summaryrefslogtreecommitdiff
path: root/src/or/circuitbuild.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2007-02-13 01:27:55 +0000
committerNick Mathewson <nickm@torproject.org>2007-02-13 01:27:55 +0000
commit3c691b9da696f78049845b7b14e084c902df9ad6 (patch)
tree561ca0c5262b5bc6677ad73210c6d054fee39cf5 /src/or/circuitbuild.c
parentdc4c1f1b21370b3c4ab0bd4d59131284ab2c3839 (diff)
downloadtor-3c691b9da696f78049845b7b14e084c902df9ad6.tar.gz
tor-3c691b9da696f78049845b7b14e084c902df9ad6.zip
r11785@catbus: nickm | 2007-02-12 20:27:48 -0500
Node-picking fixes: Never warn when a down node is listed in a config option (bug 348); always warn when a node in a config option is unnamed. Also, when entrynodes is configured, then build the guard list as: (parts of EntryNodes that were guards before), (the rest of EntryNodes), (the rest of the old guards). This last point ensures that EntryNode users will get the EntryNodes they want with the minimum change to their guard list. svn:r9574
Diffstat (limited to 'src/or/circuitbuild.c')
-rw-r--r--src/or/circuitbuild.c76
1 files changed, 44 insertions, 32 deletions
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c
index a15b2b9258..ac76c6fea0 100644
--- a/src/or/circuitbuild.c
+++ b/src/or/circuitbuild.c
@@ -1226,10 +1226,10 @@ choose_good_exit_server_general(routerlist_t *dir, int need_uptime,
n_pending_connections);
preferredexits = smartlist_create();
- add_nickname_list_to_smartlist(preferredexits,options->ExitNodes,1,1,1);
+ add_nickname_list_to_smartlist(preferredexits,options->ExitNodes,1);
excludedexits = smartlist_create();
- add_nickname_list_to_smartlist(excludedexits,options->ExcludeNodes,0,0,1);
+ add_nickname_list_to_smartlist(excludedexits,options->ExcludeNodes,0);
sl = smartlist_create();
@@ -2253,46 +2253,58 @@ entry_nodes_should_be_added(void)
void
entry_guards_prepend_from_config(void)
{
- int missed_some = 0;
- int idx;
or_options_t *options = get_options();
- smartlist_t *routers = smartlist_create();
- smartlist_t *tmp = smartlist_create();
+ smartlist_t *entry_routers = smartlist_create();
+ smartlist_t *old_entry_guards_on_list = smartlist_create();
+ smartlist_t *old_entry_guards_not_on_list = smartlist_create();
+ smartlist_t *entry_fps = smartlist_create();
tor_assert(entry_guards);
tor_assert(options->EntryNodes);
- if (options->StrictEntryNodes) {
- log_info(LD_CIRC,"Clearing old entry guards");
- SMARTLIST_FOREACH(entry_guards, entry_guard_t *, e, tor_free(e));
- smartlist_clear(entry_guards);
- entry_guards_changed();
- }
-
- add_nickname_list_to_smartlist(routers, options->EntryNodes,
- 0, 1, 1);
-
- /* take a moment first to notice whether we got them all */
log_info(LD_CIRC,"Adding configured EntryNodes '%s'.",
options->EntryNodes);
- smartlist_split_string(tmp, options->EntryNodes, ",",
- SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
- missed_some = smartlist_len(routers) != smartlist_len(tmp);
- SMARTLIST_FOREACH(tmp, char *, nick, tor_free(nick));
- smartlist_free(tmp);
- for (idx = smartlist_len(routers)-1 ; idx >= 0; idx--) {
- /* pick off the last one, turn it into a router, prepend it
- * to our entry_guards list. If we can't find it, set missed_some
- * to 1. */
- routerinfo_t *r = smartlist_get(routers, idx);
- add_an_entry_guard(r);
+ /* Split entry guards into those on the list and those not. */
+ add_nickname_list_to_smartlist(entry_routers, options->EntryNodes, 0);
+ SMARTLIST_FOREACH(entry_routers, routerinfo_t *, ri,
+ smartlist_add(entry_fps,ri->cache_info.identity_digest));
+ SMARTLIST_FOREACH(entry_guards, entry_guard_t *, e, {
+ if (smartlist_digest_isin(entry_fps, e->identity))
+ smartlist_add(old_entry_guards_on_list, e);
+ else
+ smartlist_add(old_entry_guards_not_on_list, e);
+ });
+
+ /* Remove all currently configured entry guards from entry_routers. */
+ SMARTLIST_FOREACH(entry_routers, routerinfo_t *, ri, {
+ if (is_an_entry_guard(ri->cache_info.identity_digest)) {
+ smartlist_del(entry_routers, ri_sl_idx--);
+ }
+ });
+
+ /* Now build the new entry_guards list. */
+ smartlist_clear(entry_guards);
+ /* First, the previously configured guards that are in EntryNodes. */
+ smartlist_add_all(entry_guards, old_entry_guards_on_list);
+ /* Next, the rest of EntryNodes */
+ SMARTLIST_FOREACH(entry_routers, routerinfo_t *, ri, {
+ add_an_entry_guard(ri);
+ });
+ /* Finally, the remaining EntryNodes, unless we're strict */
+ if (options->StrictEntryNodes) {
+ SMARTLIST_FOREACH(old_entry_guards_not_on_list, entry_guard_t *, e,
+ tor_free(e));
+ } else {
+ smartlist_add_all(entry_guards, old_entry_guards_not_on_list);
}
- if (!missed_some)
- should_add_entry_nodes = 0; /* whew, we're done */
-
- smartlist_free(routers);
+ should_add_entry_nodes = 0;
+ smartlist_free(entry_routers);
+ smartlist_free(entry_fps);
+ smartlist_free(old_entry_guards_on_list);
+ smartlist_free(old_entry_guards_not_on_list);
+ entry_guards_changed();
}
/** Pick a live (up and listed) entry guard from entry_guards, and