tor  master
Data Structures | Macros | Typedefs | Enumerations | Functions
nodelist.c File Reference

Structures and functions for tracking what we know about the routers on the Tor network, and correlating information from networkstatus, routerinfo, and microdescs. More...

#include "or.h"
#include "address.h"
#include "address_set.h"
#include "bridges.h"
#include "config.h"
#include "control.h"
#include "dirserv.h"
#include "entrynodes.h"
#include "geoip.h"
#include "hs_common.h"
#include "hs_client.h"
#include "main.h"
#include "microdesc.h"
#include "networkstatus.h"
#include "nodelist.h"
#include "policies.h"
#include "protover.h"
#include "rendservice.h"
#include "router.h"
#include "routerlist.h"
#include "routerparse.h"
#include "routerset.h"
#include "torcert.h"
#include <string.h>
#include "dirauth/mode.h"
Include dependency graph for nodelist.c:

Data Structures

struct  nodelist_t
 

Macros

#define NODELIST_PRIVATE
 
#define node_free(val)   FREE_AND_NULL(node_t, node_free_, (val))
 
#define ESTIMATED_ADDRESS_PER_NODE   2
 
#define SL_ADD_NEW_IPV4_AP(r, port_field, sl, valid)
 
#define SL_ADD_NEW_IPV6_AP(r, port_field, sl, valid)
 
#define RETURN_IPV4_AP(r, port_field, ap_out)
 
#define DFLT_PCT_USABLE_NEEDED   60
 

Typedefs

typedef struct nodelist_t nodelist_t
 

Enumerations

enum  usable_descriptor_t { USABLE_DESCRIPTOR_ALL = 0, USABLE_DESCRIPTOR_EXIT_ONLY = 1 }
 

