mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-30 23:53:32 +01:00
Merge branch 'tor-github/pr/999'
This commit is contained in:
commit
4d461e20f7
3
changes/ticket30345
Normal file
3
changes/ticket30345
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
o Minor features (modularity):
|
||||||
|
- The --disable-module-dirauth compile-time option now disables
|
||||||
|
even more dirauth-only code. Closes ticket 30345.
|
@ -29,12 +29,12 @@
|
|||||||
#
|
#
|
||||||
# Remember: It is better to fix the problem than to add a new exception!
|
# Remember: It is better to fix the problem than to add a new exception!
|
||||||
|
|
||||||
problem file-size /src/app/config/config.c 8492
|
problem file-size /src/app/config/config.c 8494
|
||||||
problem include-count /src/app/config/config.c 87
|
problem include-count /src/app/config/config.c 87
|
||||||
problem function-size /src/app/config/config.c:options_act_reversible() 296
|
problem function-size /src/app/config/config.c:options_act_reversible() 296
|
||||||
problem function-size /src/app/config/config.c:options_act() 588
|
problem function-size /src/app/config/config.c:options_act() 588
|
||||||
problem function-size /src/app/config/config.c:resolve_my_address() 192
|
problem function-size /src/app/config/config.c:resolve_my_address() 192
|
||||||
problem function-size /src/app/config/config.c:options_validate() 1207
|
problem function-size /src/app/config/config.c:options_validate() 1209
|
||||||
problem function-size /src/app/config/config.c:options_init_from_torrc() 202
|
problem function-size /src/app/config/config.c:options_init_from_torrc() 202
|
||||||
problem function-size /src/app/config/config.c:options_init_from_string() 173
|
problem function-size /src/app/config/config.c:options_init_from_string() 173
|
||||||
problem function-size /src/app/config/config.c:options_init_logs() 146
|
problem function-size /src/app/config/config.c:options_init_logs() 146
|
||||||
@ -221,7 +221,7 @@ problem function-size /src/feature/nodelist/node_select.c:router_pick_directory_
|
|||||||
problem function-size /src/feature/nodelist/node_select.c:compute_weighted_bandwidths() 206
|
problem function-size /src/feature/nodelist/node_select.c:compute_weighted_bandwidths() 206
|
||||||
problem function-size /src/feature/nodelist/node_select.c:router_pick_trusteddirserver_impl() 114
|
problem function-size /src/feature/nodelist/node_select.c:router_pick_trusteddirserver_impl() 114
|
||||||
problem function-size /src/feature/nodelist/nodelist.c:compute_frac_paths_available() 193
|
problem function-size /src/feature/nodelist/nodelist.c:compute_frac_paths_available() 193
|
||||||
problem file-size /src/feature/nodelist/routerlist.c 3234
|
problem file-size /src/feature/nodelist/routerlist.c 3238
|
||||||
problem function-size /src/feature/nodelist/routerlist.c:router_rebuild_store() 148
|
problem function-size /src/feature/nodelist/routerlist.c:router_rebuild_store() 148
|
||||||
problem function-size /src/feature/nodelist/routerlist.c:router_add_to_routerlist() 169
|
problem function-size /src/feature/nodelist/routerlist.c:router_add_to_routerlist() 169
|
||||||
problem function-size /src/feature/nodelist/routerlist.c:routerlist_remove_old_routers() 121
|
problem function-size /src/feature/nodelist/routerlist.c:routerlist_remove_old_routers() 121
|
||||||
|
@ -3556,6 +3556,7 @@ options_validate(or_options_t *old_options, or_options_t *options,
|
|||||||
options->V3AuthoritativeDir))
|
options->V3AuthoritativeDir))
|
||||||
REJECT("AuthoritativeDir is set, but none of "
|
REJECT("AuthoritativeDir is set, but none of "
|
||||||
"(Bridge/V3)AuthoritativeDir is set.");
|
"(Bridge/V3)AuthoritativeDir is set.");
|
||||||
|
#ifdef HAVE_MODULE_DIRAUTH
|
||||||
/* If we have a v3bandwidthsfile and it's broken, complain on startup */
|
/* If we have a v3bandwidthsfile and it's broken, complain on startup */
|
||||||
if (options->V3BandwidthsFile && !old_options) {
|
if (options->V3BandwidthsFile && !old_options) {
|
||||||
dirserv_read_measured_bandwidths(options->V3BandwidthsFile, NULL, NULL,
|
dirserv_read_measured_bandwidths(options->V3BandwidthsFile, NULL, NULL,
|
||||||
@ -3565,6 +3566,7 @@ options_validate(or_options_t *old_options, or_options_t *options,
|
|||||||
if (options->GuardfractionFile && !old_options) {
|
if (options->GuardfractionFile && !old_options) {
|
||||||
dirserv_read_guardfraction_file(options->GuardfractionFile, NULL);
|
dirserv_read_guardfraction_file(options->GuardfractionFile, NULL);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options->AuthoritativeDir && !options->DirPort_set)
|
if (options->AuthoritativeDir && !options->DirPort_set)
|
||||||
|
@ -36,10 +36,6 @@
|
|||||||
#include "feature/control/control.h"
|
#include "feature/control/control.h"
|
||||||
#include "feature/control/control_auth.h"
|
#include "feature/control/control_auth.h"
|
||||||
#include "feature/dirauth/authmode.h"
|
#include "feature/dirauth/authmode.h"
|
||||||
#include "feature/dirauth/bwauth.h"
|
|
||||||
#include "feature/dirauth/dirvote.h"
|
|
||||||
#include "feature/dirauth/keypin.h"
|
|
||||||
#include "feature/dirauth/process_descs.h"
|
|
||||||
#include "feature/dirauth/shared_random.h"
|
#include "feature/dirauth/shared_random.h"
|
||||||
#include "feature/dircache/consdiffmgr.h"
|
#include "feature/dircache/consdiffmgr.h"
|
||||||
#include "feature/dircache/dirserv.h"
|
#include "feature/dircache/dirserv.h"
|
||||||
@ -98,7 +94,6 @@ tor_cleanup(void)
|
|||||||
}
|
}
|
||||||
if (authdir_mode_tests_reachability(options))
|
if (authdir_mode_tests_reachability(options))
|
||||||
rep_hist_record_mtbf_data(now, 0);
|
rep_hist_record_mtbf_data(now, 0);
|
||||||
keypin_close_journal();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
timers_shutdown();
|
timers_shutdown();
|
||||||
@ -128,9 +123,7 @@ tor_free_all(int postfork)
|
|||||||
routerlist_free_all();
|
routerlist_free_all();
|
||||||
networkstatus_free_all();
|
networkstatus_free_all();
|
||||||
addressmap_free_all();
|
addressmap_free_all();
|
||||||
dirserv_free_fingerprint_list();
|
|
||||||
dirserv_free_all();
|
dirserv_free_all();
|
||||||
dirserv_clear_measured_bw_cache();
|
|
||||||
rend_cache_free_all();
|
rend_cache_free_all();
|
||||||
rend_service_authorization_free_all();
|
rend_service_authorization_free_all();
|
||||||
rep_hist_free_all();
|
rep_hist_free_all();
|
||||||
|
@ -82,7 +82,6 @@ LIBTOR_APP_A_SOURCES = \
|
|||||||
src/feature/control/control_getinfo.c \
|
src/feature/control/control_getinfo.c \
|
||||||
src/feature/control/fmt_serverstatus.c \
|
src/feature/control/fmt_serverstatus.c \
|
||||||
src/feature/control/getinfo_geoip.c \
|
src/feature/control/getinfo_geoip.c \
|
||||||
src/feature/dirauth/keypin.c \
|
|
||||||
src/feature/dircache/conscache.c \
|
src/feature/dircache/conscache.c \
|
||||||
src/feature/dircache/consdiffmgr.c \
|
src/feature/dircache/consdiffmgr.c \
|
||||||
src/feature/dircache/dircache.c \
|
src/feature/dircache/dircache.c \
|
||||||
@ -119,7 +118,6 @@ LIBTOR_APP_A_SOURCES = \
|
|||||||
src/feature/hs_common/replaycache.c \
|
src/feature/hs_common/replaycache.c \
|
||||||
src/feature/hs_common/shared_random_client.c \
|
src/feature/hs_common/shared_random_client.c \
|
||||||
src/feature/keymgt/loadkey.c \
|
src/feature/keymgt/loadkey.c \
|
||||||
src/feature/dirauth/keypin.c \
|
|
||||||
src/feature/nodelist/authcert.c \
|
src/feature/nodelist/authcert.c \
|
||||||
src/feature/nodelist/describe.c \
|
src/feature/nodelist/describe.c \
|
||||||
src/feature/nodelist/dirlist.c \
|
src/feature/nodelist/dirlist.c \
|
||||||
@ -151,17 +149,6 @@ LIBTOR_APP_A_SOURCES = \
|
|||||||
src/feature/stats/rephist.c \
|
src/feature/stats/rephist.c \
|
||||||
src/feature/stats/predict_ports.c
|
src/feature/stats/predict_ports.c
|
||||||
|
|
||||||
# These should eventually move into module_dirauth_sources, but for now
|
|
||||||
# the separation is only in the code location.
|
|
||||||
LIBTOR_APP_A_SOURCES += \
|
|
||||||
src/feature/dirauth/bwauth.c \
|
|
||||||
src/feature/dirauth/dsigs_parse.c \
|
|
||||||
src/feature/dirauth/guardfraction.c \
|
|
||||||
src/feature/dirauth/reachability.c \
|
|
||||||
src/feature/dirauth/recommend_pkg.c \
|
|
||||||
src/feature/dirauth/process_descs.c \
|
|
||||||
src/feature/dirauth/voteflags.c
|
|
||||||
|
|
||||||
if BUILD_NT_SERVICES
|
if BUILD_NT_SERVICES
|
||||||
LIBTOR_APP_A_SOURCES += src/app/main/ntmain.c
|
LIBTOR_APP_A_SOURCES += src/app/main/ntmain.c
|
||||||
endif
|
endif
|
||||||
@ -177,12 +164,21 @@ LIBTOR_APP_TESTING_A_SOURCES = $(LIBTOR_APP_A_SOURCES)
|
|||||||
# The Directory Authority module.
|
# The Directory Authority module.
|
||||||
MODULE_DIRAUTH_SOURCES = \
|
MODULE_DIRAUTH_SOURCES = \
|
||||||
src/feature/dirauth/authmode.c \
|
src/feature/dirauth/authmode.c \
|
||||||
|
src/feature/dirauth/bridgeauth.c \
|
||||||
|
src/feature/dirauth/bwauth.c \
|
||||||
src/feature/dirauth/dirauth_periodic.c \
|
src/feature/dirauth/dirauth_periodic.c \
|
||||||
src/feature/dirauth/dirauth_sys.c \
|
src/feature/dirauth/dirauth_sys.c \
|
||||||
src/feature/dirauth/dircollate.c \
|
src/feature/dirauth/dircollate.c \
|
||||||
src/feature/dirauth/dirvote.c \
|
src/feature/dirauth/dirvote.c \
|
||||||
|
src/feature/dirauth/dsigs_parse.c \
|
||||||
|
src/feature/dirauth/guardfraction.c \
|
||||||
|
src/feature/dirauth/keypin.c \
|
||||||
|
src/feature/dirauth/process_descs.c \
|
||||||
|
src/feature/dirauth/reachability.c \
|
||||||
|
src/feature/dirauth/recommend_pkg.c \
|
||||||
src/feature/dirauth/shared_random.c \
|
src/feature/dirauth/shared_random.c \
|
||||||
src/feature/dirauth/shared_random_state.c
|
src/feature/dirauth/shared_random_state.c \
|
||||||
|
src/feature/dirauth/voteflags.c
|
||||||
|
|
||||||
if BUILD_MODULE_DIRAUTH
|
if BUILD_MODULE_DIRAUTH
|
||||||
LIBTOR_APP_A_SOURCES += $(MODULE_DIRAUTH_SOURCES)
|
LIBTOR_APP_A_SOURCES += $(MODULE_DIRAUTH_SOURCES)
|
||||||
@ -312,6 +308,7 @@ noinst_HEADERS += \
|
|||||||
src/feature/control/fmt_serverstatus.h \
|
src/feature/control/fmt_serverstatus.h \
|
||||||
src/feature/control/getinfo_geoip.h \
|
src/feature/control/getinfo_geoip.h \
|
||||||
src/feature/dirauth/authmode.h \
|
src/feature/dirauth/authmode.h \
|
||||||
|
src/feature/dirauth/bridgeauth.h \
|
||||||
src/feature/dirauth/bwauth.h \
|
src/feature/dirauth/bwauth.h \
|
||||||
src/feature/dirauth/dirauth_periodic.h \
|
src/feature/dirauth/dirauth_periodic.h \
|
||||||
src/feature/dirauth/dirauth_sys.h \
|
src/feature/dirauth/dirauth_sys.h \
|
||||||
|
@ -1366,7 +1366,6 @@ CALLBACK(retry_listeners);
|
|||||||
CALLBACK(rotate_onion_key);
|
CALLBACK(rotate_onion_key);
|
||||||
CALLBACK(rotate_x509_certificate);
|
CALLBACK(rotate_x509_certificate);
|
||||||
CALLBACK(save_state);
|
CALLBACK(save_state);
|
||||||
CALLBACK(write_bridge_ns);
|
|
||||||
CALLBACK(write_stats_file);
|
CALLBACK(write_stats_file);
|
||||||
CALLBACK(control_per_second_events);
|
CALLBACK(control_per_second_events);
|
||||||
CALLBACK(second_elapsed);
|
CALLBACK(second_elapsed);
|
||||||
@ -1433,9 +1432,6 @@ STATIC periodic_event_item_t mainloop_periodic_events[] = {
|
|||||||
/* XXXX this could be restricted to CLIENT+NET_PARTICIPANT */
|
/* XXXX this could be restricted to CLIENT+NET_PARTICIPANT */
|
||||||
CALLBACK(rend_cache_failure_clean, NET_PARTICIPANT, FL(RUN_ON_DISABLE)),
|
CALLBACK(rend_cache_failure_clean, NET_PARTICIPANT, FL(RUN_ON_DISABLE)),
|
||||||
|
|
||||||
/* Bridge Authority only. */
|
|
||||||
CALLBACK(write_bridge_ns, BRIDGEAUTH, 0),
|
|
||||||
|
|
||||||
/* Directory server only. */
|
/* Directory server only. */
|
||||||
CALLBACK(clean_consdiffmgr, DIRSERVER, 0),
|
CALLBACK(clean_consdiffmgr, DIRSERVER, 0),
|
||||||
|
|
||||||
@ -2369,22 +2365,6 @@ check_dns_honesty_callback(time_t now, const or_options_t *options)
|
|||||||
return 12*3600 + crypto_rand_int(12*3600);
|
return 12*3600 + crypto_rand_int(12*3600);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Periodic callback: if we're the bridge authority, write a networkstatus
|
|
||||||
* file to disk.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
write_bridge_ns_callback(time_t now, const or_options_t *options)
|
|
||||||
{
|
|
||||||
/* 10. write bridge networkstatus file to disk */
|
|
||||||
if (options->BridgeAuthoritativeDir) {
|
|
||||||
networkstatus_dump_bridge_status_to_file(now);
|
|
||||||
#define BRIDGE_STATUSFILE_INTERVAL (30*60)
|
|
||||||
return BRIDGE_STATUSFILE_INTERVAL;
|
|
||||||
}
|
|
||||||
return PERIODIC_EVENT_NO_UPDATE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int heartbeat_callback_first_time = 1;
|
static int heartbeat_callback_first_time = 1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -76,7 +76,6 @@ list_server_status_v1(smartlist_t *routers, char **router_status_out,
|
|||||||
SMARTLIST_FOREACH_BEGIN(routers, routerinfo_t *, ri) {
|
SMARTLIST_FOREACH_BEGIN(routers, routerinfo_t *, ri) {
|
||||||
const node_t *node = node_get_by_id(ri->cache_info.identity_digest);
|
const node_t *node = node_get_by_id(ri->cache_info.identity_digest);
|
||||||
tor_assert(node);
|
tor_assert(node);
|
||||||
|
|
||||||
if (for_controller) {
|
if (for_controller) {
|
||||||
char name_buf[MAX_VERBOSE_NICKNAME_LEN+2];
|
char name_buf[MAX_VERBOSE_NICKNAME_LEN+2];
|
||||||
char *cp = name_buf;
|
char *cp = name_buf;
|
||||||
|
55
src/feature/dirauth/bridgeauth.c
Normal file
55
src/feature/dirauth/bridgeauth.c
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/* Copyright (c) 2001 Matej Pfajfar.
|
||||||
|
* Copyright (c) 2001-2004, Roger Dingledine.
|
||||||
|
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
|
||||||
|
* Copyright (c) 2007-2019, The Tor Project, Inc. */
|
||||||
|
/* See LICENSE for licensing information */
|
||||||
|
|
||||||
|
#include "core/or/or.h"
|
||||||
|
#include "feature/dirauth/bridgeauth.h"
|
||||||
|
#include "feature/dirauth/voteflags.h"
|
||||||
|
#include "feature/nodelist/networkstatus.h"
|
||||||
|
#include "feature/relay/router.h"
|
||||||
|
#include "app/config/config.h"
|
||||||
|
|
||||||
|
#include "feature/nodelist/routerinfo_st.h"
|
||||||
|
|
||||||
|
/** Write out router status entries for all our bridge descriptors. Here, we
|
||||||
|
* also mark routers as running. */
|
||||||
|
void
|
||||||
|
bridgeauth_dump_bridge_status_to_file(time_t now)
|
||||||
|
{
|
||||||
|
char *status;
|
||||||
|
char *fname = NULL;
|
||||||
|
char *thresholds = NULL;
|
||||||
|
char *published_thresholds_and_status = NULL;
|
||||||
|
char published[ISO_TIME_LEN+1];
|
||||||
|
const routerinfo_t *me = router_get_my_routerinfo();
|
||||||
|
char fingerprint[FINGERPRINT_LEN+1];
|
||||||
|
char *fingerprint_line = NULL;
|
||||||
|
|
||||||
|
dirserv_set_bridges_running(now);
|
||||||
|
status = networkstatus_getinfo_by_purpose("bridge", now);
|
||||||
|
|
||||||
|
if (me && crypto_pk_get_fingerprint(me->identity_pkey,
|
||||||
|
fingerprint, 0) >= 0) {
|
||||||
|
tor_asprintf(&fingerprint_line, "fingerprint %s\n", fingerprint);
|
||||||
|
} else {
|
||||||
|
log_warn(LD_BUG, "Error computing fingerprint for bridge status.");
|
||||||
|
}
|
||||||
|
format_iso_time(published, now);
|
||||||
|
dirserv_compute_bridge_flag_thresholds();
|
||||||
|
thresholds = dirserv_get_flag_thresholds_line();
|
||||||
|
tor_asprintf(&published_thresholds_and_status,
|
||||||
|
"published %s\nflag-thresholds %s\n%s%s",
|
||||||
|
published, thresholds, fingerprint_line ? fingerprint_line : "",
|
||||||
|
status);
|
||||||
|
fname = get_datadir_fname("networkstatus-bridges");
|
||||||
|
if (write_str_to_file(fname,published_thresholds_and_status,0)<0) {
|
||||||
|
log_warn(LD_DIRSERV, "Unable to write networkstatus-bridges file.");
|
||||||
|
}
|
||||||
|
tor_free(thresholds);
|
||||||
|
tor_free(published_thresholds_and_status);
|
||||||
|
tor_free(fname);
|
||||||
|
tor_free(status);
|
||||||
|
tor_free(fingerprint_line);
|
||||||
|
}
|
12
src/feature/dirauth/bridgeauth.h
Normal file
12
src/feature/dirauth/bridgeauth.h
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
/* Copyright (c) 2001 Matej Pfajfar.
|
||||||
|
* Copyright (c) 2001-2004, Roger Dingledine.
|
||||||
|
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
|
||||||
|
* Copyright (c) 2007-2019, The Tor Project, Inc. */
|
||||||
|
/* See LICENSE for licensing information */
|
||||||
|
|
||||||
|
#ifndef TOR_DIRAUTH_BRIDGEAUTH_H
|
||||||
|
#define TOR_DIRAUTH_BRIDGEAUTH_H
|
||||||
|
|
||||||
|
void bridgeauth_dump_bridge_status_to_file(time_t now);
|
||||||
|
|
||||||
|
#endif
|
@ -11,6 +11,7 @@
|
|||||||
#include "feature/dirauth/reachability.h"
|
#include "feature/dirauth/reachability.h"
|
||||||
#include "feature/stats/rephist.h"
|
#include "feature/stats/rephist.h"
|
||||||
|
|
||||||
|
#include "feature/dirauth/bridgeauth.h"
|
||||||
#include "feature/dirauth/dirvote.h"
|
#include "feature/dirauth/dirvote.h"
|
||||||
#include "feature/dirauth/dirauth_periodic.h"
|
#include "feature/dirauth/dirauth_periodic.h"
|
||||||
#include "feature/dirauth/authmode.h"
|
#include "feature/dirauth/authmode.h"
|
||||||
@ -131,6 +132,23 @@ downrate_stability_callback(time_t now, const or_options_t *options)
|
|||||||
|
|
||||||
DECLARE_EVENT(downrate_stability, AUTHORITIES, 0);
|
DECLARE_EVENT(downrate_stability, AUTHORITIES, 0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Periodic callback: if we're the bridge authority, write a networkstatus
|
||||||
|
* file to disk.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
write_bridge_ns_callback(time_t now, const or_options_t *options)
|
||||||
|
{
|
||||||
|
if (options->BridgeAuthoritativeDir) {
|
||||||
|
bridgeauth_dump_bridge_status_to_file(now);
|
||||||
|
#define BRIDGE_STATUSFILE_INTERVAL (30*60)
|
||||||
|
return BRIDGE_STATUSFILE_INTERVAL;
|
||||||
|
}
|
||||||
|
return PERIODIC_EVENT_NO_UPDATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
DECLARE_EVENT(write_bridge_ns, BRIDGEAUTH, 0);
|
||||||
|
|
||||||
void
|
void
|
||||||
dirauth_register_periodic_events(void)
|
dirauth_register_periodic_events(void)
|
||||||
{
|
{
|
||||||
@ -139,4 +157,5 @@ dirauth_register_periodic_events(void)
|
|||||||
periodic_events_register(&save_stability_event);
|
periodic_events_register(&save_stability_event);
|
||||||
periodic_events_register(&check_authority_cert_event);
|
periodic_events_register(&check_authority_cert_event);
|
||||||
periodic_events_register(&dirvote_event);
|
periodic_events_register(&dirvote_event);
|
||||||
|
periodic_events_register(&write_bridge_ns_event);
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,13 @@
|
|||||||
|
|
||||||
#include "core/or/or.h"
|
#include "core/or/or.h"
|
||||||
|
|
||||||
|
#include "feature/dirauth/bwauth.h"
|
||||||
#include "feature/dirauth/dirauth_sys.h"
|
#include "feature/dirauth/dirauth_sys.h"
|
||||||
#include "feature/dirauth/dirvote.h"
|
#include "feature/dirauth/dirvote.h"
|
||||||
#include "feature/dirauth/dirauth_periodic.h"
|
#include "feature/dirauth/dirauth_periodic.h"
|
||||||
|
#include "feature/dirauth/keypin.h"
|
||||||
|
#include "feature/dirauth/process_descs.h"
|
||||||
|
|
||||||
#include "lib/subsys/subsys.h"
|
#include "lib/subsys/subsys.h"
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -21,7 +25,10 @@ subsys_dirauth_initialize(void)
|
|||||||
static void
|
static void
|
||||||
subsys_dirauth_shutdown(void)
|
subsys_dirauth_shutdown(void)
|
||||||
{
|
{
|
||||||
|
dirserv_free_fingerprint_list();
|
||||||
dirvote_free_all();
|
dirvote_free_all();
|
||||||
|
dirserv_clear_measured_bw_cache();
|
||||||
|
keypin_close_journal();
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct subsys_fns_t sys_dirauth = {
|
const struct subsys_fns_t sys_dirauth = {
|
||||||
|
@ -4545,8 +4545,8 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key,
|
|||||||
|
|
||||||
vrs = tor_malloc_zero(sizeof(vote_routerstatus_t));
|
vrs = tor_malloc_zero(sizeof(vote_routerstatus_t));
|
||||||
rs = &vrs->status;
|
rs = &vrs->status;
|
||||||
set_routerstatus_from_routerinfo(rs, node, ri, now,
|
dirauth_set_routerstatus_from_routerinfo(rs, node, ri, now,
|
||||||
listbadexits);
|
listbadexits);
|
||||||
|
|
||||||
if (ri->cache_info.signing_key_cert) {
|
if (ri->cache_info.signing_key_cert) {
|
||||||
memcpy(vrs->ed25519_id,
|
memcpy(vrs->ed25519_id,
|
||||||
|
@ -12,6 +12,18 @@
|
|||||||
#ifndef TOR_RECOMMEND_PKG_H
|
#ifndef TOR_RECOMMEND_PKG_H
|
||||||
#define TOR_RECOMMEND_PKG_H
|
#define TOR_RECOMMEND_PKG_H
|
||||||
|
|
||||||
|
#ifdef HAVE_MODULE_DIRAUTH
|
||||||
int validate_recommended_package_line(const char *line);
|
int validate_recommended_package_line(const char *line);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
validate_recommended_package_line(const char *line)
|
||||||
|
{
|
||||||
|
(void) line;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -546,38 +546,31 @@ should_publish_node_ipv6(const node_t *node, const routerinfo_t *ri,
|
|||||||
router_is_me(ri));
|
router_is_me(ri));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Extract status information from <b>ri</b> and from other authority
|
/**
|
||||||
* functions and store it in <b>rs</b>. <b>rs</b> is zeroed out before it is
|
* Extract status information from <b>ri</b> and from other authority
|
||||||
* set.
|
* functions and store it in <b>rs</b>, as per
|
||||||
*
|
* <b>set_routerstatus_from_routerinfo</b>. Additionally, sets information
|
||||||
* We assume that ri-\>is_running has already been set, e.g. by
|
* in from the authority subsystem.
|
||||||
* dirserv_set_router_is_running(ri, now);
|
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
set_routerstatus_from_routerinfo(routerstatus_t *rs,
|
dirauth_set_routerstatus_from_routerinfo(routerstatus_t *rs,
|
||||||
node_t *node,
|
node_t *node,
|
||||||
const routerinfo_t *ri,
|
const routerinfo_t *ri,
|
||||||
time_t now,
|
time_t now,
|
||||||
int listbadexits)
|
int listbadexits)
|
||||||
{
|
{
|
||||||
const or_options_t *options = get_options();
|
const or_options_t *options = get_options();
|
||||||
uint32_t routerbw_kb = dirserv_get_credible_bandwidth_kb(ri);
|
uint32_t routerbw_kb = dirserv_get_credible_bandwidth_kb(ri);
|
||||||
|
|
||||||
memset(rs, 0, sizeof(routerstatus_t));
|
/* Set these flags so that set_routerstatus_from_routerinfo can copy them.
|
||||||
|
*/
|
||||||
|
node->is_stable = !dirserv_thinks_router_is_unreliable(now, ri, 1, 0);
|
||||||
|
node->is_fast = !dirserv_thinks_router_is_unreliable(now, ri, 0, 1);
|
||||||
|
node->is_hs_dir = dirserv_thinks_router_is_hs_dir(ri, node, now);
|
||||||
|
|
||||||
rs->is_authority =
|
set_routerstatus_from_routerinfo(rs, node, ri);
|
||||||
router_digest_is_trusted_dir(ri->cache_info.identity_digest);
|
|
||||||
|
|
||||||
/* Already set by compute_performance_thresholds. */
|
|
||||||
rs->is_exit = node->is_exit;
|
|
||||||
rs->is_stable = node->is_stable =
|
|
||||||
!dirserv_thinks_router_is_unreliable(now, ri, 1, 0);
|
|
||||||
rs->is_fast = node->is_fast =
|
|
||||||
!dirserv_thinks_router_is_unreliable(now, ri, 0, 1);
|
|
||||||
rs->is_flagged_running = node->is_running; /* computed above */
|
|
||||||
|
|
||||||
rs->is_valid = node->is_valid;
|
|
||||||
|
|
||||||
|
/* Override rs->is_possible_guard. */
|
||||||
if (node->is_fast && node->is_stable &&
|
if (node->is_fast && node->is_stable &&
|
||||||
ri->supports_tunnelled_dir_requests &&
|
ri->supports_tunnelled_dir_requests &&
|
||||||
((options->AuthDirGuardBWGuarantee &&
|
((options->AuthDirGuardBWGuarantee &&
|
||||||
@ -593,31 +586,16 @@ set_routerstatus_from_routerinfo(routerstatus_t *rs,
|
|||||||
rs->is_possible_guard = 0;
|
rs->is_possible_guard = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Override rs->is_bad_exit */
|
||||||
rs->is_bad_exit = listbadexits && node->is_bad_exit;
|
rs->is_bad_exit = listbadexits && node->is_bad_exit;
|
||||||
rs->is_hs_dir = node->is_hs_dir =
|
|
||||||
dirserv_thinks_router_is_hs_dir(ri, node, now);
|
|
||||||
|
|
||||||
rs->is_named = rs->is_unnamed = 0;
|
|
||||||
|
|
||||||
rs->published_on = ri->cache_info.published_on;
|
|
||||||
memcpy(rs->identity_digest, node->identity, DIGEST_LEN);
|
|
||||||
memcpy(rs->descriptor_digest, ri->cache_info.signed_descriptor_digest,
|
|
||||||
DIGEST_LEN);
|
|
||||||
rs->addr = ri->addr;
|
|
||||||
strlcpy(rs->nickname, ri->nickname, sizeof(rs->nickname));
|
|
||||||
rs->or_port = ri->or_port;
|
|
||||||
rs->dir_port = ri->dir_port;
|
|
||||||
rs->is_v2_dir = ri->supports_tunnelled_dir_requests;
|
|
||||||
|
|
||||||
|
/* Set rs->is_staledesc. */
|
||||||
rs->is_staledesc =
|
rs->is_staledesc =
|
||||||
(ri->cache_info.published_on + DESC_IS_STALE_INTERVAL) < now;
|
(ri->cache_info.published_on + DESC_IS_STALE_INTERVAL) < now;
|
||||||
|
|
||||||
if (should_publish_node_ipv6(node, ri, now)) {
|
if (! should_publish_node_ipv6(node, ri, now)) {
|
||||||
/* We're configured as having IPv6 connectivity. There's an IPv6
|
/* We're not configured as having IPv6 connectivity or the node isn't:
|
||||||
OR port and it's reachable so copy it to the routerstatus. */
|
* zero its IPv6 information. */
|
||||||
tor_addr_copy(&rs->ipv6_addr, &ri->ipv6_addr);
|
|
||||||
rs->ipv6_orport = ri->ipv6_orport;
|
|
||||||
} else {
|
|
||||||
tor_addr_make_null(&rs->ipv6_addr, AF_INET6);
|
tor_addr_make_null(&rs->ipv6_addr, AF_INET6);
|
||||||
rs->ipv6_orport = 0;
|
rs->ipv6_orport = 0;
|
||||||
}
|
}
|
||||||
|
@ -12,18 +12,20 @@
|
|||||||
#ifndef TOR_VOTEFLAGS_H
|
#ifndef TOR_VOTEFLAGS_H
|
||||||
#define TOR_VOTEFLAGS_H
|
#define TOR_VOTEFLAGS_H
|
||||||
|
|
||||||
|
#ifdef HAVE_MODULE_DIRAUTH
|
||||||
void dirserv_set_router_is_running(routerinfo_t *router, time_t now);
|
void dirserv_set_router_is_running(routerinfo_t *router, time_t now);
|
||||||
char *dirserv_get_flag_thresholds_line(void);
|
char *dirserv_get_flag_thresholds_line(void);
|
||||||
void dirserv_compute_bridge_flag_thresholds(void);
|
void dirserv_compute_bridge_flag_thresholds(void);
|
||||||
int running_long_enough_to_decide_unreachable(void);
|
int running_long_enough_to_decide_unreachable(void);
|
||||||
|
|
||||||
void set_routerstatus_from_routerinfo(routerstatus_t *rs,
|
void dirauth_set_routerstatus_from_routerinfo(routerstatus_t *rs,
|
||||||
node_t *node,
|
node_t *node,
|
||||||
const routerinfo_t *ri,
|
const routerinfo_t *ri,
|
||||||
time_t now,
|
time_t now,
|
||||||
int listbadexits);
|
int listbadexits);
|
||||||
|
|
||||||
void dirserv_compute_performance_thresholds(digestmap_t *omit_as_sybil);
|
void dirserv_compute_performance_thresholds(digestmap_t *omit_as_sybil);
|
||||||
|
#endif
|
||||||
|
|
||||||
void dirserv_set_bridges_running(time_t now);
|
void dirserv_set_bridges_running(time_t now);
|
||||||
|
|
||||||
|
@ -14,55 +14,14 @@
|
|||||||
#include "core/or/or.h"
|
#include "core/or/or.h"
|
||||||
#include "feature/nodelist/fmt_routerstatus.h"
|
#include "feature/nodelist/fmt_routerstatus.h"
|
||||||
|
|
||||||
/* #include "lib/container/buffers.h" */
|
|
||||||
/* #include "app/config/config.h" */
|
|
||||||
/* #include "app/config/confparse.h" */
|
|
||||||
/* #include "core/or/channel.h" */
|
|
||||||
/* #include "core/or/channeltls.h" */
|
|
||||||
/* #include "core/or/command.h" */
|
|
||||||
/* #include "core/mainloop/connection.h" */
|
|
||||||
/* #include "core/or/connection_or.h" */
|
|
||||||
/* #include "feature/dircache/conscache.h" */
|
|
||||||
/* #include "feature/dircache/consdiffmgr.h" */
|
|
||||||
/* #include "feature/control/control.h" */
|
|
||||||
/* #include "feature/dircache/directory.h" */
|
|
||||||
/* #include "feature/dircache/dirserv.h" */
|
|
||||||
/* #include "feature/hibernate/hibernate.h" */
|
|
||||||
/* #include "feature/dirauth/keypin.h" */
|
|
||||||
/* #include "core/mainloop/mainloop.h" */
|
|
||||||
/* #include "feature/nodelist/microdesc.h" */
|
|
||||||
/* #include "feature/nodelist/networkstatus.h" */
|
|
||||||
/* #include "feature/nodelist/nodelist.h" */
|
|
||||||
#include "core/or/policies.h"
|
#include "core/or/policies.h"
|
||||||
/* #include "core/or/protover.h" */
|
|
||||||
/* #include "feature/stats/rephist.h" */
|
|
||||||
/* #include "feature/relay/router.h" */
|
|
||||||
/* #include "feature/nodelist/dirlist.h" */
|
|
||||||
#include "feature/nodelist/routerlist.h"
|
#include "feature/nodelist/routerlist.h"
|
||||||
|
|
||||||
/* #include "feature/nodelist/routerparse.h" */
|
|
||||||
/* #include "feature/nodelist/routerset.h" */
|
|
||||||
/* #include "feature/nodelist/torcert.h" */
|
|
||||||
/* #include "feature/dircommon/voting_schedule.h" */
|
|
||||||
|
|
||||||
#include "feature/dirauth/dirvote.h"
|
#include "feature/dirauth/dirvote.h"
|
||||||
|
|
||||||
/* #include "feature/dircache/cached_dir_st.h" */
|
|
||||||
/* #include "feature/dircommon/dir_connection_st.h" */
|
|
||||||
/* #include "feature/nodelist/extrainfo_st.h" */
|
|
||||||
/* #include "feature/nodelist/microdesc_st.h" */
|
|
||||||
/* #include "feature/nodelist/node_st.h" */
|
|
||||||
#include "feature/nodelist/routerinfo_st.h"
|
#include "feature/nodelist/routerinfo_st.h"
|
||||||
/* #include "feature/nodelist/routerlist_st.h" */
|
|
||||||
/* #include "core/or/tor_version_st.h" */
|
|
||||||
#include "feature/nodelist/vote_routerstatus_st.h"
|
#include "feature/nodelist/vote_routerstatus_st.h"
|
||||||
|
|
||||||
/* #include "lib/compress/compress.h" */
|
|
||||||
/* #include "lib/container/order.h" */
|
|
||||||
#include "lib/crypt_ops/crypto_format.h"
|
#include "lib/crypt_ops/crypto_format.h"
|
||||||
/* #include "lib/encoding/confline.h" */
|
|
||||||
|
|
||||||
/* #include "lib/encoding/keyval.h" */
|
|
||||||
|
|
||||||
/** Helper: write the router-status information in <b>rs</b> into a newly
|
/** Helper: write the router-status information in <b>rs</b> into a newly
|
||||||
* allocated character buffer. Use the same format as in network-status
|
* allocated character buffer. Use the same format as in network-status
|
||||||
|
@ -2366,6 +2366,49 @@ networkstatus_getinfo_helper_single(const routerstatus_t *rs)
|
|||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract status information from <b>ri</b> and from other authority
|
||||||
|
* functions and store it in <b>rs</b>. <b>rs</b> is zeroed out before it is
|
||||||
|
* set.
|
||||||
|
*
|
||||||
|
* We assume that node-\>is_running has already been set, e.g. by
|
||||||
|
* dirserv_set_router_is_running(ri, now);
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
set_routerstatus_from_routerinfo(routerstatus_t *rs,
|
||||||
|
const node_t *node,
|
||||||
|
const routerinfo_t *ri)
|
||||||
|
{
|
||||||
|
memset(rs, 0, sizeof(routerstatus_t));
|
||||||
|
|
||||||
|
rs->is_authority =
|
||||||
|
router_digest_is_trusted_dir(ri->cache_info.identity_digest);
|
||||||
|
|
||||||
|
/* Set by compute_performance_thresholds or from consensus */
|
||||||
|
rs->is_exit = node->is_exit;
|
||||||
|
rs->is_stable = node->is_stable;
|
||||||
|
rs->is_fast = node->is_fast;
|
||||||
|
rs->is_flagged_running = node->is_running;
|
||||||
|
rs->is_valid = node->is_valid;
|
||||||
|
rs->is_possible_guard = node->is_possible_guard;
|
||||||
|
rs->is_bad_exit = node->is_bad_exit;
|
||||||
|
rs->is_hs_dir = node->is_hs_dir;
|
||||||
|
rs->is_named = rs->is_unnamed = 0;
|
||||||
|
|
||||||
|
rs->published_on = ri->cache_info.published_on;
|
||||||
|
memcpy(rs->identity_digest, node->identity, DIGEST_LEN);
|
||||||
|
memcpy(rs->descriptor_digest, ri->cache_info.signed_descriptor_digest,
|
||||||
|
DIGEST_LEN);
|
||||||
|
rs->addr = ri->addr;
|
||||||
|
strlcpy(rs->nickname, ri->nickname, sizeof(rs->nickname));
|
||||||
|
rs->or_port = ri->or_port;
|
||||||
|
rs->dir_port = ri->dir_port;
|
||||||
|
rs->is_v2_dir = ri->supports_tunnelled_dir_requests;
|
||||||
|
|
||||||
|
tor_addr_copy(&rs->ipv6_addr, &ri->ipv6_addr);
|
||||||
|
rs->ipv6_orport = ri->ipv6_orport;
|
||||||
|
}
|
||||||
|
|
||||||
/** Alloc and return a string describing routerstatuses for the most
|
/** Alloc and return a string describing routerstatuses for the most
|
||||||
* recent info of each router we know about that is of purpose
|
* recent info of each router we know about that is of purpose
|
||||||
* <b>purpose_string</b>. Return NULL if unrecognized purpose.
|
* <b>purpose_string</b>. Return NULL if unrecognized purpose.
|
||||||
@ -2398,8 +2441,7 @@ networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now)
|
|||||||
continue;
|
continue;
|
||||||
if (ri->purpose != purpose)
|
if (ri->purpose != purpose)
|
||||||
continue;
|
continue;
|
||||||
/* then generate and write out status lines for each of them */
|
set_routerstatus_from_routerinfo(&rs, node, ri);
|
||||||
set_routerstatus_from_routerinfo(&rs, node, ri, now, 0);
|
|
||||||
smartlist_add(statuses, networkstatus_getinfo_helper_single(&rs));
|
smartlist_add(statuses, networkstatus_getinfo_helper_single(&rs));
|
||||||
} SMARTLIST_FOREACH_END(ri);
|
} SMARTLIST_FOREACH_END(ri);
|
||||||
|
|
||||||
@ -2409,47 +2451,6 @@ networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now)
|
|||||||
return answer;
|
return answer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Write out router status entries for all our bridge descriptors. Here, we
|
|
||||||
* also mark routers as running. */
|
|
||||||
void
|
|
||||||
networkstatus_dump_bridge_status_to_file(time_t now)
|
|
||||||
{
|
|
||||||
char *status;
|
|
||||||
char *fname = NULL;
|
|
||||||
char *thresholds = NULL;
|
|
||||||
char *published_thresholds_and_status = NULL;
|
|
||||||
char published[ISO_TIME_LEN+1];
|
|
||||||
const routerinfo_t *me = router_get_my_routerinfo();
|
|
||||||
char fingerprint[FINGERPRINT_LEN+1];
|
|
||||||
char *fingerprint_line = NULL;
|
|
||||||
|
|
||||||
dirserv_set_bridges_running(now);
|
|
||||||
status = networkstatus_getinfo_by_purpose("bridge", now);
|
|
||||||
|
|
||||||
if (me && crypto_pk_get_fingerprint(me->identity_pkey,
|
|
||||||
fingerprint, 0) >= 0) {
|
|
||||||
tor_asprintf(&fingerprint_line, "fingerprint %s\n", fingerprint);
|
|
||||||
} else {
|
|
||||||
log_warn(LD_BUG, "Error computing fingerprint for bridge status.");
|
|
||||||
}
|
|
||||||
format_iso_time(published, now);
|
|
||||||
dirserv_compute_bridge_flag_thresholds();
|
|
||||||
thresholds = dirserv_get_flag_thresholds_line();
|
|
||||||
tor_asprintf(&published_thresholds_and_status,
|
|
||||||
"published %s\nflag-thresholds %s\n%s%s",
|
|
||||||
published, thresholds, fingerprint_line ? fingerprint_line : "",
|
|
||||||
status);
|
|
||||||
fname = get_datadir_fname("networkstatus-bridges");
|
|
||||||
if (write_str_to_file(fname,published_thresholds_and_status,0)<0) {
|
|
||||||
log_warn(LD_DIRSERV, "Unable to write networkstatus-bridges file.");
|
|
||||||
}
|
|
||||||
tor_free(thresholds);
|
|
||||||
tor_free(published_thresholds_and_status);
|
|
||||||
tor_free(fname);
|
|
||||||
tor_free(status);
|
|
||||||
tor_free(fingerprint_line);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* DOCDOC get_net_param_from_list */
|
/* DOCDOC get_net_param_from_list */
|
||||||
static int32_t
|
static int32_t
|
||||||
get_net_param_from_list(smartlist_t *net_params, const char *param_name,
|
get_net_param_from_list(smartlist_t *net_params, const char *param_name,
|
||||||
|
@ -122,7 +122,6 @@ void signed_descs_update_status_from_consensus_networkstatus(
|
|||||||
|
|
||||||
char *networkstatus_getinfo_helper_single(const routerstatus_t *rs);
|
char *networkstatus_getinfo_helper_single(const routerstatus_t *rs);
|
||||||
char *networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now);
|
char *networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now);
|
||||||
void networkstatus_dump_bridge_status_to_file(time_t now);
|
|
||||||
MOCK_DECL(int32_t, networkstatus_get_param,
|
MOCK_DECL(int32_t, networkstatus_get_param,
|
||||||
(const networkstatus_t *ns, const char *param_name,
|
(const networkstatus_t *ns, const char *param_name,
|
||||||
int32_t default_val, int32_t min_val, int32_t max_val));
|
int32_t default_val, int32_t min_val, int32_t max_val));
|
||||||
@ -149,6 +148,10 @@ void vote_routerstatus_free_(vote_routerstatus_t *rs);
|
|||||||
#define vote_routerstatus_free(rs) \
|
#define vote_routerstatus_free(rs) \
|
||||||
FREE_AND_NULL(vote_routerstatus_t, vote_routerstatus_free_, (rs))
|
FREE_AND_NULL(vote_routerstatus_t, vote_routerstatus_free_, (rs))
|
||||||
|
|
||||||
|
void set_routerstatus_from_routerinfo(routerstatus_t *rs,
|
||||||
|
const node_t *node,
|
||||||
|
const routerinfo_t *ri);
|
||||||
|
|
||||||
#ifdef NETWORKSTATUS_PRIVATE
|
#ifdef NETWORKSTATUS_PRIVATE
|
||||||
#ifdef TOR_UNIT_TESTS
|
#ifdef TOR_UNIT_TESTS
|
||||||
STATIC int networkstatus_set_current_consensus_from_ns(networkstatus_t *c,
|
STATIC int networkstatus_set_current_consensus_from_ns(networkstatus_t *c,
|
||||||
|
@ -1926,6 +1926,8 @@ routerlist_remove_old_routers(void)
|
|||||||
void
|
void
|
||||||
routerlist_descriptors_added(smartlist_t *sl, int from_cache)
|
routerlist_descriptors_added(smartlist_t *sl, int from_cache)
|
||||||
{
|
{
|
||||||
|
// XXXX use pubsub mechanism here.
|
||||||
|
|
||||||
tor_assert(sl);
|
tor_assert(sl);
|
||||||
control_event_descriptors_changed(sl);
|
control_event_descriptors_changed(sl);
|
||||||
SMARTLIST_FOREACH_BEGIN(sl, routerinfo_t *, ri) {
|
SMARTLIST_FOREACH_BEGIN(sl, routerinfo_t *, ri) {
|
||||||
@ -1933,7 +1935,9 @@ routerlist_descriptors_added(smartlist_t *sl, int from_cache)
|
|||||||
learned_bridge_descriptor(ri, from_cache);
|
learned_bridge_descriptor(ri, from_cache);
|
||||||
if (ri->needs_retest_if_added) {
|
if (ri->needs_retest_if_added) {
|
||||||
ri->needs_retest_if_added = 0;
|
ri->needs_retest_if_added = 0;
|
||||||
|
#ifdef HAVE_MODULE_DIRAUTH
|
||||||
dirserv_single_reachability_test(approx_time(), ri);
|
dirserv_single_reachability_test(approx_time(), ri);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
} SMARTLIST_FOREACH_END(ri);
|
} SMARTLIST_FOREACH_END(ri);
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ check_result(flag_vote_test_cfg_t *c)
|
|||||||
bool result = false;
|
bool result = false;
|
||||||
routerstatus_t rs;
|
routerstatus_t rs;
|
||||||
memset(&rs, 0, sizeof(rs));
|
memset(&rs, 0, sizeof(rs));
|
||||||
set_routerstatus_from_routerinfo(&rs, &c->node, &c->ri, c->now, 0);
|
dirauth_set_routerstatus_from_routerinfo(&rs, &c->node, &c->ri, c->now, 0);
|
||||||
|
|
||||||
tt_i64_op(rs.published_on, OP_EQ, c->expected.published_on);
|
tt_i64_op(rs.published_on, OP_EQ, c->expected.published_on);
|
||||||
tt_str_op(rs.nickname, OP_EQ, c->expected.nickname);
|
tt_str_op(rs.nickname, OP_EQ, c->expected.nickname);
|
||||||
|
Loading…
Reference in New Issue
Block a user