Browse Source

make hidden services more likely to work from the server-side

svn:r3781
Roger Dingledine 20 years ago
parent
commit
ec7f232b24
3 changed files with 15 additions and 10 deletions
  1. 4 7
      src/or/circuituse.c
  2. 2 0
      src/or/or.h
  3. 9 3
      src/or/rendservice.c

+ 4 - 7
src/or/circuituse.c

@@ -656,13 +656,10 @@ void circuit_build_failed(circuit_t *circ) {
       /* at Bob, connecting to rend point */
       /* Don't increment failure count, since Alice may have picked
        * the rendezvous point maliciously */
-      if (failed_at_last_hop) {
-        log_fn(LOG_INFO,"Couldn't connect to Alice's chosen rend point %s. Sucks to be Alice.", circ->build_state->chosen_exit_name);
-      } else {
-        log_fn(LOG_INFO,"Couldn't connect to Alice's chosen rend point %s, because an earlier node failed.",
-               circ->build_state->chosen_exit_name);
-        rend_service_relaunch_rendezvous(circ);
-      }
+      log_fn(LOG_INFO,"Couldn't connect to Alice's chosen rend point %s (%s hop failed).",
+             failed_at_last_hop?"last":"non-last",
+             circ->build_state->chosen_exit_name);
+      rend_service_relaunch_rendezvous(circ);
       break;
     default:
       /* Other cases are impossible, since this function is only called with

+ 2 - 0
src/or/or.h

@@ -786,6 +786,8 @@ typedef struct {
   struct crypt_path_t *pending_final_cpath;
   /** How many times has building a circuit for this task failed? */
   int failure_count;
+  /** At what time should we give up on this task? */
+  time_t expiry_time;
 } cpath_build_state_t;
 
 #define CIRCUIT_MAGIC 0x35315243u

+ 9 - 3
src/or/rendservice.c

@@ -31,7 +31,10 @@ typedef struct rend_service_port_config_t {
 #define MAX_INTRO_CIRCS_PER_PERIOD 10
 /** How many times will a hidden service operator attempt to connect to
  * a requested rendezvous point before giving up? */
-#define MAX_REND_FAILURES 3
+#define MAX_REND_FAILURES 30
+/** How many seconds should we spend trying to connect to a requested
+ * rendezvous point before giving up? */
+#define MAX_REND_TIMEOUT 30
 
 /** Represents a single hidden service running at this OP. */
 typedef struct rend_service_t {
@@ -505,6 +508,7 @@ rend_service_introduce(circuit_t *circuit, const char *request, size_t request_l
           sizeof(launched->rend_query));
   launched->build_state->pending_final_cpath = cpath =
     tor_malloc_zero(sizeof(crypt_path_t));
+  launched->build_state->expiry_time = time(NULL) + MAX_REND_TIMEOUT;
 
   cpath->handshake_state = dh;
   dh = NULL;
@@ -531,8 +535,9 @@ rend_service_relaunch_rendezvous(circuit_t *oldcirc)
   tor_assert(oldcirc->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND);
 
   if (!oldcirc->build_state ||
-      oldcirc->build_state->failure_count > MAX_REND_FAILURES) {
-    log_fn(LOG_INFO,"Attempt to build circuit to %s for rendezvous has failed too many times; giving up.",
+      oldcirc->build_state->failure_count > MAX_REND_FAILURES ||
+      oldcirc->build_state->expiry_time < time(NULL)) {
+    log_fn(LOG_INFO,"Attempt to build circuit to %s for rendezvous has failed too many times or expired; giving up.",
            oldcirc->build_state->chosen_exit_name);
     return;
   }
@@ -558,6 +563,7 @@ rend_service_relaunch_rendezvous(circuit_t *oldcirc)
   newstate = newcirc->build_state;
   tor_assert(newstate);
   newstate->failure_count = oldstate->failure_count+1;
+  newstate->expiry_time = oldstate->expiry_time;
   newstate->pending_final_cpath = oldstate->pending_final_cpath;
   oldstate->pending_final_cpath = NULL;