Tor 0.4.9.1-alpha-dev
voteflags.c
Go to the documentation of this file.
1/* Copyright (c) 2001-2004, Roger Dingledine.
2 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
3 * Copyright (c) 2007-2021, The Tor Project, Inc. */
4/* See LICENSE for licensing information */
5
6/**
7 * \file voteflags.c
8 * \brief Authority code for deciding the performance thresholds for flags,
9 * and assigning flags to routers.
10 **/
11
12#define VOTEFLAGS_PRIVATE
13#include "core/or/or.h"
15
16#include "app/config/config.h"
18#include "core/or/policies.h"
30
36
37#include "lib/container/order.h"
38
39/* Thresholds for server performance: set by
40 * dirserv_compute_performance_thresholds, and used by
41 * generate_v2_networkstatus */
42
43/** Any router with an uptime of at least this value is stable. */
44static uint32_t stable_uptime = 0; /* start at a safe value */
45/** Any router with an mtbf of at least this value is stable. */
46static double stable_mtbf = 0.0;
47/** If true, we have measured enough mtbf info to look at stable_mtbf rather
48 * than stable_uptime. */
49static int enough_mtbf_info = 0;
50/** Any router with a weighted fractional uptime of at least this much might
51 * be good as a guard. */
52static double guard_wfu = 0.0;
53/** Don't call a router a guard unless we've known about it for at least this
54 * many seconds. */
55static long guard_tk = 0;
56/** Any router with a bandwidth at least this high is "Fast" */
57static uint32_t fast_bandwidth_kb = 0;
58/** If exits can be guards, then all guards must have a bandwidth this
59 * high. */
61/** If exits can't be guards, then all guards must have a bandwidth this
62 * high. */
64
65/** Helper: estimate the uptime of a router given its stated uptime and the
66 * amount of time since it last stated its stated uptime. */
67static inline long
68real_uptime(const routerinfo_t *router, time_t now)
69{
70 if (now < router->cache_info.published_on)
71 return router->uptime;
72 else
73 return router->uptime + (now - router->cache_info.published_on);
74}
75
76/** Return 1 if <b>router</b> is not suitable for these parameters, else 0.
77 * If <b>need_uptime</b> is non-zero, we require a minimum uptime.
78 * If <b>need_capacity</b> is non-zero, we require a minimum advertised
79 * bandwidth.
80 */
81static int
83 const routerinfo_t *router,
84 int need_uptime, int need_capacity)
85{
86 if (need_uptime) {
87 if (!enough_mtbf_info) {
88 /* XXXX We should change the rule from
89 * "use uptime if we don't have mtbf data" to "don't advertise Stable on
90 * v3 if we don't have enough mtbf data." Or maybe not, since if we ever
91 * hit a point where we need to reset a lot of authorities at once,
92 * none of them would be in a position to declare Stable.
93 */
94 long uptime = real_uptime(router, now);
95 if ((unsigned)uptime < stable_uptime &&
96 uptime < dirauth_get_options()->AuthDirVoteStableGuaranteeMinUptime)
97 return 1;
98 } else {
99 double mtbf =
100 rep_hist_get_stability(router->cache_info.identity_digest, now);
101 if (mtbf < stable_mtbf &&
102 mtbf < dirauth_get_options()->AuthDirVoteStableGuaranteeMTBF)
103 return 1;
104 }
105 }
106 if (need_capacity) {
107 uint32_t bw_kb = dirserv_get_credible_bandwidth_kb(router);
108 if (bw_kb < fast_bandwidth_kb)
109 return 1;
110 }
111 return 0;
112}
113
114/** Return 1 if <b>ri</b>'s descriptor is "active" -- running, valid,
115 * not hibernating, and not too old. Else return 0.
116 */
117static int
118router_is_active(const routerinfo_t *ri, const node_t *node, time_t now)
119{
120 time_t cutoff = now - ROUTER_MAX_AGE_TO_PUBLISH;
121 if (ri->cache_info.published_on < cutoff) {
122 return 0;
123 }
124 if (!node->is_running || !node->is_valid || ri->is_hibernating) {
125 return 0;
126 }
127 return 1;
128}
129
130/** Return true iff <b>router</b> should be assigned the "HSDir" flag.
131 *
132 * Right now this means it advertises support for it, it has a high uptime,
133 * it's a directory cache, it has the Stable and Fast flags, and it's currently
134 * considered Running.
135 *
136 * This function needs to be called after router->is_running has
137 * been set.
138 */
139static int
141 const node_t *node, time_t now)
142{
143
144 long uptime;
145
146 /* If we haven't been running for at least
147 * MinUptimeHidServDirectoryV2 seconds, we can't
148 * have accurate data telling us a relay has been up for at least
149 * that long. We also want to allow a bit of slack: Reachability
150 * tests aren't instant. If we haven't been running long enough,
151 * trust the relay. */
152
153 if (get_uptime() >
154 dirauth_get_options()->MinUptimeHidServDirectoryV2 * 1.1)
155 uptime = MIN(rep_hist_get_uptime(router->cache_info.identity_digest, now),
156 real_uptime(router, now));
157 else
158 uptime = real_uptime(router, now);
159
160 return (router->wants_to_be_hs_dir &&
162 node->is_stable && node->is_fast &&
163 uptime >= dirauth_get_options()->MinUptimeHidServDirectoryV2 &&
164 router_is_active(router, node, now));
165}
166
167/** Don't consider routers with less bandwidth than this when computing
168 * thresholds. */
169#define ABSOLUTE_MIN_BW_VALUE_TO_CONSIDER_KB 4
170
171/** Helper for dirserv_compute_performance_thresholds(): Decide whether to
172 * include a router in our calculations, and return true iff we should; the
173 * require_mbw parameter is passed in by
174 * dirserv_compute_performance_thresholds() and controls whether we ever
175 * count routers with only advertised bandwidths */
176static int
178 const digestmap_t *omit_as_sybil,
179 int require_mbw)
180{
181 /* Have measured bw? */
182 int have_mbw =
184 uint64_t min_bw_kb = ABSOLUTE_MIN_BW_VALUE_TO_CONSIDER_KB;
185 const or_options_t *options = get_options();
186 const dirauth_options_t *dirauth_options = dirauth_get_options();
187
188 if (options->TestingTorNetwork) {
189 min_bw_kb = (int64_t)dirauth_options->TestingMinExitFlagThreshold / 1000;
190 }
191
192 return node->ri && router_is_active(node->ri, node, now) &&
193 !digestmap_get(omit_as_sybil, node->identity) &&
194 (dirserv_get_credible_bandwidth_kb(node->ri) >= min_bw_kb) &&
195 (have_mbw || !require_mbw);
196}
197
198/** Look through the routerlist, the Mean Time Between Failure history, and
199 * the Weighted Fractional Uptime history, and use them to set thresholds for
200 * the Stable, Fast, and Guard flags. Update the fields stable_uptime,
201 * stable_mtbf, enough_mtbf_info, guard_wfu, guard_tk, fast_bandwidth,
202 * guard_bandwidth_including_exits, and guard_bandwidth_excluding_exits.
203 *
204 * Also, set the is_exit flag of each router appropriately. */
205void
206dirserv_compute_performance_thresholds(digestmap_t *omit_as_sybil)
207{
208 int n_active, n_active_nonexit, n_familiar;
209 uint32_t *uptimes, *bandwidths_kb, *bandwidths_excluding_exits_kb;
210 long *tks;
211 double *mtbfs, *wfus;
212 const smartlist_t *nodelist;
213 time_t now = time(NULL);
214 const or_options_t *options = get_options();
215 const dirauth_options_t *dirauth_options = dirauth_get_options();
216
217 /* Require mbw? */
218 int require_mbw =
220 dirauth_options->MinMeasuredBWsForAuthToIgnoreAdvertised) ? 1 : 0;
221
222 /* initialize these all here, in case there are no routers */
223 stable_uptime = 0;
224 stable_mtbf = 0;
228 guard_tk = 0;
229 guard_wfu = 0;
230
232 nodelist = nodelist_get_list();
233
234 /* Initialize arrays that will hold values for each router. We'll
235 * sort them and use that to compute thresholds. */
236 n_active = n_active_nonexit = 0;
237 /* Uptime for every active router. */
238 uptimes = tor_calloc(smartlist_len(nodelist), sizeof(uint32_t));
239 /* Bandwidth for every active router. */
240 bandwidths_kb = tor_calloc(smartlist_len(nodelist), sizeof(uint32_t));
241 /* Bandwidth for every active non-exit router. */
242 bandwidths_excluding_exits_kb =
243 tor_calloc(smartlist_len(nodelist), sizeof(uint32_t));
244 /* Weighted mean time between failure for each active router. */
245 mtbfs = tor_calloc(smartlist_len(nodelist), sizeof(double));
246 /* Time-known for each active router. */
247 tks = tor_calloc(smartlist_len(nodelist), sizeof(long));
248 /* Weighted fractional uptime for each active router. */
249 wfus = tor_calloc(smartlist_len(nodelist), sizeof(double));
250
251 /* Now, fill in the arrays. */
252 SMARTLIST_FOREACH_BEGIN(nodelist, node_t *, node) {
253 if (options->BridgeAuthoritativeDir &&
254 node->ri &&
255 node->ri->purpose != ROUTER_PURPOSE_BRIDGE)
256 continue;
257
258 routerinfo_t *ri = node->ri;
259 if (ri) {
260 node->is_exit = (!router_exit_policy_rejects_all(ri) &&
262 }
263
264 if (router_counts_toward_thresholds(node, now, omit_as_sybil,
265 require_mbw)) {
266 const char *id = node->identity;
267 uint32_t bw_kb;
268
269 /* resolve spurious clang shallow analysis null pointer errors */
270 tor_assert(ri);
271
272 uptimes[n_active] = (uint32_t)real_uptime(ri, now);
273 mtbfs[n_active] = rep_hist_get_stability(id, now);
274 tks [n_active] = rep_hist_get_weighted_time_known(id, now);
275 bandwidths_kb[n_active] = bw_kb = dirserv_get_credible_bandwidth_kb(ri);
276 if (!node->is_exit || node->is_bad_exit) {
277 bandwidths_excluding_exits_kb[n_active_nonexit] = bw_kb;
278 ++n_active_nonexit;
279 }
280 ++n_active;
281 }
282 } SMARTLIST_FOREACH_END(node);
283
284 /* Now, compute thresholds. */
285 if (n_active) {
286 /* The median uptime is stable. */
287 stable_uptime = median_uint32(uptimes, n_active);
288 /* The median mtbf is stable, if we have enough mtbf info */
289 stable_mtbf = median_double(mtbfs, n_active);
290 /* The 12.5th percentile bandwidth is fast. */
291 fast_bandwidth_kb = find_nth_uint32(bandwidths_kb, n_active, n_active/8);
292 /* (Now bandwidths is sorted.) */
293 if (fast_bandwidth_kb < RELAY_REQUIRED_MIN_BANDWIDTH/(2 * 1000))
294 fast_bandwidth_kb = bandwidths_kb[n_active/4];
295 int nth = (int)(n_active *
296 dirauth_options->AuthDirVoteGuardBwThresholdFraction);
298 find_nth_uint32(bandwidths_kb, n_active, nth);
299 guard_tk = find_nth_long(tks, n_active, n_active/8);
300 }
301
302 if (guard_tk > dirauth_options->AuthDirVoteGuardGuaranteeTimeKnown)
304
305 {
306 /* We can vote on a parameter for the minimum and maximum. */
307#define ABSOLUTE_MIN_VALUE_FOR_FAST_FLAG 4
308 int32_t min_fast_kb, max_fast_kb, min_fast, max_fast;
309 min_fast = networkstatus_get_param(NULL, "FastFlagMinThreshold",
310 ABSOLUTE_MIN_VALUE_FOR_FAST_FLAG,
311 ABSOLUTE_MIN_VALUE_FOR_FAST_FLAG,
312 INT32_MAX);
313 if (options->TestingTorNetwork) {
314 min_fast = (int32_t)dirauth_options->TestingMinFastFlagThreshold;
315 }
316 max_fast = networkstatus_get_param(NULL, "FastFlagMaxThreshold",
317 INT32_MAX, min_fast, INT32_MAX);
318 min_fast_kb = min_fast / 1000;
319 max_fast_kb = max_fast / 1000;
320
321 if (fast_bandwidth_kb < (uint32_t)min_fast_kb)
322 fast_bandwidth_kb = min_fast_kb;
323 if (fast_bandwidth_kb > (uint32_t)max_fast_kb)
324 fast_bandwidth_kb = max_fast_kb;
325 }
326 /* Protect sufficiently fast nodes from being pushed out of the set
327 * of Fast nodes. */
328 {
329 const uint64_t fast_opt = dirauth_get_options()->AuthDirFastGuarantee;
330 if (fast_opt && fast_bandwidth_kb > fast_opt / 1000)
331 fast_bandwidth_kb = (uint32_t)(fast_opt / 1000);
332 }
333
334 /* Now that we have a time-known that 7/8 routers are known longer than,
335 * fill wfus with the wfu of every such "familiar" router. */
336 n_familiar = 0;
337
338 SMARTLIST_FOREACH_BEGIN(nodelist, node_t *, node) {
340 omit_as_sybil, require_mbw)) {
341 routerinfo_t *ri = node->ri;
342 const char *id = ri->cache_info.identity_digest;
343 long tk = rep_hist_get_weighted_time_known(id, now);
344 if (tk < guard_tk)
345 continue;
346 wfus[n_familiar++] = rep_hist_get_weighted_fractional_uptime(id, now);
347 }
348 } SMARTLIST_FOREACH_END(node);
349 if (n_familiar)
350 guard_wfu = median_double(wfus, n_familiar);
351 if (guard_wfu > dirauth_options->AuthDirVoteGuardGuaranteeWFU)
352 guard_wfu = dirauth_options->AuthDirVoteGuardGuaranteeWFU;
353
355
356 if (n_active_nonexit) {
357 int nth = (int)(n_active_nonexit *
358 dirauth_options->AuthDirVoteGuardBwThresholdFraction);
360 find_nth_uint32(bandwidths_excluding_exits_kb, n_active_nonexit, nth);
361 }
362
363 log_info(LD_DIRSERV,
364 "Cutoffs: For Stable, %lu sec uptime, %lu sec MTBF. "
365 "For Fast: %lu kilobytes/sec. "
366 "For Guard: WFU %.03f%%, time-known %lu sec, "
367 "and bandwidth %lu or %lu kilobytes/sec. "
368 "We%s have enough stability data.",
369 (unsigned long)stable_uptime,
370 (unsigned long)stable_mtbf,
371 (unsigned long)fast_bandwidth_kb,
372 guard_wfu*100,
373 (unsigned long)guard_tk,
376 enough_mtbf_info ? "" : " don't");
377
378 tor_free(uptimes);
379 tor_free(mtbfs);
380 tor_free(bandwidths_kb);
381 tor_free(bandwidths_excluding_exits_kb);
382 tor_free(tks);
383 tor_free(wfus);
384}
385
386/* Use dirserv_compute_performance_thresholds() to compute the thresholds
387 * for the status flags, specifically for bridges.
388 *
389 * This is only called by a Bridge Authority from
390 * networkstatus_getinfo_by_purpose().
391 */
392void
393dirserv_compute_bridge_flag_thresholds(void)
394{
395 digestmap_t *omit_as_sybil = digestmap_new();
397 digestmap_free(omit_as_sybil, NULL);
398}
399
400/** Give a statement of our current performance thresholds for inclusion
401 * in a vote document. */
402char *
404{
405 char *result=NULL;
406 const int measured_threshold =
407 dirauth_get_options()->MinMeasuredBWsForAuthToIgnoreAdvertised;
408 const int enough_measured_bw =
409 dirserv_get_last_n_measured_bws() > measured_threshold;
410
411 tor_asprintf(&result,
412 "stable-uptime=%lu stable-mtbf=%lu "
413 "fast-speed=%lu "
414 "guard-wfu=%.03f%% guard-tk=%lu "
415 "guard-bw-inc-exits=%lu guard-bw-exc-exits=%lu "
416 "enough-mtbf=%d ignoring-advertised-bws=%d",
417 (unsigned long)stable_uptime,
418 (unsigned long)stable_mtbf,
419 (unsigned long)fast_bandwidth_kb*1000,
420 guard_wfu*100,
421 (unsigned long)guard_tk,
422 (unsigned long)guard_bandwidth_including_exits_kb*1000,
423 (unsigned long)guard_bandwidth_excluding_exits_kb*1000,
424 enough_mtbf_info ? 1 : 0,
425 enough_measured_bw ? 1 : 0);
426
427 return result;
428}
429
430/** Directory authorities should avoid expressing an opinion on the
431 * Running flag if their own uptime is too low for the opinion to be
432 * accurate. They implement this step by not listing Running on the
433 * "known-flags" line in their vote.
434 *
435 * The default threshold is 30 minutes, because authorities do a full
436 * reachability sweep of the ID space every 10*128=1280 seconds
437 * (see REACHABILITY_TEST_CYCLE_PERIOD).
438 *
439 * For v3 dir auths, as long as some authorities express an opinion about
440 * Running, it's fine if a few authorities don't. There's an explicit
441 * check, when making the consensus, to abort if *no* authorities list
442 * Running as a known-flag.
443 *
444 * For the bridge authority, if it doesn't vote about Running, the
445 * resulting networkstatus file simply won't list any bridges as Running.
446 * That means the supporting tools, like bridgedb/rdsys and onionoo, need
447 * to be able to handle getting a bridge networkstatus document with no
448 * Running flags. For more details, see
449 * https://bugs.torproject.org/tpo/anti-censorship/rdsys/102 */
450int
452{
453 const dirauth_options_t *opts = dirauth_get_options();
454 return time_of_process_start +
456}
457
458/** Each server needs to have passed a reachability test no more
459 * than this number of seconds ago, or it is listed as down in
460 * the directory. */
461#define REACHABLE_TIMEOUT (45*60)
462
463/** If we tested a router and found it reachable _at least this long_ after it
464 * declared itself hibernating, it is probably done hibernating and we just
465 * missed a descriptor from it. */
466#define HIBERNATION_PUBLICATION_SKEW (60*60)
467
468/** Treat a router as alive if
469 * - It's me, and I'm not hibernating.
470 * or - We've found it reachable recently. */
471void
473{
474 /*XXXX This function is a mess. Separate out the part that calculates
475 whether it's reachable and the part that tells rephist that the router was
476 unreachable.
477 */
478 int answer;
479 const dirauth_options_t *dirauth_options = dirauth_get_options();
480 node_t *node = node_get_mutable_by_id(router->cache_info.identity_digest);
481 tor_assert(node);
482
483 if (router_is_me(router)) {
484 /* We always know if we are shutting down or hibernating ourselves. */
485 answer = ! we_are_hibernating();
486 } else if (router->is_hibernating &&
487 (router->cache_info.published_on +
489 /* A hibernating router is down unless we (somehow) had contact with it
490 * since it declared itself to be hibernating. */
491 answer = 0;
492 } else if (! dirauth_options->AuthDirTestReachability) {
493 /* If we aren't testing reachability, then everybody is up unless they say
494 * they are down. */
495 answer = 1;
496 } else {
497 /* Otherwise, a router counts as up if we found all announced OR
498 ports reachable in the last REACHABLE_TIMEOUT seconds.
499
500 XXX prop186 For now there's always one IPv4 and at most one
501 IPv6 OR port.
502
503 If we're not on IPv6, don't consider reachability of potential
504 IPv6 OR port since that'd kill all dual stack relays until a
505 majority of the dir auths have IPv6 connectivity. */
506 answer = (now < node->last_reachable + REACHABLE_TIMEOUT &&
507 (dirauth_options->AuthDirHasIPv6Connectivity != 1 ||
508 tor_addr_is_null(&router->ipv6_addr) ||
509 now < node->last_reachable6 + REACHABLE_TIMEOUT));
510 }
511
513 /* Not considered reachable. tell rephist about that.
514
515 Because we launch a reachability test for each router every
516 REACHABILITY_TEST_CYCLE_PERIOD seconds, then the router has probably
517 been down since at least that time after we last successfully reached
518 it.
519
520 XXX ipv6
521 */
522 time_t when = now;
523 if (node->last_reachable &&
526 rep_hist_note_router_unreachable(router->cache_info.identity_digest, when);
527 }
528
529 node->is_running = answer;
530}
531
532/* Check <b>node</b> and <b>ri</b> on whether or not we should publish a
533 * relay's IPv6 addresses. */
534static int
535should_publish_node_ipv6(const node_t *node, const routerinfo_t *ri,
536 time_t now)
537{
538 const dirauth_options_t *options = dirauth_get_options();
539
540 return options->AuthDirHasIPv6Connectivity == 1 &&
542 ((node->last_reachable6 >= now - REACHABLE_TIMEOUT) ||
543 router_is_me(ri));
544}
545
546/** Set routerstatus flags based on the authority options. Same as the testing
547 * function but for the main network. */
548static void
550{
551 const dirauth_options_t *options = dirauth_get_options();
552
553 tor_assert(rs);
554
555 /* Assign Guard flag to relays that can get it unconditionnaly. */
557 rs->is_possible_guard = 1;
558 }
559}
560
561/**
562 * Extract status information from <b>ri</b> and from other authority
563 * functions and store it in <b>rs</b>, as per
564 * <b>set_routerstatus_from_routerinfo</b>. Additionally, sets information
565 * in from the authority subsystem.
566 */
567void
569 node_t *node,
570 const routerinfo_t *ri,
571 time_t now,
572 int listbadexits,
573 int listmiddleonly)
574{
575 const or_options_t *options = get_options();
576 uint32_t routerbw_kb = dirserv_get_credible_bandwidth_kb(ri);
577
578 /* Set these flags so that set_routerstatus_from_routerinfo can copy them.
579 */
580 node->is_stable = !dirserv_thinks_router_is_unreliable(now, ri, 1, 0);
581 node->is_fast = !dirserv_thinks_router_is_unreliable(now, ri, 0, 1);
582 node->is_hs_dir = dirserv_thinks_router_is_hs_dir(ri, node, now);
583
585
586 /* Override rs->is_possible_guard. */
587 const uint64_t bw_opt = dirauth_get_options()->AuthDirGuardBWGuarantee;
588 if (node->is_fast && node->is_stable &&
590 ((bw_opt && routerbw_kb >= bw_opt / 1000) ||
591 routerbw_kb >= MIN(guard_bandwidth_including_exits_kb,
594 node->identity, now);
596 node->identity, now);
597 rs->is_possible_guard = (wfu >= guard_wfu && tk >= guard_tk) ? 1 : 0;
598 } else {
599 rs->is_possible_guard = 0;
600 }
601
602 /* Override rs->is_bad_exit */
603 rs->is_bad_exit = listbadexits && node->is_bad_exit;
604
605 /* Override rs->is_middle_only and related flags. */
606 rs->is_middle_only = listmiddleonly && node->is_middle_only;
607 if (rs->is_middle_only) {
608 if (listbadexits)
609 rs->is_bad_exit = 1;
610 rs->is_exit = rs->is_possible_guard = rs->is_hs_dir = rs->is_v2_dir = 0;
611 }
612
613 /* Set rs->is_staledesc. */
614 rs->is_staledesc =
615 (ri->cache_info.published_on + DESC_IS_STALE_INTERVAL) < now;
616
617 if (! should_publish_node_ipv6(node, ri, now)) {
618 /* We're not configured as having IPv6 connectivity or the node isn't:
619 * zero its IPv6 information. */
620 tor_addr_make_null(&rs->ipv6_addr, AF_INET6);
621 rs->ipv6_orport = 0;
622 }
623
624 if (options->TestingTorNetwork) {
626 } else {
628 }
629}
630
631/** Use TestingDirAuthVoteExit, TestingDirAuthVoteGuard, and
632 * TestingDirAuthVoteHSDir to give out the Exit, Guard, and HSDir flags,
633 * respectively. But don't set the corresponding node flags.
634 * Should only be called if TestingTorNetwork is set. */
635STATIC void
637{
638 const dirauth_options_t *options = dirauth_get_options();
639
640 tor_assert(get_options()->TestingTorNetwork);
641
643 rs, 0)) {
644 rs->is_exit = 1;
645 } else if (options->TestingDirAuthVoteExitIsStrict) {
646 rs->is_exit = 0;
647 }
648
650 rs, 0)) {
651 rs->is_possible_guard = 1;
652 } else if (options->TestingDirAuthVoteGuardIsStrict) {
653 rs->is_possible_guard = 0;
654 }
655
657 rs, 0)) {
658 rs->is_hs_dir = 1;
659 } else if (options->TestingDirAuthVoteHSDirIsStrict) {
660 rs->is_hs_dir = 0;
661 }
662}
663
664/** Use dirserv_set_router_is_running() to set bridges as running if they're
665 * reachable.
666 *
667 * This function is called from set_bridge_running_callback() when running as
668 * a bridge authority.
669 */
670void
672{
674
678 } SMARTLIST_FOREACH_END(ri);
679}
void tor_addr_make_null(tor_addr_t *a, sa_family_t family)
Definition: address.c:235
int tor_addr_is_null(const tor_addr_t *addr)
Definition: address.c:780
time_t approx_time(void)
Definition: approx_time.c:32
uint32_t dirserv_get_credible_bandwidth_kb(const routerinfo_t *ri)
Definition: bwauth.c:177
int dirserv_get_last_n_measured_bws(void)
Definition: bwauth.c:55
int dirserv_has_measured_bw(const char *node_id)
Definition: bwauth.c:159
Header file for bwauth.c.
const or_options_t * get_options(void)
Definition: config.c:944
Header file for config.c.
Structure dirauth_options_t to hold directory authority options.
Header for dirauth_sys.c.
Header file for dirlist.c.
int we_are_hibernating(void)
Definition: hibernate.c:937
Header file for hibernate.c.
#define LD_DIRSERV
Definition: log.h:90
long get_uptime(void)
Definition: mainloop.c:2557
time_t time_of_process_start
Definition: mainloop.c:142
Header file for mainloop.c.
#define tor_free(p)
Definition: malloc.h:56
int32_t networkstatus_get_param(const networkstatus_t *ns, const char *param_name, int32_t default_val, int32_t min_val, int32_t max_val)
void set_routerstatus_from_routerinfo(routerstatus_t *rs, const node_t *node, const routerinfo_t *ri)
Header file for networkstatus.c.
Node information structure.
const smartlist_t * nodelist_get_list(void)
Definition: nodelist.c:1047
node_t * node_get_mutable_by_id(const char *identity_digest)
Definition: nodelist.c:197
void nodelist_assert_ok(void)
Definition: nodelist.c:949
Header file for nodelist.c.
Master header file for Tor-specific functionality.
#define ROUTER_MAX_AGE_TO_PUBLISH
Definition: or.h:161
Header for order.c.
int exit_policy_is_general_exit(smartlist_t *policy)
Definition: policies.c:2250
Header file for policies.c.
int tor_asprintf(char **strp, const char *fmt,...)
Definition: printf.c:75
Header file for reachability.c.
#define REACHABILITY_TEST_CYCLE_PERIOD
Definition: reachability.h:24
double rep_hist_get_stability(const char *id, time_t when)
Definition: rephist.c:895
double rep_hist_get_weighted_fractional_uptime(const char *id, time_t when)
Definition: rephist.c:907
long rep_hist_get_uptime(const char *id, time_t when)
Definition: rephist.c:882
long rep_hist_get_weighted_time_known(const char *id, time_t when)
Definition: rephist.c:923
void rep_hist_note_router_unreachable(const char *id, time_t when)
Definition: rephist.c:706
int rep_hist_have_measured_enough_stability(void)
Definition: rephist.c:935
Header file for rephist.c.
int router_is_me(const routerinfo_t *router)
Definition: router.c:1797
Header file for router.c.
Router descriptor structure.
#define ROUTER_PURPOSE_BRIDGE
int router_exit_policy_rejects_all(const routerinfo_t *router)
Definition: routerlist.c:2362
routerlist_t * router_get_routerlist(void)
Definition: routerlist.c:898
Header file for routerlist.c.
Router descriptor list structure.
int routerset_contains_routerstatus(const routerset_t *set, const routerstatus_t *rs, country_t country)
Definition: routerset.c:339
Header file for routerset.c.
#define SMARTLIST_FOREACH_BEGIN(sl, type, var)
MEMUNIT AuthDirGuardBWGuarantee
ROUTERSET TestingDirAuthVoteGuard
DOUBLE AuthDirVoteGuardBwThresholdFraction
ROUTERSET AuthDirVoteGuard
INTERVAL TestingAuthDirTimeToLearnReachability
MEMUNIT TestingMinExitFlagThreshold
ROUTERSET TestingDirAuthVoteExit
INTERVAL AuthDirVoteGuardGuaranteeTimeKnown
ROUTERSET TestingDirAuthVoteHSDir
MEMUNIT TestingMinFastFlagThreshold
INT MinMeasuredBWsForAuthToIgnoreAdvertised
DOUBLE AuthDirVoteGuardGuaranteeWFU
Definition: node_st.h:34
unsigned int is_bad_exit
Definition: node_st.h:71
unsigned int is_running
Definition: node_st.h:63
unsigned int is_hs_dir
Definition: node_st.h:75
unsigned int is_valid
Definition: node_st.h:65
char identity[DIGEST_LEN]
Definition: node_st.h:46
unsigned int is_stable
Definition: node_st.h:68
unsigned int is_middle_only
Definition: node_st.h:74
time_t last_reachable
Definition: node_st.h:100
int BridgeAuthoritativeDir
tor_addr_t ipv6_addr
Definition: routerinfo_st.h:30
smartlist_t * exit_policy
Definition: routerinfo_st.h:62
unsigned int wants_to_be_hs_dir
Definition: routerinfo_st.h:78
unsigned int is_hibernating
Definition: routerinfo_st.h:71
uint8_t purpose
unsigned int supports_tunnelled_dir_requests
Definition: routerinfo_st.h:89
smartlist_t * routers
Definition: routerlist_st.h:32
unsigned int is_bad_exit
uint16_t ipv6_orport
tor_addr_t ipv6_addr
unsigned int is_staledesc
unsigned int is_hs_dir
unsigned int is_possible_guard
unsigned int is_exit
unsigned int is_middle_only
char identity_digest[DIGEST_LEN]
#define STATIC
Definition: testsupport.h:32
#define tor_assert(expr)
Definition: util_bug.h:103
Routerstatus (vote entry) structure.
STATIC void dirserv_set_routerstatus_testing(routerstatus_t *rs)
Definition: voteflags.c:636
int running_long_enough_to_decide_unreachable(void)
Definition: voteflags.c:451
#define HIBERNATION_PUBLICATION_SKEW
Definition: voteflags.c:466
#define ABSOLUTE_MIN_BW_VALUE_TO_CONSIDER_KB
Definition: voteflags.c:169
static void dirserv_set_routerstatus_flags(routerstatus_t *rs)
Definition: voteflags.c:549
static int router_counts_toward_thresholds(const node_t *node, time_t now, const digestmap_t *omit_as_sybil, int require_mbw)
Definition: voteflags.c:177
static uint32_t stable_uptime
Definition: voteflags.c:44
static long real_uptime(const routerinfo_t *router, time_t now)
Definition: voteflags.c:68
#define REACHABLE_TIMEOUT
Definition: voteflags.c:461
static double stable_mtbf
Definition: voteflags.c:46
void dirserv_compute_performance_thresholds(digestmap_t *omit_as_sybil)
Definition: voteflags.c:206
static int dirserv_thinks_router_is_hs_dir(const routerinfo_t *router, const node_t *node, time_t now)
Definition: voteflags.c:140
static int dirserv_thinks_router_is_unreliable(time_t now, const routerinfo_t *router, int need_uptime, int need_capacity)
Definition: voteflags.c:82
static int router_is_active(const routerinfo_t *ri, const node_t *node, time_t now)
Definition: voteflags.c:118
void dirauth_set_routerstatus_from_routerinfo(routerstatus_t *rs, node_t *node, const routerinfo_t *ri, time_t now, int listbadexits, int listmiddleonly)
Definition: voteflags.c:568
static double guard_wfu
Definition: voteflags.c:52
static uint32_t fast_bandwidth_kb
Definition: voteflags.c:57
void dirserv_set_router_is_running(routerinfo_t *router, time_t now)
Definition: voteflags.c:472
void dirserv_set_bridges_running(time_t now)
Definition: voteflags.c:671
char * dirserv_get_flag_thresholds_line(void)
Definition: voteflags.c:403
static long guard_tk
Definition: voteflags.c:55
static int enough_mtbf_info
Definition: voteflags.c:49
static uint32_t guard_bandwidth_excluding_exits_kb
Definition: voteflags.c:63
static uint32_t guard_bandwidth_including_exits_kb
Definition: voteflags.c:60
Header file for voteflags.c.