tor  0.4.1.0-alpha-dev
Data Structures | Macros | Typedefs | Enumerations | Functions
address.h File Reference
#include "orconfig.h"
#include "lib/cc/torint.h"
#include "lib/log/util_bug.h"
#include "lib/net/inaddr_st.h"
#include "lib/net/nettypes.h"
#include <stddef.h>
#include <stdlib.h>

Go to the source code of this file.

Data Structures

struct  tor_addr_t
 
struct  tor_addr_port_t
 

Macros

#define TOR_ADDR_NULL   {AF_UNSPEC, {0}}
 
#define tor_addr_to_in6_addr8(x)   tor_addr_to_in6_assert(x)->s6_addr
 
#define tor_addr_to_in6_addr16(x)   S6_ADDR16(*tor_addr_to_in6_assert(x))
 
#define tor_addr_to_in6_addr32(x)   S6_ADDR32(*tor_addr_to_in6_assert(x))
 
#define TOR_ADDR_BUF_LEN   48
 
#define fmt_addr(a)   fmt_addr_impl((a), 0)
 
#define fmt_and_decorate_addr(a)   fmt_addr_impl((a), 1)
 
#define interface_address6_list_free(addrs)   FREE_AND_NULL(struct smartlist_t, interface_address6_list_free_, (addrs))
 
#define tor_addr_eq(a, b)   (0==tor_addr_compare((a),(b),CMP_EXACT))
 
#define tor_addr_is_internal(addr, for_listening)   tor_addr_is_internal_((addr), (for_listening), SHORT_FILE__, __LINE__)
 
#define REVERSE_LOOKUP_NAME_BUF_LEN   73
 
#define TAPMP_EXTENDED_STAR   1
 
#define TAPMP_STAR_IPV4_ONLY   (1 << 1)
 
#define TAPMP_STAR_IPV6_ONLY   (1 << 2)
 
#define tor_addr_from_ipv4h(dest, v4addr)   tor_addr_from_ipv4n((dest), htonl(v4addr))
 
#define tor_addr_from_in(dest, in)   tor_addr_from_ipv4n((dest), (in)->s_addr);
 
#define tor_addr_is_valid_ipv4h(v4h_addr, for_listening)   tor_addr_is_valid_ipv4n(htonl(v4h_addr), (for_listening))
 
#define tor_addr_port_is_valid(addr, port, for_listening)
 
#define tor_addr_port_is_valid_ap(ap, for_listening)   tor_addr_port_is_valid(&(ap)->addr, (ap)->port, (for_listening))
 
#define tor_addr_port_is_valid_ipv4n(v4n_addr, port, for_listening)
 
#define tor_addr_port_is_valid_ipv4h(v4h_addr, port, for_listening)
 
#define interface_address_list_free(lst)   interface_address6_list_free(lst)
 

Typedefs

typedef uint8_t maskbits_t
 
typedef struct tor_addr_t tor_addr_t
 
typedef struct tor_addr_port_t tor_addr_port_t
 

Enumerations

enum  tor_addr_comparison_t { CMP_EXACT, CMP_SEMANTIC }
 

Functions

static const struct in6_addrtor_addr_to_in6 (const tor_addr_t *a)
 
static const struct in6_addrtor_addr_to_in6_assert (const tor_addr_t *a)
 
static uint32_t tor_addr_to_ipv4n (const tor_addr_t *a)
 
static uint32_t tor_addr_to_ipv4h (const tor_addr_t *a)
 
static uint32_t tor_addr_to_mapped_ipv4h (const tor_addr_t *a)
 
static sa_family_t tor_addr_family (const tor_addr_t *a)
 
static const struct in_addr * tor_addr_to_in (const tor_addr_t *a)
 
static int tor_addr_eq_ipv4h (const tor_addr_t *a, uint32_t u)
 
socklen_t tor_addr_to_sockaddr (const tor_addr_t *a, uint16_t port, struct sockaddr *sa_out, socklen_t len)
 
int tor_addr_from_sockaddr (tor_addr_t *a, const struct sockaddr *sa, uint16_t *port_out)
 
void tor_addr_make_unspec (tor_addr_t *a)
 
void tor_addr_make_null (tor_addr_t *a, sa_family_t family)
 
char * tor_sockaddr_to_str (const struct sockaddr *sa)
 
char * tor_addr_to_str_dup (const tor_addr_t *addr) ATTR_MALLOC
 
const char * fmt_addr_impl (const tor_addr_t *addr, int decorate)
 
const char * fmt_addrport (const tor_addr_t *addr, uint16_t port)
 
