From 400ba2f636edf5afb14fe3b57f23d80e433d893d Mon Sep 17 00:00:00 2001 From: David Goulet Date: Fri, 4 Aug 2017 12:06:34 -0400 Subject: [PATCH] prop224: Always note down the use of internal circuit Also, this removes all the callsite of this rephist in the hs subsystem Fixes #23097 Signed-off-by: David Goulet --- src/or/circuituse.c | 31 ++++++++++++++++++++++++++----- src/or/circuituse.h | 3 ++- src/or/hs_circuit.c | 12 +----------- src/or/hs_circuit.h | 2 +- src/or/hs_service.c | 6 +++--- 5 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/or/circuituse.c b/src/or/circuituse.c index 5292dc01db..66006542d0 100644 --- a/src/or/circuituse.c +++ b/src/or/circuituse.c @@ -1114,11 +1114,32 @@ needs_exit_circuits(time_t now, int *needs_uptime, int *needs_capacity) /* Return true if we need any more hidden service server circuits. * HS servers only need an internal circuit. */ STATIC int -needs_hs_server_circuits(int num_uptime_internal) +needs_hs_server_circuits(time_t now, int num_uptime_internal) { - return ((rend_num_services() || hs_service_get_num_services()) && - num_uptime_internal < SUFFICIENT_UPTIME_INTERNAL_HS_SERVERS && - router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN); + if (!rend_num_services() && !hs_service_get_num_services()) { + /* No services, we don't need anything. */ + goto no_need; + } + + if (num_uptime_internal >= SUFFICIENT_UPTIME_INTERNAL_HS_SERVERS) { + /* We have sufficient amount of internal circuit. */ + goto no_need; + } + + if (router_have_consensus_path() == CONSENSUS_PATH_UNKNOWN) { + /* Consensus hasn't been checked or might be invalid so requesting + * internal circuits is not wise. */ + goto no_need; + } + + /* At this point, we need a certain amount of circuits and we will most + * likely use them for rendezvous so we note down the use of internal + * circuit for our prediction for circuit needing uptime and capacity. */ + rep_hist_note_used_internal(now, 1, 1); + + return 1; + no_need: + return 0; } /* We need at least this many internal circuits for hidden service clients */ @@ -1217,7 +1238,7 @@ circuit_predict_and_launch_new(void) return; } - if (needs_hs_server_circuits(num_uptime_internal)) { + if (needs_hs_server_circuits(now, num_uptime_internal)) { flags = (CIRCLAUNCH_NEED_CAPACITY | CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL); diff --git a/src/or/circuituse.h b/src/or/circuituse.h index ad4c214a3b..e66679586d 100644 --- a/src/or/circuituse.h +++ b/src/or/circuituse.h @@ -68,7 +68,8 @@ STATIC int circuit_is_available_for_use(const circuit_t *circ); STATIC int needs_exit_circuits(time_t now, int *port_needs_uptime, int *port_needs_capacity); -STATIC int needs_hs_server_circuits(int num_uptime_internal); +STATIC int needs_hs_server_circuits(time_t now, + int num_uptime_internal); STATIC int needs_hs_client_circuits(time_t now, int *needs_uptime, diff --git a/src/or/hs_circuit.c b/src/or/hs_circuit.c index f6594739bc..d0265dc548 100644 --- a/src/or/hs_circuit.c +++ b/src/or/hs_circuit.c @@ -480,8 +480,6 @@ launch_rendezvous_point_circuit(const hs_service_t *service, tor_assert(data); circ_needs_uptime = hs_service_requires_uptime_circ(service->config.ports); - /* Help predict this next time */ - rep_hist_note_used_internal(now, circ_needs_uptime, 1); /* Get the extend info data structure for the chosen rendezvous point * specified by the given link specifiers. */ @@ -632,10 +630,6 @@ retry_service_rendezvous_point(const origin_circuit_t *circ) * has no anonymity (single onion), this change of behavior won't affect * security directly. */ - /* Help predict this next time */ - rep_hist_note_used_internal(time(NULL), bstate->need_uptime, - bstate->need_capacity); - new_circ = circuit_launch_by_extend_info(CIRCUIT_PURPOSE_S_CONNECT_REND, bstate->chosen_exit, flags); if (new_circ == NULL) { @@ -728,7 +722,7 @@ hs_circ_retry_service_rendezvous_point(origin_circuit_t *circ) int hs_circ_launch_intro_point(hs_service_t *service, const hs_service_intro_point_t *ip, - extend_info_t *ei, time_t now) + extend_info_t *ei) { /* Standard flags for introduction circuit. */ int ret = -1, circ_flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL; @@ -748,10 +742,6 @@ hs_circ_launch_intro_point(hs_service_t *service, safe_str_client(extend_info_describe(ei)), safe_str_client(service->onion_address)); - /* Note down that we are about to use an internal circuit. */ - rep_hist_note_used_internal(now, circ_flags & CIRCLAUNCH_NEED_UPTIME, - circ_flags & CIRCLAUNCH_NEED_CAPACITY); - /* Note down the launch for the retry period. Even if the circuit fails to * be launched, we still want to respect the retry period to avoid stress on * the circuit subsystem. */ diff --git a/src/or/hs_circuit.h b/src/or/hs_circuit.h index 8706e6b0ed..9e359394e8 100644 --- a/src/or/hs_circuit.h +++ b/src/or/hs_circuit.h @@ -24,7 +24,7 @@ void hs_circ_service_rp_has_opened(const hs_service_t *service, origin_circuit_t *circ); int hs_circ_launch_intro_point(hs_service_t *service, const hs_service_intro_point_t *ip, - extend_info_t *ei, time_t now); + extend_info_t *ei); int hs_circ_launch_rendezvous_point(const hs_service_t *service, const curve25519_public_key_t *onion_key, const uint8_t *rendezvous_cookie); diff --git a/src/or/hs_service.c b/src/or/hs_service.c index 4c0ec628cc..5f36964547 100644 --- a/src/or/hs_service.c +++ b/src/or/hs_service.c @@ -1749,7 +1749,7 @@ run_build_descriptor_event(time_t now) /* For the given service, launch any intro point circuits that could be * needed. This considers every descriptor of the service. */ static void -launch_intro_point_circuits(hs_service_t *service, time_t now) +launch_intro_point_circuits(hs_service_t *service) { tor_assert(service); @@ -1785,7 +1785,7 @@ launch_intro_point_circuits(hs_service_t *service, time_t now) /* Launch a circuit to the intro point. */ ip->circuit_retries++; - if (hs_circ_launch_intro_point(service, ip, ei, now) < 0) { + if (hs_circ_launch_intro_point(service, ip, ei) < 0) { log_warn(LD_REND, "Unable to launch intro circuit to node %s " "for service %s.", safe_str_client(extend_info_describe(ei)), @@ -1910,7 +1910,7 @@ run_build_circuit_event(time_t now) * circuit creation so make sure this service is respecting that limit. */ if (can_service_launch_intro_circuit(service, now)) { /* Launch intro point circuits if needed. */ - launch_intro_point_circuits(service, now); + launch_intro_point_circuits(service); /* Once the circuits have opened, we'll make sure to update the * descriptor intro point list and cleanup any extraneous. */ }