mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-11 05:33:47 +01:00
re-try streams at most 4 times
svn:r1242
This commit is contained in:
parent
694d287774
commit
0ab367ed91
@ -491,6 +491,8 @@ int fetch_from_buf_socks(buf_t *buf, socks_request_t *req) {
|
|||||||
}
|
}
|
||||||
assert(0);
|
assert(0);
|
||||||
case 4: /* socks4 */
|
case 4: /* socks4 */
|
||||||
|
/* http://archive.socks.permeo.com/protocol/socks4.protocol */
|
||||||
|
/* http://archive.socks.permeo.com/protocol/socks4a.protocol */
|
||||||
|
|
||||||
req->socks_version = 4;
|
req->socks_version = 4;
|
||||||
if(buf->datalen < SOCKS4_NETWORK_LEN) /* basic info available? */
|
if(buf->datalen < SOCKS4_NETWORK_LEN) /* basic info available? */
|
||||||
|
@ -540,6 +540,7 @@ repeat_connection_edge_package_raw_inbuf:
|
|||||||
goto repeat_connection_edge_package_raw_inbuf;
|
goto repeat_connection_edge_package_raw_inbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MAX_STREAM_RETRIES 4
|
||||||
void connection_ap_expire_beginning(void) {
|
void connection_ap_expire_beginning(void) {
|
||||||
connection_t **carray;
|
connection_t **carray;
|
||||||
connection_t *conn;
|
connection_t *conn;
|
||||||
@ -554,18 +555,24 @@ void connection_ap_expire_beginning(void) {
|
|||||||
if (conn->type != CONN_TYPE_AP ||
|
if (conn->type != CONN_TYPE_AP ||
|
||||||
conn->state != AP_CONN_STATE_CONNECT_WAIT)
|
conn->state != AP_CONN_STATE_CONNECT_WAIT)
|
||||||
continue;
|
continue;
|
||||||
if (now - conn->timestamp_lastread >= 15) {
|
if (now - conn->timestamp_lastread < 15)
|
||||||
|
continue;
|
||||||
|
conn->num_retries++;
|
||||||
|
circ = circuit_get_by_conn(conn);
|
||||||
|
if(conn->num_retries >= MAX_STREAM_RETRIES) {
|
||||||
|
log_fn(LOG_WARN,"Stream is %d seconds late. Giving up.",
|
||||||
|
15*conn->num_retries);
|
||||||
|
circuit_log_path(LOG_WARN, circ);
|
||||||
|
connection_mark_for_close(conn,END_STREAM_REASON_TIMEOUT);
|
||||||
|
} else {
|
||||||
log_fn(LOG_WARN,"Stream is %d seconds late. Retrying.",
|
log_fn(LOG_WARN,"Stream is %d seconds late. Retrying.",
|
||||||
(int)(now - conn->timestamp_lastread));
|
(int)(now - conn->timestamp_lastread));
|
||||||
circ = circuit_get_by_conn(conn);
|
|
||||||
circuit_log_path(LOG_WARN, circ);
|
circuit_log_path(LOG_WARN, circ);
|
||||||
/* send an end down the circuit */
|
/* send an end down the circuit */
|
||||||
connection_edge_end(conn, END_STREAM_REASON_TIMEOUT, conn->cpath_layer);
|
connection_edge_end(conn, END_STREAM_REASON_TIMEOUT, conn->cpath_layer);
|
||||||
/* un-mark it as ending, since we're going to reuse it */
|
/* un-mark it as ending, since we're going to reuse it */
|
||||||
conn->has_sent_end = 0;
|
conn->has_sent_end = 0;
|
||||||
/* move it back into 'pending' state. It's possible it will
|
/* move it back into 'pending' state. */
|
||||||
* reattach to this same circuit, but that's good enough for now.
|
|
||||||
*/
|
|
||||||
conn->state = AP_CONN_STATE_CIRCUIT_WAIT;
|
conn->state = AP_CONN_STATE_CIRCUIT_WAIT;
|
||||||
circuit_detach_stream(circ, conn);
|
circuit_detach_stream(circ, conn);
|
||||||
/* kludge to make us not try this circuit again, yet to allow
|
/* kludge to make us not try this circuit again, yet to allow
|
||||||
@ -580,8 +587,8 @@ void connection_ap_expire_beginning(void) {
|
|||||||
/* Don't need to send end -- we're not connected */
|
/* Don't need to send end -- we're not connected */
|
||||||
connection_mark_for_close(conn, 0);
|
connection_mark_for_close(conn, 0);
|
||||||
}
|
}
|
||||||
}
|
} /* end if max_retries */
|
||||||
}
|
} /* end for */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Tell any APs that are waiting for a new circuit that one is available */
|
/* Tell any APs that are waiting for a new circuit that one is available */
|
||||||
|
@ -189,6 +189,8 @@
|
|||||||
#define RELAY_COMMAND_TRUNCATE 8
|
#define RELAY_COMMAND_TRUNCATE 8
|
||||||
#define RELAY_COMMAND_TRUNCATED 9
|
#define RELAY_COMMAND_TRUNCATED 9
|
||||||
#define RELAY_COMMAND_DROP 10
|
#define RELAY_COMMAND_DROP 10
|
||||||
|
#define RELAY_COMMAND_RESOLVE 11
|
||||||
|
#define RELAY_COMMAND_RESOLVED 12
|
||||||
|
|
||||||
#define _MIN_END_STREAM_REASON 1
|
#define _MIN_END_STREAM_REASON 1
|
||||||
#define END_STREAM_REASON_MISC 1
|
#define END_STREAM_REASON_MISC 1
|
||||||
@ -363,6 +365,7 @@ struct connection_t {
|
|||||||
int done_receiving;
|
int done_receiving;
|
||||||
char has_sent_end; /* for debugging: set once we've set the stream end,
|
char has_sent_end; /* for debugging: set once we've set the stream end,
|
||||||
and check in circuit_about_to_close_connection() */
|
and check in circuit_about_to_close_connection() */
|
||||||
|
char num_retries; /* how many times have we re-tried beginning this stream? */
|
||||||
|
|
||||||
/* Used only by AP connections */
|
/* Used only by AP connections */
|
||||||
socks_request_t *socks_request;
|
socks_request_t *socks_request;
|
||||||
|
@ -846,7 +846,7 @@ routerinfo_t *router_get_entry_from_string(const char *s,
|
|||||||
|
|
||||||
tok = find_first_by_keyword(tokens, K_PORTS);
|
tok = find_first_by_keyword(tokens, K_PORTS);
|
||||||
if (tok && ports_set) {
|
if (tok && ports_set) {
|
||||||
log_fn(LOG_WARN,"Rendundant ports line");
|
log_fn(LOG_WARN,"Redundant ports line");
|
||||||
goto err;
|
goto err;
|
||||||
} else if (tok) {
|
} else if (tok) {
|
||||||
if (tok->n_args != 3) {
|
if (tok->n_args != 3) {
|
||||||
|
Loading…
Reference in New Issue
Block a user