const char * fmt_addr32 (uint32_t addr)
 
 MOCK_DECL (int, get_interface_address6,(int severity, sa_family_t family, tor_addr_t *addr))
 
void interface_address6_list_free_ (struct smartlist_t *addrs)
 
 MOCK_DECL (struct smartlist_t *, get_interface_address6_list,(int severity, sa_family_t family, int include_internal))
 
int tor_addr_compare (const tor_addr_t *addr1, const tor_addr_t *addr2, tor_addr_comparison_t how)
 
int tor_addr_compare_masked (const tor_addr_t *addr1, const tor_addr_t *addr2, maskbits_t mask, tor_addr_comparison_t how)
 
uint64_t tor_addr_hash (const tor_addr_t *addr)
 
uint64_t tor_addr_keyed_hash (const struct sipkey *key, const tor_addr_t *addr)
 
int tor_addr_is_v4 (const tor_addr_t *addr)
 
int tor_addr_is_internal_ (const tor_addr_t *ip, int for_listening, const char *filename, int lineno)
 
int tor_addr_is_multicast (const tor_addr_t *a)
 
int tor_addr_to_PTR_name (char *out, size_t outlen, const tor_addr_t *addr)
 
int tor_addr_parse_PTR_name (tor_addr_t *result, const char *address, int family, int accept_regular)
 
int tor_addr_parse_mask_ports (const char *s, unsigned flags, tor_addr_t *addr_out, maskbits_t *mask_out, uint16_t *port_min_out, uint16_t *port_max_out)
 
const char * tor_addr_to_str (char *dest, const tor_addr_t *addr, size_t len, int decorate)
 
int tor_addr_parse (tor_addr_t *addr, const char *src)
 
void tor_addr_copy (tor_addr_t *dest, const tor_addr_t *src)
 
void tor_addr_copy_tight (tor_addr_t *dest, const tor_addr_t *src)
 
void tor_addr_from_ipv4n (tor_addr_t *dest, uint32_t v4addr)
 
void tor_addr_from_ipv6_bytes (tor_addr_t *dest, const char *bytes)
 
void tor_addr_from_in6 (tor_addr_t *dest, const struct in6_addr *in6)
 
int tor_addr_is_null (const tor_addr_t *addr)
 
int tor_addr_is_loopback (const tor_addr_t *addr)
 
int tor_addr_is_valid (const tor_addr_t *addr, int for_listening)
 
int tor_addr_is_valid_ipv4n (uint32_t v4n_addr, int for_listening)
 
int tor_port_is_valid (uint16_t port, int for_listening)
 
int tor_addr_port_split (int severity, const char *addrport, char **address_out, uint16_t *port_out)
 
int tor_addr_port_parse (int severity, const char *addrport, tor_addr_t *address_out, uint16_t *port_out, int default_port)
 
int tor_addr_hostname_is_local (const char *name)
 
int parse_port_range (const char *port, uint16_t *port_min_out, uint16_t *port_max_out)
 
int addr_mask_get_bits (uint32_t mask)
 
char * tor_dup_ip (uint32_t addr) ATTR_MALLOC
 
 MOCK_DECL (int, get_interface_address,(int severity, uint32_t *addr))
 
static struct smartlist_tget_interface_address_list (int severity, int include_internal)
 
tor_addr_port_ttor_addr_port_new (const tor_addr_t *addr, uint16_t port)
 
int tor_addr_port_eq (const tor_addr_port_t *a, const tor_addr_port_t *b)
 
int string_is_valid_dest (const char *string)
 
int string_is_valid_nonrfc_hostname (const char *string)
 
int string_is_valid_ipv4_address (const char *string)
 
int string_is_valid_ipv6_address (const char *string)
 

Detailed Description

Headers for address.h.

Definition in file address.h.

Macro Definition Documentation

◆ fmt_addr

#define fmt_addr (   a)    fmt_addr_impl((a), 0)

Wrapper function of fmt_addr_impl(). It does not decorate IPv6 addresses.

Definition at line 211 of file address.h.

Referenced by control_event_transport_launched().

◆ fmt_and_decorate_addr

#define fmt_and_decorate_addr (   a)    fmt_addr_impl((a), 1)

Wrapper function of fmt_addr_impl(). It decorates IPv6 addresses.

Definition at line 214 of file address.h.

Referenced by fmt_addrport(), and get_first_listener_addrport_string().

◆ REVERSE_LOOKUP_NAME_BUF_LEN

#define REVERSE_LOOKUP_NAME_BUF_LEN   73

Longest length that can be required for a reverse lookup name.

Definition at line 258 of file address.h.

