Tor
0.4.7.0-alpha-dev
|
Code to manage bridges and bridge selection. More...
#include "core/or/or.h"
#include "app/config/config.h"
#include "core/mainloop/connection.h"
#include "core/or/circuitbuild.h"
#include "core/or/policies.h"
#include "feature/client/bridges.h"
#include "feature/client/entrynodes.h"
#include "feature/client/transports.h"
#include "feature/dirclient/dirclient.h"
#include "feature/dirclient/dlstatus.h"
#include "feature/dircommon/directory.h"
#include "feature/nodelist/describe.h"
#include "feature/nodelist/dirlist.h"
#include "feature/nodelist/nodelist.h"
#include "feature/nodelist/routerinfo.h"
#include "feature/nodelist/routerlist.h"
#include "feature/nodelist/routerset.h"
#include "core/or/extend_info_st.h"
#include "feature/nodelist/node_st.h"
#include "feature/nodelist/routerinfo_st.h"
#include "feature/nodelist/routerstatus_st.h"
#include "feature/nodelist/microdesc_st.h"
Go to the source code of this file.
Data Structures | |
struct | bridge_info_t |
Macros | |
#define | TOR_BRIDGES_PRIVATE |
#define | bridge_free(bridge) FREE_AND_NULL(bridge_info_t, bridge_free_, (bridge)) |
Variables | |
static smartlist_t * | bridge_list = NULL |
Code to manage bridges and bridge selection.
Bridges are fixed entry nodes, used for censorship circumvention.
Definition in file bridges.c.
int addr_is_a_configured_bridge | ( | const tor_addr_t * | addr, |
uint16_t | port, | ||
const char * | digest | ||
) |
If we have a bridge configured whose digest matches digest, or a bridge with no known digest whose address matches addr:port, return 1. Else return 0. If digest is NULL, check for address/port matches only.
Definition at line 273 of file bridges.c.
Referenced by extend_info_is_a_configured_bridge().
void bridge_add_from_config | ( | bridge_line_t * | bridge_line | ) |
|
static |
|
static |
const tor_addr_port_t* bridge_get_addr_port | ( | const bridge_info_t * | bridge | ) |
Given a bridge, return a pointer to its configured addr:port combination.
Definition at line 161 of file bridges.c.
Referenced by bridge_passes_guard_filter(), entry_guard_add_bridge_to_sample(), get_sampled_guard_for_bridge(), and routerset_contains_bridge().
const uint8_t* bridge_get_rsa_id_digest | ( | const bridge_info_t * | bridge | ) |
Given a bridge, return a pointer to its RSA identity digest, or NULL if we don't know one for it.
Definition at line 147 of file bridges.c.
Referenced by entry_guard_add_bridge_to_sample(), get_sampled_guard_for_bridge(), and routerset_contains_bridge().
|
static |
Return true if bridge has the same identity digest as digest. If digest is NULL, it matches bridges with unspecified identity digests.
Definition at line 446 of file bridges.c.
Referenced by bridge_resolve_conflicts().
bool bridge_has_invalid_transport | ( | const bridge_info_t * | bridge | ) |
Return true if bridge has a transport name for which we don't actually know a transport.
Definition at line 183 of file bridges.c.
Referenced by launch_direct_bridge_descriptor_fetch().
const smartlist_t* bridge_list_get | ( | void | ) |
Return a list of all the configured bridges, as bridge_info_t pointers.
Definition at line 135 of file bridges.c.
Referenced by get_eligible_guards().
STATIC void bridge_resolve_conflicts | ( | const tor_addr_t * | addr, |
uint16_t | port, | ||
const char * | digest, | ||
const char * | transport_name | ||
) |
void bridges_free_all | ( | void | ) |
const char* bridget_get_transport_name | ( | const bridge_info_t * | bridge | ) |
Given a bridge, return the transport name. If none were configured, NULL is returned.
Definition at line 172 of file bridges.c.
Referenced by bridge_has_invalid_transport().
STATIC void clear_bridge_list | ( | void | ) |
Initialize the bridge list to empty, creating it if needed.
Definition at line 109 of file bridges.c.
Referenced by bridges_free_all().
int extend_info_is_a_configured_bridge | ( | const extend_info_t * | ei | ) |
If we have a bridge configured whose digest matches ei->identity_digest, or a bridge with no known digest whose address matches ei->addr:ei->port, return 1. Else return 0. If ei->onion_key is NULL, check for address/port matches only.
Note that if the extend_info_t contains multiple addresses, we return true only if every address is a bridge.
Definition at line 290 of file bridges.c.
Referenced by circuit_handle_first_hop().
void fetch_bridge_descriptors | ( | const or_options_t * | options, |
time_t | now | ||
) |
For each bridge in our list for which we don't currently have a descriptor, fetch a new copy of its descriptor – either directly from the bridge or via a bridge authority.
Definition at line 737 of file bridges.c.
Referenced by second_elapsed_callback().
STATIC bridge_info_t* find_bridge_by_digest | ( | const char * | digest | ) |
If digest is one of our known bridges, return it.
Definition at line 581 of file bridges.c.
Referenced by retry_bridge_descriptor_fetch_directly().
const char* find_transport_name_by_bridge_addrport | ( | const tor_addr_t * | addr, |
uint16_t | port | ||
) |
Given the addr and port of a bridge, if that bridge supports a pluggable transport, return its name. Otherwise, return NULL.
Definition at line 597 of file bridges.c.
Referenced by learned_router_identity().
download_status_t* get_bridge_dl_status_by_id | ( | const char * | digest | ) |
Get the download status for a bridge descriptor given its identity
Definition at line 1018 of file bridges.c.
Referenced by getinfo_helper_downloads_bridge().
bridge_info_t* get_configured_bridge_by_addr_port_digest | ( | const tor_addr_t * | addr, |
uint16_t | port, | ||
const char * | digest | ||
) |
If we have a bridge configured whose digest matches digest, or a bridge with no known digest whose address matches addr:port, return that bridge. Else return NULL. If digest is NULL, check for address/port matches only.
Definition at line 222 of file bridges.c.
Referenced by addr_is_a_configured_bridge(), and get_socks_args_by_bridge_addrport().
bridge_info_t* get_configured_bridge_by_exact_addr_port_digest | ( | const tor_addr_t * | addr, |
uint16_t | port, | ||
const char * | digest | ||
) |
As get_configured_bridge_by_addr_port, but require that the address match addr:port, and that the ID digest match digest. (The other function will ignore the address if the digest matches.)
Definition at line 248 of file bridges.c.
Referenced by learned_router_identity().
STATIC bridge_info_t* get_configured_bridge_by_orports_digest | ( | const char * | digest, |
const smartlist_t * | orports | ||
) |
If we have a bridge configured whose digest matches digest, or a bridge with no known digest whose address matches any of the tor_addr_port_t's in orports, return that bridge. Else return NULL.
Definition at line 194 of file bridges.c.
Referenced by get_configured_bridge_by_routerinfo().
|
static |
Wrapper around get_configured_bridge_by_addr_port_digest() to look it up via router descriptor ri.
Definition at line 309 of file bridges.c.
Referenced by learned_bridge_descriptor(), and routerinfo_is_a_configured_bridge().
const smartlist_t* get_socks_args_by_bridge_addrport | ( | const tor_addr_t * | addr, |
uint16_t | port | ||
) |
Return a smartlist containing all the SOCKS arguments that we should pass to the SOCKS proxy.
Definition at line 650 of file bridges.c.
Referenced by pt_get_socks_args_for_proxy_addrport().
int get_transport_by_bridge_addrport | ( | const tor_addr_t * | addr, |
uint16_t | port, | ||
const transport_t ** | transport | ||
) |
If addr and port match the address and port of a bridge of ours that uses pluggable transports, place its transport in transport.
Return 0 on success (found a transport, or found a bridge with no transport, or found no bridge); return -1 if we should be using a transport, but the transport could not be found.
Definition at line 620 of file bridges.c.
Referenced by conn_get_proxy_type(), and get_proxy_addrport().
|
static |
We need to ask bridge for its server descriptor.
Definition at line 660 of file bridges.c.
Referenced by retry_bridge_descriptor_fetch_directly().
void learned_bridge_descriptor | ( | routerinfo_t * | ri, |
int | from_cache | ||
) |
We just learned a descriptor for a bridge. See if that digest is in our entry guard list, and add it if not.
Definition at line 948 of file bridges.c.
Referenced by routerlist_descriptors_added().
void learned_router_identity | ( | const tor_addr_t * | addr, |
uint16_t | port, | ||
const char * | digest, | ||
const ed25519_public_key_t * | ed_id | ||
) |
smartlist_t* list_bridge_identities | ( | void | ) |
Return a smartlist containing all bridge identity digests
Definition at line 998 of file bridges.c.
Referenced by getinfo_helper_downloads_bridge().
void mark_bridge_list | ( | void | ) |
int node_is_a_configured_bridge | ( | const node_t * | node | ) |
Return 1 if node is one of our configured bridges, else 0. More specifically, return 1 iff: a bridge_info_t object exists in bridge_list such that: 1) It's identity is equal to node identity OR 2) It's identity digest is zero, but it matches address and port of any ORPort in the node.
Definition at line 354 of file bridges.c.
Referenced by node_has_preferred_descriptor().
void retry_bridge_descriptor_fetch_directly | ( | const char * | digest | ) |
|
static |
If our bridge is configured to be a different address than the bridge gives in node, rewrite the routerinfo we received to use the address we meant to use. Now we handle multihomed bridges better.
Definition at line 821 of file bridges.c.
Referenced by learned_bridge_descriptor().
int routerinfo_is_a_configured_bridge | ( | const routerinfo_t * | ri | ) |
void sweep_bridge_list | ( | void | ) |
int transport_is_needed | ( | const char * | transport_name | ) |
|
static |
A list of configured bridges. Whenever we actually get a descriptor for one, we add it as an entry guard. Note that the order of bridges in this list does not necessarily correspond to the order of bridges in the torrc.
Definition at line 79 of file bridges.c.
Referenced by bridge_list_get(), bridge_resolve_conflicts(), clear_bridge_list(), fetch_bridge_descriptors(), find_bridge_by_digest(), find_transport_name_by_bridge_addrport(), get_bridge_dl_status_by_id(), get_configured_bridge_by_addr_port_digest(), get_configured_bridge_by_exact_addr_port_digest(), get_configured_bridge_by_orports_digest(), get_transport_by_bridge_addrport(), list_bridge_identities(), mark_bridge_list(), sweep_bridge_list(), and transport_is_needed().