diff options
author | Neel Chauhan <neel@neelc.org> | 2018-06-16 11:27:28 -0400 |
---|---|---|
committer | Neel Chauhan <neel@neelc.org> | 2018-06-16 11:27:28 -0400 |
commit | 9d7f148885a9334605cfb396bb06ad546349ad6a (patch) | |
tree | 77934279d1a0136e5a4b26acc373109c5681b052 | |
parent | 97cc61e9476d6553e65ade578cc57a029674ee5a (diff) | |
download | tor-9d7f148885a9334605cfb396bb06ad546349ad6a.tar.gz tor-9d7f148885a9334605cfb396bb06ad546349ad6a.zip |
Make frac_nodes_with_descriptors() take and use for_direct_connect
-rw-r--r-- | changes/bug25886 | 7 | ||||
-rw-r--r-- | src/or/nodelist.c | 16 | ||||
-rw-r--r-- | src/or/routerlist.c | 13 | ||||
-rw-r--r-- | src/or/routerlist.h | 3 |
4 files changed, 29 insertions, 10 deletions
diff --git a/changes/bug25886 b/changes/bug25886 new file mode 100644 index 0000000000..45f9a54069 --- /dev/null +++ b/changes/bug25886 @@ -0,0 +1,7 @@ + o Minor bugfixes (relay): + - In frac_nodes_with_descriptors(), add for_direct_connect, and replace + node_has_any_descriptor() with node_has_preferred_descriptor(). Also, + if we are using bridges and there is at least one bridge with a full + descriptor, set f_guard in compute_frac_paths_available() to 1.0. + Fixes bug 25886; bugfix on 0.3.5.1-alpha. Patch by Neel Chauhan. + diff --git a/src/or/nodelist.c b/src/or/nodelist.c index bc9a79940b..b589812344 100644 --- a/src/or/nodelist.c +++ b/src/or/nodelist.c @@ -2213,9 +2213,14 @@ compute_frac_paths_available(const networkstatus_t *consensus, * browsing (as distinct from hidden service web browsing). */ } - f_guard = frac_nodes_with_descriptors(guards, WEIGHT_FOR_GUARD); - f_mid = frac_nodes_with_descriptors(mid, WEIGHT_FOR_MID); - f_exit = frac_nodes_with_descriptors(exits, WEIGHT_FOR_EXIT); + f_guard = frac_nodes_with_descriptors(guards, WEIGHT_FOR_GUARD, 1); + f_mid = frac_nodes_with_descriptors(mid, WEIGHT_FOR_MID, 0); + f_exit = frac_nodes_with_descriptors(exits, WEIGHT_FOR_EXIT, 0); + + /* If we are using bridges and have at least one bridge with a full + * descriptor, assume f_guard is 1.0. */ + if (options->UseBridges && num_bridges_usable(0) > 0) + f_guard = 1.0; log_debug(LD_NET, "f_guard: %.2f, f_mid: %.2f, f_exit: %.2f", @@ -2269,9 +2274,10 @@ compute_frac_paths_available(const networkstatus_t *consensus, np, nu); - f_myexit= frac_nodes_with_descriptors(myexits,WEIGHT_FOR_EXIT); + f_myexit= frac_nodes_with_descriptors(myexits, WEIGHT_FOR_EXIT, 0); f_myexit_unflagged= - frac_nodes_with_descriptors(myexits_unflagged,WEIGHT_FOR_EXIT); + frac_nodes_with_descriptors(myexits_unflagged, + WEIGHT_FOR_EXIT, 0); log_debug(LD_NET, "f_exit: %.2f, f_myexit: %.2f, f_myexit_unflagged: %.2f", diff --git a/src/or/routerlist.c b/src/or/routerlist.c index 8788dc0190..728137bf9c 100644 --- a/src/or/routerlist.c +++ b/src/or/routerlist.c @@ -2746,10 +2746,15 @@ compute_weighted_bandwidths(const smartlist_t *sl, /** For all nodes in <b>sl</b>, return the fraction of those nodes, weighted * by their weighted bandwidths with rule <b>rule</b>, for which we have - * descriptors. */ + * descriptors. + * + * If <b>for_direct_connect</b> is true, we intend to connect to the node + * directly, as the first hop of a circuit; otherwise, we intend to connect + * to it indirectly, or use it as if we were connecting to it indirectly. */ double frac_nodes_with_descriptors(const smartlist_t *sl, - bandwidth_weight_rule_t rule) + bandwidth_weight_rule_t rule, + int for_direct_conn) { double *bandwidths = NULL; double total, present; @@ -2761,7 +2766,7 @@ frac_nodes_with_descriptors(const smartlist_t *sl, total <= 0.0) { int n_with_descs = 0; SMARTLIST_FOREACH(sl, const node_t *, node, { - if (node_has_any_descriptor(node)) + if (node_has_preferred_descriptor(node, for_direct_conn)) n_with_descs++; }); return ((double)n_with_descs) / smartlist_len(sl); @@ -2769,7 +2774,7 @@ frac_nodes_with_descriptors(const smartlist_t *sl, present = 0.0; SMARTLIST_FOREACH_BEGIN(sl, const node_t *, node) { - if (node_has_any_descriptor(node)) + if (node_has_preferred_descriptor(node, for_direct_conn)) present += bandwidths[node_sl_idx]; } SMARTLIST_FOREACH_END(node); diff --git a/src/or/routerlist.h b/src/or/routerlist.h index 83f4d1002f..cd22548c46 100644 --- a/src/or/routerlist.h +++ b/src/or/routerlist.h @@ -74,7 +74,8 @@ uint32_t router_get_advertised_bandwidth_capped(const routerinfo_t *router); const node_t *node_sl_choose_by_bandwidth(const smartlist_t *sl, bandwidth_weight_rule_t rule); double frac_nodes_with_descriptors(const smartlist_t *sl, - bandwidth_weight_rule_t rule); + bandwidth_weight_rule_t rule, + int for_direct_conn); const node_t *router_choose_random_node(smartlist_t *excludedsmartlist, struct routerset_t *excludedset, |