9#define RESOLVE_ADDR_PRIVATE
25#define MAX_CONFIG_ADDRESS 2
48 { TOR_ADDR_NULL, TOR_ADDR_NULL, TOR_ADDR_NULL };
56 { TOR_ADDR_NULL, TOR_ADDR_NULL, TOR_ADDR_NULL };
65af_to_idx(
const int family)
85 case RESOLVED_ADDR_NONE:
87 case RESOLVED_ADDR_CONFIGURED:
89 case RESOLVED_ADDR_CONFIGURED_ORPORT:
90 return "CONFIGURED_ORPORT";
91 case RESOLVED_ADDR_GETHOSTNAME:
93 case RESOLVED_ADDR_INTERFACE:
95 case RESOLVED_ADDR_RESOLVED:
141 log_notice(
LD_CONFIG,
"External address seen and suggested by a "
142 "directory authority: %s",
fmt_addr(addr));
171#define ERR_DEFAULT_DIRAUTH -1
172#define ERR_ADDRESS_IS_INTERNAL -2
192 int warn_severity,
const bool explicit_ip)
197 if (!tor_addr_is_internal(addr, 0)) {
215 if (using_default_dir_authorities(options)) {
217 "Address '%s' is a private IP address. Tor relays that use "
218 "the default DirAuthorities must have public IP addresses.",
227 "Address %s was resolved and thus not explicitly "
228 "set. Even if DirAuthorities are custom, this is "
230 return ERR_ADDRESS_IS_INTERNAL;
263 bool explicit_ip =
false, resolve_failure =
false;
264 int num_valid_addr = 0;
272 *hostname_out = NULL;
273 *method_out = RESOLVED_ADDR_NONE;
275 log_debug(
LD_CONFIG,
"Attempting to get address from configuration");
278 log_info(
LD_CONFIG,
"No Address option found in configuration.");
291 *method_out = RESOLVED_ADDR_CONFIGURED;
295 }
else if (af != -1) {
305 *method_out = RESOLVED_ADDR_RESOLVED;
309 *hostname_out = tor_strdup(cfg->value);
315 resolve_failure =
true;
317 "Could not resolve local Address '%s'. Failing.", cfg->value);
322 if (!num_valid_addr) {
323 if (resolve_failure) {
329 "No Address option found for family %s in configuration.",
338 "Found %d Address statement of address family %s. "
339 "Only one is allowed.", num_valid_addr,
fmt_af_family(family));
351 if (ret == ERR_ADDRESS_IS_INTERNAL) {
352 static bool logged_once =
false;
354 log_warn(
LD_CONFIG,
"Address set with an internal address. Tor will "
355 "not work unless custom directory authorities "
356 "are defined (AlternateDirAuthority). It is also "
357 "possible to use an internal address if "
358 "PublishServerDescriptor is set to 0 and "
359 "AssumeReachable(IPv6) to 1.");
368 log_info(
LD_CONFIG,
"Address found in configuration: %s",
400 *hostname_out = NULL;
401 *method_out = RESOLVED_ADDR_NONE;
403 log_debug(
LD_CONFIG,
"Attempting to get address from local hostname");
406 log_fn(warn_severity,
LD_NET,
"Error obtaining local hostname");
412 "Could not resolve local hostname '%s'. Failing.", hostname);
421 }
else if (ret == ERR_ADDRESS_IS_INTERNAL) {
427 *method_out = RESOLVED_ADDR_GETHOSTNAME;
428 *hostname_out = tor_strdup(hostname);
431 log_info(
LD_CONFIG,
"Address found from local hostname: %s",
463 *method_out = RESOLVED_ADDR_NONE;
464 *hostname_out = NULL;
466 log_debug(
LD_CONFIG,
"Attempting to get address from network interface");
470 "Could not get local interface IP address.");
481 *method_out = RESOLVED_ADDR_INTERFACE;
515 *method_out = RESOLVED_ADDR_NONE;
516 *hostname_out = NULL;
518 log_debug(
LD_CONFIG,
"Attempting to get address from ORPort");
520 if (!options->ORPort_set) {
521 log_info(
LD_CONFIG,
"No ORPort found in configuration.");
527 addr = get_orport_addr(family);
541 *method_out = RESOLVED_ADDR_CONFIGURED_ORPORT;
568 const char *hostname_used)
571 static bool have_resolved_once[] = {
false,
false,
false };
574 bool *done_one_resolve;
575 bool have_hostname =
false;
581 have_hostname = (hostname_used != NULL);
590 done_one_resolve = &have_resolved_once[idx];
599 if (*done_one_resolve) {
603 "Your IP address seems to have changed to %s "
604 "(METHOD=%s%s%s). Updating.",
607 have_hostname ?
" HOSTNAME=" :
"",
608 have_hostname ? hostname_used :
"");
614 "EXTERNAL_ADDRESS ADDRESS=%s METHOD=%s%s%s",
617 have_hostname ?
" HOSTNAME=" :
"",
618 have_hostname ? hostname_used :
"");
621 *done_one_resolve =
true;
625 if (method_used == RESOLVED_ADDR_CONFIGURED ||
626 method_used == RESOLVED_ADDR_CONFIGURED_ORPORT) {
634 const or_options_t *options,
int warn_severity,
int family,
737 char *hostname_used = NULL;
747 if (method_out) *method_out = RESOLVED_ADDR_NONE;
748 if (hostname_out) *hostname_out = NULL;
758 if (authdir_mode(options)) {
759 table = fn_address_table_auth;
768 for (
size_t idx = 0; idx < table_len; idx++) {
770 &method_used, &hostname_used, &my_addr);
771 if (ret == FN_RET_BAIL) {
773 }
else if (ret == FN_RET_OK) {
790 *method_out = method_used;
793 *hostname_out = hostname_used;
831 if (tor_addr_is_internal(addr, 0)) {
867resolve_addr_reset_suggested(
int family)
void tor_addr_copy(tor_addr_t *dest, const tor_addr_t *src)
void tor_addr_make_unspec(tor_addr_t *a)
int tor_addr_parse(tor_addr_t *addr, const char *src)
void tor_addr_make_null(tor_addr_t *a, sa_family_t family)
int tor_addr_compare_masked(const tor_addr_t *addr1, const tor_addr_t *addr2, maskbits_t mbits, tor_addr_comparison_t how)
int tor_addr_is_null(const tor_addr_t *addr)
int get_interface_address6(int severity, sa_family_t family, tor_addr_t *addr)
const char * fmt_af_family(sa_family_t family)
static sa_family_t tor_addr_family(const tor_addr_t *a)
#define tor_addr_eq(a, b)
Header file for directory authority mode.
const or_options_t * get_options(void)
Header file for config.c.
int control_event_server_status(int severity, const char *format,...)
Header file for control_events.c.
int tor_gethostname(char *name, size_t namelen)
Header for gethostname.c.
#define log_fn(severity, domain, args,...)
void ip_address_changed(int on_client_conn)
Header file for mainloop.c.
int tor_addr_lookup(const char *name, uint16_t family, tor_addr_t *addr)
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...
static const fn_address_t fn_address_table[]
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_set_suggested(const tor_addr_t *addr)
static tor_addr_t last_resolved_addrs[]
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)
#define ERR_DEFAULT_DIRAUTH
void resolved_addr_reset_last(int family)
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 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.
static const size_t fn_address_table_auth_len
static const size_t fn_address_table_len
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.
#define MAX_CONFIG_ADDRESS
void resolved_addr_get_suggested(int family, tor_addr_t *addr_out)
bool resolved_addr_is_configured(int family)
static tor_addr_t last_suggested_addrs[]
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).
static bool last_addrs_configured[]
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.
void resolved_addr_get_last(int family, tor_addr_t *addr_out)
const char * resolved_addr_method_to_str(const resolved_addr_method_t method)
Header file for resolve_addr.c.
dirinfo_type_t PublishServerDescriptor_
struct config_line_t * Address
#define MOCK_IMPL(rv, funcname, arglist)
void pt_update_bridge_lines(void)
Headers for transports.c.
#define tor_assert_nonfatal_unreached()