|
@@ -417,8 +417,7 @@ channel_register(channel_t *chan)
|
|
|
smartlist_add(all_channels, chan);
|
|
|
|
|
|
|
|
|
- if (chan->state == CHANNEL_STATE_CLOSED ||
|
|
|
- chan->state == CHANNEL_STATE_ERROR) {
|
|
|
+ if (CHANNEL_FINISHED(chan)) {
|
|
|
|
|
|
if (!finished_channels) finished_channels = smartlist_new();
|
|
|
smartlist_add(finished_channels, chan);
|
|
@@ -427,7 +426,7 @@ channel_register(channel_t *chan)
|
|
|
if (!active_channels) active_channels = smartlist_new();
|
|
|
smartlist_add(active_channels, chan);
|
|
|
|
|
|
- if (chan->state != CHANNEL_STATE_CLOSING) {
|
|
|
+ if (!CHANNEL_IS_CLOSING(chan)) {
|
|
|
|
|
|
if (!tor_digest_is_zero(chan->identity_digest)) {
|
|
|
|
|
@@ -462,8 +461,7 @@ channel_unregister(channel_t *chan)
|
|
|
if (!(chan->registered)) return;
|
|
|
|
|
|
|
|
|
- if (chan->state == CHANNEL_STATE_CLOSED ||
|
|
|
- chan->state == CHANNEL_STATE_ERROR) {
|
|
|
+ if (CHANNEL_FINISHED(chan)) {
|
|
|
|
|
|
if (finished_channels) smartlist_remove(finished_channels, chan);
|
|
|
} else {
|
|
@@ -479,9 +477,7 @@ channel_unregister(channel_t *chan)
|
|
|
|
|
|
|
|
|
if (!tor_digest_is_zero(chan->identity_digest) &&
|
|
|
- !(chan->state == CHANNEL_STATE_CLOSING ||
|
|
|
- chan->state == CHANNEL_STATE_CLOSED ||
|
|
|
- chan->state == CHANNEL_STATE_ERROR)) {
|
|
|
+ !(CHANNEL_CONDEMNED(chan))) {
|
|
|
|
|
|
channel_remove_from_digest_map(chan);
|
|
|
}
|
|
@@ -581,9 +577,7 @@ channel_add_to_digest_map(channel_t *chan)
|
|
|
tor_assert(chan);
|
|
|
|
|
|
|
|
|
- tor_assert(!(chan->state == CHANNEL_STATE_CLOSING ||
|
|
|
- chan->state == CHANNEL_STATE_CLOSED ||
|
|
|
- chan->state == CHANNEL_STATE_ERROR));
|
|
|
+ tor_assert(!CHANNEL_CONDEMNED(chan));
|
|
|
|
|
|
|
|
|
tor_assert(!tor_digest_is_zero(chan->identity_digest));
|
|
@@ -821,8 +815,8 @@ channel_free(channel_t *chan)
|
|
|
if (!chan) return;
|
|
|
|
|
|
|
|
|
- tor_assert(chan->state == CHANNEL_STATE_CLOSED ||
|
|
|
- chan->state == CHANNEL_STATE_ERROR);
|
|
|
+ tor_assert(CHANNEL_FINISHED(chan));
|
|
|
+
|
|
|
|
|
|
tor_assert(!(chan->registered));
|
|
|
|
|
@@ -1036,9 +1030,7 @@ channel_get_cell_handler(channel_t *chan)
|
|
|
{
|
|
|
tor_assert(chan);
|
|
|
|
|
|
- if (chan->state == CHANNEL_STATE_OPENING ||
|
|
|
- chan->state == CHANNEL_STATE_OPEN ||
|
|
|
- chan->state == CHANNEL_STATE_MAINT)
|
|
|
+ if (CHANNEL_CAN_HANDLE_CELLS(chan))
|
|
|
return chan->cell_handler;
|
|
|
|
|
|
return NULL;
|
|
@@ -1056,9 +1048,7 @@ channel_get_var_cell_handler(channel_t *chan)
|
|
|
{
|
|
|
tor_assert(chan);
|
|
|
|
|
|
- if (chan->state == CHANNEL_STATE_OPENING ||
|
|
|
- chan->state == CHANNEL_STATE_OPEN ||
|
|
|
- chan->state == CHANNEL_STATE_MAINT)
|
|
|
+ if (CHANNEL_CAN_HANDLE_CELLS(chan))
|
|
|
return chan->var_cell_handler;
|
|
|
|
|
|
return NULL;
|
|
@@ -1081,9 +1071,7 @@ channel_set_cell_handlers(channel_t *chan,
|
|
|
int try_again = 0;
|
|
|
|
|
|
tor_assert(chan);
|
|
|
- tor_assert(chan->state == CHANNEL_STATE_OPENING ||
|
|
|
- chan->state == CHANNEL_STATE_OPEN ||
|
|
|
- chan->state == CHANNEL_STATE_MAINT);
|
|
|
+ tor_assert(CHANNEL_CAN_HANDLE_CELLS(chan));
|
|
|
|
|
|
log_debug(LD_CHANNEL,
|
|
|
"Setting cell_handler callback for channel %p to %p",
|
|
@@ -1137,9 +1125,8 @@ channel_mark_for_close(channel_t *chan)
|
|
|
tor_assert(chan->close != NULL);
|
|
|
|
|
|
|
|
|
- if (chan->state == CHANNEL_STATE_CLOSING ||
|
|
|
- chan->state == CHANNEL_STATE_CLOSED ||
|
|
|
- chan->state == CHANNEL_STATE_ERROR) return;
|
|
|
+ if (CHANNEL_CONDEMNED(chan))
|
|
|
+ return;
|
|
|
|
|
|
log_debug(LD_CHANNEL,
|
|
|
"Closing channel %p (global ID " U64_FORMAT ") "
|
|
@@ -1218,9 +1205,8 @@ channel_close_from_lower_layer(channel_t *chan)
|
|
|
tor_assert(chan != NULL);
|
|
|
|
|
|
|
|
|
- if (chan->state == CHANNEL_STATE_CLOSING ||
|
|
|
- chan->state == CHANNEL_STATE_CLOSED ||
|
|
|
- chan->state == CHANNEL_STATE_ERROR) return;
|
|
|
+ if (CHANNEL_CONDEMNED(chan))
|
|
|
+ return;
|
|
|
|
|
|
log_debug(LD_CHANNEL,
|
|
|
"Closing channel %p (global ID " U64_FORMAT ") "
|
|
@@ -1278,9 +1264,8 @@ channel_close_for_error(channel_t *chan)
|
|
|
tor_assert(chan != NULL);
|
|
|
|
|
|
|
|
|
- if (chan->state == CHANNEL_STATE_CLOSING ||
|
|
|
- chan->state == CHANNEL_STATE_CLOSED ||
|
|
|
- chan->state == CHANNEL_STATE_ERROR) return;
|
|
|
+ if (CHANNEL_CONDEMNED(chan))
|
|
|
+ return;
|
|
|
|
|
|
log_debug(LD_CHANNEL,
|
|
|
"Closing channel %p due to lower-layer error",
|
|
@@ -1336,13 +1321,11 @@ void
|
|
|
channel_closed(channel_t *chan)
|
|
|
{
|
|
|
tor_assert(chan);
|
|
|
- tor_assert(chan->state == CHANNEL_STATE_CLOSING ||
|
|
|
- chan->state == CHANNEL_STATE_CLOSED ||
|
|
|
- chan->state == CHANNEL_STATE_ERROR);
|
|
|
+ tor_assert(CHANNEL_CONDEMNED(chan));
|
|
|
|
|
|
|
|
|
- if (chan->state == CHANNEL_STATE_CLOSED ||
|
|
|
- chan->state == CHANNEL_STATE_ERROR) return;
|
|
|
+ if (CHANNEL_FINISHED(chan))
|
|
|
+ return;
|
|
|
|
|
|
|
|
|
* give up. */
|
|
@@ -1405,10 +1388,7 @@ channel_clear_identity_digest(channel_t *chan)
|
|
|
"global ID " U64_FORMAT,
|
|
|
chan, U64_PRINTF_ARG(chan->global_identifier));
|
|
|
|
|
|
- state_not_in_map =
|
|
|
- (chan->state == CHANNEL_STATE_CLOSING ||
|
|
|
- chan->state == CHANNEL_STATE_CLOSED ||
|
|
|
- chan->state == CHANNEL_STATE_ERROR);
|
|
|
+ state_not_in_map = CHANNEL_CONDEMNED(chan);
|
|
|
|
|
|
if (!state_not_in_map && chan->registered &&
|
|
|
!tor_digest_is_zero(chan->identity_digest))
|
|
@@ -1441,10 +1421,8 @@ channel_set_identity_digest(channel_t *chan,
|
|
|
identity_digest ?
|
|
|
hex_str(identity_digest, DIGEST_LEN) : "(null)");
|
|
|
|
|
|
- state_not_in_map =
|
|
|
- (chan->state == CHANNEL_STATE_CLOSING ||
|
|
|
- chan->state == CHANNEL_STATE_CLOSED ||
|
|
|
- chan->state == CHANNEL_STATE_ERROR);
|
|
|
+ state_not_in_map = CHANNEL_CONDEMNED(chan);
|
|
|
+
|
|
|
was_in_digest_map =
|
|
|
!state_not_in_map &&
|
|
|
chan->registered &&
|
|
@@ -1494,10 +1472,7 @@ channel_clear_remote_end(channel_t *chan)
|
|
|
"global ID " U64_FORMAT,
|
|
|
chan, U64_PRINTF_ARG(chan->global_identifier));
|
|
|
|
|
|
- state_not_in_map =
|
|
|
- (chan->state == CHANNEL_STATE_CLOSING ||
|
|
|
- chan->state == CHANNEL_STATE_CLOSED ||
|
|
|
- chan->state == CHANNEL_STATE_ERROR);
|
|
|
+ state_not_in_map = CHANNEL_CONDEMNED(chan);
|
|
|
|
|
|
if (!state_not_in_map && chan->registered &&
|
|
|
!tor_digest_is_zero(chan->identity_digest))
|
|
@@ -1533,10 +1508,8 @@ channel_set_remote_end(channel_t *chan,
|
|
|
identity_digest ?
|
|
|
hex_str(identity_digest, DIGEST_LEN) : "(null)");
|
|
|
|
|
|
- state_not_in_map =
|
|
|
- (chan->state == CHANNEL_STATE_CLOSING ||
|
|
|
- chan->state == CHANNEL_STATE_CLOSED ||
|
|
|
- chan->state == CHANNEL_STATE_ERROR);
|
|
|
+ state_not_in_map = CHANNEL_CONDEMNED(chan);
|
|
|
+
|
|
|
was_in_digest_map =
|
|
|
!state_not_in_map &&
|
|
|
chan->registered &&
|
|
@@ -1761,9 +1734,7 @@ channel_write_cell_queue_entry(channel_t *chan, cell_queue_entry_t *q)
|
|
|
tor_assert(q);
|
|
|
|
|
|
|
|
|
- tor_assert(chan->state == CHANNEL_STATE_OPENING ||
|
|
|
- chan->state == CHANNEL_STATE_OPEN ||
|
|
|
- chan->state == CHANNEL_STATE_MAINT);
|
|
|
+ tor_assert(CHANNEL_CAN_HANDLE_CELLS(chan));
|
|
|
|
|
|
{
|
|
|
circid_t circ_id;
|
|
@@ -1777,7 +1748,7 @@ channel_write_cell_queue_entry(channel_t *chan, cell_queue_entry_t *q)
|
|
|
|
|
|
|
|
|
if (TOR_SIMPLEQ_EMPTY(&chan->outgoing_queue) &&
|
|
|
- chan->state == CHANNEL_STATE_OPEN) {
|
|
|
+ CHANNEL_IS_OPEN(chan)) {
|
|
|
|
|
|
switch (q->type) {
|
|
|
case CELL_QUEUE_FIXED:
|
|
@@ -1835,7 +1806,7 @@ channel_write_cell_queue_entry(channel_t *chan, cell_queue_entry_t *q)
|
|
|
|
|
|
chan->bytes_in_queue += cell_bytes;
|
|
|
|
|
|
- if (chan->state == CHANNEL_STATE_OPEN) channel_flush_cells(chan);
|
|
|
+ if (CHANNEL_IS_OPEN(chan)) channel_flush_cells(chan);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1856,7 +1827,7 @@ channel_write_cell(channel_t *chan, cell_t *cell)
|
|
|
tor_assert(chan);
|
|
|
tor_assert(cell);
|
|
|
|
|
|
- if (chan->state == CHANNEL_STATE_CLOSING) {
|
|
|
+ if (CHANNEL_IS_CLOSING(chan)) {
|
|
|
log_debug(LD_CHANNEL, "Discarding cell_t %p on closing channel %p with "
|
|
|
"global ID "U64_FORMAT, cell, chan,
|
|
|
U64_PRINTF_ARG(chan->global_identifier));
|
|
@@ -1893,7 +1864,7 @@ channel_write_packed_cell(channel_t *chan, packed_cell_t *packed_cell)
|
|
|
tor_assert(chan);
|
|
|
tor_assert(packed_cell);
|
|
|
|
|
|
- if (chan->state == CHANNEL_STATE_CLOSING) {
|
|
|
+ if (CHANNEL_IS_CLOSING(chan)) {
|
|
|
log_debug(LD_CHANNEL, "Discarding packed_cell_t %p on closing channel %p "
|
|
|
"with global ID "U64_FORMAT, packed_cell, chan,
|
|
|
U64_PRINTF_ARG(chan->global_identifier));
|
|
@@ -1932,7 +1903,7 @@ channel_write_var_cell(channel_t *chan, var_cell_t *var_cell)
|
|
|
tor_assert(chan);
|
|
|
tor_assert(var_cell);
|
|
|
|
|
|
- if (chan->state == CHANNEL_STATE_CLOSING) {
|
|
|
+ if (CHANNEL_IS_CLOSING(chan)) {
|
|
|
log_debug(LD_CHANNEL, "Discarding var_cell_t %p on closing channel %p "
|
|
|
"with global ID "U64_FORMAT, var_cell, chan,
|
|
|
U64_PRINTF_ARG(chan->global_identifier));
|
|
@@ -2211,7 +2182,7 @@ channel_flush_some_cells, (channel_t *chan, ssize_t num_cells))
|
|
|
if (!unlimited && num_cells <= flushed) goto done;
|
|
|
|
|
|
|
|
|
- if (chan->state == CHANNEL_STATE_OPEN) {
|
|
|
+ if (CHANNEL_IS_OPEN(chan)) {
|
|
|
|
|
|
flushed += channel_flush_some_cells_from_outgoing_queue(chan,
|
|
|
(unlimited ? -1 : num_cells - flushed));
|
|
@@ -2302,7 +2273,7 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan,
|
|
|
if (!unlimited && num_cells <= flushed) return 0;
|
|
|
|
|
|
|
|
|
- if (chan->state == CHANNEL_STATE_OPEN) {
|
|
|
+ if (CHANNEL_IS_OPEN(chan)) {
|
|
|
while ((unlimited || num_cells > flushed) &&
|
|
|
NULL != (q = TOR_SIMPLEQ_FIRST(&chan->outgoing_queue))) {
|
|
|
free_q = 0;
|
|
@@ -2667,9 +2638,8 @@ channel_process_cells(channel_t *chan)
|
|
|
{
|
|
|
cell_queue_entry_t *q;
|
|
|
tor_assert(chan);
|
|
|
- tor_assert(chan->state == CHANNEL_STATE_CLOSING ||
|
|
|
- chan->state == CHANNEL_STATE_MAINT ||
|
|
|
- chan->state == CHANNEL_STATE_OPEN);
|
|
|
+ tor_assert(CHANNEL_IS_CLOSING(chan) || CHANNEL_IS_MAINT(chan) ||
|
|
|
+ CHANNEL_IS_OPEN(chan));
|
|
|
|
|
|
log_debug(LD_CHANNEL,
|
|
|
"Processing as many incoming cells as we can for channel %p",
|
|
@@ -2736,7 +2706,7 @@ channel_queue_cell(channel_t *chan, cell_t *cell)
|
|
|
|
|
|
tor_assert(chan);
|
|
|
tor_assert(cell);
|
|
|
- tor_assert(chan->state == CHANNEL_STATE_OPEN);
|
|
|
+ tor_assert(CHANNEL_IS_OPEN(chan));
|
|
|
|
|
|
|
|
|
if (!(chan->cell_handler)) need_to_queue = 1;
|
|
@@ -2790,7 +2760,7 @@ channel_queue_var_cell(channel_t *chan, var_cell_t *var_cell)
|
|
|
|
|
|
tor_assert(chan);
|
|
|
tor_assert(var_cell);
|
|
|
- tor_assert(chan->state == CHANNEL_STATE_OPEN);
|
|
|
+ tor_assert(CHANNEL_IS_OPEN(chan));
|
|
|
|
|
|
|
|
|
if (!(chan->var_cell_handler)) need_to_queue = 1;
|
|
@@ -2913,10 +2883,7 @@ channel_send_destroy(circid_t circ_id, channel_t *chan, int reason)
|
|
|
}
|
|
|
|
|
|
|
|
|
- if (!(chan->state == CHANNEL_STATE_CLOSING ||
|
|
|
- chan->state == CHANNEL_STATE_CLOSED ||
|
|
|
- chan->state == CHANNEL_STATE_ERROR) &&
|
|
|
- chan->cmux) {
|
|
|
+ if (!CHANNEL_CONDEMNED(chan) && chan->cmux) {
|
|
|
channel_note_destroy_pending(chan, circ_id);
|
|
|
circuitmux_append_destroy_cell(chan, chan->cmux, circ_id, reason);
|
|
|
log_debug(LD_OR,
|
|
@@ -3106,9 +3073,7 @@ channel_free_list(smartlist_t *channels, int mark_for_close)
|
|
|
}
|
|
|
channel_unregister(curr);
|
|
|
if (mark_for_close) {
|
|
|
- if (!(curr->state == CHANNEL_STATE_CLOSING ||
|
|
|
- curr->state == CHANNEL_STATE_CLOSED ||
|
|
|
- curr->state == CHANNEL_STATE_ERROR)) {
|
|
|
+ if (!CHANNEL_CONDEMNED(curr)) {
|
|
|
channel_mark_for_close(curr);
|
|
|
}
|
|
|
channel_force_free(curr);
|
|
@@ -3322,9 +3287,7 @@ channel_get_for_extend(const char *digest,
|
|
|
tor_assert(tor_memeq(chan->identity_digest,
|
|
|
digest, DIGEST_LEN));
|
|
|
|
|
|
- if (chan->state == CHANNEL_STATE_CLOSING ||
|
|
|
- chan->state == CHANNEL_STATE_CLOSED ||
|
|
|
- chan->state == CHANNEL_STATE_ERROR)
|
|
|
+ if (CHANNEL_CONDEMNED(chan))
|
|
|
continue;
|
|
|
|
|
|
|
|
@@ -3334,7 +3297,7 @@ channel_get_for_extend(const char *digest,
|
|
|
}
|
|
|
|
|
|
|
|
|
- if (chan->state != CHANNEL_STATE_OPEN) {
|
|
|
+ if (!CHANNEL_IS_OPEN(chan)) {
|
|
|
|
|
|
* circuit. */
|
|
|
if (channel_matches_target_addr_for_extend(chan, target_addr))
|