]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
r16570@catbus: nickm | 2007-11-08 11:04:20 -0500
authorNick Mathewson <nickm@torproject.org>
Thu, 8 Nov 2007 16:19:07 +0000 (16:19 +0000)
committerNick Mathewson <nickm@torproject.org>
Thu, 8 Nov 2007 16:19:07 +0000 (16:19 +0000)
 Keep track, for each OR connection, of the last time we added a non-padding cell to its outbuf.  Use this timestamp, not "lastwritten" to tell if it is time to close a circuitless connection.  (We can'tuse lastwritten, since lastwritten is updated when ever the connection flushes anything, and by that point we can no longer tell what is a padding cell and what is not.)

svn:r12437

doc/TODO
src/or/connection.c
src/or/connection_or.c
src/or/main.c
src/or/or.h

index 99bfe5a9d4742e31e3626b970d87bc0647d63a71..958c7b0eb7761e665c5ea3c6067c1d37b92b8199 100644 (file)
--- a/doc/TODO
+++ b/doc/TODO
@@ -15,7 +15,7 @@ J       - Jeff claims
         X Abandoned
 
 Items blocking 0.2.0.10-alpha:
-  - Some resolution for (the reopened) bug 546.
+  . Some resolution for (the reopened) bug 546.
   - We should back out the MBTF->WFU Guard factors, since they open us
     up to new attacks, and don't this "median" notion doesn't necessarily
     help us distinguish between "was good enough to be a guard when
@@ -32,9 +32,9 @@ Here's a go:
   median WFU of the set. In addition, anybody born more than a month ago
   who has >=50% WFU is always a winner.
 
-  - If 1.5*MaxCircuitDirtiness is more than KeepAlive, do we then send
+  o If 1.5*MaxCircuitDirtiness is more than KeepAlive, do we then send
     a KeepAlive and reset our timeout, thus never reaching 1.5*MCD?
-    - Aw, crud.  We could keep track of how long it's been since
+    o Aw, crud.  We could keep track of how long it's been since
       we last did anything _other_ than a keepalive, I guess. -NM
 
 For Tor 0.2.0.11-alpha:
index 0dd2f9e43dd701445e2240f9d17107bc45c47426..24fd567de034fb4706495c449a2980b1a135f542 100644 (file)
@@ -209,8 +209,10 @@ connection_new(int type, int socket_family)
   if (CONN_IS_EDGE(conn)) {
     TO_EDGE_CONN(conn)->global_identifier = n_connections_allocated++;
   }
-  if (type == CONN_TYPE_OR)
+  if (type == CONN_TYPE_OR) {
+    TO_OR_CONN(conn)->timestamp_last_added_nonpadding = now;
     TO_OR_CONN(conn)->next_circ_id = crypto_rand_int(1<<15);
+  }
 
   conn->timestamp_created = now;
   conn->timestamp_lastread = now;
index 6e649bee2e94a1780f727a1b677067acf62193ca..fb29fa58704c64f20b3810574a95a8587e87df4f 100644 (file)
@@ -855,6 +855,9 @@ connection_or_write_cell_to_buf(const cell_t *cell, or_connection_t *conn)
   cell_pack(&networkcell, cell);
 
   connection_write_to_buf(networkcell.body, CELL_NETWORK_SIZE, TO_CONN(conn));
+
+  if (cell->command != CELL_PADDING)
+    conn->timestamp_last_added_nonpadding = time(NULL);
 }
 
 /**DOCDOC*/
@@ -868,6 +871,8 @@ connection_or_write_var_cell_to_buf(const var_cell_t *cell,
   var_cell_pack_header(cell, hdr);
   connection_write_to_buf(hdr, sizeof(hdr), TO_CONN(conn));
   connection_write_to_buf(cell->payload, cell->payload_len, TO_CONN(conn));
+  if (cell->command != CELL_PADDING)
+    conn->timestamp_last_added_nonpadding = time(NULL);
 }
 
 /** DOCDOC */
index b7787f7ef2bbab2033e4e153a31464c963ddc95f..0f628fa226476a0d1e8cd79d5192b8fadfeb721f 100644 (file)
@@ -780,7 +780,8 @@ run_connection_housekeeping(int i, time_t now)
       connection_mark_for_close(conn);
       conn->hold_open_until_flushed = 1;
     } else if (!clique_mode(options) && !or_conn->n_circuits &&
-               now >= conn->timestamp_lastwritten + maxCircuitlessPeriod &&
+               now >= or_conn->timestamp_last_added_nonpadding +
+                                           maxCircuitlessPeriod &&
                (!router || !server_mode(options) ||
                 !router_is_clique_mode(router))) {
       log_info(LD_OR,"Expiring non-used OR connection to fd %d (%s:%d) "
index e7838eacada018d138b88194585afcf51824b44c..93eb639d678b378164b688ffe8c917ca0f5655fd 100644 (file)
@@ -926,6 +926,8 @@ typedef struct or_connection_t {
 
   or_handshake_state_t *handshake_state;/**< DOCDOC */
   time_t timestamp_lastempty; /**< When was the outbuf last completely empty?*/
+  time_t timestamp_last_added_nonpadding; /** When did we last add a
+                                           * non-padding cell to the outbuf? */
 
   /* bandwidth* and read_bucket only used by ORs in OPEN state: */
   int bandwidthrate; /**< Bytes/s added to the bucket. (OPEN ORs only.) */