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);
114#define OIA_HOSTNAME 0
202 switch (addr->
addr.
sa.sa_family)
205 return addr->
addr.
in4.sin_addr.s_addr != 0;
208 return !IN6_IS_ADDR_UNSPECIFIED(&addr->
addr.
in6.sin6_addr);
217addr_local(
const struct sockaddr *addr)
223 switch (addr->sa_family)
226 return ((
const struct sockaddr_in *)addr)->sin_addr.s_addr == htonl(INADDR_LOOPBACK);
229 return IN6_IS_ADDR_LOOPBACK(&((
const struct sockaddr_in6 *)addr)->sin6_addr);
247#if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
249 return lsa->pi.in4.ipi_spec_dst.s_addr != 0;
251#elif defined(IP_RECVDSTADDR)
253 return lsa->pi.in4.s_addr != 0;
257 return !IN6_IS_ADDR_UNSPECIFIED(&lsa->pi.in6.ipi6_addr);
273 overhead += (proto ==
PROTO_UDP) ? 8 : 20;
274 overhead += (af == AF_INET) ? 20 : 40;
297 switch (a1->
addr.
sa.sa_family)
300 return a1->
addr.
in4.sin_addr.s_addr == a2->
addr.
in4.sin_addr.s_addr;
312 const struct addrinfo *curele;
313 for (curele = addrlist; curele; curele = curele->ai_next)
315 switch (a1->
addr.
sa.sa_family)
318 if (a1->
addr.
in4.sin_addr.s_addr
319 == ((
struct sockaddr_in *)curele->ai_addr)->sin_addr.s_addr)
327 &((
struct sockaddr_in6 *)curele->ai_addr)->sin6_addr))
343 const struct addrinfo *curele;
344 for (curele = a2; curele; curele = curele->ai_next)
346 switch (a1->
addr.
sa.sa_family)
349 if (curele->ai_family == AF_INET
350 && a1->
addr.
in4.sin_addr.s_addr
351 == ((
struct sockaddr_in *)curele->ai_addr)->sin_addr.s_addr
352 && a1->
addr.
in4.sin_port == ((
struct sockaddr_in *)curele->ai_addr)->sin_port)
359 if (curele->ai_family == AF_INET6
361 &((
struct sockaddr_in6 *)curele->ai_addr)->sin6_addr)
363 == ((
struct sockaddr_in6 *)curele->ai_addr)->sin6_port)
380 switch (a1->
addr.
sa.sa_family)
383 return a1->
addr.
in4.sin_addr.s_addr == a2->
addr.
in4.sin_addr.s_addr
413 switch (addr->
addr.
sa.sa_family)
416 addr->
addr.
in4.sin_addr.s_addr = 0;
420 memset(&addr->
addr.
in6.sin6_addr, 0,
sizeof(
struct in6_addr));
431 return sizeof(
struct sockaddr_in);
434 return sizeof(
struct sockaddr_in6);
439 msg(
M_ERR,
"Bad address family: %d", af);
Buffer management functions and garbage collection.
struct in6_addr add_in6_addr(struct in6_addr base, uint32_t add)
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)
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)
Overhead added to packets by various protocols.
static bool proto_is_net(int proto)
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 addrlist_match_proto(const struct openvpn_sockaddr *a1, const struct addrinfo *addr_list, const int proto)
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)
const char * print_link_socket_actual_ex(const struct link_socket_actual *act, const char *separator, const unsigned int flags, struct gc_arena *gc)
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)
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)
Garbage collection arena used to keep track of dynamically allocated memory.
struct openvpn_sockaddr dest
union openvpn_sockaddr::@051240265251124304325377241125360350250341115171 addr
unsigned short sa_family_t
#define IN6_ARE_ADDR_EQUAL(a, b)