summaryrefslogtreecommitdiff
path: root/src/or/circuitmux.c
diff options
context:
space:
mode:
authorAndrea Shepard <andrea@torproject.org>2012-09-26 11:40:33 -0700
committerAndrea Shepard <andrea@torproject.org>2012-10-10 00:43:17 -0700
commitc3ebd0340cca67dc4dd44bd18849100ebba39051 (patch)
treefc0611a93e632f8db715b8c73139f3608b90529b /src/or/circuitmux.c
parent7e5c358d38cae7769426f1427f23ce6002cda980 (diff)
downloadtor-c3ebd0340cca67dc4dd44bd18849100ebba39051.tar.gz
tor-c3ebd0340cca67dc4dd44bd18849100ebba39051.zip
Implement circuitmux_detach_circuit() in circuitmux.c
Diffstat (limited to 'src/or/circuitmux.c')
-rw-r--r--src/or/circuitmux.c98
1 files changed, 30 insertions, 68 deletions
diff --git a/src/or/circuitmux.c b/src/or/circuitmux.c
index 629fbcf333..2a7d075aed 100644
--- a/src/or/circuitmux.c
+++ b/src/or/circuitmux.c
@@ -443,98 +443,60 @@ circuitmux_attach_circuit(circuitmux_t *cmux, circuit_t *circ,
}
}
-/*
- * Circuitmux/circuit attachment status inquiry functions
- */
-
/**
- * Query the direction of an attached circuit
+ * Detach a circuit from a circuitmux and update all counters as needed;
+ * no-op if not attached.
*/
-cell_direction_t
-circuitmux_attached_circuit_direction(circuitmux_t *cmux, circuit_t *circ)
+void
+circuitmux_detach_circuit(circuitmux_t *cmux, circuit_t *circ)
{
- chanid_circid_muxinfo_t *hashent = NULL;
-
- /* Try to find a map entry */
- hashent = circuitmux_find_map_entry(cmux, circ);
-
+ chanid_circid_muxinfo_t search, *hashent = NULL;
/*
- * This function should only be called on attached circuits; assert that
- * we had a map entry.
+ * Use this to keep track of whether we found it for n_chan or
+ * p_chan for consistency checking.
*/
- tor_assert(hashent);
-
- /* Return the direction from the map entry */
- return hashent->muxinfo.direction;
-}
-
-/**
- * Find an entry in the cmux's map for this circuit or return NULL if there
- * is none.
- */
+ cell_direction_t last_searched_direction;
-static chanid_circid_muxinfo_t *
-circuitmux_find_map_entry(circuitmux_t *cmux, circuit_t *circ)
-{
- chanid_circid_muxinfo_t search, *hashent = NULL;
-
- /* Sanity-check parameters */
tor_assert(cmux);
tor_assert(cmux->chanid_circid_map);
tor_assert(circ);
tor_assert(circ->n_chan);
- /* Okay, let's see if it's attached for n_chan/n_circ_id */
+ /* See if we have it for n_chan/n_circ_id */
search.chan_id = circ->n_chan->global_identifier;
search.circ_id = circ->n_circ_id;
+ hashent = HT_REMOVE(chanid_circid_muxinfo_map, cmux->chanid_circid_map,
+ &search);
+ last_searched_direction = CELL_DIRECTION_OUT;
- /* Query */
- hashent = HT_FIND(chanid_circid_muxinfo_map, cmux->chanid_circid_map,
- &search);
-
- /* Found something? */
- if (hashent) {
- /*
- * Assert that the direction makes sense for a hashent we found by
- * n_chan/n_circ_id before we return it.
- */
- tor_assert(hashent->muxinfo.direction == CELL_DIRECTION_OUT);
- } else {
- /* Not there, have we got a p_chan/p_circ_id to try? */
+ /* Got one? If not, see if it's an or_circuit_t and try p_chan/p_circ_id */
+ if (!hashent) {
if (circ->magic == OR_CIRCUIT_MAGIC) {
search.circ_id = TO_OR_CIRCUIT(circ)->p_circ_id;
- /* Check for p_chan */
if (TO_OR_CIRCUIT(circ)->p_chan) {
search.chan_id = TO_OR_CIRCUIT(circ)->p_chan->global_identifier;
- /* Okay, search for that */
- hashent = HT_FIND(chanid_circid_muxinfo_map, cmux->chanid_circid_map,
- &search);
- /* Find anything? */
- if (hashent) {
- /* Assert that the direction makes sense before we return it */
- tor_assert(hashent->muxinfo.direction == CELL_DIRECTION_IN);
- }
+ hashent = HT_REMOVE(chanid_circid_muxinfo_map,
+ cmux->chanid_circid_map,
+ &search);
+ last_searched_direction = CELL_DIRECTION_IN;
}
}
}
- /* Okay, hashent is it if it was there */
- return hashent;
-}
-
-/**
- * Query whether a circuit is attached to a circuitmux
- */
-
-int
-circuitmux_is_circuit_attached(circuitmux_t *cmux, circuit_t *circ)
-{
- chanid_circid_muxinfo_t *hashent = NULL;
+ /* If hashent isn't NULL, we just removed it from the map */
+ if (hashent) {
+ /* Update counters */
+ --(cmux->n_circuits);
+ if (hashent->muxinfo.cell_count > 0) --(cmux->n_active_circuits);
+ cmux->n_cells -= hashent->muxinfo.cell_count;
+ /* TODO update active_circuits / active_circuit_pqueue */
- /* Look if it's in the circuit map */
- hashent = circuitmux_find_map_entry(cmux, circ);
+ /* Consistency check: the direction must match the direction searched */
+ tor_assert(last_searched_direction == hashent->muxinfo.direction);
- return (hashent != NULL);
+ /* Free the hash entry */
+ tor_free(hashent);
+ }
}