Referenced by connection_ap_handshake_send_resolve(), and tor_addr_to_PTR_name().

◆ TOR_ADDR_BUF_LEN

#define TOR_ADDR_BUF_LEN   48

Length of a buffer that you need to allocate to be sure you can encode any tor_addr_t.

This allows enough space for "[ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255]", plus a terminating NUL.

Definition at line 205 of file address.h.

Referenced by client_dns_set_addressmap(), fmt_addr_impl(), fmt_addrport(), get_pt_proxy_uri(), log_addr_has_changed(), MOCK_IMPL(), policy_write_item(), tor_addr_to_str_dup(), tor_dup_ip(), and tor_sockaddr_to_str().

◆ tor_addr_eq

#define tor_addr_eq (   a,
 
)    (0==tor_addr_compare((a),(b),CMP_EXACT))

◆ tor_addr_from_in

#define tor_addr_from_in (   dest,
  in 
)    tor_addr_from_ipv4n((dest), (in)->s_addr);

Set dest to the IPv4 address incoded in in.

Definition at line 291 of file address.h.

Referenced by tor_addr_parse_PTR_name().

◆ tor_addr_from_ipv4h

#define tor_addr_from_ipv4h (   dest,
  v4addr 
)    tor_addr_from_ipv4n((dest), htonl(v4addr))

◆ tor_addr_port_is_valid

#define tor_addr_port_is_valid (   addr,
  port,
  for_listening 
)
Value:
(tor_addr_is_valid((addr), (for_listening)) && \
tor_port_is_valid((port), (for_listening)))

Definition at line 303 of file address.h.

◆ tor_addr_port_is_valid_ipv4h

#define tor_addr_port_is_valid_ipv4h (   v4h_addr,
  port,
  for_listening 
)
Value:
(tor_addr_is_valid_ipv4h((v4h_addr), (for_listening)) && \
tor_port_is_valid((port), (for_listening)))

Definition at line 314 of file address.h.

◆ tor_addr_port_is_valid_ipv4n

#define tor_addr_port_is_valid_ipv4n (   v4n_addr,
  port,
  for_listening 
)
Value:
(tor_addr_is_valid_ipv4n((v4n_addr), (for_listening)) && \
tor_port_is_valid((port), (for_listening)))

Definition at line 310 of file address.h.

◆ tor_addr_to_in6_addr16

#define tor_addr_to_in6_addr16 (   x)    S6_ADDR16(*tor_addr_to_in6_assert(x))

Given an IPv6 address x, yield it as an array of uint16_t.

Requires that x is actually an IPv6 address.

Definition at line 135 of file address.h.

◆ tor_addr_to_in6_addr32

#define tor_addr_to_in6_addr32 (   x)    S6_ADDR32(*tor_addr_to_in6_assert(x))

Given an IPv6 address x, yield it as an array of uint32_t.

Requires that x is actually an IPv6 address.

Definition at line 140 of file address.h.

Referenced by tor_addr_is_internal_(), tor_addr_is_loopback(), tor_addr_is_null(), tor_addr_is_v4(), and tor_addr_to_mapped_ipv4h().

◆ tor_addr_to_in6_addr8

#define tor_addr_to_in6_addr8 (   x)    tor_addr_to_in6_assert(x)->s6_addr

Given an IPv6 address x, yield it as an array of uint8_t.

Requires that x is actually an IPv6 address.

Definition at line 129 of file address.h.

Referenced by connection_send_socks5_connect(), get_random_virtual_addr(), tor_addr_is_multicast(), and tor_addr_to_PTR_name().

Typedef Documentation

◆ maskbits_t

typedef uint8_t maskbits_t

The number of bits from an address to consider while doing a masked comparison.

Definition at line 62 of file address.h.

◆ tor_addr_port_t

Holds an IP address and a TCP/UDP port.

◆ tor_addr_t

typedef struct tor_addr_t tor_addr_t

Holds an IPv4 or IPv6 address. (Uses less memory than struct sockaddr_storage.)

Enumeration Type Documentation

◆ tor_addr_comparison_t

Flag to specify how to do a comparison between addresses. In an "exact" comparison, addresses are equivalent only if they are in the same family with the same value. In a "semantic" comparison, IPv4 addresses match all IPv6 encodings of those addresses.

Definition at line 233 of file address.h.

Function Documentation

◆ addr_mask_get_bits()

int addr_mask_get_bits ( uint32_t  mask)

If mask is an address mask for a bit-prefix, return the number of bits. Otherwise, return -1.

Definition at line 1808 of file address.c.

◆ fmt_addr32()

const char* fmt_addr32 ( uint32_t  addr)

