60 int conn_is_encrypted,
61 const uint8_t **body_out,
63 time_t *published_out);
66 time_t *published_out);
82 return dir_server_mode(options) || options->
BridgeRelay;
97 if (options->
BridgeRelay || dir_server_mode(options))
99 if (!server_mode(options) || !advertised_server_mode())
113 return options->
BridgeRelay != 0 || dir_server_mode(options);
127 if (!d || --d->
refcnt > 0)
145 log_warn(
LD_BUG,
"Error compressing directory");
175dirserv_set_cached_consensus_networkstatus(
const char *networkstatus,
176 size_t networkstatus_len,
177 const char *flavor_name,
179 const uint8_t *sha3_as_signed,
188 new_cached_dir(tor_memdup_nulterm(networkstatus, networkstatus_len),
195 if (old_networkstatus)
202dirserv_get_consensus,(
const char *flavor_name))
222 const size_t digest_len =
226 compressed_out, flags);
230 spooled_resource_new(source, digest, digest_len);
234 } SMARTLIST_FOREACH_END(digest);
236 smartlist_free(fingerprints);
249 int conn_is_encrypted,
250 const char **msg_out)
254 if (!strcmp(key,
"all")) {
258 spooled = spooled_resource_new(source,
259 (
const uint8_t *)r->cache_info.identity_digest,
262 conn_is_encrypted = 0;
264 } SMARTLIST_FOREACH_END(r);
265 }
else if (!strcmp(key,
"authority")) {
269 spooled_resource_new(source,
275 DSR_HEX|DSR_SORT_UNIQ);
277 key += strlen(
"fp/");
279 DSR_HEX|DSR_SORT_UNIQ);
281 *msg_out =
"Not found";
285 if (! conn_is_encrypted) {
288 const uint8_t *body = NULL;
291 &body, &bodylen, NULL);
292 if (r < 0 || body == NULL || bodylen == 0) {
294 spooled_resource_free(spooled);
296 } SMARTLIST_FOREACH_END(spooled);
299 if (!smartlist_len(spool_out)) {
300 *msg_out =
"Servers unavailable";
312 const uint8_t *digest,
size_t digestlen)
317 case DIR_SPOOL_NETWORKSTATUS:
320 case DIR_SPOOL_SERVER_BY_DIGEST:
321 case DIR_SPOOL_SERVER_BY_FP:
322 case DIR_SPOOL_EXTRA_BY_DIGEST:
323 case DIR_SPOOL_EXTRA_BY_FP:
324 case DIR_SPOOL_MICRODESC:
328 case DIR_SPOOL_CONSENSUS_CACHE_ENTRY:
329 tor_assert_unreached();
334 memcpy(spooled->
digest, digest, digestlen);
349 spooled->
spool_source = DIR_SPOOL_CONSENSUS_CACHE_ENTRY;
360 spooled_resource_free(spooled);
385#define DIRSERV_CACHED_DIR_CHUNK_SIZE 8192
408 time_t *published_out)
411 const uint8_t *body = NULL;
417 if (r == -1 || body == NULL || bodylen == 0)
421 bodylen = (size_t)(bodylen * ratio);
432 return spooled->cce_len;
440 if (cached == NULL) {
466 const uint8_t *body = NULL;
470 &body, &bodylen, NULL);
471 if (r == -1 || body == NULL || bodylen == 0) {
482 if (cached == NULL && cce == NULL) {
494 if (BUG(!cached && !cce))
503 total_len = spooled->cce_len;
504 ptr = (
const char *)spooled->cce_body;
509 if (BUG(remaining < 0))
534 time_t *published_out)
553 int conn_is_encrypted,
554 const uint8_t **body_out,
556 time_t *published_out)
563 case DIR_SPOOL_EXTRA_BY_FP: {
567 case DIR_SPOOL_SERVER_BY_FP: {
571 case DIR_SPOOL_SERVER_BY_DIGEST: {
575 case DIR_SPOOL_EXTRA_BY_DIGEST: {
579 case DIR_SPOOL_MICRODESC: {
582 (
const char *)spooled->
digest);
583 if (! md || ! md->
body) {
586 *body_out = (
const uint8_t *)md->
body;
589 *published_out = TIME_MAX;
592 case DIR_SPOOL_NETWORKSTATUS:
593 case DIR_SPOOL_CONSENSUS_CACHE_ENTRY:
606 if (sd->send_unencrypted == 0 && ! conn_is_encrypted) {
665 time_t published = TIME_MAX;
667 compression, &published);
668 if (published < cutoff) {
671 spooled_resource_free(spooled);
672 }
else if (sz == 0) {
674 spooled_resource_free(spooled);
678 } SMARTLIST_FOREACH_END(spooled);
681 *size_out = (total > SIZE_MAX) ? SIZE_MAX : (size_t)total;
684 *n_expired_out = n_expired;
700 if (conn->
spool == NULL)
724 return &ri->cache_info;
732#define DIRSERV_BUFFER_MIN 16384
746 if (conn->
spool == NULL)
750 smartlist_len(conn->
spool)) {
752 smartlist_get(conn->
spool, smartlist_len(conn->
spool)-1);
755 if (status == SRFS_ERR) {
757 }
else if (status == SRFS_MORE) {
764 spooled_resource_free(spooled);
767 if (smartlist_len(conn->
spool) > 0) {
773 smartlist_free(conn->
spool);
778 connection_buf_add_compress(
"", 0, conn, 1);
806 if (!conn || ! conn->
spool)
809 spooled_resource_free(s));
810 smartlist_free(conn->
spool);
int tor_addr_parse(tor_addr_t *addr, const char *src)
Cached large directory object structure.
int tor_compress(char **out, size_t *out_len, const char *in, size_t in_len, compress_method_t method)
Header file for config.c.
void connection_dir_buf_add(const char *string, size_t len, dir_connection_t *dir_conn, int done)
Header file for connection.c.
void consensus_cache_entry_incref(consensus_cache_entry_t *ent)
void consensus_cache_entry_decref(consensus_cache_entry_t *ent)
int consensus_cache_entry_get_body(const consensus_cache_entry_t *ent, const uint8_t **body_out, size_t *sz_out)
int consensus_cache_entry_get_valid_after(const consensus_cache_entry_t *ent, time_t *out)
Header for consdiffmgr.c.
#define fast_memcmp(a, b, c)
Client/server directory connection structure.
int connection_dir_is_encrypted(const dir_connection_t *conn)
int dir_split_resource_into_fingerprints(const char *resource, smartlist_t *fp_out, int *compressed_out, int flags)
bool connection_dir_used_obsolete_sendme(const dir_connection_t *conn)
Header file for directory.c.
#define DIR_CONN_STATE_SERVER_WRITING
static int dirserv_spool_sort_comparison_(const void **a_, const void **b_)
void cached_dir_decref(cached_dir_t *d)
void dirserv_spool_sort(dir_connection_t *conn)
#define DIRSERV_CACHED_DIR_CHUNK_SIZE
static void clear_cached_dir(cached_dir_t *d)
static cached_dir_t * spooled_resource_lookup_cached_dir(const spooled_resource_t *spooled, time_t *published_out)
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)
static void free_cached_dir_(void *_d)
spooled_resource_flush_status_t
static spooled_resource_flush_status_t spooled_resource_flush_some(spooled_resource_t *spooled, dir_connection_t *conn)
void spooled_resource_free_(spooled_resource_t *spooled)
int dirserv_get_routerdesc_spool(smartlist_t *spool_out, const char *key, dir_spool_source_t source, int conn_is_encrypted, const char **msg_out)
#define DIRSERV_BUFFER_MIN
static cached_dir_t * lookup_cached_dir_by_fp(const uint8_t *fp)
void dir_conn_clear_spool(dir_connection_t *conn)
static double estimate_compression_ratio(dir_spool_source_t source)
static int spooled_resource_lookup_body(const spooled_resource_t *spooled, int conn_is_encrypted, const uint8_t **body_out, size_t *size_out, time_t *published_out)
spooled_resource_t * spooled_resource_new_from_cache_entry(consensus_cache_entry_t *entry)
static size_t spooled_resource_estimate_size(const spooled_resource_t *spooled, dir_connection_t *conn, int compressed, time_t *published_out)
static strmap_t * cached_consensuses
void dirserv_free_all(void)
int connection_dirserv_flushed_some(dir_connection_t *conn)
int dir_split_resource_into_spoolable(const char *resource, dir_spool_source_t source, smartlist_t *spool_out, int *compressed_out, int flags)
cached_dir_t * new_cached_dir(char *s, time_t published)
static const signed_descriptor_t * get_signed_descriptor_by_fp(const uint8_t *fp, int extrainfo)
Header file for dirserv.c.
Header file for geoip_stats.c.
@ GEOIP_CLIENT_NETWORKSTATUS
microdesc_t * microdesc_cache_lookup_by_digest256(microdesc_cache_t *cache, const char *d)
microdesc_cache_t * get_microdesc_cache(void)
Header file for microdesc.c.
Microdescriptor structure.
Master header file for Tor-specific functionality.
Header file for predict_ports.c.
extrainfo_t * router_get_my_extrainfo(void)
int router_digest_is_me(const char *digest)
const routerinfo_t * router_get_my_routerinfo(void)
int router_my_exit_policy_is_reject_star(void)
int should_refuse_unknown_exits(const or_options_t *options)
Header file for router.c.
Router descriptor structure.
const char * signed_descriptor_get_body(const signed_descriptor_t *desc)
routerlist_t * router_get_routerlist(void)
signed_descriptor_t * router_get_by_descriptor_digest(const char *digest)
const routerinfo_t * router_get_by_id_digest(const char *digest)
signed_descriptor_t * extrainfo_get_by_descriptor_digest(const char *digest)
Header file for routerlist.c.
Router descriptor list structure.
Header file for routermode.c.
void smartlist_sort(smartlist_t *sl, int(*compare)(const void **a, const void **b))
void * smartlist_pop_last(smartlist_t *sl)
smartlist_t * smartlist_new(void)
void smartlist_add(smartlist_t *sl, void *element)
#define SMARTLIST_FOREACH_BEGIN(sl, type, var)
#define SMARTLIST_FOREACH(sl, type, var, cmd)
#define SMARTLIST_DEL_CURRENT(sl, var)
uint8_t digest_sha3_as_signed[DIGEST256_LEN]
size_t dir_compressed_len
bool should_count_geoip_when_finished
struct tor_compress_state_t * compress_state
char extra_info_digest[DIGEST_LEN]
char identity_digest[DIGEST_LEN]
size_t signed_descriptor_len
dir_spool_source_bitfield_t spool_source
uint8_t digest[DIGEST256_LEN]
struct consensus_cache_entry_t * consensus_cache_entry
struct cached_dir_t * cached_dir_ref
#define MOCK_IMPL(rv, funcname, arglist)
#define tor_assert_nonfatal_unreached()
int strcmpstart(const char *s1, const char *s2)
int tor_digest_is_zero(const char *digest)