Tor  0.4.7.0-alpha-dev
Data Structures | Macros | Functions | Variables
dirlist.c File Reference

Code to maintain our lists of directory authorities and fallback directories. More...

#include "core/or/or.h"
#include "app/config/config.h"
#include "app/config/resolve_addr.h"
#include "core/or/policies.h"
#include "feature/control/control_events.h"
#include "feature/dirauth/authmode.h"
#include "feature/dircommon/directory.h"
#include "feature/nodelist/dirlist.h"
#include "feature/nodelist/networkstatus.h"
#include "feature/nodelist/nodelist.h"
#include "feature/nodelist/routerlist.h"
#include "feature/nodelist/routerset.h"
#include "feature/relay/router.h"
#include "lib/net/resolve.h"
#include "feature/dirclient/dir_server_st.h"
#include "feature/nodelist/node_st.h"

Go to the source code of this file.

Data Structures

struct  auth_dirport_t
 

Macros

#define dir_server_free(val)    FREE_AND_NULL(dir_server_t, dir_server_free_, (val))
 

Functions

static void add_trusted_dir_to_nodelist_addr_set (const dir_server_t *dir)
 
void dirlist_add_trusted_dir_addresses (void)
 
int get_n_authorities (dirinfo_type_t type)
 
smartlist_trouter_get_trusted_dir_servers_mutable (void)
 
smartlist_trouter_get_fallback_dir_servers_mutable (void)
 
const smartlist_trouter_get_trusted_dir_servers (void)
 
const smartlist_trouter_get_fallback_dir_servers (void)
 
void router_reset_status_download_failures (void)
 
dir_server_trouter_get_trusteddirserver_by_digest (const char *digest)
 
dir_server_trouter_get_fallback_dirserver_by_digest (const char *digest)
 
int router_digest_is_fallback_dir (const char *digest)
 
dir_server_ttrusteddirserver_get_by_v3_auth_digest (const char *digest)
 
void mark_all_dirservers_up (smartlist_t *server_list)
 
int router_digest_is_trusted_dir_type (const char *digest, dirinfo_type_t type)
 
bool router_addr_is_trusted_dir_type (const tor_addr_t *addr, dirinfo_type_t type)
 
auth_dirport_usage_t auth_dirport_usage_for_purpose (int purpose)
 
static dir_server_tdir_server_new (int is_authority, const char *nickname, const tor_addr_t *ipv4_addr, const char *hostname, uint16_t ipv4_dirport, uint16_t ipv4_orport, const tor_addr_port_t *addrport_ipv6, const char *digest, const char *v3_auth_digest, dirinfo_type_t type, double weight)
 
dir_server_ttrusted_dir_server_new (const char *nickname, const char *address, uint16_t ipv4_dirport, uint16_t ipv4_orport, const tor_addr_port_t *ipv6_addrport, const char *digest, const char *v3_auth_digest, dirinfo_type_t type, double weight)
 
void trusted_dir_server_add_dirport (dir_server_t *ds, auth_dirport_usage_t usage, const tor_addr_port_t *dirport)
 
const tor_addr_port_ttrusted_dir_server_get_dirport_exact (const dir_server_t *ds, auth_dirport_usage_t usage, int addr_family)
 
const tor_addr_port_ttrusted_dir_server_get_dirport (const dir_server_t *ds, auth_dirport_usage_t usage, int addr_family)
 
dir_server_tfallback_dir_server_new (const tor_addr_t *ipv4_addr, uint16_t ipv4_dirport, uint16_t ipv4_orport, const tor_addr_port_t *addrport_ipv6, const char *id_digest, double weight)
 
void dir_server_add (dir_server_t *ent)
 
static void dir_server_free_ (dir_server_t *ds)
 
void clear_dir_servers (void)
 
void dirlist_free_all (void)
 

Variables

static smartlist_ttrusted_dir_servers = NULL
 
static smartlist_tfallback_dir_servers = NULL
 

Detailed Description

Code to maintain our lists of directory authorities and fallback directories.

For the directory authorities, we have a list containing the public identity key, and contact points, for each authority. The authorities receive descriptors from relays, and publish consensuses, descriptors, and microdescriptors. This list is pre-configured.

