Go to the documentation of this file.
9 #define RESOLVE_ADDR_PRIVATE
24 #define MAX_CONFIG_ADDRESS 2
47 { TOR_ADDR_NULL, TOR_ADDR_NULL, TOR_ADDR_NULL };
55 { TOR_ADDR_NULL, TOR_ADDR_NULL, TOR_ADDR_NULL };
64 af_to_idx(
const int family)
84 case RESOLVED_ADDR_NONE:
86 case RESOLVED_ADDR_CONFIGURED:
88 case RESOLVED_ADDR_CONFIGURED_ORPORT:
89 return "CONFIGURED_ORPORT";
90 case RESOLVED_ADDR_GETHOSTNAME:
92 case RESOLVED_ADDR_INTERFACE:
94 case RESOLVED_ADDR_RESOLVED:
139 log_notice(
LD_CONFIG,
"External address seen and suggested by a "
140 "directory authority: %s",
fmt_addr(addr));
166 #define ERR_DEFAULT_DIRAUTH -1
167 #define ERR_ADDRESS_IS_INTERNAL -2
187 int warn_severity,
const bool explicit_ip)
192 if (!tor_addr_is_internal(addr, 0)) {
198 if (using_default_dir_authorities(options)) {
200 "Address '%s' is a private IP address. Tor relays that use "
201 "the default DirAuthorities must have public IP addresses.",
210 "Address %s was resolved and thus not explicitly "
211 "set. Even if DirAuthorities are custom, this is "
213 return ERR_ADDRESS_IS_INTERNAL;
246 bool explicit_ip =
false, resolve_failure =
false;
247 int num_valid_addr = 0;
255 *hostname_out = NULL;
256 *method_out = RESOLVED_ADDR_NONE;
258 log_debug(
LD_CONFIG,
"Attempting to get address from configuration");
261 log_info(
LD_CONFIG,
"No Address option found in configuration.");
274 *method_out = RESOLVED_ADDR_CONFIGURED;
278 }
else if (af != -1) {
288 *method_out = RESOLVED_ADDR_RESOLVED;
292 *hostname_out = tor_strdup(cfg->value);
298 resolve_failure =
true;
300 "Could not resolve local Address '%s'. Failing.", cfg->value);
305 if (!num_valid_addr) {
306 if (resolve_failure) {
312 "No Address option found for family %s in configuration.",
321 "Found %d Address statement of address family %s. "
322 "Only one is allowed.", num_valid_addr,
fmt_af_family(family));
339 log_info(
LD_CONFIG,
"Address found in configuration: %s",
371 *hostname_out = NULL;
372 *method_out = RESOLVED_ADDR_NONE;
374 log_debug(
LD_CONFIG,
"Attempting to get address from local hostname");
377 log_fn(warn_severity,
LD_NET,
"Error obtaining local hostname");
383 "Could not resolve local hostname '%s'. Failing.", hostname);
392 }
else if (ret == ERR_ADDRESS_IS_INTERNAL) {
398 *method_out = RESOLVED_ADDR_GETHOSTNAME;
399 *hostname_out = tor_strdup(hostname);
402 log_info(
LD_CONFIG,
"Address found from local hostname: %s",
434 *method_out = RESOLVED_ADDR_NONE;
435 *hostname_out = NULL;
437 log_debug(
LD_CONFIG,
"Attempting to get address from network interface");
441 "Could not get local interface IP address.");
452 *method_out = RESOLVED_ADDR_INTERFACE;
486 *method_out = RESOLVED_ADDR_NONE;
487 *hostname_out = NULL;
489 log_debug(
LD_CONFIG,
"Attempting to get address from ORPort");
491 if (!options->ORPort_set) {
492 log_info(
LD_CONFIG,
"No ORPort found in configuration.");
498 addr = get_orport_addr(family);
512 *method_out = RESOLVED_ADDR_CONFIGURED_ORPORT;
539 const char *hostname_used)
542 static bool have_resolved_once[] = {
false,
false,
false };
545 bool *done_one_resolve;
546 bool have_hostname =
false;
552 have_hostname = (hostname_used != NULL);
561 done_one_resolve = &have_resolved_once[idx];
570 if (*done_one_resolve) {
574 "Your IP address seems to have changed to %s "
575 "(METHOD=%s%s%s). Updating.",
578 have_hostname ?
" HOSTNAME=" :
"",
579 have_hostname ? hostname_used :
"");
585 "EXTERNAL_ADDRESS ADDRESS=%s METHOD=%s%s%s",
588 have_hostname ?
" HOSTNAME=" :
"",
589 have_hostname ? hostname_used :
"");
592 *done_one_resolve =
true;
596 if (method_used == RESOLVED_ADDR_CONFIGURED ||
597 method_used == RESOLVED_ADDR_CONFIGURED_ORPORT) {
605 const or_options_t *options,
int warn_severity,
int family,
708 char *hostname_used = NULL;
718 if (method_out) *method_out = RESOLVED_ADDR_NONE;
719 if (hostname_out) *hostname_out = NULL;
730 table = fn_address_table_auth;
739 for (
size_t idx = 0; idx < table_len; idx++) {
741 &method_used, &hostname_used, &my_addr);
742 if (ret == FN_RET_BAIL) {
744 }
else if (ret == FN_RET_OK) {
761 *method_out = method_used;
764 *hostname_out = hostname_used;
802 if (tor_addr_is_internal(addr, 0)) {
835 #ifdef TOR_UNIT_TESTS
838 resolve_addr_reset_suggested(
int family)
#define log_fn(severity, domain, args,...)
int get_interface_address6(int severity, sa_family_t family, tor_addr_t *addr)
static sa_family_t tor_addr_family(const tor_addr_t *a)
static tor_addr_t last_suggested_addrs[]
void tor_addr_make_null(tor_addr_t *a, sa_family_t family)
void resolved_addr_reset_last(int family)
#define MOCK_IMPL(rv, funcname, arglist)
static bool last_addrs_configured[]
int tor_addr_lookup(const char *name, uint16_t family, tor_addr_t *addr)
bool find_my_address(const or_options_t *options, int family, int warn_severity, tor_addr_t *addr_out, resolved_addr_method_t *method_out, char **hostname_out)
Attempt to find our IP address that can be used as our external reachable address.
void tor_addr_make_unspec(tor_addr_t *a)
static fn_address_ret_t get_address_from_interface(const or_options_t *options, int warn_severity, int family, resolved_addr_method_t *method_out, char **hostname_out, tor_addr_t *addr_out)
Get IP address from a network interface.
bool resolved_addr_is_configured(int family)
static fn_address_ret_t get_address_from_orport(const or_options_t *options, int warn_severity, int family, resolved_addr_method_t *method_out, char **hostname_out, tor_addr_t *addr_out)
Get IP address from the ORPort (if any).
Header for gethostname.c.
Header file for mainloop.c.
void resolved_addr_get_suggested(int family, tor_addr_t *addr_out)
#define tor_assert_nonfatal_unreached()
int control_event_server_status(int severity, const char *format,...)
#define ERR_DEFAULT_DIRAUTH
static fn_address_ret_t get_address_from_hostname(const or_options_t *options, int warn_severity, int family, resolved_addr_method_t *method_out, char **hostname_out, tor_addr_t *addr_out)
Get IP address from the local hostname by calling gethostbyname() and doing a DNS resolution on the h...
Header file for directory authority mode.
void resolved_addr_set_last(const tor_addr_t *addr, const resolved_addr_method_t method_used, const char *hostname_used)
Set the last resolved address cache using the given address.
static tor_addr_t last_resolved_addrs[]
int tor_addr_parse(tor_addr_t *addr, const char *src)
static const size_t fn_address_table_auth_len
Header file for control_events.c.
const or_options_t * get_options(void)
#define MAX_CONFIG_ADDRESS
Header file for resolve_addr.c.
void resolved_addr_set_suggested(const tor_addr_t *addr)
static const size_t fn_address_table_len
void ip_address_changed(int on_client_conn)
int tor_addr_is_null(const tor_addr_t *addr)
int tor_gethostname(char *name, size_t namelen)
const char * fmt_af_family(sa_family_t family)
static const fn_address_t fn_address_table[]
Header file for config.c.
static int address_can_be_used(const tor_addr_t *addr, const or_options_t *options, int warn_severity, const bool explicit_ip)
Return true iff the given IP address can be used as a valid external resolved address.
struct config_line_t * Address
static fn_address_ret_t get_address_from_config(const or_options_t *options, int warn_severity, int family, resolved_addr_method_t *method_out, char **hostname_out, tor_addr_t *addr_out)
Get IP address from the given config line and for a specific address family.
bool is_local_to_resolve_addr(const tor_addr_t *addr)
: Return true iff the given addr is judged to be local to our resolved address.
void resolved_addr_get_last(int family, tor_addr_t *addr_out)
int tor_addr_compare_masked(const tor_addr_t *addr1, const tor_addr_t *addr2, maskbits_t mbits, tor_addr_comparison_t how)
#define tor_addr_eq(a, b)
fn_address_ret_t(* fn_address_t)(const or_options_t *options, int warn_severity, int family, resolved_addr_method_t *method_out, char **hostname_out, tor_addr_t *addr_out)
int authdir_mode(const or_options_t *options)
void tor_addr_copy(tor_addr_t *dest, const tor_addr_t *src)
const char * resolved_addr_method_to_str(const resolved_addr_method_t method)