tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

dirserv.h (5955B)


      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-2021, The Tor Project, Inc. */
      5 /* See LICENSE for licensing information */
      6 
      7 /**
      8 * \file dirserv.h
      9 * \brief Header file for dirserv.c.
     10 **/
     11 
     12 #ifndef TOR_DIRSERV_H
     13 #define TOR_DIRSERV_H
     14 
     15 struct ed25519_public_key_t;
     16 
     17 #include "lib/testsupport/testsupport.h"
     18 
     19 /** Ways to convert a spoolable_resource_t to a bunch of bytes. */
     20 typedef enum dir_spool_source_t {
     21    DIR_SPOOL_SERVER_BY_DIGEST=1, DIR_SPOOL_SERVER_BY_FP,
     22    DIR_SPOOL_EXTRA_BY_DIGEST, DIR_SPOOL_EXTRA_BY_FP,
     23    DIR_SPOOL_MICRODESC,
     24    DIR_SPOOL_NETWORKSTATUS,
     25    DIR_SPOOL_CONSENSUS_CACHE_ENTRY,
     26 } dir_spool_source_t;
     27 #define dir_spool_source_bitfield_t ENUM_BF(dir_spool_source_t)
     28 
     29 /** Object to remember the identity of an object that we are spooling,
     30 * or about to spool, in response to a directory request.
     31 *
     32 * (Why do we spool?  Because some directory responses are very large,
     33 * and we don't want to just shove the complete answer into the output
     34 * buffer: that would take a ridiculous amount of RAM.)
     35 *
     36 * If the spooled resource is relatively small (like microdescriptors,
     37 * descriptors, etc), we look them up by ID as needed, and add the whole
     38 * thing onto the output buffer at once.  If the spooled reseource is
     39 * big (like networkstatus documents), we reference-count it, and add it
     40 * a few K at a time.
     41 */
     42 typedef struct spooled_resource_t {
     43  /**
     44   * If true, we add the entire object to the outbuf.  If false,
     45   * we spool the object a few K at a time.
     46   */
     47  unsigned spool_eagerly : 1;
     48  /**
     49   * Tells us what kind of object to get, and how to look it up.
     50   */
     51  dir_spool_source_bitfield_t spool_source : 7;
     52  /**
     53   * Tells us the specific object to spool.
     54   */
     55  uint8_t digest[DIGEST256_LEN];
     56  /**
     57   * A large object that we're spooling. Holds a reference count.  Only
     58   * used when spool_eagerly is false.
     59   */
     60  struct cached_dir_t *cached_dir_ref;
     61  /**
     62   * A different kind of large object that we might be spooling. Also
     63   * reference-counted.  Also only used when spool_eagerly is false.
     64   */
     65  struct consensus_cache_entry_t *consensus_cache_entry;
     66  const uint8_t *cce_body;
     67  size_t cce_len;
     68  /**
     69   * The current offset into cached_dir or cce_body. Only used when
     70   * spool_eagerly is false */
     71  off_t cached_dir_offset;
     72 } spooled_resource_t;
     73 
     74 int connection_dirserv_flushed_some(dir_connection_t *conn);
     75 
     76 enum dir_spool_source_t;
     77 int dir_split_resource_into_spoolable(const char *resource,
     78                                      enum dir_spool_source_t source,
     79                                      smartlist_t *spool_out,
     80                                      int *compressed_out,
     81                                      int flags);
     82 
     83 #ifdef HAVE_MODULE_DIRCACHE
     84 /** Is the dircache module enabled? */
     85 #define have_module_dircache() (1)
     86 int directory_caches_unknown_auth_certs(const or_options_t *options);
     87 int directory_caches_dir_info(const or_options_t *options);
     88 int directory_permits_begindir_requests(const or_options_t *options);
     89 MOCK_DECL(cached_dir_t *, dirserv_get_consensus, (const char *flavor_name));
     90 void dirserv_set_cached_consensus_networkstatus(const char *consensus,
     91                                              size_t consensus_len,
     92                                              const char *flavor_name,
     93                                              const common_digests_t *digests,
     94                                              const uint8_t *sha3_as_signed,
     95                                              time_t published);
     96 #else /* !defined(HAVE_MODULE_DIRCACHE) */
     97 #define have_module_dircache() (0)
     98 #define directory_caches_unknown_auth_certs(opt) \
     99  ((void)(opt), 0)
    100 #define directory_caches_dir_info(opt) \
    101  ((void)(opt), 0)
    102 #define directory_permits_begindir_requests(opt) \
    103  ((void)(opt), 0)
    104 #define dirserv_get_consensus(flav) \
    105  ((void)(flav), NULL)
    106 #define dirserv_set_cached_consensus_networkstatus(a,b,c,d,e,f) \
    107  STMT_BEGIN {                                                  \
    108    (void)(a);                                                  \
    109    (void)(b);                                                  \
    110    (void)(c);                                                  \
    111    (void)(d);                                                  \
    112    (void)(e);                                                  \
    113    (void)(f);                                                  \
    114  } STMT_END
    115 #endif /* defined(HAVE_MODULE_DIRCACHE) */
    116 
    117 void dirserv_clear_old_networkstatuses(time_t cutoff);
    118 int dirserv_get_routerdesc_spool(smartlist_t *spools_out, const char *key,
    119                                 dir_spool_source_t source,
    120                                 int conn_is_encrypted,
    121                                 const char **msg_out);
    122 
    123 void dirserv_free_all(void);
    124 void cached_dir_decref(cached_dir_t *d);
    125 cached_dir_t *new_cached_dir(char *s, time_t published);
    126 
    127 spooled_resource_t *spooled_resource_new(dir_spool_source_t source,
    128                                         const uint8_t *digest,
    129                                         size_t digestlen);
    130 spooled_resource_t *spooled_resource_new_from_cache_entry(
    131                                      struct consensus_cache_entry_t *entry);
    132 void spooled_resource_free_(spooled_resource_t *spooled);
    133 #define spooled_resource_free(sp) \
    134  FREE_AND_NULL(spooled_resource_t, spooled_resource_free_, (sp))
    135 void dirserv_spool_remove_missing_and_guess_size(dir_connection_t *conn,
    136                                                 time_t cutoff,
    137                                                 int compression,
    138                                                 size_t *size_out,
    139                                                 int *n_expired_out);
    140 void dirserv_spool_sort(dir_connection_t *conn);
    141 void dir_conn_clear_spool(dir_connection_t *conn);
    142 
    143 #endif /* !defined(TOR_DIRSERV_H) */