mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
make hidden services more likely to work from the server-side
svn:r3781
This commit is contained in:
+4
-7
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user