Like fmt_addr(), but takes addr as a host-order IPv4 addresses. Also not thread-safe, also clobbers its return buffer on repeated calls.

Definition at line 1169 of file address.c.

References INET_NTOA_BUF_LEN, and tor_inet_ntoa().

◆ fmt_addr_impl()

const char* fmt_addr_impl ( const tor_addr_t addr,
int  decorate 
)

Return a string representing the address addr. This string is statically allocated, and must not be freed. Each call to fmt_addr_impl invalidates the last result of the function. This function is not thread-safe. If decorate is set, add brackets to IPv6 addresses.

It's better to use the wrapper macros of this function: fmt_addr() and fmt_and_decorate_addr().

Definition at line 1142 of file address.c.

References TOR_ADDR_BUF_LEN, and tor_addr_to_str().

◆ fmt_addrport()

const char* fmt_addrport ( const tor_addr_t addr,
uint16_t  port 
)

Return a string representing the pair addr and port. This calls fmt_and_decorate_addr internally, so IPv6 addresses will have brackets, and the caveats of fmt_addr_impl apply.

Definition at line 1157 of file address.c.

References fmt_and_decorate_addr, TOR_ADDR_BUF_LEN, and tor_snprintf().

Referenced by bridge_resolve_conflicts(), and pt_get_extra_info_descriptor_string().

◆ get_interface_address_list()

static struct smartlist_t* get_interface_address_list ( int  severity,
int  include_internal 
)
inlinestatic

Return a smartlist of the IPv4 addresses of all interfaces on the server. Excludes loopback and multicast addresses. Only includes internal addresses if include_internal is true. (Note that a relay behind NAT may use an internal address to connect to the Internet.) An empty smartlist means that there are no IPv4 addresses. Returns NULL on failure. Use free_interface_address_list to free the returned list.

Definition at line 344 of file address.h.

◆ interface_address6_list_free_()

void interface_address6_list_free_ ( smartlist_t addrs)

Free a smartlist of IP addresses returned by get_interface_address6_list.

Definition at line 1617 of file address.c.

References SMARTLIST_FOREACH, and tor_free.

◆ parse_port_range()

int parse_port_range ( const char *  port,
uint16_t *  port_min_out,
uint16_t *  port_max_out 
)

Parse a string s in the format of (*|port(-maxport)?)?, setting the various *out pointers as appropriate. Return 0 on success, -1 on failure.

Definition at line 1827 of file address.c.

References tor_assert(), and tor_parse_long().

Referenced by router_parse_addr_policy_private().

◆ string_is_valid_dest()

int string_is_valid_dest ( const char *  string)

Return true iff string is a valid destination address, i.e. either a DNS hostname or IPv4/IPv6 address string.

Definition at line 1969 of file address.c.

◆ string_is_valid_ipv4_address()

int string_is_valid_ipv4_address ( const char *  string)

Return true if string represents a valid IPv4 adddress in 'a.b.c.d' form.

Definition at line 1947 of file address.c.

References tor_inet_pton().

Referenced by string_is_valid_nonrfc_hostname().

◆ string_is_valid_ipv6_address()

int string_is_valid_ipv6_address ( const char *  string)

Return true if string represents a valid IPv6 address in a form that inet_pton() can parse.

Definition at line 1958 of file address.c.

References tor_inet_pton().

◆ string_is_valid_nonrfc_hostname()

int string_is_valid_nonrfc_hostname ( const char *  string)

Return true iff string matches a pattern of DNS names that we allow Tor clients to connect to.

Note: This allows certain technically invalid characters ('_') to cope with misconfigured zones that have been encountered in the wild.

Definition at line 2002 of file address.c.

References smartlist_split_string(), and string_is_valid_ipv4_address().

◆ tor_addr_compare()

int tor_addr_compare ( const tor_addr_t addr1,
const tor_addr_t addr2,
tor_addr_comparison_t  how 
)

Given two addresses addr1 and addr2, return 0 if the two addresses are equivalent under the mask mbits, less than 0 if addr1 precedes addr2, and greater than 0 otherwise.

Different address families (IPv4 vs IPv6) are always considered unequal if how is CMP_EXACT; otherwise, IPv6-mapped IPv4 addresses are considered equivalent to their IPv4 equivalents.

As a special case, all pointer-wise distinct AF_UNIX addresses are always considered unequal since tor_addr_t currently does not contain the information required to make the comparison.

Definition at line 942 of file address.c.

References tor_addr_compare_masked().

