mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
Use an upper and lower bound for bridge weights
When picking bridges (or other nodes without a consensus entry (and thus no bandwidth weights)) we shouldn't just trust the node's descriptor. So far we believed anything between 0 and 10MB/s, where 0 would mean that a node doesn't get any use from use unless it is our only one, and 10MB/s would be a quite siginficant weight. To make this situation better, we now believe weights in the range from 20kB/s to 100kB/s. This should allow new bridges to get use more quickly, and means that it will be harder for bridges to see almost all our traffic.
This commit is contained in:
+25
-2
@@ -1572,6 +1572,29 @@ router_get_advertised_bandwidth_capped(routerinfo_t *router)
|
||||
return result;
|
||||
}
|
||||
|
||||
/** When weighting bridges, enforce these values as lower and upper
|
||||
* bound for believable bandwidth, because there is no way for us
|
||||
* to verify a bridge's bandwidth currently. */
|
||||
#define BRIDGE_MIN_BELIEVABLE_BANDWIDTH 20000 /* 20 kB/sec */
|
||||
#define BRIDGE_MAX_BELIEVABLE_BANDWIDTH 100000 /* 100 kB/sec */
|
||||
|
||||
/** Return the smaller of the router's configured BandwidthRate
|
||||
* and its advertised capacity, making sure to stay within the
|
||||
* interval between bridge-min-believe-bw and
|
||||
* bridge-max-believe-bw. */
|
||||
static uint32_t
|
||||
bridge_get_advertised_bandwidth_bounded(routerinfo_t *router)
|
||||
{
|
||||
uint32_t result = router->bandwidthcapacity;
|
||||
if (result > router->bandwidthrate)
|
||||
result = router->bandwidthrate;
|
||||
if (result > BRIDGE_MAX_BELIEVABLE_BANDWIDTH)
|
||||
result = BRIDGE_MAX_BELIEVABLE_BANDWIDTH;
|
||||
else if (result < BRIDGE_MIN_BELIEVABLE_BANDWIDTH)
|
||||
result = BRIDGE_MIN_BELIEVABLE_BANDWIDTH;
|
||||
return result;
|
||||
}
|
||||
|
||||
/** Return bw*1000, unless bw*1000 would overflow, in which case return
|
||||
* INT32_MAX. */
|
||||
static INLINE int32_t
|
||||
@@ -1726,7 +1749,7 @@ smartlist_choose_by_bandwidth_weights(smartlist_t *sl,
|
||||
if (rs && rs->has_bandwidth) {
|
||||
this_bw = kb_to_bytes(rs->bandwidth);
|
||||
} else { /* bridge or other descriptor not in our consensus */
|
||||
this_bw = router_get_advertised_bandwidth_capped(router);
|
||||
this_bw = bridge_get_advertised_bandwidth_bounded(router);
|
||||
have_unknown = 1;
|
||||
}
|
||||
if (router_digest_is_me(router->cache_info.identity_digest))
|
||||
@@ -1897,7 +1920,7 @@ smartlist_choose_by_bandwidth(smartlist_t *sl, bandwidth_weight_rule_t rule,
|
||||
flags |= is_exit ? 2 : 0;
|
||||
flags |= is_guard ? 4 : 0;
|
||||
} else /* bridge or other descriptor not in our consensus */
|
||||
this_bw = router_get_advertised_bandwidth_capped(router);
|
||||
this_bw = bridge_get_advertised_bandwidth_bounded(router);
|
||||
}
|
||||
if (is_exit)
|
||||
bitarray_set(exit_bits, i);
|
||||
|
||||
Reference in New Issue
Block a user