mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 13:13:44 +01:00
Backport END_STREAM_REASON_NOROUTE for client use.
(Partial backport of150ed553df
,161b275028
, and 4c948ffd6.)
This commit is contained in:
parent
fc66a2ad1b
commit
78e4aa63fb
3
changes/misc-reason
Normal file
3
changes/misc-reason
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor features:
|
||||
- Have clients begin understanding the new END_STREAM_REASON_NOROUTE
|
||||
error code.
|
@ -544,7 +544,7 @@ typedef enum {
|
||||
#define END_STREAM_REASON_DESTROY 5
|
||||
#define END_STREAM_REASON_DONE 6
|
||||
#define END_STREAM_REASON_TIMEOUT 7
|
||||
/* 8 is unallocated for historical reasons. */
|
||||
#define END_STREAM_REASON_NOROUTE 8
|
||||
#define END_STREAM_REASON_HIBERNATING 9
|
||||
#define END_STREAM_REASON_INTERNAL 10
|
||||
#define END_STREAM_REASON_RESOURCELIMIT 11
|
||||
|
@ -26,6 +26,7 @@ stream_end_reason_to_control_string(int reason)
|
||||
case END_STREAM_REASON_DESTROY: return "DESTROY";
|
||||
case END_STREAM_REASON_DONE: return "DONE";
|
||||
case END_STREAM_REASON_TIMEOUT: return "TIMEOUT";
|
||||
case END_STREAM_REASON_NOROUTE: return "NOROUTE";
|
||||
case END_STREAM_REASON_HIBERNATING: return "HIBERNATING";
|
||||
case END_STREAM_REASON_INTERNAL: return "INTERNAL";
|
||||
case END_STREAM_REASON_RESOURCELIMIT: return "RESOURCELIMIT";
|
||||
@ -60,6 +61,7 @@ stream_end_reason_to_string(int reason)
|
||||
case END_STREAM_REASON_DESTROY: return "destroyed";
|
||||
case END_STREAM_REASON_DONE: return "closed normally";
|
||||
case END_STREAM_REASON_TIMEOUT: return "gave up (timeout)";
|
||||
case END_STREAM_REASON_NOROUTE: return "no route to host";
|
||||
case END_STREAM_REASON_HIBERNATING: return "server is hibernating";
|
||||
case END_STREAM_REASON_INTERNAL: return "internal error at server";
|
||||
case END_STREAM_REASON_RESOURCELIMIT: return "server out of resources";
|
||||
@ -102,6 +104,8 @@ stream_end_reason_to_socks5_response(int reason)
|
||||
return SOCKS5_SUCCEEDED;
|
||||
case END_STREAM_REASON_TIMEOUT:
|
||||
return SOCKS5_TTL_EXPIRED;
|
||||
case END_STREAM_REASON_NOROUTE:
|
||||
return SOCKS5_HOST_UNREACHABLE;
|
||||
case END_STREAM_REASON_RESOURCELIMIT:
|
||||
return SOCKS5_GENERAL_ERROR;
|
||||
case END_STREAM_REASON_HIBERNATING:
|
||||
@ -162,6 +166,14 @@ errno_to_stream_end_reason(int e)
|
||||
S_CASE(ENOTCONN):
|
||||
S_CASE(ENETUNREACH):
|
||||
return END_STREAM_REASON_INTERNAL;
|
||||
E_CASE(EHOSTUNREACH):
|
||||
/* XXXX022
|
||||
* The correct behavior is END_STREAM_REASON_NOROUTE, but older
|
||||
* clients don't recognize it. So we're going to continue sending
|
||||
* "MISC" until 0.2.1.27 or later is "well established".
|
||||
*/
|
||||
/* return END_STREAM_REASON_NOROUTE; */
|
||||
return END_STREAM_REASON_MISC;
|
||||
S_CASE(ECONNREFUSED):
|
||||
return END_STREAM_REASON_CONNECTREFUSED;
|
||||
S_CASE(ECONNRESET):
|
||||
|
@ -648,7 +648,8 @@ edge_reason_is_retriable(int reason)
|
||||
reason == END_STREAM_REASON_RESOURCELIMIT ||
|
||||
reason == END_STREAM_REASON_EXITPOLICY ||
|
||||
reason == END_STREAM_REASON_RESOLVEFAILED ||
|
||||
reason == END_STREAM_REASON_MISC;
|
||||
reason == END_STREAM_REASON_MISC ||
|
||||
reason == END_STREAM_REASON_NOROUTE;
|
||||
}
|
||||
|
||||
/** Called when we receive an END cell on a stream that isn't open yet,
|
||||
@ -743,6 +744,7 @@ connection_ap_process_end_not_open(
|
||||
case END_STREAM_REASON_RESOLVEFAILED:
|
||||
case END_STREAM_REASON_TIMEOUT:
|
||||
case END_STREAM_REASON_MISC:
|
||||
case END_STREAM_REASON_NOROUTE:
|
||||
if (client_dns_incr_failures(conn->socks_request->address)
|
||||
< MAX_RESOLVE_FAILURES) {
|
||||
/* We haven't retried too many times; reattach the connection. */
|
||||
|
Loading…
Reference in New Issue
Block a user