Referenced by compare_orports_(), geoip_add_entry(), get_configured_bridge_by_addr_port_digest(), get_configured_bridge_by_exact_addr_port_digest(), get_configured_bridge_by_orports_digest(), and rewrite_node_address_for_bridge().

◆ tor_addr_compare_masked()

int tor_addr_compare_masked ( const tor_addr_t addr1,
const tor_addr_t addr2,
maskbits_t  mbits,
tor_addr_comparison_t  how 
)

As tor_addr_compare(), but only looks at the first mask bits of the address.

Reduce over-specific masks (>128 for ipv6, >32 for ipv4) to 128 or 32.

The mask is interpreted relative to addr1, so that if a is ::ffff:1.2.3.4, and b is 3.4.5.6, tor_addr_compare_masked(a,b,100,CMP_SEMANTIC) is the same as -tor_addr_compare_masked(b,a,4,CMP_SEMANTIC).

We guarantee that the ordering from tor_addr_compare_masked is a total order on addresses, but not that it is any particular order, or that it will be the same from one version to the next.

Helper: Evaluates to -1 if a is less than b, 0 if a equals b, or 1 if a is greater than b. May evaluate a and b more than once.

Definition at line 963 of file address.c.

References tor_addr_family(), tor_addr_to_ipv4h(), and tor_assert().

Referenced by addr_policy_covers(), addr_policy_intersects(), addrs_in_same_network_family(), get_random_virtual_addr(), and tor_addr_compare().

◆ tor_addr_copy()

void tor_addr_copy ( tor_addr_t dest,
const tor_addr_t src 
)

◆ tor_addr_copy_tight()

void tor_addr_copy_tight ( tor_addr_t dest,
const tor_addr_t src 
)

Copy a tor_addr_t from src to dest, taking extra care to copy only the well-defined portions. Used for computing hashes of addresses.

Definition at line 906 of file address.c.

References tor_addr_family(), tor_assert(), and tor_fragile_assert.

Referenced by policy_hash().

◆ tor_addr_eq_ipv4h()

static int tor_addr_eq_ipv4h ( const tor_addr_t a,
uint32_t  u 
)
inlinestatic

Return true iff a is an IPv4 address equal to the host-ordered address in u.

Definition at line 193 of file address.h.

References tor_addr_to_ipv4h().

◆ tor_addr_family()

static sa_family_t tor_addr_family ( const tor_addr_t a)
inlinestatic

◆ tor_addr_from_in6()

void tor_addr_from_in6 ( tor_addr_t dest,
const struct in6_addr in6 
)

Set dest equal to the IPv6 address in the in6_addr in6.

Definition at line 884 of file address.c.

References tor_addr_from_ipv6_bytes().

Referenced by tor_addr_from_sockaddr(), and tor_addr_parse_PTR_name().

◆ tor_addr_from_ipv4n()

void tor_addr_from_ipv4n ( tor_addr_t dest,
uint32_t  v4addr 
)

Set dest to equal the IPv4 address in v4addr (given in network order).

Definition at line 862 of file address.c.

References tor_assert().

Referenced by get_random_virtual_addr(), and tor_addr_from_sockaddr().

◆ tor_addr_from_ipv6_bytes()

void tor_addr_from_ipv6_bytes ( tor_addr_t dest,
const char *  ipv6_bytes 
)

Set dest to equal the IPv6 address in the 16 bytes at ipv6_bytes.

Definition at line 873 of file address.c.

References tor_assert().

Referenced by get_random_virtual_addr(), and tor_addr_from_in6().

◆ tor_addr_from_sockaddr()

int tor_addr_from_sockaddr ( tor_addr_t a,
const struct sockaddr *  sa,
uint16_t *  port_out 
)

Set the tor_addr_t in a to contain the socket address contained in sa. IF port_out is non-NULL and sa contains a port, set *port_out to that port. Return 0 on success and -1 on failure.

Definition at line 165 of file address.c.

References tor_addr_from_in6(), tor_addr_from_ipv4n(), tor_addr_make_af_unix(), tor_addr_make_unspec(), and tor_assert().

Referenced by tor_addr_from_getsockname().

◆ tor_addr_hash()

uint64_t tor_addr_hash ( const tor_addr_t addr)

Return a hash code based on the address addr. DOCDOC extra

Definition at line 1081 of file address.c.

References tor_addr_family(), tor_fragile_assert, and unspec_hash_input.

◆ tor_addr_hostname_is_local()

int tor_addr_hostname_is_local ( const char *  name)

Return true if we can tell that name is a canonical name for the loopback address. Return true also for *.local hostnames, which are multicast DNS names for hosts on the local network.

Definition at line 1916 of file address.c.

