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

svn:r3781
This commit is contained in:
Roger Dingledine
2005-03-19 04:38:59 +00:00
parent b004eda10c
commit ec7f232b24
3 changed files with 15 additions and 10 deletions
+4 -7
View File
@@ -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
View File
@@ -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
View File
@@ -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;