diff options
Diffstat (limited to 'src/or/connection_edge.c')
-rw-r--r-- | src/or/connection_edge.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index a23162398..7d5c4ffb7 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -460,6 +460,35 @@ connection_ap_attach_pending(void) }); } +/** Tell any AP streams that are waiting for a onehop tunnel to + * <b>failed_digest</b> that they are going to fail. */ +/* XXX021 We should get rid of this function, and instead attach + * onehop streams to circ->p_streams so they get marked in + * circuit_mark_for_close like normal p_streams. */ +void +connection_ap_fail_onehop(const char *failed_digest) +{ + edge_connection_t *edge_conn; + char digest[DIGEST_LEN]; + smartlist_t *conns = get_connection_array(); + SMARTLIST_FOREACH(conns, connection_t *, conn, + { + if (conn->marked_for_close || + conn->type != CONN_TYPE_AP || + conn->state != AP_CONN_STATE_CIRCUIT_WAIT) + continue; + edge_conn = TO_EDGE_CONN(conn); + if (!edge_conn->want_onehop) + continue; + if (!hexdigest_to_digest(edge_conn->chosen_exit_name, digest) && + !memcmp(digest, failed_digest, DIGEST_LEN)) { + log_info(LD_APP, "Closing onehop stream to '%s' because the OR conn " + "just failed.", edge_conn->chosen_exit_name); + connection_mark_unattached_ap(edge_conn, END_STREAM_REASON_TIMEOUT); + } + }); +} + /** A circuit failed to finish on its last hop <b>info</b>. If there * are any streams waiting with this exit node in mind, but they * don't absolutely require it, make them give up on it. |