◆ tor_addr_is_internal_()

int tor_addr_is_internal_ ( const tor_addr_t addr,
int  for_listening,
const char *  filename,
int  lineno 
)

Return true iff ip is an IP reserved to localhost or local networks in RFC1918 or RFC4193 or RFC4291. (fec0::/10, deprecated by RFC3879, is also treated as internal for now.)

Definition at line 246 of file address.c.

References tor_addr_family(), tor_addr_is_v4(), tor_addr_to_in6_addr32, tor_addr_to_ipv4h(), and tor_assert().

◆ tor_addr_is_loopback()

int tor_addr_is_loopback ( const tor_addr_t addr)

Return true iff addr is a loopback address

Definition at line 783 of file address.c.

References tor_addr_family(), tor_addr_to_in6_addr32, tor_addr_to_ipv4h(), tor_assert(), and tor_fragile_assert.

Referenced by MOCK_IMPL(), and warn_nonlocal_controller_ports().

◆ tor_addr_is_multicast()

int tor_addr_is_multicast ( const tor_addr_t a)

Return true iff a is a multicast address.

Definition at line 1488 of file address.c.

References tor_addr_family(), tor_addr_to_in6_addr8, and tor_addr_to_ipv4h().

Referenced by MOCK_IMPL().

◆ tor_addr_is_null()

int tor_addr_is_null ( const tor_addr_t addr)

◆ tor_addr_is_v4()

int tor_addr_is_v4 ( const tor_addr_t addr)

