diff options
author | Roger Dingledine <arma@torproject.org> | 2004-04-02 22:30:39 +0000 |
---|---|---|
committer | Roger Dingledine <arma@torproject.org> | 2004-04-02 22:30:39 +0000 |
commit | fc3d7383e75499ccd78afbbadeda39c7b5c3012f (patch) | |
tree | 607ab261b065f907a74427c76c8138bae10e3fb6 | |
parent | f34e6da3e75ad5b681c68e6c0a50d65d4566f9cf (diff) | |
download | tor-fc3d7383e75499ccd78afbbadeda39c7b5c3012f.tar tor-fc3d7383e75499ccd78afbbadeda39c7b5c3012f.tar.gz |
router_choose_random_node can take a smartlist of nodes to exclude
svn:r1442
-rw-r--r-- | src/or/onion.c | 2 | ||||
-rw-r--r-- | src/or/or.h | 4 | ||||
-rw-r--r-- | src/or/routerlist.c | 12 |
3 files changed, 15 insertions, 3 deletions
diff --git a/src/or/onion.c b/src/or/onion.c index 36f76415a..44e32c44f 100644 --- a/src/or/onion.c +++ b/src/or/onion.c @@ -334,7 +334,7 @@ static routerinfo_t *choose_good_exit_server(uint8_t purpose, routerlist_t *dir) if(purpose == CIRCUIT_PURPOSE_C_GENERAL) return choose_good_exit_server_general(dir); else - return router_choose_random_node(dir, options.RendNodes, options.RendExcludeNodes); + return router_choose_random_node(dir, options.RendNodes, options.RendExcludeNodes, NULL); } cpath_build_state_t *onion_new_cpath_build_state(uint8_t purpose, diff --git a/src/or/or.h b/src/or/or.h index 41836c7b0..83c06ab8c 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -975,7 +975,9 @@ int router_dump_router_to_string(char *s, int maxlen, routerinfo_t *router, /********************************* routerlist.c ***************************/ routerinfo_t *router_pick_directory_server(void); -routerinfo_t *router_choose_random_node(routerlist_t *dir, char *preferred, char *excluded); +routerinfo_t *router_choose_random_node(routerlist_t *dir, + char *preferred, char *excluded, + smartlist_t *excludedsmartlist); routerinfo_t *router_get_by_addr_port(uint32_t addr, uint16_t port); routerinfo_t *router_get_by_link_pk(crypto_pk_env_t *pk); routerinfo_t *router_get_by_nickname(char *nickname); diff --git a/src/or/routerlist.c b/src/or/routerlist.c index b913f9171..048dc4947 100644 --- a/src/or/routerlist.c +++ b/src/or/routerlist.c @@ -233,7 +233,13 @@ void router_add_running_routers_to_smartlist(smartlist_t *sl) { } } -routerinfo_t *router_choose_random_node(routerlist_t *dir, char *preferred, char *excluded) +/* Pick a random node from preferred if possible, else from all of dir. + * Never pick a node in excluded. + * If excludedsmartlist is defined, never pick a node in it either. + */ +routerinfo_t *router_choose_random_node(routerlist_t *dir, + char *preferred, char *excluded, + smartlist_t *excludedsmartlist) { smartlist_t *sl, *excludednodes; routerinfo_t *choice; @@ -245,12 +251,16 @@ routerinfo_t *router_choose_random_node(routerlist_t *dir, char *preferred, char sl = smartlist_create(); add_nickname_list_to_smartlist(sl,preferred); smartlist_subtract(sl,excludednodes); + if(excludedsmartlist) + smartlist_subtract(sl,excludedsmartlist); choice = smartlist_choose(sl); smartlist_free(sl); if(!choice) { sl = smartlist_create(); router_add_running_routers_to_smartlist(sl); smartlist_subtract(sl,excludednodes); + if(excludedsmartlist) + smartlist_subtract(sl,excludedsmartlist); choice = smartlist_choose(sl); smartlist_free(sl); } |