Fallback directories are well-known, stable, but untrusted directory caches that clients which have not yet bootstrapped can use to get their first networkstatus consensus, in order to find out where the Tor network really is. This list is pre-configured in fallback_dirs.inc. Every authority also serves as a fallback.

Both fallback directories and directory authorities are are represented by a dir_server_t.

Definition in file dirlist.c.

Function Documentation

◆ add_trusted_dir_to_nodelist_addr_set()

static void add_trusted_dir_to_nodelist_addr_set ( const dir_server_t dir)
static

Helper: From a given trusted directory entry, add the v4 or/and v6 address to the nodelist address set.

Definition at line 64 of file dirlist.c.

Referenced by dirlist_add_trusted_dir_addresses().

◆ auth_dirport_usage_for_purpose()

auth_dirport_usage_t auth_dirport_usage_for_purpose ( int  purpose)

Return an appropriate usage value describing which authdir port to use for a given directory connection purpose.

Definition at line 304 of file dirlist.c.

◆ clear_dir_servers()

void clear_dir_servers ( void  )

Remove all members from the list of dir servers.

Definition at line 600 of file dirlist.c.

◆ dir_server_add()

void dir_server_add ( dir_server_t ent)

Add a directory server to the global list(s).

Definition at line 564 of file dirlist.c.

◆ dir_server_free_()

static void dir_server_free_ ( dir_server_t ds)
static

Free storage held in ds.

Definition at line 583 of file dirlist.c.

◆ dir_server_new()

static dir_server_t* dir_server_new ( int  is_authority,
const char *  nickname,
const tor_addr_t ipv4_addr,
const char *  hostname,
uint16_t  ipv4_dirport,
uint16_t  ipv4_orport,
const tor_addr_port_t addrport_ipv6,
const char *  digest,
const char *  v3_auth_digest,
dirinfo_type_t  type,
double  weight 
)
static

Create a directory server at address:port, with OR identity key digest which has DIGEST_LEN bytes. If address is NULL, add ourself. If is_authority, this is a directory authority. Return the new directory server entry on success or NULL on failure.

Definition at line 338 of file dirlist.c.

Referenced by fallback_dir_server_new().

◆ dirlist_add_trusted_dir_addresses()

void dirlist_add_trusted_dir_addresses ( void  )

Go over the trusted directory server list and add their address(es) to the nodelist address set. This is called every time a new consensus is set.

Definition at line 87 of file dirlist.c.

◆ fallback_dir_server_new()

dir_server_t* fallback_dir_server_new ( const tor_addr_t ipv4_addr,
uint16_t  ipv4_dirport,
uint16_t  ipv4_orport,
const tor_addr_port_t addrport_ipv6,
const char *  id_digest,
double  weight 
)

Return a new dir_server_t for a fallback directory server at addr:or_port/dir_port, with identity key digest id_digest

Definition at line 553 of file dirlist.c.

◆ get_n_authorities()

int get_n_authorities ( dirinfo_type_t  type)

Return the number of directory authorities whose type matches some bit set in type

Definition at line 103 of file dirlist.c.

Referenced by fetch_bridge_descriptors(), networkstatus_check_consensus_signature(), and should_keep_srv().

◆ mark_all_dirservers_up()

void mark_all_dirservers_up ( smartlist_t server_list)

Mark as running every dir_server_t in server_list.

Definition at line 232 of file dirlist.c.

Referenced by router_reset_status_download_failures().

◆ router_addr_is_trusted_dir_type()

bool router_addr_is_trusted_dir_type ( const tor_addr_t addr,
dirinfo_type_t  type 
)

Return true iff the given address matches a trusted directory that matches at least one bit of type.

If type is NO_DIRINFO or ALL_DIRINFO, any authority is matched.

Only ORPorts' addresses are considered.

Definition at line 277 of file dirlist.c.

◆ router_digest_is_fallback_dir()

int router_digest_is_fallback_dir ( const char *  digest)

Return 1 if any fallback dirserver's identity key hashes to digest, or 0 if no such fallback is in the list of fallback_dir_servers. (fallback_dir_servers is affected by the FallbackDir and UseDefaultFallbackDirs torrc options.) The list of fallback directories includes the list of authorities.

Definition at line 205 of file dirlist.c.

◆ router_digest_is_trusted_dir_type()

