mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2025-02-27 16:45:53 +01:00
There are now separate modules for: * the list of router descriptors * the list of authorities and fallbacks * managing authority certificates * selecting random nodes
102 lines
4.4 KiB
C
102 lines
4.4 KiB
C
/* Copyright (c) 2001-2004, Roger Dingledine.
|
|
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
|
|
* Copyright (c) 2007-2018, The Tor Project, Inc. */
|
|
/* See LICENSE for licensing information */
|
|
|
|
/**
|
|
* \file node_select.h
|
|
* \brief Header file for node_select.c
|
|
**/
|
|
|
|
#ifndef TOR_NODE_SELECT_H
|
|
#define TOR_NODE_SELECT_H
|
|
|
|
/** Flags to be passed to control router_choose_random_node() to indicate what
|
|
* kind of nodes to pick according to what algorithm. */
|
|
typedef enum router_crn_flags_t {
|
|
CRN_NEED_UPTIME = 1<<0,
|
|
CRN_NEED_CAPACITY = 1<<1,
|
|
CRN_NEED_GUARD = 1<<2,
|
|
/* XXXX not used, apparently. */
|
|
CRN_WEIGHT_AS_EXIT = 1<<5,
|
|
CRN_NEED_DESC = 1<<6,
|
|
/* On clients, only provide nodes that satisfy ClientPreferIPv6OR */
|
|
CRN_PREF_ADDR = 1<<7,
|
|
/* On clients, only provide nodes that we can connect to directly, based on
|
|
* our firewall rules */
|
|
CRN_DIRECT_CONN = 1<<8,
|
|
/* On clients, only provide nodes with HSRend >= 2 protocol version which
|
|
* is required for hidden service version >= 3. */
|
|
CRN_RENDEZVOUS_V3 = 1<<9,
|
|
} router_crn_flags_t;
|
|
|
|
/** Possible ways to weight routers when choosing one randomly. See
|
|
* routerlist_sl_choose_by_bandwidth() for more information.*/
|
|
typedef enum bandwidth_weight_rule_t {
|
|
NO_WEIGHTING, WEIGHT_FOR_EXIT, WEIGHT_FOR_MID, WEIGHT_FOR_GUARD,
|
|
WEIGHT_FOR_DIR
|
|
} bandwidth_weight_rule_t;
|
|
|
|
/* Flags for pick_directory_server() and pick_trusteddirserver(). */
|
|
/** Flag to indicate that we should not automatically be willing to use
|
|
* ourself to answer a directory request.
|
|
* Passed to router_pick_directory_server (et al).*/
|
|
#define PDS_ALLOW_SELF (1<<0)
|
|
/** Flag to indicate that if no servers seem to be up, we should mark all
|
|
* directory servers as up and try again.
|
|
* Passed to router_pick_directory_server (et al).*/
|
|
#define PDS_RETRY_IF_NO_SERVERS (1<<1)
|
|
/** Flag to indicate that we should not exclude directory servers that
|
|
* our ReachableAddress settings would exclude. This usually means that
|
|
* we're going to connect to the server over Tor, and so we don't need to
|
|
* worry about our firewall telling us we can't.
|
|
* Passed to router_pick_directory_server (et al).*/
|
|
#define PDS_IGNORE_FASCISTFIREWALL (1<<2)
|
|
/** Flag to indicate that we should not use any directory authority to which
|
|
* we have an existing directory connection for downloading server descriptors
|
|
* or extrainfo documents.
|
|
*
|
|
* Passed to router_pick_directory_server (et al)
|
|
*/
|
|
#define PDS_NO_EXISTING_SERVERDESC_FETCH (1<<3)
|
|
/** Flag to indicate that we should not use any directory authority to which
|
|
* we have an existing directory connection for downloading microdescs.
|
|
*
|
|
* Passed to router_pick_directory_server (et al)
|
|
*/
|
|
#define PDS_NO_EXISTING_MICRODESC_FETCH (1<<4)
|
|
|
|
const routerstatus_t *router_pick_directory_server(dirinfo_type_t type,
|
|
int flags);
|
|
|
|
int router_get_my_share_of_directory_requests(double *v3_share_out);
|
|
|
|
const node_t *node_sl_choose_by_bandwidth(const smartlist_t *sl,
|
|
bandwidth_weight_rule_t rule);
|
|
double frac_nodes_with_descriptors(const smartlist_t *sl,
|
|
bandwidth_weight_rule_t rule,
|
|
int for_direct_conn);
|
|
const node_t *router_choose_random_node(smartlist_t *excludedsmartlist,
|
|
struct routerset_t *excludedset,
|
|
router_crn_flags_t flags);
|
|
|
|
const routerstatus_t *router_pick_trusteddirserver(dirinfo_type_t type,
|
|
int flags);
|
|
const routerstatus_t *router_pick_fallback_dirserver(dirinfo_type_t type,
|
|
int flags);
|
|
|
|
#ifdef NODE_SELECT_PRIVATE
|
|
STATIC int choose_array_element_by_weight(const uint64_t *entries,
|
|
int n_entries);
|
|
STATIC void scale_array_elements_to_u64(uint64_t *entries_out,
|
|
const double *entries_in,
|
|
int n_entries,
|
|
uint64_t *total_out);
|
|
STATIC const routerstatus_t *router_pick_directory_server_impl(
|
|
dirinfo_type_t auth, int flags,
|
|
int *n_busy_out);
|
|
STATIC int router_is_already_dir_fetching(const tor_addr_port_t *ap,
|
|
int serverdesc, int microdesc);
|
|
#endif
|
|
|
|
#endif
|