|
@@ -78,13 +78,29 @@ orconn_circid_circuit_map_t *_last_circid_orconn_ent = NULL;
|
|
|
* remove the circuit from the list of active circuits on old_conn and add it
|
|
|
* to the list of active circuits on conn. */
|
|
|
static void
|
|
|
-circuit_set_circid_orconn_helper(circuit_t *circ, uint16_t id,
|
|
|
+circuit_set_circid_orconn_helper(circuit_t *circ, int direction,
|
|
|
+ uint16_t id,
|
|
|
or_connection_t *conn,
|
|
|
- uint16_t old_id, or_connection_t *old_conn,
|
|
|
int active)
|
|
|
{
|
|
|
orconn_circid_circuit_map_t search;
|
|
|
orconn_circid_circuit_map_t *found;
|
|
|
+ or_connection_t *old_conn, **conn_ptr;
|
|
|
+ uint16_t old_id, *circid_ptr;
|
|
|
+
|
|
|
+ if (direction == CELL_DIRECTION_OUT) {
|
|
|
+ conn_ptr = &circ->n_conn;
|
|
|
+ circid_ptr = &circ->n_circ_id;
|
|
|
+ } else {
|
|
|
+ or_circuit_t *c = TO_OR_CIRCUIT(circ);
|
|
|
+ conn_ptr = &c->p_conn;
|
|
|
+ circid_ptr = &c->p_circ_id;
|
|
|
+ }
|
|
|
+ old_conn = *conn_ptr;
|
|
|
+ old_id = *circid_ptr;
|
|
|
+
|
|
|
+ if (id == old_id && conn == old_conn)
|
|
|
+ return;
|
|
|
|
|
|
if (_last_circid_orconn_ent &&
|
|
|
((old_id == _last_circid_orconn_ent->circ_id &&
|
|
@@ -107,6 +123,11 @@ circuit_set_circid_orconn_helper(circuit_t *circ, uint16_t id,
|
|
|
make_circuit_inactive_on_conn(circ,old_conn);
|
|
|
}
|
|
|
|
|
|
+ /* Change the values only after we have possibly made the circuit inactive
|
|
|
+ * on the previous conn. */
|
|
|
+ *conn_ptr = conn;
|
|
|
+ *circid_ptr = id;
|
|
|
+
|
|
|
if (conn == NULL)
|
|
|
return;
|
|
|
|
|
@@ -136,21 +157,16 @@ void
|
|
|
circuit_set_p_circid_orconn(or_circuit_t *circ, uint16_t id,
|
|
|
or_connection_t *conn)
|
|
|
{
|
|
|
- uint16_t old_id;
|
|
|
- or_connection_t *old_conn;
|
|
|
int active;
|
|
|
|
|
|
- old_id = circ->p_circ_id;
|
|
|
- old_conn = circ->p_conn;
|
|
|
- circ->p_circ_id = id;
|
|
|
- circ->p_conn = conn;
|
|
|
active = circ->p_conn_cells.n > 0;
|
|
|
tor_assert(bool_eq(active, circ->next_active_on_p_conn));
|
|
|
|
|
|
- if (id == old_id && conn == old_conn)
|
|
|
- return;
|
|
|
- circuit_set_circid_orconn_helper(TO_CIRCUIT(circ), id, conn,
|
|
|
- old_id, old_conn, active);
|
|
|
+ circuit_set_circid_orconn_helper(TO_CIRCUIT(circ), CELL_DIRECTION_IN,
|
|
|
+ id, conn, active);
|
|
|
+
|
|
|
+ if (conn)
|
|
|
+ tor_assert(bool_eq(active, circ->next_active_on_p_conn));
|
|
|
}
|
|
|
|
|
|
/** Set the n_conn field of a circuit <b>circ</b>, along
|
|
@@ -160,20 +176,16 @@ void
|
|
|
circuit_set_n_circid_orconn(circuit_t *circ, uint16_t id,
|
|
|
or_connection_t *conn)
|
|
|
{
|
|
|
- uint16_t old_id;
|
|
|
- or_connection_t *old_conn;
|
|
|
int active;
|
|
|
|
|
|
- old_id = circ->n_circ_id;
|
|
|
- old_conn = circ->n_conn;
|
|
|
- circ->n_circ_id = id;
|
|
|
- circ->n_conn = conn;
|
|
|
active = circ->n_conn_cells.n > 0;
|
|
|
tor_assert(bool_eq(active, circ->next_active_on_n_conn));
|
|
|
|
|
|
- if (id == old_id && conn == old_conn)
|
|
|
- return;
|
|
|
- circuit_set_circid_orconn_helper(circ, id, conn, old_id, old_conn, active);
|
|
|
+ circuit_set_circid_orconn_helper(circ, CELL_DIRECTION_OUT,
|
|
|
+ id, conn, active);
|
|
|
+
|
|
|
+ if (conn)
|
|
|
+ tor_assert(bool_eq(active, circ->next_active_on_n_conn));
|
|
|
}
|
|
|
|
|
|
/** Change the state of <b>circ</b> to <b>state</b>, adding it to or removing
|