mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2025-02-24 22:58:50 +01:00
router_choose_random_node can take a smartlist of nodes to exclude
svn:r1442
This commit is contained in:
parent
f34e6da3e7
commit
fc3d7383e7
3 changed files with 15 additions and 3 deletions
|
@ -334,7 +334,7 @@ static routerinfo_t *choose_good_exit_server(uint8_t purpose, routerlist_t *dir)
|
||||||
if(purpose == CIRCUIT_PURPOSE_C_GENERAL)
|
if(purpose == CIRCUIT_PURPOSE_C_GENERAL)
|
||||||
return choose_good_exit_server_general(dir);
|
return choose_good_exit_server_general(dir);
|
||||||
else
|
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,
|
cpath_build_state_t *onion_new_cpath_build_state(uint8_t purpose,
|
||||||
|
|
|
@ -975,7 +975,9 @@ int router_dump_router_to_string(char *s, int maxlen, routerinfo_t *router,
|
||||||
/********************************* routerlist.c ***************************/
|
/********************************* routerlist.c ***************************/
|
||||||
|
|
||||||
routerinfo_t *router_pick_directory_server(void);
|
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_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_link_pk(crypto_pk_env_t *pk);
|
||||||
routerinfo_t *router_get_by_nickname(char *nickname);
|
routerinfo_t *router_get_by_nickname(char *nickname);
|
||||||
|
|
|
@ -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;
|
smartlist_t *sl, *excludednodes;
|
||||||
routerinfo_t *choice;
|
routerinfo_t *choice;
|
||||||
|
@ -245,12 +251,16 @@ routerinfo_t *router_choose_random_node(routerlist_t *dir, char *preferred, char
|
||||||
sl = smartlist_create();
|
sl = smartlist_create();
|
||||||
add_nickname_list_to_smartlist(sl,preferred);
|
add_nickname_list_to_smartlist(sl,preferred);
|
||||||
smartlist_subtract(sl,excludednodes);
|
smartlist_subtract(sl,excludednodes);
|
||||||
|
if(excludedsmartlist)
|
||||||
|
smartlist_subtract(sl,excludedsmartlist);
|
||||||
choice = smartlist_choose(sl);
|
choice = smartlist_choose(sl);
|
||||||
smartlist_free(sl);
|
smartlist_free(sl);
|
||||||
if(!choice) {
|
if(!choice) {
|
||||||
sl = smartlist_create();
|
sl = smartlist_create();
|
||||||
router_add_running_routers_to_smartlist(sl);
|
router_add_running_routers_to_smartlist(sl);
|
||||||
smartlist_subtract(sl,excludednodes);
|
smartlist_subtract(sl,excludednodes);
|
||||||
|
if(excludedsmartlist)
|
||||||
|
smartlist_subtract(sl,excludedsmartlist);
|
||||||
choice = smartlist_choose(sl);
|
choice = smartlist_choose(sl);
|
||||||
smartlist_free(sl);
|
smartlist_free(sl);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue