summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2016-12-08 12:59:58 -0500
committerNick Mathewson <nickm@torproject.org>2016-12-16 11:34:31 -0500
commitd9200d853d5b9125ebcb47ae5a02ef0cd52f436a (patch)
treed6161dab1023c4a17f1aa1c49874ecc44d8cd82f
parentdeb8bcadced3c54d986c526662444a46e630621d (diff)
downloadtor-d9200d853d5b9125ebcb47ae5a02ef0cd52f436a.tar.gz
tor-d9200d853d5b9125ebcb47ae5a02ef0cd52f436a.zip
Make NumEntryGuards work as expected again.
Further, add a "guard-n-primary-guards-to-use" parameter, defaulting to 1, for NumEntryGuards to override.
-rw-r--r--src/or/entrynodes.c26
-rw-r--r--src/or/entrynodes.h6
2 files changed, 30 insertions, 2 deletions
diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c
index 5c64dfdc43..9defd11656 100644
--- a/src/or/entrynodes.c
+++ b/src/or/entrynodes.c
@@ -471,10 +471,32 @@ get_guard_confirmed_min_lifetime(void)
STATIC int
get_n_primary_guards(void)
{
- return networkstatus_get_param(NULL, "guard-n-primary-guards",
+ const int n = get_options()->NumEntryGuards;
+ if (n > 5) {
+ return n + n / 2;
+ } else if (n > 1) {
+ return n * 2;
+ }
+
+ return networkstatus_get_param(NULL,
+ "guard-n-primary-guards",
DFLT_N_PRIMARY_GUARDS, 1, INT32_MAX);
}
/**
+ * Return the number of the live primary guards we should look at when
+ * making a circuit.
+ */
+STATIC int
+get_n_primary_guards_to_use(void)
+{
+ if (get_options()->NumEntryGuards > 1) {
+ return get_options()->NumEntryGuards;
+ }
+ return networkstatus_get_param(NULL,
+ "guard-n-primary-guards-to-use",
+ DFLT_N_PRIMARY_GUARDS_TO_USE, 1, INT32_MAX);
+}
+/**
* If we haven't successfully built or used a circuit in this long, then
* consider that the internet is probably down.
*/
@@ -1795,7 +1817,7 @@ select_entry_guard_for_circuit(guard_selection_t *gs,
if (!gs->primary_guards_up_to_date)
entry_guards_update_primary(gs);
- int num_entry_guards = 1;
+ int num_entry_guards = get_n_primary_guards_to_use();
smartlist_t *usable_primary_guards = smartlist_new();
/* "If any entry in PRIMARY_GUARDS has {is_reachable} status of
diff --git a/src/or/entrynodes.h b/src/or/entrynodes.h
index 827755ab11..e2ae2561f3 100644
--- a/src/or/entrynodes.h
+++ b/src/or/entrynodes.h
@@ -472,6 +472,11 @@ int num_bridges_usable(void);
*/
#define DFLT_N_PRIMARY_GUARDS 3
/**
+ * Of the live guards on the primary guard list, how many do we consider when
+ * choosing a guard to use?
+ */
+#define DFLT_N_PRIMARY_GUARDS_TO_USE 1
+/**
* If we haven't successfully built or used a circuit in this long, then
* consider that the internet is probably down.
*/
@@ -506,6 +511,7 @@ STATIC int get_remove_unlisted_guards_after_days(void);
STATIC int get_guard_lifetime(void);
STATIC int get_guard_confirmed_min_lifetime(void);
STATIC int get_n_primary_guards(void);
+STATIC int get_n_primary_guards_to_use(void);
STATIC int get_internet_likely_down_interval(void);
STATIC int get_nonprimary_guard_connect_timeout(void);
STATIC int get_nonprimary_guard_idle_timeout(void);