diff options
Diffstat (limited to 'src/or/connection_edge.c')
-rw-r--r-- | src/or/connection_edge.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index dab25f7a3f..cb3b651994 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -296,9 +296,6 @@ void connection_ap_expire_beginning(void) { connection_edge_end(conn, END_STREAM_REASON_TIMEOUT, conn->cpath_layer); /* un-mark it as ending, since we're going to reuse it */ conn->has_sent_end = 0; - /* move it back into 'pending' state. */ - conn->state = AP_CONN_STATE_CIRCUIT_WAIT; - circuit_detach_stream(circ, conn); /* kludge to make us not try this circuit again, yet to allow * current streams on it to survive if they can: make it * unattractive to use for new streams */ @@ -306,8 +303,8 @@ void connection_ap_expire_beginning(void) { circ->timestamp_dirty -= options->MaxCircuitDirtiness; /* give our stream another 15 seconds to try */ conn->timestamp_lastread += 15; - /* attaching to a dirty circuit is fine */ - if (connection_ap_handshake_attach_circuit(conn)<0) { + /* move it back into 'pending' state, and try to attach. */ + if (connection_ap_detach_retriable(conn, circ)<0) { /* it will never work */ /* Don't need to send end -- we're not connected */ conn->has_sent_end = 1; @@ -342,6 +339,26 @@ void connection_ap_attach_pending(void) } } +/** DOCDOC + * -1 on err, 1 on success, 0 on not-yet-sure. + */ +int +connection_ap_detach_retriable(connection_t *conn, circuit_t *circ) +{ + control_event_stream_status(conn, STREAM_EVENT_FAILED_RETRIABLE); + if (get_options()->ManageConnections) { + conn->state = AP_CONN_STATE_CIRCUIT_WAIT; + circuit_detach_stream(circ,conn); + /* Muck with timestamps? */ + return connection_ap_handshake_attach_circuit(conn); + } else { + conn->state = AP_CONN_STATE_CONTROLLER_WAIT; + circuit_detach_stream(circ,conn); + return 0; + } +} + + /** A client-side struct to remember requests to rewrite addresses * to new addresses. These structs make up a tree, with addressmap * below as its root. @@ -839,7 +856,7 @@ static int connection_ap_handshake_process_socks(connection_t *conn) { return 0; } rep_hist_note_used_resolve(time(NULL)); /* help predict this next time */ - control_event_stream_status(conn, STREAM_EVENT_NEW_RESOLVE); + control_event_stream_status(conn, STREAM_EVENT_NEW_RESOLVE); } else { /* socks->command == SOCKS_COMMAND_CONNECT */ if (socks->port == 0) { log_fn(LOG_NOTICE,"Application asked to connect to port 0. Refusing."); |