diff options
author | Nick Mathewson <nickm@torproject.org> | 2013-04-02 10:41:14 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2013-04-02 10:41:14 -0400 |
commit | 856d57531b3173ef04a9f8f69c5e6e6c16c25c00 (patch) | |
tree | 806b0b0577664b395ae95ee64027dd386de85b87 /src/common | |
parent | 2c155064aaa77d5a59169388c89723b8dd53d589 (diff) | |
parent | 452cfaacfc6e6b4313d2170c29e18d6399038999 (diff) | |
download | tor-856d57531b3173ef04a9f8f69c5e6e6c16c25c00.tar.gz tor-856d57531b3173ef04a9f8f69c5e6e6c16c25c00.zip |
Merge remote-tracking branch 'public/bug7707_diagnostic' into maint-0.2.4
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/tortls.c | 25 | ||||
-rw-r--r-- | src/common/tortls.h | 2 |
2 files changed, 27 insertions, 0 deletions
diff --git a/src/common/tortls.c b/src/common/tortls.c index a08910b3a2..b7e5bc1a5f 100644 --- a/src/common/tortls.c +++ b/src/common/tortls.c @@ -1997,6 +1997,10 @@ tor_tls_free(tor_tls_t *tls) if (!tls) return; tor_assert(tls->ssl); + { + size_t r,w; + tor_tls_get_n_raw_bytes(tls,&r,&w); /* ensure written_by_tls is updated */ + } #ifdef SSL_set_tlsext_host_name SSL_set_tlsext_host_name(tls->ssl, NULL); #endif @@ -2048,6 +2052,13 @@ tor_tls_read(tor_tls_t *tls, char *cp, size_t len) } } +/** Total number of bytes that we've used TLS to send. Used to track TLS + * overhead. */ +static uint64_t total_bytes_written_over_tls = 0; +/** Total number of bytes that TLS has put on the network for us. Used to + * track TLS overhead. */ +static uint64_t total_bytes_written_by_tls = 0; + /** Underlying function for TLS writing. Write up to <b>n</b> * characters from <b>cp</b> onto <b>tls</b>. On success, returns the * number of characters written. On failure, returns TOR_TLS_ERROR, @@ -2074,6 +2085,7 @@ tor_tls_write(tor_tls_t *tls, const char *cp, size_t n) r = SSL_write(tls->ssl, cp, (int)n); err = tor_tls_get_error(tls, r, 0, "writing", LOG_INFO, LD_NET); if (err == TOR_TLS_DONE) { + total_bytes_written_over_tls += r; return r; } if (err == TOR_TLS_WANTWRITE || err == TOR_TLS_WANTREAD) { @@ -2563,10 +2575,23 @@ tor_tls_get_n_raw_bytes(tor_tls_t *tls, size_t *n_read, size_t *n_written) "r=%lu, last_read=%lu, w=%lu, last_written=%lu", r, tls->last_read_count, w, tls->last_write_count); } + total_bytes_written_by_tls += *n_written; tls->last_read_count = r; tls->last_write_count = w; } +/** Return a ratio of the bytes that TLS has sent to the bytes that we've told + * it to send. Used to track whether our TLS records are getting too tiny. */ +double +tls_get_write_overhead_ratio(void) +{ + if (total_bytes_written_over_tls == 0) + return 1.0; + + return U64_TO_DBL(total_bytes_written_by_tls) / + U64_TO_DBL(total_bytes_written_over_tls); +} + /** Implement check_no_tls_errors: If there are any pending OpenSSL * errors, log an error message. */ void diff --git a/src/common/tortls.h b/src/common/tortls.h index 1ae6344d04..49c488b365 100644 --- a/src/common/tortls.h +++ b/src/common/tortls.h @@ -95,6 +95,8 @@ void tor_tls_get_buffer_sizes(tor_tls_t *tls, size_t *rbuf_capacity, size_t *rbuf_bytes, size_t *wbuf_capacity, size_t *wbuf_bytes); +double tls_get_write_overhead_ratio(void); + int tor_tls_used_v1_handshake(tor_tls_t *tls); int tor_tls_received_v3_certificate(tor_tls_t *tls); int tor_tls_get_num_server_handshakes(tor_tls_t *tls); |