Functions

 HT_GENERATE2 (nodelist_map, node_t, ht_ent, node_id_hash, node_id_eq, 0.6, tor_reallocarray_, tor_free_) static inline unsigned int node_ed_id_hash(const node_t *node)
 
 HT_PROTOTYPE (HT_GENERATE2(nodelist_ed_map, HT_GENERATE2(node_t, HT_GENERATE2(ed_ht_ent, HT_GENERATE2(node_ed_id_hash, HT_GENERATE2(node_ed_id_eq)
 
 MOCK_IMPL (node_t *, node_get_mutable_by_id,(const char *identity_digest))
 
node_tnode_get_mutable_by_ed25519_id (const ed25519_public_key_t *ed_id)
 
 MOCK_IMPL (const node_t *, node_get_by_id,(const char *identity_digest))
 
 MOCK_IMPL (const node_t *, node_get_by_ed25519_id,(const ed25519_public_key_t *ed_id))
 
STATIC void node_set_hsdir_index (node_t *node, const networkstatus_t *ns)
 
int nodelist_probably_contains_address (const tor_addr_t *addr)
 
node_tnodelist_set_routerinfo (routerinfo_t *ri, routerinfo_t **ri_old_out)
 
node_tnodelist_add_microdesc (microdesc_t *md)
 
 MOCK_IMPL (int, get_estimated_address_per_node,(void))
 
void nodelist_set_consensus (networkstatus_t *ns)
 
void nodelist_remove_microdesc (const char *identity_digest, microdesc_t *md)
 
void nodelist_remove_routerinfo (routerinfo_t *ri)
 
smartlist_tnodelist_find_nodes_with_microdesc (const microdesc_t *md)
 
void nodelist_purge (void)
 
void nodelist_free_all (void)
 
void nodelist_assert_ok (void)
 
 MOCK_IMPL (smartlist_t *, nodelist_get_list,(void))
 
const node_tnode_get_by_hex_id (const char *hex_id, unsigned flags)
 
 MOCK_IMPL (const node_t *, node_get_by_nickname,(const char *nickname, unsigned flags))
 
const ed25519_public_key_tnode_get_ed25519_id (const node_t *node)
 
int node_ed25519_id_matches (const node_t *node, const ed25519_public_key_t *id)
 
int node_supports_ed25519_link_authentication (const node_t *node, int compatible_with_us)
 
int node_supports_v3_hsdir (const node_t *node)
 
int node_supports_ed25519_hs_intro (const node_t *node)
 
int node_supports_v3_rendezvous_point (const node_t *node)
 
const uint8_t * node_get_rsa_id_digest (const node_t *node)
 
const char * node_get_nickname (const node_t *node)
 
int node_is_dir (const node_t *node)
 
int node_has_any_descriptor (const node_t *node)
 
int node_has_preferred_descriptor (const node_t *node, int for_direct_connect)
 
int node_get_purpose (const node_t *node)
 
void node_get_verbose_nickname (const node_t *node, char *verbose_name_out)
 
void node_get_verbose_nickname_by_id (const char *id_digest, char *verbose_name_out)
 
int node_allows_single_hop_exits (const node_t *node)
 
int node_exit_policy_rejects_all (const node_t *node)
 
int node_exit_policy_is_exact (const node_t *node, sa_family_t family)
 
smartlist_tnode_get_all_orports (const node_t *node)
 
void node_get_addr (const node_t *node, tor_addr_t *addr_out)
 
uint32_t node_get_prim_addr_ipv4h (const node_t *node)
 
void node_get_address_string (const node_t *node, char *buf, size_t len)
 
long node_get_declared_uptime (const node_t *node)
 
const char * node_get_platform (const node_t *node)
 
int node_is_me (const node_t *node)
 
const smartlist_tnode_get_declared_family (const node_t *node)
 
int node_has_ipv6_addr (const node_t *node)
 
int node_has_ipv6_orport (const node_t *node)
 
int node_has_ipv6_dirport (const node_t *node)
 
int node_ipv6_or_preferred (const node_t *node)
 
void node_get_prim_orport (const node_t *node, tor_addr_port_t *ap_out)
 
void node_get_pref_orport (const node_t *node, tor_addr_port_t *ap_out)
 
void node_get_pref_ipv6_orport (const node_t *node, tor_addr_port_t *ap_out)
 
int node_ipv6_dir_preferred (const node_t *node)
 
void node_get_prim_dirport (const node_t *node, tor_addr_port_t *ap_out)
 
void node_get_pref_dirport (const node_t *node, tor_addr_port_t *ap_out)
 
void node_get_pref_ipv6_dirport (const node_t *node, tor_addr_port_t *ap_out)
 
int node_has_curve25519_onion_key (const node_t *node)
 
const curve25519_public_key_tnode_get_curve25519_onion_key (const node_t *node)
 
void node_set_country (node_t *node)
 
void nodelist_refresh_countries (void)
 
int addrs_in_same_network_family (const tor_addr_t *a1, const tor_addr_t *a2)
 
int nodes_in_same_family (const node_t *node1, const node_t *node2)
 
void nodelist_add_node_and_family (smartlist_t *sl, const node_t *node)
 
const node_trouter_find_exact_exit_enclave (const char *address, uint16_t port)
 
int node_is_unreliable (const node_t *node, int need_uptime, int need_capacity, int need_guard)
 
int router_exit_policy_all_nodes_reject (const tor_addr_t *addr, uint16_t port, int need_uptime)
 
void router_set_status (const char *digest, int up)
 
 MOCK_IMPL (int, router_have_minimum_dir_info,(void))
 
 MOCK_IMPL (consensus_path_type_t, router_have_consensus_path,(void))
 
void router_dir_info_changed (void)
 
const char * get_dir_info_status_string (void)
 
int count_loading_descriptors_progress (void)
 

Detailed Description

Structures and functions for tracking what we know about the routers on the Tor network, and correlating information from networkstatus, routerinfo, and microdescs.

The key structure here is node_t: that's the canonical way to refer to a Tor relay that we might want to build a circuit through. Every node_t has either a routerinfo_t, or a routerstatus_t from the current networkstatus consensus. If it has a routerstatus_t, it will also need to have a microdesc_t before you can use it for circuits.

The nodelist_t is a global singleton that maps identities to node_t objects. Access them with the node_get_*() functions. The nodelist_t is maintained by calls throughout the codebase

Generally, other code should not have to reach inside a node_t to see what information it has. Instead, you should call one of the many accessor functions that works on a generic node_t. If there isn't one that does what you need, it's better to make such a function, and then use it.

For historical reasons, some of the functions that select a node_t from the list of all usable node_t objects are in the routerlist.c module, since they originally selected a routerinfo_t. (TODO: They should move!)

(TODO: Perhaps someday we should abstract the remaining ways of talking about a relay to also be node_t instances. Those would be routerstatus_t as used for directory requests, and dir_server_t as used for authorities and fallback directories.)

Macro Definition Documentation

◆ RETURN_IPV4_AP

#define RETURN_IPV4_AP (   r,
  port_field,
  ap_out 
)
Value:
STMT_BEGIN \
if (r && tor_addr_port_is_valid_ipv4h((r)->addr, (r)->port_field, 0)) { \
tor_addr_from_ipv4h(&(ap_out)->addr, (r)->addr); \
(ap_out)->port = (r)->port_field; \
} \
STMT_END

◆ SL_ADD_NEW_IPV4_AP

#define SL_ADD_NEW_IPV4_AP (   r,
  port_field,
  sl,
  valid 
)
Value:
STMT_BEGIN \
if (tor_addr_port_is_valid_ipv4h((r)->addr, (r)->port_field, 0)) { \
valid = 1; \
tor_addr_port_t *ap = tor_malloc(sizeof(tor_addr_port_t)); \
tor_addr_from_ipv4h(&ap->addr, (r)->addr); \
ap->port = (r)->port_field; \
smartlist_add((sl), ap); \
} \
STMT_END
Definition: address.h:68

◆ SL_ADD_NEW_IPV6_AP

#define SL_ADD_NEW_IPV6_AP (   r,
  port_field,
  sl,
  valid 
)
Value:
STMT_BEGIN \
if (tor_addr_port_is_valid(&(r)->ipv6_addr, (r)->port_field, 0)) { \
valid = 1; \
tor_addr_port_t *ap = tor_malloc(sizeof(tor_addr_port_t)); \
tor_addr_copy(&ap->addr, &(r)->ipv6_addr); \
ap->port = (r)->port_field; \
smartlist_add((sl), ap); \
} \
STMT_END
Definition: address.h:68

Typedef Documentation

◆ nodelist_t

typedef struct nodelist_t nodelist_t

A nodelist_t holds a node_t object for every router we're "willing to use for something". Specifically, it should hold a node_t for every node that is currently in the routerlist, or currently in the consensus we're using.

Enumeration Type Documentation

◆ usable_descriptor_t

count_usable_descriptors counts descriptors with these flag(s)

Function Documentation

◆ addrs_in_same_network_family()

int addrs_in_same_network_family ( const tor_addr_t a1,
const tor_addr_t a2 
)

Return true iff router1 and router2 have similar enough network addresses that we should treat them as being in the same family

Here is the call graph for this function:
Here is the caller graph for this function:

◆ count_loading_descriptors_progress()

int count_loading_descriptors_progress ( void  )

We just fetched a new set of descriptors. Compute how far through the "loading descriptors" bootstrapping phase we are, so we can inform the controller of our progress.

Here is the call graph for this function:

◆ get_dir_info_status_string()

const char* get_dir_info_status_string ( void  )

Return a string describing what we're missing before we have enough directory info.

Here is the caller graph for this function:

◆ HT_PROTOTYPE()

HT_PROTOTYPE ( HT_GENERATE2(  nodelist_ed_map,
HT_GENERATE2(  node_t,
HT_GENERATE2(  ed_ht_ent,
HT_GENERATE2(  node_ed_id_hash,
HT_GENERATE2(  node_ed_id_eq 
)

Create an empty nodelist if we haven't done so already.

◆ MOCK_IMPL() [1/7]

MOCK_IMPL ( node_t ,
node_get_mutable_by_id  ,
(const char *identity_digest)   
)

As node_get_by_id, but returns a non-const pointer

◆ MOCK_IMPL() [2/7]

MOCK_IMPL ( const node_t ,
node_get_by_id  ,
(const char *identity_digest)   
)

Return the node_t whose identity is identity_digest, or NULL if no such node exists.

◆ MOCK_IMPL() [3/7]

MOCK_IMPL ( const node_t ,
node_get_by_ed25519_id  ,
(const ed25519_public_key_t *ed_id)   
)

Return the node_t whose ed25519 identity is ed_id, or NULL if no such node exists.

Here is the call graph for this function:

◆ MOCK_IMPL() [4/7]

MOCK_IMPL ( smartlist_t ,
nodelist_get_list  ,
(void)   
)

Return a list of a node_t * for every node we know about. The caller MUST NOT modify the list. (You can set and clear flags in the nodes if you must, but you must not add or remove nodes.)

◆ MOCK_IMPL() [5/7]

MOCK_IMPL ( const node_t ,
node_get_by_nickname  ,
(const char *nickname, unsigned flags)   
)

Given a nickname (possibly verbose, possibly a hexadecimal digest), return the corresponding node_t, or NULL if none exists. Warn the user if they have specified a router by nickname, unless the NNF_NO_WARN_UNNAMED bit is set in flags.

◆ MOCK_IMPL() [6/7]

MOCK_IMPL ( int  ,
router_have_minimum_dir_info  ,
(void)   
)

Return true iff we have enough consensus information to start building circuits. Right now, this means "a consensus that's less than a day old, and at least 60% of router descriptors (configurable), weighted by bandwidth. Treat the exit fraction as 100% if there are no exits in the consensus." To obtain the final weighted bandwidth, we multiply the weighted bandwidth fraction for each position (guard, middle, exit).

Here is the call graph for this function:

◆ MOCK_IMPL() [7/7]

MOCK_IMPL ( consensus_path_type_t  ,
router_have_consensus_path  ,
(void)   
)

Set to CONSENSUS_PATH_EXIT if there is at least one exit node in the consensus. We update this flag in compute_frac_paths_available if there is at least one relay that has an Exit flag in the consensus. Used to avoid building exit circuits when they will almost certainly fail. Set to CONSENSUS_PATH_INTERNAL if there are no exits in the consensus. (This situation typically occurs during bootstrap of a test network.) Set to CONSENSUS_PATH_UNKNOWN if we have never checked, or have reason to believe our last known value was invalid or has expired. If we're in a network with TestingDirAuthVoteExit set, this can cause router_have_consensus_path() to be set to CONSENSUS_PATH_EXIT, even if there are no nodes with accept exit policies.

◆ node_allows_single_hop_exits()

int node_allows_single_hop_exits ( const node_t node)

Return true iff it seems that node allows circuits to exit through it directlry from the client.

◆ node_ed25519_id_matches()

int node_ed25519_id_matches ( const node_t node,
const ed25519_public_key_t id 
)

Return true iff this node's Ed25519 identity matches id. (An absent Ed25519 identity matches NULL or zero.)

Here is the call graph for this function:

◆ node_exit_policy_is_exact()

int node_exit_policy_is_exact ( const node_t node,
sa_family_t  family 
)

Return true iff the exit policy for node is such that we can treat rejecting an address of type family unexpectedly as a sign of that node's failure.

◆ node_exit_policy_rejects_all()

int node_exit_policy_rejects_all ( const node_t node)

Return true iff it seems that node has an exit policy that doesn't actually permit anything to exit, or we don't know its exit policy

Here is the call graph for this function:

◆ node_get_addr()

void node_get_addr ( const node_t node,
tor_addr_t addr_out 
)

Wrapper around node_get_prim_orport for backward compatibility.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ node_get_address_string()

void node_get_address_string ( const node_t node,
char *  buf,
size_t  len 
)

Copy a string representation of an IP address for node into the len-byte buffer at buf.

Here is the call graph for this function:

◆ node_get_all_orports()

smartlist_t* node_get_all_orports ( const node_t node)

Return list of tor_addr_port_t with all OR ports (in the sense IP addr + TCP port) for node. Caller must free all elements using tor_free() and free the list using smartlist_free().

XXX this is potentially a memory fragmentation hog – if on critical path consider the option of having the caller allocate the memory

Here is the caller graph for this function:

◆ node_get_by_hex_id()

const node_t* node_get_by_hex_id ( const char *  hex_id,
unsigned  flags 
)

Given a hex-encoded nickname of the format DIGEST, $DIGEST, $DIGEST=name, or $DIGEST~name, return the node with the matching identity digest and nickname (if any). Return NULL if no such node exists, or if hex_id is not well-formed. DOCDOC flags

Here is the call graph for this function:
Here is the caller graph for this function:

◆ node_get_curve25519_onion_key()

const curve25519_public_key_t* node_get_curve25519_onion_key ( const node_t node)

Return the curve25519 key of node, or NULL if none.

Here is the caller graph for this function:

◆ node_get_declared_family()

const smartlist_t* node_get_declared_family ( const node_t node)

Return node declared family (as a list of names), or NULL if the node didn't declare a family.

Here is the caller graph for this function:

◆ node_get_declared_uptime()

long node_get_declared_uptime ( const node_t node)

Return node's declared uptime, or -1 if it doesn't seem to have one.

◆ node_get_ed25519_id()

const ed25519_public_key_t* node_get_ed25519_id ( const node_t node)

Return the Ed25519 identity key for the provided node, or NULL if it doesn't have one.

Here is the caller graph for this function:

◆ node_get_mutable_by_ed25519_id()

node_t* node_get_mutable_by_ed25519_id ( const ed25519_public_key_t ed_id)

As node_get_by_ed25519_id, but returns a non-const pointer

Here is the caller graph for this function:

◆ node_get_nickname()

const char* node_get_nickname ( const node_t node)

Return the nickname of node, or NULL if we can't find one.

Here is the caller graph for this function:

◆ node_get_platform()

const char* node_get_platform ( const node_t node)

Return node's platform string, or NULL if we don't know it.

◆ node_get_pref_dirport()

void node_get_pref_dirport ( const node_t node,
tor_addr_port_t ap_out 
)

Copy the preferred Dir port (IP address and TCP port) for node into *ap_out.

Here is the call graph for this function:

◆ node_get_pref_ipv6_dirport()

void node_get_pref_ipv6_dirport ( const node_t node,
tor_addr_port_t ap_out 
)

Copy the preferred IPv6 Dir port (IP address and TCP port) for node into *ap_out.

Here is the caller graph for this function:

◆ node_get_pref_ipv6_orport()

void node_get_pref_ipv6_orport ( const node_t node,
tor_addr_port_t ap_out 
)

Copy the preferred IPv6 OR port (IP address and TCP port) for node into *ap_out.

Here is the caller graph for this function:

◆ node_get_pref_orport()

void node_get_pref_orport ( const node_t node,
tor_addr_port_t ap_out 
)

Copy the preferred OR port (IP address and TCP port) for node into *ap_out.

Here is the call graph for this function:

◆ node_get_prim_addr_ipv4h()

uint32_t node_get_prim_addr_ipv4h ( const node_t node)

Return the host-order IPv4 address for node, or 0 if it doesn't seem to have one.

Here is the caller graph for this function:

◆ node_get_prim_dirport()

void node_get_prim_dirport ( const node_t node,
tor_addr_port_t ap_out 
)

Copy the primary (IPv4) Dir port (IP address and TCP port) for node into *ap_out.

Here is the caller graph for this function:

◆ node_get_prim_orport()

void node_get_prim_orport ( const node_t node,
tor_addr_port_t ap_out 
)

Copy the primary (IPv4) OR port (IP address and TCP port) for node into *ap_out.

Here is the caller graph for this function:

◆ node_get_purpose()

int node_get_purpose ( const node_t node)

Return the router_purpose of node.

◆ node_get_rsa_id_digest()

const uint8_t* node_get_rsa_id_digest ( const node_t node)

Return the RSA ID key's SHA1 digest for the provided node.

◆ node_get_verbose_nickname()

void node_get_verbose_nickname ( const node_t node,
char *  verbose_name_out 
)

Compute the verbose ("extended") nickname of node and store it into the MAX_VERBOSE_NICKNAME_LEN+1 character buffer at verbose_name_out

Here is the call graph for this function:
Here is the caller graph for this function:

◆ node_get_verbose_nickname_by_id()

void node_get_verbose_nickname_by_id ( const char *  id_digest,
char *  verbose_name_out 
)

Compute the verbose ("extended") nickname of node with given id_digest and store it into the MAX_VERBOSE_NICKNAME_LEN+1 character buffer at verbose_name_out

If node_get_by_id() returns NULL, base 16 encoding of id_digest is returned instead.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ node_has_any_descriptor()

int node_has_any_descriptor ( const node_t node)

Return true iff node has either kind of descriptor – that is, a routerdescriptor or a microdescriptor.

You should probably use node_has_preferred_descriptor() instead.

Here is the caller graph for this function:

◆ node_has_curve25519_onion_key()

int node_has_curve25519_onion_key ( const node_t node)

Return true iff node has a curve25519 onion key.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ node_has_preferred_descriptor()

int node_has_preferred_descriptor ( const node_t node,
int  for_direct_connect 
)

Return true iff node has the kind of descriptor we would prefer to use for it, given our configuration and how we intend to use the node.

If for_direct_connect is true, we intend to connect to the node directly, as the first hop of a circuit; otherwise, we intend to connect to it indirectly, or use it as if we were connecting to it indirectly.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ node_ipv6_dir_preferred()

int node_ipv6_dir_preferred ( const node_t node)

Return 1 if we prefer the IPv6 address and Dir TCP port of node, else 0.

We prefer the IPv6 address if the router has an IPv6 address, and we can use IPv6 addresses, and: i) the router has no IPv4 Dir address. or ii) our preference is for IPv6 Dir addresses.

If there is no node, use fascist_firewall_prefer_ipv6_dirport().

Here is the caller graph for this function:

◆ node_ipv6_or_preferred()

int node_ipv6_or_preferred ( const node_t node)

Return 1 if we prefer the IPv6 address and OR TCP port of node, else 0.

We prefer the IPv6 address if the router has an IPv6 address, and we can use IPv6 addresses, and: i) the node_t says that it prefers IPv6 or ii) the router has no IPv4 OR address.

If you don't have a node, consider looking it up. If there is no node, use fascist_firewall_prefer_ipv6_orport().

Here is the caller graph for this function:

◆ node_is_dir()

int node_is_dir ( const node_t node)

Return true iff node appears to be a directory authority or directory cache

◆ node_is_me()

int node_is_me ( const node_t node)

Return true iff node is one representing this router.

Here is the call graph for this function:

◆ node_is_unreliable()

int node_is_unreliable ( const node_t node,
int  need_uptime,
int  need_capacity,
int  need_guard 
)

Return 1 if router is not suitable for these parameters, else 0. If need_uptime is non-zero, we require a minimum uptime. If need_capacity is non-zero, we require a minimum advertised bandwidth. If need_guard, we require that the router is a possible entry guard.

Here is the caller graph for this function:

◆ node_set_country()

void node_set_country ( node_t node)

Refresh the country code of ri. This function MUST be called on each router when the GeoIP database is reloaded, and on all new routers.

Here is the caller graph for this function:

◆ node_supports_ed25519_hs_intro()

int node_supports_ed25519_hs_intro ( const node_t node)

Return true iff node supports ed25519 authentication as an hidden service introduction point.

◆ node_supports_ed25519_link_authentication()

int node_supports_ed25519_link_authentication ( const node_t node,
int  compatible_with_us 
)

Return true iff node supports authenticating itself by ed25519 ID during the link handshake. If compatible_with_us, it needs to be using a link authentication method that we understand. If not, any plausible link authentication method will do.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ node_supports_v3_hsdir()

int node_supports_v3_hsdir ( const node_t node)

Return true iff node supports the hidden service directory version 3 protocol (proposal 224).

◆ node_supports_v3_rendezvous_point()

int node_supports_v3_rendezvous_point ( const node_t node)

Return true iff node supports to be a rendezvous point for hidden service version 3 (HSRend=2).

◆ nodelist_add_microdesc()

node_t* nodelist_add_microdesc ( microdesc_t md)

Set the appropriate node_t to use md as its microdescriptor.

Called when a new microdesc has arrived and the usable consensus flavor is "microdesc".

◆ nodelist_add_node_and_family()

void nodelist_add_node_and_family ( smartlist_t sl,
const node_t node 
)

Add all the family of node, including node itself, to the smartlist sl.

This is used to make sure we don't pick siblings in a single path, or pick more than one relay from a family for our entry guard list. Note that a node may be added to sl more than once if it is part of node's family for more than one reason.

Here is the call graph for this function:

◆ nodelist_assert_ok()

void nodelist_assert_ok ( void  )

Check that the nodelist is internally consistent, and consistent with the directory info it's derived from.

Here is the call graph for this function:

◆ nodelist_find_nodes_with_microdesc()

smartlist_t* nodelist_find_nodes_with_microdesc ( const microdesc_t md)

Return a newly allocated smartlist of the nodes that have md as their microdescriptor.

Here is the call graph for this function:

◆ nodelist_free_all()

void nodelist_free_all ( void  )

Release all storage held by the nodelist.

◆ nodelist_probably_contains_address()

int nodelist_probably_contains_address ( const tor_addr_t addr)

Return true if addr is the address of some node in the nodelist. If not, probably return false.

◆ nodelist_purge()

void nodelist_purge ( void  )

Remove all entries from the nodelist that don't have enough info to be usable for anything.

◆ nodelist_refresh_countries()

void nodelist_refresh_countries ( void  )

Set the country code of all routers in the routerlist.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ nodelist_remove_microdesc()

void nodelist_remove_microdesc ( const char *  identity_digest,
microdesc_t md 
)

Tell the nodelist that md is no longer a microdescriptor for the node with identity_digest.

Here is the call graph for this function:

◆ nodelist_remove_routerinfo()

void nodelist_remove_routerinfo ( routerinfo_t ri)

Tell the nodelist that ri is no longer in the routerlist.

Here is the caller graph for this function:

◆ nodelist_set_consensus()

void nodelist_set_consensus ( networkstatus_t ns)

Tell the nodelist that the current usable consensus is ns. This makes the nodelist change all of the routerstatus entries for the nodes, drop nodes that no longer have enough info to get used, and grab microdescriptors into nodes as appropriate.

◆ nodelist_set_routerinfo()

node_t* nodelist_set_routerinfo ( routerinfo_t ri,
routerinfo_t **  ri_old_out 
)

Add ri to an appropriate node in the nodelist. If we replace an old routerinfo, and ri_old_out is not NULL, set *ri_old_out to the previous routerinfo.

◆ nodes_in_same_family()

int nodes_in_same_family ( const node_t node1,
const node_t node2 
)

Return true iff r1 and r2 are in the same family, but not the same router.

Here is the call graph for this function:

◆ router_dir_info_changed()

void router_dir_info_changed ( void  )

Called when our internal view of the directory has changed. This can be when the authorities change, networkstatuses change, the list of routerdescs changes, or number of running routers changes.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ router_exit_policy_all_nodes_reject()

int router_exit_policy_all_nodes_reject ( const tor_addr_t addr,
uint16_t  port,
int  need_uptime 
)

Return 1 if all running sufficiently-stable routers we can use will reject addr:port. Return 0 if any might accept it.

Here is the call graph for this function:

◆ router_find_exact_exit_enclave()

const node_t* router_find_exact_exit_enclave ( const char *  address,
uint16_t  port 
)

Find a router that's up, that has this IP address, and that allows exit to this address:port, or return NULL if there isn't a good one. Don't exit enclave to excluded relays – it wouldn't actually hurt anything, but this way there are fewer confused users.

Here is the call graph for this function:

◆ router_set_status()

void router_set_status ( const char *  digest,
int  up 
)

Mark the router with ID digest as running or non-running in our routerlist.

Here is the caller graph for this function: