30#define PS_SHOW_PORT_IF_DEFINED (1 << 0)
31#define PS_SHOW_PORT (1 << 1)
32#define PS_SHOW_PKTINFO (1 << 2)
33#define PS_DONT_SHOW_ADDR (1 << 3)
34#define PS_DONT_SHOW_FAMILY (1 << 4)
43 struct sockaddr_in
in4;
44 struct sockaddr_in6
in6;
57#if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
58 struct in_pktinfo in4;
59#elif defined(IP_RECVDSTADDR)
62 struct in6_pktinfo in6;
68 const unsigned int flags,
struct gc_arena *
gc);
70static inline const char *
76static inline const char *
84 const unsigned int flags,
struct gc_arena *
gc);
89#define IA_EMPTY_IF_UNDEF (1 << 0)
90#define IA_NET_ORDER (1 << 1)
97struct in6_addr
add_in6_addr(struct in6_addr base, uint32_t add);
99#define SA_IP_PORT (1 << 0)
100#define SA_SET_IF_NONZERO (1 << 1)
105 const unsigned int flags);
108 const unsigned int flags);
117#define GETADDR_RESOLVE (1 << 0)
118#define GETADDR_FATAL (1 << 1)
119#define GETADDR_HOST_ORDER (1 << 2)
120#define GETADDR_MENTION_RESOLVE_RETRY (1 << 3)
121#define GETADDR_FATAL_ON_SIGNAL (1 << 4)
122#define GETADDR_WARN_ON_SIGNAL (1 << 5)
123#define GETADDR_MSG_VIRT_OUT (1 << 6)
124#define GETADDR_TRY_ONCE (1 << 7)
125#define GETADDR_UPDATE_MANAGEMENT_STATE (1 << 8)
126#define GETADDR_RANDOMIZE (1 << 9)
127#define GETADDR_PASSIVE (1 << 10)
128#define GETADDR_DATAGRAM (1 << 11)
130#define GETADDR_CACHE_MASK (GETADDR_DATAGRAM | GETADDR_PASSIVE)
138in_addr_t
getaddr(
unsigned int flags,
const char *hostname,
int resolve_retry_seconds,
144bool get_ipv6_addr(
const char *hostname,
struct in6_addr *network,
unsigned int *netbits,
148 int resolve_retry_seconds,
struct signal_info *sig_info,
int ai_family,
149 struct addrinfo **
res);
152#define OIA_HOSTNAME 0
240 switch (addr->
addr.
sa.sa_family)
243 return addr->
addr.
in4.sin_addr.s_addr != 0;
246 return !IN6_IS_ADDR_UNSPECIFIED(&addr->
addr.
in6.sin6_addr);
260 switch (addr->sa_family)
263 return ((
const struct sockaddr_in *)addr)->sin_addr.s_addr == htonl(INADDR_LOOPBACK);
266 return IN6_IS_ADDR_LOOPBACK(&((
const struct sockaddr_in6 *)addr)->sin6_addr);
284#if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
286 return lsa->pi.in4.ipi_spec_dst.s_addr != 0;
288#elif defined(IP_RECVDSTADDR)
290 return lsa->pi.in4.s_addr != 0;
294 return !IN6_IS_ADDR_UNSPECIFIED(&lsa->pi.in6.ipi6_addr);
312 overhead += (proto ==
PROTO_UDP) ? 8 : 20;
313 overhead += (af == AF_INET) ? 20 : 40;
336 switch (a1->
addr.
sa.sa_family)
339 return a1->
addr.
in4.sin_addr.s_addr == a2->
addr.
in4.sin_addr.s_addr;
351 const struct addrinfo *curele;
352 for (curele = addrlist; curele; curele = curele->ai_next)
354 switch (a1->
addr.
sa.sa_family)
357 if (a1->
addr.
in4.sin_addr.s_addr
358 == ((
struct sockaddr_in *)curele->ai_addr)->sin_addr.s_addr)
366 &((
struct sockaddr_in6 *)curele->ai_addr)->sin6_addr))
382 const struct addrinfo *curele;
383 for (curele = a2; curele; curele = curele->ai_next)
385 switch (a1->
addr.
sa.sa_family)
388 if (curele->ai_family == AF_INET
389 && a1->
addr.
in4.sin_addr.s_addr
390 == ((
struct sockaddr_in *)curele->ai_addr)->sin_addr.s_addr
391 && a1->
addr.
in4.sin_port == ((
struct sockaddr_in *)curele->ai_addr)->sin_port)
398 if (curele->ai_family == AF_INET6
400 &((
struct sockaddr_in6 *)curele->ai_addr)->sin6_addr)
402 == ((
struct sockaddr_in6 *)curele->ai_addr)->sin6_port)
419 switch (a1->
addr.
sa.sa_family)
422 return a1->
addr.
in4.sin_addr.s_addr == a2->
addr.
in4.sin_addr.s_addr
452 switch (addr->
addr.
sa.sa_family)
455 addr->
addr.
in4.sin_addr.s_addr = 0;
459 memset(&addr->
addr.
in6.sin6_addr, 0,
sizeof(
struct in6_addr));
470 return sizeof(
struct sockaddr_in);
473 return sizeof(
struct sockaddr_in6);
478 msg(
M_ERR,
"Bad address family: %d", af);
static bool addr_port_match(const struct openvpn_sockaddr *a1, const struct openvpn_sockaddr *a2)
static const char * print_sockaddr(const struct sockaddr *addr, struct gc_arena *gc)
static bool link_socket_actual_defined(const struct link_socket_actual *act)
static bool addr_match_proto(const struct openvpn_sockaddr *a1, const struct openvpn_sockaddr *a2, const int proto)
const char * proto2ascii(int proto, sa_family_t af, bool display_form)
bool get_ipv6_addr(const char *hostname, struct in6_addr *network, unsigned int *netbits, int msglevel)
Translate an IPv6 addr or hostname from string form to in6_addr.
static const char * print_openvpn_sockaddr(const struct openvpn_sockaddr *addr, struct gc_arena *gc)
static int datagram_overhead(sa_family_t af, int proto)
static bool proto_is_net(int proto)
int openvpn_getaddrinfo(unsigned int flags, const char *hostname, const char *servname, int resolve_retry_seconds, struct signal_info *sig_info, int ai_family, struct addrinfo **res)
static bool proto_is_udp(int proto)
Returns if the protocol being used is UDP.
static bool link_socket_actual_match(const struct link_socket_actual *a1, const struct link_socket_actual *a2)
static bool addr_local(const struct sockaddr *addr)
bool mac_addr_safe(const char *mac_addr)
void setenv_in_addr_t(struct env_set *es, const char *name_prefix, in_addr_t addr, const unsigned int flags)
const char * print_in_port_t(in_port_t port, struct gc_arena *gc)
const char * proto2ascii_all(struct gc_arena *gc)
void setenv_link_socket_actual(struct env_set *es, const char *name_prefix, const struct link_socket_actual *act, const unsigned int flags)
void setenv_in6_addr(struct env_set *es, const char *name_prefix, const struct in6_addr *addr, const unsigned int flags)
const char * print_link_socket_actual(const struct link_socket_actual *act, struct gc_arena *gc)
static bool proto_is_tcp(int proto)
returns if the proto is a TCP variant (tcp-server, tcp-client or tcp)
static void addr_zero_host(struct openvpn_sockaddr *addr)
void setenv_sockaddr(struct env_set *es, const char *name_prefix, const struct openvpn_sockaddr *addr, const unsigned int flags)
static bool addr_defined_ipi(const struct link_socket_actual *lsa)
const char * print_link_socket_actual_ex(const struct link_socket_actual *act, const char *separator, const unsigned int flags, struct gc_arena *gc)
struct in6_addr add_in6_addr(struct in6_addr base, uint32_t add)
static bool proto_is_dgram(int proto)
Return if the protocol is datagram (UDP)
sa_family_t ascii2af(const char *proto_name)
static int af_addr_size(sa_family_t af)
int openvpn_inet_aton(const char *dotted_quad, struct in_addr *addr)
static bool addr_defined(const struct openvpn_sockaddr *addr)
const char * proto_remote(int proto, bool remote)
bool ipv6_addr_safe(const char *ipv6_text_addr)
bool ip_or_dns_addr_safe(const char *addr, const bool allow_fqdn)
int ascii2proto(const char *proto_name)
const char * print_in_addr_t(in_addr_t addr, unsigned int flags, struct gc_arena *gc)
static bool addrlist_port_match(const struct openvpn_sockaddr *a1, const struct addrinfo *a2)
const char * print_sockaddr_ex(const struct sockaddr *addr, const char *separator, const unsigned int flags, struct gc_arena *gc)
in_addr_t getaddr(unsigned int flags, const char *hostname, int resolve_retry_seconds, bool *succeeded, struct signal_info *sig_info)
Translate an IPv4 addr or hostname from string form to in_addr_t.
static bool addr_match(const struct openvpn_sockaddr *a1, const struct openvpn_sockaddr *a2)
const char * addr_family_name(int af)
const char * print_in6_addr(struct in6_addr addr6, unsigned int flags, struct gc_arena *gc)
static bool addrlist_match(const struct openvpn_sockaddr *a1, const struct addrinfo *addrlist)
bool ip_addr_dotted_quad_safe(const char *dotted_quad)
static bool link_socket_proto_connection_oriented(int proto)
static bool addrlist_match_proto(const struct openvpn_sockaddr *a1, struct addrinfo *addr_list, const int proto)
Garbage collection arena used to keep track of dynamically allocated memory.
struct openvpn_sockaddr dest
union openvpn_sockaddr::@27 addr
unsigned short sa_family_t
#define IN6_ARE_ADDR_EQUAL(a, b)