int router_digest_is_trusted_dir_type ( const char *  digest,
dirinfo_type_t  type 
)

Return true iff digest is the digest of the identity key of a trusted directory matching at least one bit of type. If type is zero (NO_DIRINFO), or ALL_DIRINFO, any authority is okay.

Definition at line 256 of file dirlist.c.

◆ router_get_fallback_dirserver_by_digest()

dir_server_t* router_get_fallback_dirserver_by_digest ( const char *  digest)

Return the dir_server_t for the fallback dirserver whose identity key hashes to digest, or NULL if no such fallback is in the list of fallback_dir_servers. (fallback_dir_servers is affected by the FallbackDir and UseDefaultFallbackDirs torrc options.) The list of fallback directories includes the list of authorities.

Definition at line 181 of file dirlist.c.

Referenced by router_digest_is_fallback_dir().

◆ router_get_trusted_dir_servers_mutable()

smartlist_t* router_get_trusted_dir_servers_mutable ( void  )

Return a smartlist containing a list of dir_server_t * for all known trusted dirservers. Callers must not modify the list or its contents.

Definition at line 119 of file dirlist.c.

◆ router_get_trusteddirserver_by_digest()

dir_server_t* router_get_trusteddirserver_by_digest ( const char *  digest)

Return the dir_server_t for the directory authority whose identity key hashes to digest, or NULL if no such authority is known.

Definition at line 160 of file dirlist.c.

Referenced by handle_response_upload_dir().

◆ router_reset_status_download_failures()

void router_reset_status_download_failures ( void  )

Reset all internal variables used to count failed downloads of network status objects.

Definition at line 151 of file dirlist.c.

◆ trusted_dir_server_add_dirport()

void trusted_dir_server_add_dirport ( dir_server_t ds,
auth_dirport_usage_t  usage,
const tor_addr_port_t dirport 
)

Add dirport as an HTTP DirPort contact point for the directory authority ds, for use when contacting that authority for the given usage.

Multiple ports of the same usage are allowed; if present, then only the first one of each address family is currently used.

Definition at line 477 of file dirlist.c.

◆ trusted_dir_server_get_dirport()

const tor_addr_port_t* trusted_dir_server_get_dirport ( const dir_server_t ds,
auth_dirport_usage_t  usage,
int  addr_family 
)

Return the DirPort of the authority ds for with the usage type usage and address family addr_family. If none is found, try again with an AUTH_USAGE_LEGACY dirport, if there is one. Return NULL if no port can be found.

Definition at line 529 of file dirlist.c.

◆ trusted_dir_server_get_dirport_exact()

const tor_addr_port_t* trusted_dir_server_get_dirport_exact ( const dir_server_t ds,
auth_dirport_usage_t  usage,
int  addr_family 
)

Helper for trusted_dir_server_get_dirport: only return the exact requested usage type.

Definition at line 503 of file dirlist.c.

Referenced by trusted_dir_server_get_dirport().

◆ trusted_dir_server_new()

dir_server_t* trusted_dir_server_new ( const char *  nickname,
const char *  address,
uint16_t  ipv4_dirport,
uint16_t  ipv4_orport,
const tor_addr_port_t ipv6_addrport,
const char *  digest,
const char *  v3_auth_digest,
dirinfo_type_t  type,
double  weight 
)

Create an authoritative directory server at address:port, with identity key digest. If ipv4_addr_str is NULL, add ourself. Return the new trusted directory server entry on success or NULL if we couldn't add it.

Definition at line 419 of file dirlist.c.

◆ trusteddirserver_get_by_v3_auth_digest()

dir_server_t* trusteddirserver_get_by_v3_auth_digest ( const char *  digest)

Return the dir_server_t for the directory authority whose v3 identity key hashes to digest, or NULL if no such authority is known.

Definition at line 215 of file dirlist.c.

Variable Documentation

◆ fallback_dir_servers

smartlist_t* fallback_dir_servers = NULL
static

Global list of dir_server_t objects for all directory authorities and all fallback directory servers.

Definition at line 59 of file dirlist.c.

Referenced by clear_dir_servers(), dir_server_add(), router_get_fallback_dirserver_by_digest(), and router_reset_status_download_failures().

◆ trusted_dir_servers

smartlist_t* trusted_dir_servers = NULL
static