Handle n_mux/p_mux properly in circuitmux.c

This commit is contained in:
Andrea Shepard 2012-09-26 11:51:39 -07:00
parent c3ebd0340c
commit 8004448635
2 changed files with 27 additions and 10 deletions

View File

@ -340,7 +340,8 @@ circuitmux_attach_circuit(circuitmux_t *cmux, circuit_t *circ,
/* /*
* Figure out which channel we're using, and get the circuit's current * Figure out which channel we're using, and get the circuit's current
* cell count and circuit ID. * cell count and circuit ID; assert that the circuit is not already
* attached to another mux.
*/ */
if (direction == CELL_DIRECTION_OUT) { if (direction == CELL_DIRECTION_OUT) {
/* It's n_chan */ /* It's n_chan */
@ -376,13 +377,16 @@ circuitmux_attach_circuit(circuitmux_t *cmux, circuit_t *circ,
"Circuit %u on channel " U64_FORMAT " was already attached to " "Circuit %u on channel " U64_FORMAT " was already attached to "
"cmux %p (trying to attach to %p)", "cmux %p (trying to attach to %p)",
circ_id, U64_PRINTF_ARG(channel_id), circ_id, U64_PRINTF_ARG(channel_id),
circ->mux, cmux); ((direction == CELL_DIRECTION_OUT) ?
circ->n_mux : TO_OR_CIRCUIT(circ)->p_mux),
cmux);
/* /*
* The mux pointer on the circuit should match this cmux, and the * The mux pointer on this circuit and the direction in result should
* direction in result should match; otherwise assert. * match; otherwise assert.
*/ */
tor_assert(circ->mux == cmux); if (direction == CELL_DIRECTION_OUT) tor_assert(circ->n_mux == cmux);
else tor_assert(TO_OR_CIRCUIT(circ)->p_mux == cmux);
tor_assert(hashent->muxinfo.direction == direction); tor_assert(hashent->muxinfo.direction == direction);
/* /*
@ -407,8 +411,12 @@ circuitmux_attach_circuit(circuitmux_t *cmux, circuit_t *circ,
"Attaching circuit %u on channel " U64_FORMAT " to cmux %p", "Attaching circuit %u on channel " U64_FORMAT " to cmux %p",
circ_id, U64_PRINTF_ARG(channel_id), cmux); circ_id, U64_PRINTF_ARG(channel_id), cmux);
/* Assert that the circuit doesn't already have a mux */ /*
tor_assert(circ->mux == NULL); * Assert that the circuit doesn't already have a mux for this
* direction.
*/
if (direction == CELL_DIRECTION_OUT) tor_assert(circ->n_mux == NULL);
else tor_assert(TO_OR_CIRCUIT(circ)->p_mux == NULL);
/* Insert it in the map */ /* Insert it in the map */
hashent = tor_malloc_zero(sizeof(*hashent)); hashent = tor_malloc_zero(sizeof(*hashent));
@ -419,8 +427,9 @@ circuitmux_attach_circuit(circuitmux_t *cmux, circuit_t *circ,
HT_INSERT(chanid_circid_muxinfo_map, cmux->chanid_circid_map, HT_INSERT(chanid_circid_muxinfo_map, cmux->chanid_circid_map,
hashent); hashent);
/* Set the circuit's mux */ /* Set the circuit's mux for this direction */
circ->mux = cmux; if (direction == CELL_DIRECTION_OUT) circ->n_mux = cmux;
else TO_OR_CIRCUIT(circ)->p_mux = cmux;
/* Make sure the next/prev pointers are NULL */ /* Make sure the next/prev pointers are NULL */
if (direction == CELL_DIRECTION_OUT) { if (direction == CELL_DIRECTION_OUT) {
@ -494,6 +503,9 @@ circuitmux_detach_circuit(circuitmux_t *cmux, circuit_t *circ)
/* Consistency check: the direction must match the direction searched */ /* Consistency check: the direction must match the direction searched */
tor_assert(last_searched_direction == hashent->muxinfo.direction); tor_assert(last_searched_direction == hashent->muxinfo.direction);
/* Clear the circuit's mux for this direction */
if (last_searched_direction == CELL_DIRECTION_OUT) circ->n_mux = NULL;
else TO_OR_CIRCUIT(circ)->p_mux = NULL;
/* Free the hash entry */ /* Free the hash entry */
tor_free(hashent); tor_free(hashent);

View File

@ -2650,7 +2650,7 @@ typedef struct circuit_t {
* Circuit mux associated with n_chan to which this circuit is attached; * Circuit mux associated with n_chan to which this circuit is attached;
* NULL if we have no n_chan. * NULL if we have no n_chan.
*/ */
circuitmux_t *mux; circuitmux_t *n_mux;
/** Queue of cells waiting to be transmitted on n_chan */ /** Queue of cells waiting to be transmitted on n_chan */
cell_queue_t n_chan_cells; cell_queue_t n_chan_cells;
@ -2916,6 +2916,11 @@ typedef struct or_circuit_t {
cell_queue_t p_chan_cells; cell_queue_t p_chan_cells;
/** The channel that is previous in this circuit. */ /** The channel that is previous in this circuit. */
channel_t *p_chan; channel_t *p_chan;
/**
* Circuit mux associated with p_chan to which this circuit is attached;
* NULL if we have no p_chan.
*/
circuitmux_t *p_mux;
/** Linked list of Exit streams associated with this circuit. */ /** Linked list of Exit streams associated with this circuit. */
edge_connection_t *n_streams; edge_connection_t *n_streams;
/** Linked list of Exit streams associated with this circuit that are /** Linked list of Exit streams associated with this circuit that are