Determine whether an address is IPv4, either native or IPv4-mapped IPv6. Note that this is about representation only, as any decent stack will reject IPv4-mapped addresses received on the wire (and won't use them on the wire either).

Definition at line 737 of file address.c.

References tor_addr_family(), tor_addr_to_in6_addr32, and tor_assert().

Referenced by get_first_listener_addrport_string(), and tor_addr_is_internal_().

◆ tor_addr_keyed_hash()

uint64_t tor_addr_keyed_hash ( const struct sipkey *  key,
const tor_addr_t addr 
)

As tor_addr_hash, but use a particular siphash key.

Definition at line 1100 of file address.c.

References tor_addr_family(), tor_fragile_assert, and unspec_hash_input.

◆ tor_addr_make_null()

void tor_addr_make_null ( tor_addr_t a,
sa_family_t  family 
)

Set address a to the null address in address family family. The null address for AF_INET is 0.0.0.0. The null address for AF_INET6 is [::]. AF_UNSPEC is all null.

Definition at line 235 of file address.c.

Referenced by connection_ap_get_begincell_flags(), fascist_firewall_choose_address_base(), fascist_firewall_choose_address_dir_server(), fascist_firewall_choose_address_ipv4h(), fascist_firewall_choose_address_node(), and fascist_firewall_choose_address_rs().

◆ tor_addr_make_unspec()

void tor_addr_make_unspec ( tor_addr_t a)

Set address a to the unspecified address. This address belongs to no family.

Definition at line 225 of file address.c.

Referenced by connected_cell_parse(), parse_port_config(), and tor_addr_from_sockaddr().

◆ tor_addr_parse()

int tor_addr_parse ( tor_addr_t addr,
const char *  src 
)

Convert the string in src to a tor_addr_t addr. The string may be an IPv4 address, an IPv6 address, or an IPv6 address surrounded by square brackets.

Return an address family on success, or -1 if an invalid address string is provided.

Definition at line 1185 of file address.c.

References tor_assert().

Referenced by address_is_in_virtual_range(), address_is_invalid_destination(), addressmap_rewrite_reverse(), adjust_exit_policy_from_exitpolicy_failure(), circuit_is_acceptable(), client_dns_set_addressmap(), client_dns_set_reverse_addressmap(), parse_port_config(), router_new_address_suggestion(), tor_addr_parse_PTR_name(), tor_addr_port_parse(), and tor_addr_port_split().

◆ tor_addr_parse_mask_ports()

int tor_addr_parse_mask_ports ( const char *  s,
unsigned  flags,
tor_addr_t addr_out,
maskbits_t maskbits_out,
uint16_t *  port_min_out,
uint16_t *  port_max_out 
)

Parse a string s containing an IPv4/IPv6 address, and possibly a mask and port or port range. Store the parsed address in addr_out, a mask (if any) in mask_out, and port(s) (if any) in port_min_out and port_max_out.

The syntax is: Address OptMask OptPortRange Address ::= IPv4Address / "[" IPv6Address "]" / "*" OptMask ::= "/" Integer / OptPortRange ::= ":*" / ":" Integer / ":" Integer "-" Integer /

  • If mask, minport, or maxport are NULL, we do not want these options to be set; treat them as an error if present.
  • If the string has no mask, the mask is set to /32 (IPv4) or /128 (IPv6).
  • If the string has one port, it is placed in both min and max port variables.
  • If the string has no port(s), port_(min|max)_out are set to 1 and 65535.

Return an address family on success, or -1 if an invalid address string is provided.

If 'flags & TAPMP_EXTENDED_STAR' is false, then the wildcard address '*' yield an IPv4 wildcard.

If 'flags & TAPMP_EXTENDED_STAR' is true, then the wildcard address '*' yields an AF_UNSPEC wildcard address, which expands to corresponding wildcard IPv4 and IPv6 rules, and the following change is made in the grammar above: Address ::= IPv4Address / "[" IPv6Address "]" / "*" / "*4" / "*6" with the new "*4" and "*6" productions creating a wildcard to match IPv4 or IPv6 addresses.

If 'flags & TAPMP_EXTENDED_STAR' and 'flags & TAPMP_STAR_IPV4_ONLY' are both true, then the wildcard address '*' yields an IPv4 wildcard.

If 'flags & TAPMP_EXTENDED_STAR' and 'flags & TAPMP_STAR_IPV6_ONLY' are both true, then the wildcard address '*' yields an IPv6 wildcard.

TAPMP_STAR_IPV4_ONLY and TAPMP_STAR_IPV6_ONLY are mutually exclusive.

Longest possible length for an address, mask, and port-range combination. Includes IP, [], /mask, :, ports

Definition at line 531 of file address.c.

References tor_assert().

Referenced by find_single_ipv6_orport(), and policy_expand_private().

◆ tor_addr_parse_PTR_name()

int tor_addr_parse_PTR_name ( tor_addr_t result,
const char *  address,
int  family,
int  accept_regular 
)

Parse an .in-addr.arpa or .ip6.arpa address from address. Return 0 if this is not an .in-addr.arpa address or an .ip6.arpa address. Return -1 if this is an ill-formed .in-addr.arpa address or an .ip6.arpa address. Also return -1 if family is not AF_UNSPEC, and the parsed address family does not match family. On success, return 1, and store the result, if any, into result, if provided.

If accept_regular is set and the address is in neither recognized reverse lookup hostname format, try parsing the address as a regular IPv4 or IPv6 address too.

Definition at line 368 of file address.c.

References hex_decode_digit(), INET_NTOA_BUF_LEN, strcasecmpend(), tor_addr_from_in, tor_addr_from_in6(), tor_addr_parse(), and tor_inet_aton().

◆ tor_addr_port_eq()

int tor_addr_port_eq ( const tor_addr_port_t a,
const tor_addr_port_t b 
)

Return true iff a and b are the same address and port

Definition at line 1937 of file address.c.

References tor_addr_eq.

◆ tor_addr_port_new()

tor_addr_port_t* tor_addr_port_new ( const tor_addr_t addr,
uint16_t  port 
)

Return a newly allocated tor_addr_port_t with addr and port filled in.

Definition at line 1926 of file address.c.

◆ tor_addr_port_parse()

int tor_addr_port_parse ( int  severity,
const char *  addrport,
tor_addr_t address_out,
uint16_t *  port_out,
int  default_port 
)

Given an address of the form "ip:port", try to divide it into its ip and port portions, setting *address_out to a newly allocated string holding the address portion and *port_out to the port.

Don't do DNS lookups and don't allow domain names in the "ip" field.

If default_port is less than 0, don't accept addrport of the form "ip" or "ip:0". Otherwise, accept those forms, and set *port_out to default_port.

Return 0 on success, -1 on failure.

Definition at line 1712 of file address.c.

References tor_addr_parse(), tor_addr_port_split(), tor_assert(), and tor_free.

◆ tor_addr_port_split()

int tor_addr_port_split ( int  severity,
const char *  addrport,
char **  address_out,
uint16_t *  port_out 
)

Given an address of the form "host[:port]", try to divide it into its host and port portions, setting *address_out to a newly allocated string holding the address portion and *port_out to the port (or 0 if no port is given). Return 0 on success, -1 on failure.

Definition at line 1751 of file address.c.

References tor_addr_parse(), and tor_assert().

Referenced by tor_addr_port_parse().

◆ tor_addr_to_in()

static const struct in_addr * tor_addr_to_in ( const tor_addr_t a)
inlinestatic

Return an in_addr* equivalent to a, or NULL if a is not an IPv4 address.

Definition at line 186 of file address.h.

◆ tor_addr_to_in6()

static const struct in6_addr * tor_addr_to_in6 ( const tor_addr_t a)
inlinestatic

Return an in6_addr* equivalent to a, or NULL if a is not an IPv6 address.

Definition at line 111 of file address.h.

Referenced by MOCK_IMPL().

◆ tor_addr_to_in6_assert()

static const struct in6_addr * tor_addr_to_in6_assert ( const tor_addr_t a)
inlinestatic

As tor_addr_to_in6, but assert that the address truly is an IPv6 address.

Definition at line 119 of file address.h.

References tor_assert().

Referenced by tor_addr_to_sockaddr().

◆ tor_addr_to_ipv4h()

static uint32_t tor_addr_to_ipv4h ( const tor_addr_t a)
inlinestatic

◆ tor_addr_to_ipv4n()

static uint32_t tor_addr_to_ipv4n ( const tor_addr_t a)
inlinestatic

Return an IPv4 address in network order for a, or 0 if a is not an IPv4 address.

Definition at line 145 of file address.h.

Referenced by connected_cell_format_payload(), connection_ap_handshake_socks_resolved_addr(), connection_send_socks5_connect(), get_random_virtual_addr(), tor_addr_is_null(), tor_addr_to_ipv4h(), and tor_addr_to_sockaddr().

◆ tor_addr_to_mapped_ipv4h()

static uint32_t tor_addr_to_mapped_ipv4h ( const tor_addr_t a)
inlinestatic

Given an IPv6 address, return its mapped IPv4 address in host order, or 0 if a is not an IPv6 address.

(Does not check whether the address is really a mapped address

Definition at line 161 of file address.h.

References tor_addr_to_in6_addr32, and tor_assert().

◆ tor_addr_to_PTR_name()

int tor_addr_to_PTR_name ( char *  out,
size_t  outlen,
const tor_addr_t addr 
)

Convert addr to an in-addr.arpa name or a .ip6.arpa name, and store the result in the outlen-byte buffer at out. Returns a non-negative integer on success. Returns -1 on failure.

Definition at line 458 of file address.c.

References REVERSE_LOOKUP_NAME_BUF_LEN, tor_addr_to_in6_addr8, tor_addr_to_ipv4h(), tor_assert(), and tor_snprintf().

◆ tor_addr_to_sockaddr()

socklen_t tor_addr_to_sockaddr ( const tor_addr_t a,
uint16_t  port,
struct sockaddr *  sa_out,
socklen_t  len 
)

Convert the tor_addr_t in a, with port in port, into a sockaddr object in *sa_out of object size len. If not enough room is available in sa_out, or on error, return 0. On success, return the length of the sockaddr.

Interface note: ordinarily, we return -1 for error. We can't do that here, since socklen_t is unsigned on some platforms.

Definition at line 113 of file address.c.

References tor_addr_family(), tor_addr_to_in6_assert(), and tor_addr_to_ipv4n().

◆ tor_addr_to_str()

const char* tor_addr_to_str ( char *  dest,
const tor_addr_t addr,
size_t  len,
int  decorate 
)

Convert a tor_addr_t addr into a string, and store it in dest of size len. Returns a pointer to dest on success, or NULL on failure. If decorate, surround IPv6 addresses with brackets.

Definition at line 317 of file address.c.

References tor_addr_family(), tor_assert(), tor_inet_ntop(), and tor_snprintf().

Referenced by client_dns_set_addressmap(), fmt_addr_impl(), get_pt_proxy_uri(), policy_write_item(), remap_event_helper(), and tor_addr_to_str_dup().

◆ tor_addr_to_str_dup()

char* tor_addr_to_str_dup ( const tor_addr_t addr)

Return a newly allocated string with a representation of addr.

Definition at line 1122 of file address.c.

References TOR_ADDR_BUF_LEN, and tor_addr_to_str().

◆ tor_dup_ip()

char* tor_dup_ip ( uint32_t  addr)

Given a host-order addr, call tor_inet_ntop() on it and return a strdup of the resulting address.

Definition at line 1879 of file address.c.

References TOR_ADDR_BUF_LEN, and tor_inet_ntop().

Referenced by inform_testing_reachability(), reachability_warnings_callback(), router_dirport_found_reachable(), and router_orport_found_reachable().

◆ tor_sockaddr_to_str()

char* tor_sockaddr_to_str ( const struct sockaddr *  sa)

Return a newly allocated string holding the address described in sa. AF_UNIX, AF_UNSPEC, AF_INET, and AF_INET6 are supported.

Definition at line 198 of file address.c.

References TOR_ADDR_BUF_LEN, and tor_asprintf().