summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2016-12-08 12:47:29 -0500
committerNick Mathewson <nickm@torproject.org>2016-12-16 11:34:31 -0500
commitdeb8bcadced3c54d986c526662444a46e630621d (patch)
tree6b1c0fc75e39a7e026fdad4f04c39c589eefd3ed
parent385602e9826e79dbf0d8b51abfd925e59f275708 (diff)
downloadtor-deb8bcadced3c54d986c526662444a46e630621d.tar.gz
tor-deb8bcadced3c54d986c526662444a46e630621d.zip
271: Algorithm tweak to allow multiple entry guards.
Previously, we had NumEntryGuards kind of hardwired to 1. Now we have the code (but not the configuarability) to choose randomly from among the first N primary guards that would work, where N defaults to 1. Part of 20831 support for making NumEntryGuards work again.
-rw-r--r--src/or/entrynodes.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c
index f89594bdde..5c64dfdc43 100644
--- a/src/or/entrynodes.c
+++ b/src/or/entrynodes.c
@@ -1795,6 +1795,9 @@ 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;
+ smartlist_t *usable_primary_guards = smartlist_new();
+
/* "If any entry in PRIMARY_GUARDS has {is_reachable} status of
<maybe> or <yes>, return the first such guard." */
SMARTLIST_FOREACH_BEGIN(gs->primary_entry_guards, entry_guard_t *, guard) {
@@ -1804,12 +1807,21 @@ select_entry_guard_for_circuit(guard_selection_t *gs,
if (guard->is_reachable != GUARD_REACHABLE_NO) {
*state_out = GUARD_CIRC_STATE_USABLE_ON_COMPLETION;
guard->last_tried_to_connect = approx_time();
- log_info(LD_GUARD, "Selected primary guard %s for circuit.",
- entry_guard_describe(guard));
- return guard;
+ smartlist_add(usable_primary_guards, guard);
+ if (smartlist_len(usable_primary_guards) >= num_entry_guards)
+ break;
}
} SMARTLIST_FOREACH_END(guard);
+ if (smartlist_len(usable_primary_guards)) {
+ entry_guard_t *guard = smartlist_choose(usable_primary_guards);
+ smartlist_free(usable_primary_guards);
+ log_info(LD_GUARD, "Selected primary guard %s for circuit.",
+ entry_guard_describe(guard));
+ return guard;
+ }
+ smartlist_free(usable_primary_guards);
+
/* "Otherwise, if the ordered intersection of {CONFIRMED_GUARDS}
and {USABLE_FILTERED_GUARDS} is nonempty, return the first
entry in that intersection that has {is_pending} set to