tor  master
dirserv.h
Go to the documentation of this file.
1 /* Copyright (c) 2001 Matej Pfajfar.
2  * Copyright (c) 2001-2004, Roger Dingledine.
3  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
4  * Copyright (c) 2007-2017, The Tor Project, Inc. */
5 /* See LICENSE for licensing information */
6 
12 #ifndef TOR_DIRSERV_H
13 #define TOR_DIRSERV_H
14 
15 #include "testsupport.h"
16 
20 #define REACHABILITY_MODULO_PER_TEST 128
21 
23 #define REACHABILITY_TEST_INTERVAL 10
24 
26 #define REACHABILITY_TEST_CYCLE_PERIOD \
27  (REACHABILITY_TEST_INTERVAL*REACHABILITY_MODULO_PER_TEST)
28 
30 #define MAX_EXITPOLICY_SUMMARY_LEN 1000
31 
33 #define MAX_V_LINE_LEN 128
34 
36 typedef enum dir_spool_source_t {
37  DIR_SPOOL_SERVER_BY_DIGEST=1, DIR_SPOOL_SERVER_BY_FP,
38  DIR_SPOOL_EXTRA_BY_DIGEST, DIR_SPOOL_EXTRA_BY_FP,
39  DIR_SPOOL_MICRODESC,
40  DIR_SPOOL_NETWORKSTATUS,
41  DIR_SPOOL_CONSENSUS_CACHE_ENTRY,
43 #define dir_spool_source_bitfield_t ENUM_BF(dir_spool_source_t)
44 
58 typedef struct spooled_resource_t {
63  unsigned spool_eagerly : 1;
67  dir_spool_source_bitfield_t spool_source : 7;
82  const uint8_t *cce_body;
83  size_t cce_len;
89 
91 
96  const char *desc, uint8_t purpose,
97  const char *source,
98  const char **msg);
100  const char **msg,
101  const char *source);
102 void dirserv_set_router_is_running(routerinfo_t *router, time_t now);
103 int list_server_status_v1(smartlist_t *routers, char **router_status_out,
104  int for_controller);
106 void dirserv_compute_bridge_flag_thresholds(void);
107 
112 int directory_caches_dir_info(const or_options_t *options);
115  time_t now);
116 
117 cached_dir_t *dirserv_get_consensus(const char *flavor_name);
118 void dirserv_set_cached_consensus_networkstatus(const char *consensus,
119  const char *flavor_name,
120  const common_digests_t *digests,
121  const uint8_t *sha3_as_signed,
122  time_t published);
123 void dirserv_clear_old_networkstatuses(time_t cutoff);
124 int dirserv_get_routerdesc_spool(smartlist_t *spools_out, const char *key,
125  dir_spool_source_t source,
126  int conn_is_encrypted,
127  const char **msg_out);
128 int dirserv_get_routerdescs(smartlist_t *descs_out, const char *key,
129  const char **msg);
130 void dirserv_orconn_tls_done(const tor_addr_t *addr,
131  uint16_t or_port,
132  const char *digest_rcvd,
133  const ed25519_public_key_t *ed_id_rcvd);
135  const routerinfo_t *ri_old);
136 void dirserv_single_reachability_test(time_t now, routerinfo_t *router);
137 void dirserv_test_reachability(time_t now);
138 int authdir_wants_to_reject_router(routerinfo_t *ri, const char **msg,
139  int complain,
140  int *valid_out);
141 uint32_t dirserv_router_get_status(const routerinfo_t *router,
142  const char **msg,
143  int severity);
145  uint32_t authstatus);
146 
149  const routerstatus_t *rs,
150  const char *version,
151  const char *protocols,
153  int consensus_method,
154  const vote_routerstatus_t *vrs);
155 void dirserv_free_all(void);
157 cached_dir_t *new_cached_dir(char *s, time_t published);
158 
159 int validate_recommended_package_line(const char *line);
160 int dirserv_query_measured_bw_cache_kb(const char *node_id,
161  long *bw_out,
162  time_t *as_of_out);
164 int dirserv_has_measured_bw(const char *node_id);
166 void dirserv_count_measured_bws(const smartlist_t *routers);
167 int running_long_enough_to_decide_unreachable(void);
168 void dirserv_compute_performance_thresholds(digestmap_t *omit_as_sybil);
169 
170 #ifdef DIRSERV_PRIVATE
171 
173 
174 /* Put the MAX_MEASUREMENT_AGE #define here so unit tests can see it */
175 #define MAX_MEASUREMENT_AGE (3*24*60*60) /* 3 days */
176 
177 STATIC int measured_bw_line_parse(measured_bw_line_t *out, const char *line);
178 
179 STATIC int measured_bw_line_apply(measured_bw_line_t *parsed_line,
180  smartlist_t *routerstatuses);
181 
182 STATIC void dirserv_cache_measured_bw(const measured_bw_line_t *parsed_line,
183  time_t as_of);
184 STATIC void dirserv_expire_measured_bw_cache(time_t now);
185 
186 STATIC int
187 dirserv_read_guardfraction_file_from_str(const char *guardfraction_file_str,
188  smartlist_t *vote_routerstatuses);
189 #endif /* defined(DIRSERV_PRIVATE) */
190 
191 int dirserv_read_measured_bandwidths(const char *from_file,
192  smartlist_t *routerstatuses);
193 
194 int dirserv_read_guardfraction_file(const char *fname,
195  smartlist_t *vote_routerstatuses);
196 
197 spooled_resource_t *spooled_resource_new(dir_spool_source_t source,
198  const uint8_t *digest,
199  size_t digestlen);
201  struct consensus_cache_entry_t *entry);
203 #define spooled_resource_free(sp) \
204  FREE_AND_NULL(spooled_resource_t, spooled_resource_free_, (sp))
206  time_t cutoff,
207  int compression,
208  size_t *size_out,
209  int *n_expired_out);
212 
213 #endif /* !defined(TOR_DIRSERV_H) */
214 
dir_spool_source_bitfield_t spool_source
Definition: dirserv.h:67
void dirserv_set_router_is_running(routerinfo_t *router, time_t now)
Definition: dirserv.c:946
void dirserv_count_measured_bws(const smartlist_t *routers)
Definition: dirserv.c:1453
int dirserv_get_routerdesc_spool(smartlist_t *spools_out, const char *key, dir_spool_source_t source, int conn_is_encrypted, const char **msg_out)
Definition: dirserv.c:2655
int validate_recommended_package_line(const char *line)
Definition: dirserv.c:3494
void dirserv_compute_performance_thresholds(digestmap_t *omit_as_sybil)
Definition: dirserv.c:1475
int dirserv_read_guardfraction_file(const char *fname, smartlist_t *vote_routerstatuses)
Definition: dirserv.c:2433
void cached_dir_decref(cached_dir_t *d)
Definition: dirserv.c:1208
Definition: or.h:3657
STATIC void dirserv_set_routerstatus_testing(routerstatus_t *rs)
Definition: dirserv.c:2107
int dirserv_get_measured_bw_cache_size(void)
Definition: dirserv.c:1769
was_router_added_t
Definition: or.h:5481
int directory_too_idle_to_fetch_descriptors(const or_options_t *options, time_t now)
Definition: dirserv.c:1191
int directory_fetches_dir_info_early(const or_options_t *options)
Definition: dirserv.c:1127
char * fname
Definition: conscache.c:35
struct spooled_resource_t spooled_resource_t
Definition: or.h:2504
int connection_dirserv_flushed_some(dir_connection_t *conn)
Definition: dirserv.c:3417
routerstatus_format_type_t
Definition: or.h:5099
Definition: crypto_digest.h:74
void spooled_resource_free_(spooled_resource_t *spooled)
Definition: dirserv.c:3035
Definition: dirserv.h:58
Definition: crypto_ed25519.h:23
int directory_fetches_from_authorities(const or_options_t *options)
Definition: dirserv.c:1099
enum was_router_added_t dirserv_add_descriptor(routerinfo_t *ri, const char **msg, const char *source)
Definition: dirserv.c:664
Definition: address.h:56
int directory_caches_unknown_auth_certs(const or_options_t *options)
Definition: dirserv.c:1150
STATIC void dirserv_expire_measured_bw_cache(time_t now)
Definition: dirserv.c:1717
void dirserv_free_fingerprint_list(void)
Definition: dirserv.c:460
char * dirserv_get_flag_thresholds_line(void)
Definition: dirserv.c:1809
int directory_caches_dir_info(const or_options_t *options)
Definition: dirserv.c:1165
int dirserv_should_launch_reachability_test(const routerinfo_t *ri, const routerinfo_t *ri_old)
Definition: dirserv.c:2866
void dirserv_set_cached_consensus_networkstatus(const char *consensus, const char *flavor_name, const common_digests_t *digests, const uint8_t *sha3_as_signed, time_t published)
Definition: dirserv.c:1258
cached_dir_t * new_cached_dir(char *s, time_t published)
Definition: dirserv.c:1219
STATIC int measured_bw_line_apply(measured_bw_line_t *parsed_line, smartlist_t *routerstatuses)
Definition: dirserv.c:2549
Definition: conscache.c:26
Definition: container.h:18
int authdir_wants_to_reject_router(routerinfo_t *ri, const char **msg, int complain, int *valid_out)
Definition: dirserv.c:502
Definition: d.py:1
int dirserv_has_measured_bw(const char *node_id)
Definition: dirserv.c:1762
unsigned spool_eagerly
Definition: dirserv.h:63
int dirserv_get_routerdescs(smartlist_t *descs_out, const char *key, const char **msg)
Definition: dirserv.c:2734
char * routerstatus_format_entry(const routerstatus_t *rs, const char *version, const char *protocols, routerstatus_format_type_t format, int consensus_method, const vote_routerstatus_t *vrs)
Definition: dirserv.c:1856
STATIC int dirserv_read_guardfraction_file_from_str(const char *guardfraction_file_str, smartlist_t *vote_routerstatuses)
Definition: dirserv.c:2318
void dirserv_orconn_tls_done(const tor_addr_t *addr, uint16_t or_port, const char *digest_rcvd, const ed25519_public_key_t *ed_id_rcvd)
Definition: dirserv.c:2803
off_t cached_dir_offset
Definition: dirserv.h:87
uint8_t digest[DIGEST256_LEN]
Definition: dirserv.h:71
int directory_fetches_dir_info_later(const or_options_t *options)
Definition: dirserv.c:1139
void dirserv_single_reachability_test(time_t now, routerinfo_t *router)
Definition: dirserv.c:2891
uint32_t dirserv_router_get_status(const routerinfo_t *router, const char **msg, int severity)
Definition: dirserv.c:276
dir_spool_source_t
Definition: dirserv.h:36
int dirserv_would_reject_router(const routerstatus_t *rs)
Definition: dirserv.c:352
struct cached_dir_t * cached_dir_ref
Definition: dirserv.h:76
#define DIGEST256_LEN
Definition: crypto_digest.h:25
STATIC void dirserv_cache_measured_bw(const measured_bw_line_t *parsed_line, time_t as_of)
Definition: dirserv.c:1676
Definition: or.h:2018
int directory_permits_begindir_requests(const or_options_t *options)
Definition: dirserv.c:1181
int dirserv_read_measured_bandwidths(const char *from_file, smartlist_t *routerstatuses)
Definition: dirserv.c:2575
void dirserv_set_node_flags_from_authoritative_status(node_t *node, uint32_t authstatus)
Definition: dirserv.c:555
void dirserv_spool_sort(dir_connection_t *conn)
Definition: dirserv.c:3372
void dirserv_free_all(void)
Definition: dirserv.c:3550
Definition: or.h:1833
int list_server_status_v1(smartlist_t *routers, char **router_status_out, int for_controller)
Definition: dirserv.c:1015
int dirserv_load_fingerprint_file(void)
Definition: dirserv.c:196
Definition: crypto_rsa.c:41
int dirserv_add_own_fingerprint(crypto_pk_t *pk)
Definition: dirserv.c:177
int dirserv_query_measured_bw_cache_kb(const char *node_id, long *bw_out, time_t *as_of_out)
Definition: dirserv.c:1741
STATIC int measured_bw_line_parse(measured_bw_line_t *out, const char *orig_line)
Definition: dirserv.c:2455
struct consensus_cache_entry_t * consensus_cache_entry
Definition: dirserv.h:81
void dirserv_clear_measured_bw_cache(void)
Definition: dirserv.c:1706
Definition: or.h:2344
spooled_resource_t * spooled_resource_new_from_cache_entry(struct consensus_cache_entry_t *entry)
Definition: dirserv.c:3014
void dir_conn_clear_spool(dir_connection_t *conn)
Definition: dirserv.c:3462
cached_dir_t * dirserv_get_consensus(const char *flavor_name)
Definition: dirserv.c:1282
enum was_router_added_t dirserv_add_multiple_descriptors(const char *desc, uint8_t purpose, const char *source, const char **msg)
Definition: dirserv.c:572
Definition: or.h:2590
Definition: or.h:2232
void dirserv_spool_remove_missing_and_guess_size(dir_connection_t *conn, time_t cutoff, int compression, size_t *size_out, int *n_expired_out)
Definition: dirserv.c:3319
void dirserv_test_reachability(time_t now)
Definition: dirserv.c:2944