summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Hahn <sebastian@torproject.org>2010-08-03 16:46:28 +0200
committerNick Mathewson <nickm@torproject.org>2010-08-18 11:12:32 -0400
commit78e4aa63fbc8b65ebf94234300b0d21e573ebe6e (patch)
tree902f24a04c001ad697a9f81ca2dc866931cd47ca
parentfc66a2ad1bf1e653cae47eb54fc6324d29d5916e (diff)
downloadtor-78e4aa63fbc8b65ebf94234300b0d21e573ebe6e.tar.gz
tor-78e4aa63fbc8b65ebf94234300b0d21e573ebe6e.zip
Backport END_STREAM_REASON_NOROUTE for client use.
(Partial backport of 150ed553dfce9, 161b275028e90, and 4c948ffd6.)
-rw-r--r--changes/misc-reason3
-rw-r--r--src/or/or.h2
-rw-r--r--src/or/reasons.c12
-rw-r--r--src/or/relay.c4
4 files changed, 19 insertions, 2 deletions
diff --git a/changes/misc-reason b/changes/misc-reason
new file mode 100644
index 0000000000..80db2d257d
--- /dev/null
+++ b/changes/misc-reason
@@ -0,0 +1,3 @@
+ o Minor features:
+ - Have clients begin understanding the new END_STREAM_REASON_NOROUTE
+ error code.
diff --git a/src/or/or.h b/src/or/or.h
index a2a6d380d6..910e612a0d 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -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
diff --git a/src/or/reasons.c b/src/or/reasons.c
index 45b592367c..82e5f99212 100644
--- a/src/or/reasons.c
+++ b/src/or/reasons.c
@@ -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):
diff --git a/src/or/relay.c b/src/or/relay.c
index 2082da94fe..b3d2fbb026 100644
--- a/src/or/relay.c
+++ b/src/or/relay.c
@@ -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. */