From 5de88dda0acda6914bacd1e14c2e037798c5d9d9 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Thu, 31 Oct 2013 16:53:31 -0400 Subject: [PATCH] circuit_build_failed: distinguish "got DESTROY" case Roger spotted this on tor-dev in his comments on proposal 221. We etect DESTROY vs everything else, since arma likes network timeout indicating failure but not overload indicating failure. --- src/or/circuituse.c | 9 +++++---- src/or/command.c | 1 + src/or/or.h | 3 +++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/or/circuituse.c b/src/or/circuituse.c index 25997ebdbe..5fe65eba05 100644 --- a/src/or/circuituse.c +++ b/src/or/circuituse.c @@ -1382,10 +1382,11 @@ circuit_build_failed(origin_circuit_t *circ) failed_at_last_hop = 1; } if (circ->cpath && - circ->cpath->state != CPATH_STATE_OPEN) { - /* We failed at the first hop. If there's an OR connection - * to blame, blame it. Also, avoid this relay for a while, and - * fail any one-hop directory fetches destined for it. */ + circ->cpath->state != CPATH_STATE_OPEN && + ! circ->base_.received_destroy) { + /* We failed at the first hop for some reason other than a DESTROY cell. + * If there's an OR connection to blame, blame it. Also, avoid this relay + * for a while, and fail any one-hop directory fetches destined for it. */ const char *n_chan_id = circ->cpath->extend_info->identity_digest; int already_marked = 0; if (circ->base_.n_chan) { diff --git a/src/or/command.c b/src/or/command.c index 699b02fb47..51d07b0485 100644 --- a/src/or/command.c +++ b/src/or/command.c @@ -499,6 +499,7 @@ command_process_destroy_cell(cell_t *cell, channel_t *chan) log_debug(LD_OR,"Received for circID %u.",(unsigned)cell->circ_id); reason = (uint8_t)cell->payload[0]; + circ->received_destroy = 1; if (!CIRCUIT_IS_ORIGIN(circ) && cell->circ_id == TO_OR_CIRCUIT(circ)->p_circ_id) { diff --git a/src/or/or.h b/src/or/or.h index eff5a6d2b4..ad91f7da29 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -2799,6 +2799,9 @@ typedef struct circuit_t { * allowing n_streams to add any more cells. (OR circuit only.) */ unsigned int streams_blocked_on_p_chan : 1; + /** True iff this circuit has received a DESTROY cell in either direction */ + unsigned int received_destroy : 1; + uint8_t state; /**< Current status of this circuit. */ uint8_t purpose; /**< Why are we creating this circuit? */