Loading changes/ticket9176 0 → 100644 +4 −0 Original line number Diff line number Diff line o Minor features: - Made PREDICTED_CIRCS_RELEVANCE_TIME configurable from config file. Implements ticket #9176. Patch by unixninja92. doc/tor.1.txt +6 −0 Original line number Diff line number Diff line Loading @@ -544,6 +544,12 @@ GENERAL OPTIONS following the Tor specification. Otherwise, they are logged with severity \'info'. (Default: 0) [[PredictedCircsRelevanceTime]] **PredictedCircsRelevanceTime** __NUM__:: Set how long, after the client has mad an anonymized connection to a given port, we will try to make sure that we build circuits to exits that support that port. The maximum value for this option is 1 hour. (Default: 1 hour) [[RunAsDaemon]] **RunAsDaemon** **0**|**1**:: If 1, Tor forks and daemonizes to the background. This option has no effect on Windows; instead you should use the --service command-line option. Loading src/or/config.c +13 −0 Original line number Diff line number Diff line Loading @@ -318,6 +318,7 @@ static config_var_t option_vars_[] = { V(NATDListenAddress, LINELIST, NULL), VPORT(NATDPort, LINELIST, NULL), V(Nickname, STRING, NULL), V(PredictedCircsRelevanceTime, INTERVAL, "1 hour"), V(WarnUnsafeSocks, BOOL, "1"), OBSOLETE("NoPublish"), VAR("NodeFamily", LINELIST, NodeFamilies, NULL), Loading Loading @@ -2381,6 +2382,11 @@ compute_publishserverdescriptor(or_options_t *options) * services can overload the directory system. */ #define MIN_REND_POST_PERIOD (10*60) /** Higest allowable value for PredictedCircsRelevanceTime; if this is * too high, our selection of exits will decrease for an extended * period of time to an uncomfortable level .*/ #define MAX_PREDICTED_CIRCS_RELEVANCE (60*60) /** Highest allowable value for RendPostPeriod. */ #define MAX_DIR_PERIOD (MIN_ONION_KEY_LIFETIME/2) Loading Loading @@ -2841,6 +2847,13 @@ options_validate(or_options_t *old_options, or_options_t *options, options->RendPostPeriod = MAX_DIR_PERIOD; } if (options->PredictedCircsRelevanceTime > MAX_PREDICTED_CIRCS_RELEVANCE) { log_warn(LD_CONFIG, "PredictedCircsRelevanceTime is too large; " "clipping to %ds.", MAX_PREDICTED_CIRCS_RELEVANCE); options->PredictedCircsRelevanceTime = MAX_PREDICTED_CIRCS_RELEVANCE; } if (options->Tor2webMode && options->LearnCircuitBuildTimeout) { /* LearnCircuitBuildTimeout and Tor2webMode are incompatible in * two ways: Loading src/or/or.h +4 −0 Original line number Diff line number Diff line Loading @@ -3638,6 +3638,10 @@ typedef struct { * a new one? */ int MaxCircuitDirtiness; /**< Never use circs that were first used more than this interval ago. */ int PredictedCircsRelevanceTime; /** How long after we've requested a * connection for a given port, do we want * to continue to pick exits that support * that port? */ uint64_t BandwidthRate; /**< How much bandwidth, on average, are we willing * to use in a second? */ uint64_t BandwidthBurst; /**< How much bandwidth, at maximum, are we willing Loading src/or/rephist.c +12 −8 Original line number Diff line number Diff line Loading @@ -1862,22 +1862,20 @@ rep_hist_note_used_port(time_t now, uint16_t port) add_predicted_port(now, port); } /** For this long after we've seen a request for a given port, assume that * we'll want to make connections to the same port in the future. */ #define PREDICTED_CIRCS_RELEVANCE_TIME (60*60) /** Return a newly allocated pointer to a list of uint16_t * for ports that * are likely to be asked for in the near future. */ smartlist_t * rep_hist_get_predicted_ports(time_t now) { int predicted_circs_relevance_time; smartlist_t *out = smartlist_new(); tor_assert(predicted_ports_list); predicted_circs_relevance_time = get_options()->PredictedCircsRelevanceTime; /* clean out obsolete entries */ SMARTLIST_FOREACH_BEGIN(predicted_ports_list, predicted_port_t *, pp) { if (pp->time + PREDICTED_CIRCS_RELEVANCE_TIME < now) { if (pp->time + predicted_circs_relevance_time < now) { log_debug(LD_CIRC, "Expiring predicted port %d", pp->port); rephist_total_alloc -= sizeof(predicted_port_t); Loading Loading @@ -1944,14 +1942,17 @@ int rep_hist_get_predicted_internal(time_t now, int *need_uptime, int *need_capacity) { int predicted_circs_relevance_time; predicted_circs_relevance_time = get_options()->PredictedCircsRelevanceTime; if (!predicted_internal_time) { /* initialize it */ predicted_internal_time = now; predicted_internal_uptime_time = now; predicted_internal_capacity_time = now; } if (predicted_internal_time + PREDICTED_CIRCS_RELEVANCE_TIME < now) if (predicted_internal_time + predicted_circs_relevance_time < now) return 0; /* too long ago */ if (predicted_internal_uptime_time + PREDICTED_CIRCS_RELEVANCE_TIME >= now) if (predicted_internal_uptime_time + predicted_circs_relevance_time >= now) *need_uptime = 1; // Always predict that we need capacity. *need_capacity = 1; Loading @@ -1963,8 +1964,11 @@ rep_hist_get_predicted_internal(time_t now, int *need_uptime, int any_predicted_circuits(time_t now) { int predicted_circs_relevance_time; predicted_circs_relevance_time = get_options()->PredictedCircsRelevanceTime; return smartlist_len(predicted_ports_list) || predicted_internal_time + PREDICTED_CIRCS_RELEVANCE_TIME >= now; predicted_internal_time + predicted_circs_relevance_time >= now; } /** Return 1 if we have no need for circuits currently, else return 0. */ Loading Loading
changes/ticket9176 0 → 100644 +4 −0 Original line number Diff line number Diff line o Minor features: - Made PREDICTED_CIRCS_RELEVANCE_TIME configurable from config file. Implements ticket #9176. Patch by unixninja92.
doc/tor.1.txt +6 −0 Original line number Diff line number Diff line Loading @@ -544,6 +544,12 @@ GENERAL OPTIONS following the Tor specification. Otherwise, they are logged with severity \'info'. (Default: 0) [[PredictedCircsRelevanceTime]] **PredictedCircsRelevanceTime** __NUM__:: Set how long, after the client has mad an anonymized connection to a given port, we will try to make sure that we build circuits to exits that support that port. The maximum value for this option is 1 hour. (Default: 1 hour) [[RunAsDaemon]] **RunAsDaemon** **0**|**1**:: If 1, Tor forks and daemonizes to the background. This option has no effect on Windows; instead you should use the --service command-line option. Loading
src/or/config.c +13 −0 Original line number Diff line number Diff line Loading @@ -318,6 +318,7 @@ static config_var_t option_vars_[] = { V(NATDListenAddress, LINELIST, NULL), VPORT(NATDPort, LINELIST, NULL), V(Nickname, STRING, NULL), V(PredictedCircsRelevanceTime, INTERVAL, "1 hour"), V(WarnUnsafeSocks, BOOL, "1"), OBSOLETE("NoPublish"), VAR("NodeFamily", LINELIST, NodeFamilies, NULL), Loading Loading @@ -2381,6 +2382,11 @@ compute_publishserverdescriptor(or_options_t *options) * services can overload the directory system. */ #define MIN_REND_POST_PERIOD (10*60) /** Higest allowable value for PredictedCircsRelevanceTime; if this is * too high, our selection of exits will decrease for an extended * period of time to an uncomfortable level .*/ #define MAX_PREDICTED_CIRCS_RELEVANCE (60*60) /** Highest allowable value for RendPostPeriod. */ #define MAX_DIR_PERIOD (MIN_ONION_KEY_LIFETIME/2) Loading Loading @@ -2841,6 +2847,13 @@ options_validate(or_options_t *old_options, or_options_t *options, options->RendPostPeriod = MAX_DIR_PERIOD; } if (options->PredictedCircsRelevanceTime > MAX_PREDICTED_CIRCS_RELEVANCE) { log_warn(LD_CONFIG, "PredictedCircsRelevanceTime is too large; " "clipping to %ds.", MAX_PREDICTED_CIRCS_RELEVANCE); options->PredictedCircsRelevanceTime = MAX_PREDICTED_CIRCS_RELEVANCE; } if (options->Tor2webMode && options->LearnCircuitBuildTimeout) { /* LearnCircuitBuildTimeout and Tor2webMode are incompatible in * two ways: Loading
src/or/or.h +4 −0 Original line number Diff line number Diff line Loading @@ -3638,6 +3638,10 @@ typedef struct { * a new one? */ int MaxCircuitDirtiness; /**< Never use circs that were first used more than this interval ago. */ int PredictedCircsRelevanceTime; /** How long after we've requested a * connection for a given port, do we want * to continue to pick exits that support * that port? */ uint64_t BandwidthRate; /**< How much bandwidth, on average, are we willing * to use in a second? */ uint64_t BandwidthBurst; /**< How much bandwidth, at maximum, are we willing Loading
src/or/rephist.c +12 −8 Original line number Diff line number Diff line Loading @@ -1862,22 +1862,20 @@ rep_hist_note_used_port(time_t now, uint16_t port) add_predicted_port(now, port); } /** For this long after we've seen a request for a given port, assume that * we'll want to make connections to the same port in the future. */ #define PREDICTED_CIRCS_RELEVANCE_TIME (60*60) /** Return a newly allocated pointer to a list of uint16_t * for ports that * are likely to be asked for in the near future. */ smartlist_t * rep_hist_get_predicted_ports(time_t now) { int predicted_circs_relevance_time; smartlist_t *out = smartlist_new(); tor_assert(predicted_ports_list); predicted_circs_relevance_time = get_options()->PredictedCircsRelevanceTime; /* clean out obsolete entries */ SMARTLIST_FOREACH_BEGIN(predicted_ports_list, predicted_port_t *, pp) { if (pp->time + PREDICTED_CIRCS_RELEVANCE_TIME < now) { if (pp->time + predicted_circs_relevance_time < now) { log_debug(LD_CIRC, "Expiring predicted port %d", pp->port); rephist_total_alloc -= sizeof(predicted_port_t); Loading Loading @@ -1944,14 +1942,17 @@ int rep_hist_get_predicted_internal(time_t now, int *need_uptime, int *need_capacity) { int predicted_circs_relevance_time; predicted_circs_relevance_time = get_options()->PredictedCircsRelevanceTime; if (!predicted_internal_time) { /* initialize it */ predicted_internal_time = now; predicted_internal_uptime_time = now; predicted_internal_capacity_time = now; } if (predicted_internal_time + PREDICTED_CIRCS_RELEVANCE_TIME < now) if (predicted_internal_time + predicted_circs_relevance_time < now) return 0; /* too long ago */ if (predicted_internal_uptime_time + PREDICTED_CIRCS_RELEVANCE_TIME >= now) if (predicted_internal_uptime_time + predicted_circs_relevance_time >= now) *need_uptime = 1; // Always predict that we need capacity. *need_capacity = 1; Loading @@ -1963,8 +1964,11 @@ rep_hist_get_predicted_internal(time_t now, int *need_uptime, int any_predicted_circuits(time_t now) { int predicted_circs_relevance_time; predicted_circs_relevance_time = get_options()->PredictedCircsRelevanceTime; return smartlist_len(predicted_ports_list) || predicted_internal_time + PREDICTED_CIRCS_RELEVANCE_TIME >= now; predicted_internal_time + predicted_circs_relevance_time >= now; } /** Return 1 if we have no need for circuits currently, else return 0. */ Loading