Parcourir la source

Merge branch 'ticket9176_squashed'

Conflicts:
	doc/tor.1.txt
Nick Mathewson il y a 10 ans
Parent
commit
103cebd924
5 fichiers modifiés avec 39 ajouts et 8 suppressions
  1. 4 0
      changes/ticket9176
  2. 6 0
      doc/tor.1.txt
  3. 13 0
      src/or/config.c
  4. 4 0
      src/or/or.h
  5. 12 8
      src/or/rephist.c

+ 4 - 0
changes/ticket9176

@@ -0,0 +1,4 @@
+  o Minor features:
+
+    - Made PREDICTED_CIRCS_RELEVANCE_TIME configurable from config
+      file. Implements ticket #9176. Patch by unixninja92.

+ 6 - 0
doc/tor.1.txt

@@ -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.

+ 13 - 0
src/or/config.c

@@ -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),
@@ -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)
 
@@ -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:

+ 4 - 0
src/or/or.h

@@ -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

+ 12 - 8
src/or/rephist.c

@@ -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);
@@ -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;
@@ -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. */