New ReconfigDropsBridgeDescs config option

Let external bridge reachability testing tools discard cached
bridge descriptors when setting new bridges, so they can be sure
to get a clean reachability test.

Implements ticket 40209.
This commit is contained in:
Roger Dingledine 2021-01-25 02:16:44 -05:00
parent af5250b1df
commit 01a5b41be0
5 changed files with 39 additions and 0 deletions

4
changes/ticket40209 Normal file
View File

@ -0,0 +1,4 @@
o Minor features (bridge testing support):
- Let external bridge reachability testing tools discard cached
bridge descriptors when setting new bridges, so they can be sure
to get a clean reachability test. Implements ticket 40209.

View File

@ -628,6 +628,7 @@ static const config_var_t option_vars_[] = {
V(ConnectionPadding, AUTOBOOL, "auto"), V(ConnectionPadding, AUTOBOOL, "auto"),
V(RefuseUnknownExits, AUTOBOOL, "auto"), V(RefuseUnknownExits, AUTOBOOL, "auto"),
V(CircuitPadding, BOOL, "1"), V(CircuitPadding, BOOL, "1"),
V(ReconfigDropsBridgeDescs, BOOL, "0"),
V(ReducedCircuitPadding, BOOL, "0"), V(ReducedCircuitPadding, BOOL, "0"),
V(RejectPlaintextPorts, CSV, ""), V(RejectPlaintextPorts, CSV, ""),
V(RelayBandwidthBurst, MEMUNIT, "0"), V(RelayBandwidthBurst, MEMUNIT, "0"),
@ -2321,6 +2322,8 @@ options_act,(const or_options_t *old_options))
} }
if (transition_affects_guards) { if (transition_affects_guards) {
if (options->ReconfigDropsBridgeDescs)
routerlist_drop_bridge_descriptors();
if (guards_update_all()) { if (guards_update_all()) {
abandon_circuits = 1; abandon_circuits = 1;
} }

View File

@ -293,6 +293,13 @@ struct or_options_t {
* disabled. */ * disabled. */
int CircuitPadding; int CircuitPadding;
/** Boolean: if true, then this client will discard cached bridge
* descriptors on a setconf or other config change that impacts guards
* or bridges (see options_transition_affects_guards() for exactly which
* config changes trigger it). Useful for tools that test bridge
* reachability by fetching fresh descriptors. */
int ReconfigDropsBridgeDescs;
/** Boolean: if true, then this client will only use circuit padding /** Boolean: if true, then this client will only use circuit padding
* algorithms that are known to use a low amount of overhead. If false, * algorithms that are known to use a low amount of overhead. If false,
* we will use all available circuit padding algorithms. * we will use all available circuit padding algorithms.

View File

@ -2012,6 +2012,30 @@ routerlist_remove_old_routers(void)
router_rebuild_store(RRS_DONT_REMOVE_OLD,&routerlist->extrainfo_store); router_rebuild_store(RRS_DONT_REMOVE_OLD,&routerlist->extrainfo_store);
} }
/* Drop every bridge descriptor in our routerlist. Used by the external
* 'bridgestrap' tool to discard bridge descriptors so that it can then
* do a clean reachability test. */
void
routerlist_drop_bridge_descriptors(void)
{
routerinfo_t *router;
int i;
if (!routerlist)
return;
for (i = 0; i < smartlist_len(routerlist->routers); ++i) {
router = smartlist_get(routerlist->routers, i);
if (router->purpose == ROUTER_PURPOSE_BRIDGE) {
log_notice(LD_DIR,
"Dropping existing bridge descriptor for %s",
router_describe(router));
routerlist_remove(routerlist, router, 0, time(NULL));
i--;
}
}
}
/** We just added a new set of descriptors. Take whatever extra steps /** We just added a new set of descriptors. Take whatever extra steps
* we need. */ * we need. */
void void

View File

@ -145,6 +145,7 @@ was_router_added_t router_add_extrainfo_to_routerlist(
int from_cache, int from_fetch); int from_cache, int from_fetch);
void routerlist_descriptors_added(smartlist_t *sl, int from_cache); void routerlist_descriptors_added(smartlist_t *sl, int from_cache);
void routerlist_remove_old_routers(void); void routerlist_remove_old_routers(void);
void routerlist_drop_bridge_descriptors(void);
int router_load_single_router(const char *s, uint8_t purpose, int cache, int router_load_single_router(const char *s, uint8_t purpose, int cache,
const char **msg); const char **msg);
int router_load_routers_from_string(const char *s, const char *eos, int router_load_routers_from_string(const char *s, const char *eos,