commit 3a2e25969fbb7bf38fcfafce676e7f56a1aca118 Merge: 7f35630 bbb8f12 Author: Nick Mathewson nickm@torproject.org Date: Wed Jun 11 11:57:56 2014 -0400
Merge remote-tracking branch 'public/ticket6799_024_v2_squashed'
Conflicts: src/or/channel.c src/or/circuitlist.c src/or/connection.c
Conflicts involved removal of next_circ_id and addition of unusable-circid tracking.
changes/bug6799 | 20 ++++++++++++++++++++ src/or/channel.c | 11 +++++------ src/or/channel.h | 6 ++++-- src/or/channeltls.c | 2 +- src/or/circuitlist.c | 10 ++++++++-- src/or/connection.c | 4 +--- src/or/connection_or.c | 46 ++++++++++++++++++++++++++++++++++++++++------ src/or/connection_or.h | 2 ++ src/or/main.c | 38 ++++++++++++++++++++++---------------- src/or/or.h | 7 ++++--- 10 files changed, 107 insertions(+), 39 deletions(-)
diff --cc src/or/channel.c index 63af2f9,ce2d012..1cc7864 --- a/src/or/channel.c +++ b/src/or/channel.c @@@ -726,10 -731,10 +728,10 @@@ channel_init(channel_t *chan chan->global_identifier = n_channels_allocated++;
/* Init timestamp */ - chan->timestamp_last_added_nonpadding = time(NULL); + chan->timestamp_last_had_circuits = time(NULL);
- /* Init next_circ_id */ - chan->next_circ_id = crypto_rand_int(1 << 15); + /* Warn about exhausted circuit IDs no more than hourly. */ + chan->last_warned_circ_ids_exhausted.rate = 3600;
/* Initialize queues. */ TOR_SIMPLEQ_INIT(&chan->incoming_queue); @@@ -1681,18 -1687,6 +1685,13 @@@ channel_write_cell_queue_entry(channel_ chan->state == CHANNEL_STATE_OPEN || chan->state == CHANNEL_STATE_MAINT);
- /* Increment the timestamp unless it's padding */ - if (!cell_queue_entry_is_padding(q)) { - chan->timestamp_last_added_nonpadding = approx_time(); - } - + { + circid_t circ_id; + if (is_destroy_cell(chan, q, &circ_id)) { + channel_note_destroy_not_pending(chan, circ_id); + } + } + /* Can we send it right out? If so, try */ if (TOR_SIMPLEQ_EMPTY(&chan->outgoing_queue) && chan->state == CHANNEL_STATE_OPEN) { diff --cc src/or/circuitlist.c index 6238e08,3cb429b..0140afc --- a/src/or/circuitlist.c +++ b/src/or/circuitlist.c @@@ -319,23 -211,17 +319,26 @@@ channel_note_destroy_not_pending(channe * with the corresponding circuit ID, and add the circuit as appropriate * to the (chan,id)->circuit map. */ void -circuit_set_p_circid_chan(or_circuit_t *circ, circid_t id, +circuit_set_p_circid_chan(or_circuit_t *or_circ, circid_t id, channel_t *chan) { - circuit_set_circid_chan_helper(TO_CIRCUIT(circ), CELL_DIRECTION_IN, - id, chan); + circuit_t *circ = TO_CIRCUIT(or_circ); + channel_t *old_chan = or_circ->p_chan; + circid_t old_id = or_circ->p_circ_id; + + circuit_set_circid_chan_helper(circ, CELL_DIRECTION_IN, id, chan);
- if (chan) + if (chan) { - tor_assert(bool_eq(circ->p_chan_cells.n, circ->next_active_on_p_chan)); + tor_assert(bool_eq(or_circ->p_chan_cells.n, + or_circ->next_active_on_p_chan));
+ chan->timestamp_last_had_circuits = approx_time(); + } ++ + if (circ->p_delete_pending && old_chan) { + channel_mark_circid_unusable(old_chan, old_id); + circ->p_delete_pending = 0; + } }
/** Set the n_conn field of a circuit <b>circ</b>, along @@@ -345,18 -231,13 +348,21 @@@ voi circuit_set_n_circid_chan(circuit_t *circ, circid_t id, channel_t *chan) { + channel_t *old_chan = circ->n_chan; + circid_t old_id = circ->n_circ_id; + circuit_set_circid_chan_helper(circ, CELL_DIRECTION_OUT, id, chan);
- if (chan) + if (chan) { tor_assert(bool_eq(circ->n_chan_cells.n, circ->next_active_on_n_chan));
+ chan->timestamp_last_had_circuits = approx_time(); + } ++ + if (circ->n_delete_pending && old_chan) { + channel_mark_circid_unusable(old_chan, old_id); + circ->n_delete_pending = 0; + } }
/** Change the state of <b>circ</b> to <b>state</b>, adding it to or removing diff --cc src/or/connection.c index cef9172,d99a54c..0b03092 --- a/src/or/connection.c +++ b/src/or/connection.c @@@ -269,8 -249,8 +269,6 @@@ dir_connection_new(int socket_family /** Allocate and return a new or_connection_t, initialized as by * connection_init(). * - * Set timestamp_last_added_nonpadding to now. - * - * Assign a pseudorandom next_circ_id between 0 and 2**15. - * * Initialize active_circuit_pqueue. * * Set active_circuit_pqueue_last_recalibrated to current cell_ewma tick. @@@ -280,14 -260,10 +278,14 @@@ or_connection_new(int type, int socket_ { or_connection_t *or_conn = tor_malloc_zero(sizeof(or_connection_t)); time_t now = time(NULL); - connection_init(now, TO_CONN(or_conn), CONN_TYPE_OR, socket_family); + tor_assert(type == CONN_TYPE_OR || type == CONN_TYPE_EXT_OR); + connection_init(now, TO_CONN(or_conn), type, socket_family);
- or_conn->timestamp_last_added_nonpadding = time(NULL); + connection_or_set_canonical(or_conn, 0);
+ if (type == CONN_TYPE_EXT_OR) + connection_or_set_ext_or_identifier(or_conn); + return or_conn; }
diff --cc src/or/connection_or.h index 8d93028,896556c..143540e --- a/src/or/connection_or.h +++ b/src/or/connection_or.h @@@ -45,9 -45,10 +45,11 @@@ void connection_or_close_for_error(or_c
void connection_or_report_broken_states(int severity, int domain);
-int connection_tls_start_handshake(or_connection_t *conn, int receiving); +MOCK_DECL(int,connection_tls_start_handshake,(or_connection_t *conn, + int receiving)); int connection_tls_continue_handshake(or_connection_t *conn); + void connection_or_set_canonical(or_connection_t *or_conn, + int is_canonical);
int connection_init_or_handshake_state(or_connection_t *conn, int started_here); diff --cc src/or/or.h index 6aa6b59,3ed9f9f..f1d68b7 --- a/src/or/or.h +++ b/src/or/or.h @@@ -1482,13 -1422,12 +1482,16 @@@ typedef struct or_connection_t unsigned int is_outgoing:1; unsigned int proxy_type:2; /**< One of PROXY_NONE...PROXY_SOCKS5 */ unsigned int wide_circ_ids:1; + /** True iff this connection has had its bootstrap failure logged with + * control_event_bootstrap_problem. */ + unsigned int have_noted_bootstrap_problem:1; + uint16_t link_proto; /**< What protocol version are we using? 0 for * "none negotiated yet." */ - + uint16_t idle_timeout; /**< How long can this connection sit with no + * circuits on it before we close it? Based on + * IDLE_CIRCUIT_TIMEOUT_{NON,}CANONICAL and + * on is_canonical, randomized. */ or_handshake_state_t *handshake_state; /**< If we are setting this connection * up, state information to do so. */
tor-commits@lists.torproject.org