64sf2gaf(
const unsigned int getaddr_flags,
65 const unsigned int sockflags)
64sf2gaf(
const unsigned int getaddr_flags, {
…}
82 void *network,
unsigned int *netbits,
83 int resolve_retry_seconds,
struct signal_info *sig_info,
86 char *endp, *sep, *var_host = NULL;
87 struct addrinfo *ai = NULL;
103 max_bits =
sizeof(in_addr_t) * 8;
108 max_bits =
sizeof(
struct in6_addr) * 8;
113 "Unsupported AF family passed to getaddrinfo for %s (%d)",
123 var_host = strdup(hostname);
127 "Can't allocate hostname buffer for getaddrinfo");
132 sep = strchr(var_host,
'/');
135 bits = strtoul(sep + 1, &endp, 10);
136 if ((*endp !=
'\0') || (bits > max_bits))
138 msg(msglevel,
"IP prefix '%s': invalid '/bits' spec (%s)", hostname,
146 resolve_retry_seconds, sig_info, af, &ai);
147 if ((ret == 0) && network)
149 struct in6_addr *ip6;
156 *ip4 = ((
struct sockaddr_in *)ai->ai_addr)->sin_addr.s_addr;
166 *ip6 = ((
struct sockaddr_in6 *)ai->ai_addr)->sin6_addr;
172 "Unsupported AF family for %s (%d)", var_host, af);
196 const char *hostname,
197 int resolve_retry_seconds,
205 resolve_retry_seconds, sig_info,
227 unsigned int *netbits,
int msglevel)
230 0, NULL, msglevel) < 0)
241 if (a == NULL && b == NULL)
245 else if (a == NULL || b == NULL)
261 const char *hostname,
262 const char *servname,
265 struct addrinfo **ai)
273 for (ph = dns_cache; ph; ph = ph->
next)
352 for (
int i = 0;
i <
l->len; ++
i)
421 flags &= ~GETADDR_RANDOMIZE;
457 case AF_INET:
return "[AF_INET]";
459 case AF_INET6:
return "[AF_INET6]";
470 const char *hostname,
471 const char *servname,
472 int resolve_retry_seconds,
475 struct addrinfo **res)
477 struct addrinfo hints;
482 const char *print_hostname;
483 const char *print_servname;
487 ASSERT(hostname || servname);
492 print_servname = servname;
512 hints.ai_flags = AI_NUMERICHOST;
516 hints.ai_flags |= AI_PASSIVE;
521 hints.ai_socktype = SOCK_DGRAM;
525 hints.ai_socktype = SOCK_STREAM;
532 hints.ai_family = ai_family;
535 status = getaddrinfo(hostname, servname, &hints, res);
539 const int fail_wait_interval = 5;
542 ((resolve_retry_seconds + 4)/ fail_wait_interval);
548 hints.ai_family = ai_family;
557 print_hostname = hostname;
561 print_hostname =
"undefined";
564 fmt =
"RESOLVE: Cannot resolve host address: %s:%s%s (%s)";
566 && !resolve_retry_seconds)
568 fmt =
"RESOLVE: Cannot resolve host address: %s:%s%s (%s)"
569 "(I would have retried this name query if you had "
570 "specified the --resolv-retry option.)";
575 msg(msglevel,
"RESOLVE: Cannot parse IP address: %s:%s (%s)",
576 print_hostname, print_servname, gai_strerror(
status));
580#ifdef ENABLE_MANAGEMENT
606 hints.ai_flags &= ~AI_NUMERICHOST;
608 "GETADDRINFO flags=0x%04x ai_family=%d ai_socktype=%d",
609 flags, hints.ai_family, hints.ai_socktype);
610 status = getaddrinfo(hostname, servname, &hints, res);
621 "RESOLVE: Ignored SIGUSR1 signal received during "
622 "DNS resolution attempt");
649 if (resolve_retries > 0)
661 if (--resolve_retries <= 0)
684 "WARNING: ignoring --remote-random-hostname because the "
685 "hostname is an IP address");
701 msg(level,
"RESOLVE: signal received during DNS resolution attempt");
715 unsigned int a, b, c, d;
718 if (sscanf(dotted_quad,
"%u.%u.%u.%u", &a, &b, &c, &d) == 4)
720 if (a < 256 && b < 256 && c < 256 && d < 256)
722 addr->s_addr = htonl(a<<24 | b<<16 | c<<8 | d);
746 if (strlen(dotted_quad) > 15)
755 const char *p = dotted_quad;
760 if (c >=
'0' && c <=
'9')
796 if (strlen(ipv6_text_addr) > INET6_ADDRSTRLEN)
804 return inet_pton( AF_INET6, ipv6_text_addr, &a6 ) == 1;
813 const size_t len = strlen(addr);
849 if (strlen(mac_addr) > 17)
858 const char *p = mac_addr;
863 if ( (c >=
'0' && c <=
'9') || (c >=
'a' && c <=
'f') || (c >=
'A' && c <=
'F') )
889#if defined(SOL_SOCKET) && defined(SO_SNDBUF)
894 if (getsockopt(sd, SOL_SOCKET, SO_SNDBUF, (
void *) &val, &len) == 0
895 && len ==
sizeof(val))
906#if defined(SOL_SOCKET) && defined(SO_SNDBUF)
907 if (setsockopt(sd, SOL_SOCKET, SO_SNDBUF, (
void *) &size,
sizeof(size)) != 0)
909 msg(
M_WARN,
"NOTE: setsockopt SO_SNDBUF=%d failed", size);
917#if defined(SOL_SOCKET) && defined(SO_RCVBUF)
922 if (getsockopt(sd, SOL_SOCKET, SO_RCVBUF, (
void *) &val, &len) == 0
923 && len ==
sizeof(val))
934#if defined(SOL_SOCKET) && defined(SO_RCVBUF)
935 if (setsockopt(sd, SOL_SOCKET, SO_RCVBUF, (
void *) &size,
sizeof(size)) != 0)
937 msg(
M_WARN,
"NOTE: setsockopt SO_RCVBUF=%d failed", size);
954 && (reduce_size || sndbuf_old < sbs->sndbuf))
960 && (reduce_size || rcvbuf_old < sbs->rcvbuf))
965 msg(
D_OSBUF,
"Socket Buffers: R=[%d->%d] S=[%d->%d]",
980#if defined(_WIN32) || (defined(IPPROTO_TCP) && defined(TCP_NODELAY))
981 if (setsockopt(sd, IPPROTO_TCP, TCP_NODELAY, (
void *) &state,
sizeof(state)) != 0)
983 msg(
M_WARN,
"NOTE: setsockopt TCP_NODELAY=%d failed", state);
988 dmsg(
D_OSBUF,
"Socket flags: TCP_NODELAY=%d succeeded", state);
992 msg(
M_WARN,
"NOTE: setsockopt TCP_NODELAY=%d failed (No kernel support)", state);
1000#if defined(TARGET_LINUX) && HAVE_DECL_SO_MARK
1001 if (mark && setsockopt(sd, SOL_SOCKET, SO_MARK, (
void *) &mark,
sizeof(mark)) != 0)
1003 msg(
M_WARN,
"NOTE: setsockopt SO_MARK=%d failed", mark);
1058 ASSERT(addrinfo->ai_socktype == SOCK_STREAM);
1060 if ((sd = socket(addrinfo->ai_family, addrinfo->ai_socktype, addrinfo->ai_protocol)) < 0)
1062 msg(
M_ERR,
"Cannot create TCP socket");
1069 if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR,
1070 (
void *) &on,
sizeof(on)) < 0)
1072 msg(
M_ERR,
"TCP: Cannot setsockopt SO_REUSEADDR on TCP socket");
1090 ASSERT(addrinfo->ai_socktype == SOCK_DGRAM);
1092 if ((sd = socket(addrinfo->ai_family, addrinfo->ai_socktype, addrinfo->ai_protocol)) < 0)
1094 msg(
M_ERR,
"UDP: Cannot create UDP/UDP6 socket");
1096#if ENABLE_IP_PKTINFO
1100 if (addrinfo->ai_family == AF_INET)
1102#if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
1103 if (setsockopt(sd,
SOL_IP, IP_PKTINFO,
1104 (
void *)&pad,
sizeof(pad)) < 0)
1106 msg(
M_ERR,
"UDP: failed setsockopt for IP_PKTINFO");
1108#elif defined(IP_RECVDSTADDR)
1109 if (setsockopt(sd, IPPROTO_IP, IP_RECVDSTADDR,
1110 (
void *)&pad,
sizeof(pad)) < 0)
1112 msg(
M_ERR,
"UDP: failed setsockopt for IP_RECVDSTADDR");
1115#error ENABLE_IP_PKTINFO is set without IP_PKTINFO xor IP_RECVDSTADDR (fix syshead.h)
1118 else if (addrinfo->ai_family == AF_INET6)
1120#ifndef IPV6_RECVPKTINFO
1121 if (setsockopt(sd, IPPROTO_IPV6, IPV6_PKTINFO,
1122 (
void *)&pad,
sizeof(pad)) < 0)
1124 if (setsockopt(sd, IPPROTO_IPV6, IPV6_RECVPKTINFO,
1125 (
void *)&pad,
sizeof(pad)) < 0)
1127 {
msg(
M_ERR,
"UDP: failed setsockopt for IPV6_RECVPKTINFO");}
1148 ai_family,
"SOCKS",
false);
1162 if (addr->ai_protocol == IPPROTO_UDP || addr->ai_socktype == SOCK_DGRAM)
1174 struct addrinfo addrinfo_tmp = *addr;
1175 addrinfo_tmp.ai_socktype = SOCK_STREAM;
1176 addrinfo_tmp.ai_protocol = IPPROTO_TCP;
1180 else if (addr->ai_protocol == IPPROTO_TCP || addr->ai_socktype == SOCK_STREAM)
1190 sock->
info.
af = addr->ai_family;
1198#if defined(TARGET_LINUX)
1202 if (setsockopt(sock->
sd, SOL_SOCKET, SO_BINDTODEVICE, sock->
bind_dev, strlen(sock->
bind_dev) + 1) != 0)
1213#ifdef TARGET_ANDROID
1215protect_fd_nonlocal(
int fd,
const struct sockaddr *addr)
1219 msg(
M_FATAL,
"Required management interface not available.");
1233 management_android_control(
management,
"PROTECTFD", __func__);
1242 const struct addrinfo *local,
1244 bool do_set_nonblock)
1250 msg(
M_INFO,
"Listening for incoming TCP connection on %s",
1254 msg(
M_ERR,
"TCP: listen() failed");
1259 if (do_set_nonblock)
1277 socklen_t remote_len =
sizeof(act->
dest.
addr);
1284 new_sd = getpeername(sd, &act->
dest.
addr.
sa, &remote_len);
1297 new_sd = accept(sd, &act->
dest.
addr.
sa, &remote_len);
1316 else if (remote_len_af && remote_len != remote_len_af)
1318 msg(
D_LINK_ERRORS,
"TCP: Received strange incoming connection with unknown address length=%d", remote_len);
1335 msg(
M_INFO,
"TCP connection established with %s",
1343 const char *remote_dynamic,
1344 const struct addrinfo *local,
1347 volatile int *signal_received)
1368 status = select(sd + 1, &reads, NULL, NULL, &tv);
1371 if (*signal_received)
1392 struct addrinfo *ai = NULL;
1396 remote_verify.
addr.
sa.sa_family, &ai);
1402 "TCP NOTE: Rejected connection attempt from %s due to --remote setting",
1406 msg(
M_ERR,
"TCP: close socket failed (new_sd)");
1424 msg(
M_ERR,
"TCP: close socket failed (sd)");
1435 struct addrinfo *local,
1449 struct addrinfo *cur;
1455 for (cur = local; cur; cur = cur->ai_next)
1457 if (cur->ai_family == ai_family)
1464 msg(
M_FATAL,
"%s: Socket bind failed: Addr to bind has no %s record",
1468 if (ai_family == AF_INET6)
1470 int v6only = ipv6only ? 1 : 0;
1472 msg(
M_INFO,
"setsockopt(IPV6_V6ONLY=%d)", v6only);
1473 if (setsockopt(sd, IPPROTO_IPV6, IPV6_V6ONLY, (
void *) &v6only,
sizeof(v6only)))
1478 if (bind(sd, cur->ai_addr, cur->ai_addrlen))
1489 const struct sockaddr *remote,
1490 int connect_timeout,
1491 volatile int *signal_received)
1495#ifdef TARGET_ANDROID
1496 protect_fd_nonlocal(sd, remote);
1515 struct pollfd fds[1];
1517 fds[0].events = POLLOUT;
1518 status = poll(fds, 1, (connect_timeout > 0) ? 1000 : 0);
1525 tv.tv_sec = (connect_timeout > 0) ? 1 : 0;
1528 status = select(sd + 1, NULL, &writes, NULL, &tv);
1530 if (signal_received)
1533 if (*signal_received)
1546 if (--connect_timeout < 0)
1565 if (getsockopt(sd, SOL_SOCKET, SO_ERROR, (
void *) &val, &len) == 0
1566 && len ==
sizeof(val))
1588 if (ai->ai_family == AF_INET)
1591 *((
struct sockaddr_in *) ai->ai_addr);
1593 else if (ai->ai_family == AF_INET6)
1596 *((
struct sockaddr_in6 *) ai->ai_addr);
1607 const struct sockaddr *dest,
1608 const int connect_timeout,
1614 msg(
M_INFO,
"Attempting to establish TCP connection with %s",
1617#ifdef ENABLE_MANAGEMENT
1651 msg(
M_INFO,
"TCP connection established with %s",
1667 const unsigned int sockflags,
const int proto);
1739 msg(
M_FATAL,
"getaddrinfo() failed for local \"%s:%s\": %s",
1755 const char **remote_dynamic,
1758 volatile int *signal_received = sig_info ? &sig_info->
signal_received : NULL;
1769 struct addrinfo *ai;
1783 else if (phase == 1)
1795 else if (phase == 2)
1821 retry, sig_info, sock->
info.
af, &ai);
1830 "RESOLVE_REMOTE flags=0x%04x phase=%d rrs=%d sig=%d status=%d",
1834 signal_received ? *signal_received : -1,
1837 if (signal_received && *signal_received)
1843 if (signal_received)
1856 msg(
M_INFO,
"TCP/UDP: Preserving recently used remote address: %s",
1860 *remote_dynamic = NULL;
1903 const char *remote_host = o->
ce.
remote;
1940 sock->gremlin = o->gremlin;
1949 if (o->port_share_host && o->port_share_port)
2041#if EXTENDED_SOCKET_ERROR_CAPABILITY
2043 set_sock_extended_error_passing(sock->
sd, sock->
info.
af);
2061 struct addrinfo *cur;
2064 if (!ai_family || ai_family == cur->ai_family)
2070 msg(msglevel,
"%s link local (bound): %s",
2076 msg(msglevel,
"%s link local: (not bound)",
2081 msg(msglevel,
"%s link remote: %s",
2136 bool proxy_retry =
false;
2174 }
while (proxy_retry);
2236 const char *device_guid = NULL;
2240 static_assert(
sizeof(sock->
sd) ==
sizeof(tt->
hand),
"HANDLE and SOCKET size differs");
2273 const char *remote_dynamic = NULL;
2281 sig_save = *sig_info;
2324 if (sock->
info.
af == AF_UNSPEC)
2326 msg(
M_WARN,
"Could not determine IPv4/IPv6 protocol. Using %s",
2337 msg(
M_WARN,
"Could not determine IPv4/IPv6 protocol");
2338 register_signal(sig_info, SIGUSR1,
"Could not determine IPv4/IPv6 protocol");
2360#ifdef TARGET_ANDROID
2395 const int gremlin = GREMLIN_CONNECTION_FLOOD_LEVEL(sock->gremlin);
2397 const int gremlin = 0;
2407 msg(
D_LOW,
"TCP/UDP: Closing socket");
2466 const char *common_name,
2496 msg(
M_WARN,
"WARNING: ipchange plugin call failed");
2520 struct addrinfo *ai;
2527 "TCP/UDP: Incoming packet rejected from %s[%d], expected peer address: %s (allow this incoming source address/port by removing --remote or adding --float)",
2575 return ntohl(((
struct sockaddr_in *)lsa->
current_remote->ai_addr)
2584const struct in6_addr *
2606 return &(((
struct sockaddr_in6 *)lsa->
current_remote->ai_addr)->sin6_addr);
2658 sb->residual_fully_formed =
false;
2659 sb->buf =
sb->buf_init;
2667 const unsigned int sockflags,
2670 sb->buf_init = *buf;
2671 sb->maxlen =
sb->buf_init.
len;
2672 sb->buf_init.len = 0;
2690 sb->next.offset =
sb->buf.offset +
sb->buf.len;
2691 sb->next.len = (
sb->len >= 0 ?
sb->len :
sb->maxlen) -
sb->buf.len;
2693 sb->buf.offset,
sb->buf.len,
2694 sb->next.offset,
sb->next.len,
2695 sb->len,
sb->maxlen);
2774 if (
sb->len < 1 ||
sb->len >
sb->maxlen)
2776 msg(
M_WARN,
"WARNING: Bad encapsulated packet length from peer (%d), which must be > 0 and <= %d -- please ensure that --tun-mtu or --link-mtu is equal on both peers -- this condition could also indicate a possible active attack on the TCP link -- [Attempting restart...]",
sb->len,
sb->maxlen);
2784 if (
sb->len > 0 &&
sb->buf.len >=
sb->len)
2788 if (
sb->buf.len >
sb->len)
2837 const unsigned int flags,
2847 switch (sa->sa_family)
2854 salen =
sizeof(
struct sockaddr_in);
2855 addr_is_defined = ((
struct sockaddr_in *) sa)->sin_addr.s_addr != 0;
2863 salen =
sizeof(
struct sockaddr_in6);
2864 addr_is_defined = !IN6_IS_ADDR_UNSPECIFIED(&((
struct sockaddr_in6 *) sa)->sin6_addr);
2870 return "[AF_UNSPEC]";
2881 status = getnameinfo(sa, salen, hostaddr,
sizeof(hostaddr),
2882 servname,
sizeof(servname), NI_NUMERICHOST | NI_NUMERICSERV);
2892 if (addr_is_defined)
2922#define IF_NAMESIZE 16
2927 const char *separator,
2928 const unsigned int flags,
2935#if ENABLE_IP_PKTINFO
2940 switch (
act->dest.addr.sa.sa_family)
2946 sa.addr.in4.sin_family = AF_INET;
2947#if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
2948 sa.addr.in4.sin_addr = act->pi.in4.ipi_spec_dst;
2949 if_indextoname(act->pi.in4.ipi_ifindex, ifname);
2950#elif defined(IP_RECVDSTADDR)
2951 sa.addr.in4.sin_addr = act->pi.in4;
2954#error ENABLE_IP_PKTINFO is set without IP_PKTINFO xor IP_RECVDSTADDR (fix syshead.h)
2964 struct sockaddr_in6 sin6;
2965 char buf[INET6_ADDRSTRLEN] =
"[undef]";
2967 sin6.sin6_family = AF_INET6;
2968 sin6.sin6_addr = act->pi.in6.ipi6_addr;
2969 if_indextoname(act->pi.in6.ipi6_ifindex, ifname);
2970 if (getnameinfo((
struct sockaddr *)&sin6,
sizeof(
struct sockaddr_in6),
2971 buf,
sizeof(buf), NULL, 0, NI_NUMERICHOST) == 0)
2973 buf_printf(&out,
" (via %s%%%s)", buf, ifname);
2977 buf_printf(&out,
" (via [getnameinfo() err]%%%s)", ifname);
3005 ia.s_addr = (flags &
IA_NET_ORDER) ? addr : htonl(addr);
3007 inet_ntop(AF_INET, &ia, out, INET_ADDRSTRLEN);
3019 char *out =
gc_malloc(INET6_ADDRSTRLEN,
true,
gc);
3021 if (memcmp(&a6, &in6addr_any,
sizeof(a6)) != 0
3024 inet_ntop(AF_INET6, &a6, out, INET6_ADDRSTRLEN);
3048 for (i = 15; i>=0 && add > 0; i--)
3051 register uint32_t h;
3053 h = (
unsigned char) base.s6_addr[i];
3054 base.s6_addr[i] = (h+add) & UINT8_MAX;
3059 carry = ((h & 0xff) + (add & 0xff)) >> 8;
3060 add = (add>>8) + carry;
3071 char buf[INET6_ADDRSTRLEN];
3072 switch (addr->
addr.
sa.sa_family)
3077 snprintf(name_buf,
sizeof(name_buf),
"%s_ip", name_prefix);
3081 snprintf(name_buf,
sizeof(name_buf),
"%s", name_prefix);
3084 inet_ntop(AF_INET, &addr->
addr.
in4.sin_addr, buf,
sizeof(buf));
3089 snprintf(name_buf,
sizeof(name_buf),
"%s_port", name_prefix);
3095 if (IN6_IS_ADDR_V4MAPPED( &addr->
addr.
in6.sin6_addr ))
3098 memcpy(&ia.s_addr, &addr->
addr.
in6.sin6_addr.s6_addr[12],
3100 snprintf(name_buf,
sizeof(name_buf),
"%s_ip", name_prefix);
3101 inet_ntop(AF_INET, &ia, buf,
sizeof(buf));
3105 snprintf(name_buf,
sizeof(name_buf),
"%s_ip6", name_prefix);
3106 inet_ntop(AF_INET6, &addr->
addr.
in6.sin6_addr, buf,
sizeof(buf));
3112 snprintf(name_buf,
sizeof(name_buf),
"%s_port", name_prefix);
3126 si.
addr.
in4.sin_family = AF_INET;
3134 const char *name_prefix,
3135 const struct in6_addr *
addr,
3136 const unsigned int flags)
3142 si.
addr.
in6.sin6_family = AF_INET6;
3150 const char *name_prefix,
3152 const unsigned int flags)
3170 {
"proto-uninitialized",
"proto-NONE", AF_UNSPEC,
PROTO_NONE},
3232 return "[unknown protocol]";
3256 case AF_INET:
return "AF_INET";
3287 return "TCPv4_SERVER";
3292 return "TCPv4_CLIENT";
3306 msg(
M_FATAL,
"ERROR: received strange incoming packet with an address length of %d -- we only accept address lengths of %d.",
3330 msg(
M_INFO,
"BUG: link_socket_read_tcp(): sock->sd==-1, reset client instance" );
3332 return buf->
len = 0;
3363 return buf->
len = 0;
3369#if ENABLE_IP_PKTINFO
3374#if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
3375#define PKTINFO_BUF_SIZE max_int( CMSG_SPACE(sizeof(struct in6_pktinfo)), \
3376 CMSG_SPACE(sizeof(struct in_pktinfo)) )
3378#define PKTINFO_BUF_SIZE max_int( CMSG_SPACE(sizeof(struct in6_pktinfo)), \
3379 CMSG_SPACE(sizeof(struct in_addr)) )
3388 uint8_t pktinfo_buf[PKTINFO_BUF_SIZE];
3389 struct msghdr mesg = {0};
3390 socklen_t fromlen =
sizeof(from->
dest.
addr);
3394 iov.iov_base =
BPTR(buf);
3396 mesg.msg_iov = &iov;
3397 mesg.msg_iovlen = 1;
3399 mesg.msg_namelen = fromlen;
3400 mesg.msg_control = pktinfo_buf;
3401 mesg.msg_controllen =
sizeof pktinfo_buf;
3402 buf->
len = recvmsg(sock->
sd, &mesg, 0);
3405 struct cmsghdr *cmsg;
3406 fromlen = mesg.msg_namelen;
3407 cmsg = CMSG_FIRSTHDR(&mesg);
3409 && CMSG_NXTHDR(&mesg, cmsg) == NULL
3411 && cmsg->cmsg_level ==
SOL_IP
3412 && cmsg->cmsg_type == IP_PKTINFO
3413 && cmsg->cmsg_len >= CMSG_LEN(
sizeof(
struct in_pktinfo)) )
3414#elif defined(IP_RECVDSTADDR)
3415 && cmsg->cmsg_level == IPPROTO_IP
3416 && cmsg->cmsg_type == IP_RECVDSTADDR
3417 && cmsg->cmsg_len >= CMSG_LEN(
sizeof(
struct in_addr)) )
3419#error
ENABLE_IP_PKTINFO is set without IP_PKTINFO xor IP_RECVDSTADDR (fix syshead.h)
3422#if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
3423 struct in_pktinfo *pkti = (
struct in_pktinfo *) CMSG_DATA(cmsg);
3424 from->pi.in4.ipi_ifindex = pkti->ipi_ifindex;
3425 from->pi.in4.ipi_spec_dst = pkti->ipi_spec_dst;
3426#elif defined(IP_RECVDSTADDR)
3427 from->pi.in4 = *(
struct in_addr *) CMSG_DATA(cmsg);
3429#error ENABLE_IP_PKTINFO is set without IP_PKTINFO xor IP_RECVDSTADDR (fix syshead.h)
3432 else if (cmsg != NULL
3433 && CMSG_NXTHDR(&mesg, cmsg) == NULL
3434 && cmsg->cmsg_level == IPPROTO_IPV6
3435 && cmsg->cmsg_type == IPV6_PKTINFO
3436 && cmsg->cmsg_len >= CMSG_LEN(
sizeof(
struct in6_pktinfo)) )
3438 struct in6_pktinfo *pkti6 = (
struct in6_pktinfo *) CMSG_DATA(cmsg);
3439 from->pi.in6.ipi6_ifindex = pkti6->ipi6_ifindex;
3440 from->pi.in6.ipi6_addr = pkti6->ipi6_addr;
3442 else if (cmsg != NULL)
3444 msg(
M_WARN,
"CMSG received that cannot be parsed (cmsg_level=%d, cmsg_type=%d, cmsg=len=%d)", (
int)cmsg->cmsg_level, (
int)cmsg->cmsg_type, (
int)cmsg->cmsg_len );
3453link_socket_read_udp_posix(
struct link_socket *sock,
3457 socklen_t fromlen =
sizeof(from->
dest.
addr);
3463#if ENABLE_IP_PKTINFO
3467 fromlen = link_socket_read_udp_posix_recvmsg(sock, buf, from);
3476 if (buf->
len >= 0 && expectedlen && fromlen != expectedlen)
3502 return link_socket_write_tcp_posix(sock, buf);
3506#if ENABLE_IP_PKTINFO
3509link_socket_write_udp_posix_sendmsg(
struct link_socket *sock,
3515 struct cmsghdr *cmsg;
3516 uint8_t pktinfo_buf[PKTINFO_BUF_SIZE];
3518 iov.iov_base =
BPTR(buf);
3519 iov.iov_len =
BLEN(buf);
3520 mesg.msg_iov = &iov;
3521 mesg.msg_iovlen = 1;
3527 mesg.msg_namelen =
sizeof(
struct sockaddr_in);
3528 mesg.msg_control = pktinfo_buf;
3530#if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
3531 mesg.msg_controllen = CMSG_SPACE(
sizeof(
struct in_pktinfo));
3532 cmsg = CMSG_FIRSTHDR(&mesg);
3533 cmsg->cmsg_len = CMSG_LEN(
sizeof(
struct in_pktinfo));
3534 cmsg->cmsg_level =
SOL_IP;
3535 cmsg->cmsg_type = IP_PKTINFO;
3537 struct in_pktinfo *pkti;
3538 pkti = (
struct in_pktinfo *) CMSG_DATA(cmsg);
3539 pkti->ipi_ifindex = to->pi.in4.ipi_ifindex;
3540 pkti->ipi_spec_dst = to->pi.in4.ipi_spec_dst;
3541 pkti->ipi_addr.s_addr = 0;
3543#elif defined(IP_RECVDSTADDR)
3544 ASSERT( CMSG_SPACE(
sizeof(
struct in_addr)) <=
sizeof(pktinfo_buf) );
3545 mesg.msg_controllen = CMSG_SPACE(
sizeof(
struct in_addr));
3546 cmsg = CMSG_FIRSTHDR(&mesg);
3547 cmsg->cmsg_len = CMSG_LEN(
sizeof(
struct in_addr));
3548 cmsg->cmsg_level = IPPROTO_IP;
3549 cmsg->cmsg_type = IP_RECVDSTADDR;
3550 *(
struct in_addr *) CMSG_DATA(cmsg) = to->pi.in4;
3552#error ENABLE_IP_PKTINFO is set without IP_PKTINFO xor IP_RECVDSTADDR (fix syshead.h)
3559 struct in6_pktinfo *pkti6;
3561 mesg.msg_namelen =
sizeof(
struct sockaddr_in6);
3563 ASSERT( CMSG_SPACE(
sizeof(
struct in6_pktinfo)) <=
sizeof(pktinfo_buf) );
3564 mesg.msg_control = pktinfo_buf;
3565 mesg.msg_controllen = CMSG_SPACE(
sizeof(
struct in6_pktinfo));
3567 cmsg = CMSG_FIRSTHDR(&mesg);
3568 cmsg->cmsg_len = CMSG_LEN(
sizeof(
struct in6_pktinfo));
3569 cmsg->cmsg_level = IPPROTO_IPV6;
3570 cmsg->cmsg_type = IPV6_PKTINFO;
3572 pkti6 = (
struct in6_pktinfo *) CMSG_DATA(cmsg);
3573 pkti6->ipi6_ifindex = to->pi.in6.ipi6_ifindex;
3574 pkti6->ipi6_addr = to->pi.in6.ipi6_addr;
3580 return sendmsg(sock->
sd, &mesg, 0);
3596 return GetLastError();
3599 return WSAGetLastError();
3626 wsabuf[0].len = maxsize ? maxsize :
BLEN(&sock->
reads.
buf);
3637 status = ReadFile((HANDLE)sock->
sd, wsabuf[0].buf, wsabuf[0].len,
3689 dmsg(
D_WIN32_IO,
"WIN32 I/O: Socket Receive immediate return [%d,%d]",
3690 (
int) wsabuf[0].len,
3696 if (
status == WSA_IO_PENDING)
3701 (
int) wsabuf[0].len);
3710 (
int) wsabuf[0].len,
3742 status = WriteFile((HANDLE)sock->
sd, wsabuf[0].buf, wsabuf[0].len,
3804 dmsg(
D_WIN32_IO,
"WIN32 I/O: Socket Send immediate return [%d,%d]",
3805 (
int) wsabuf[0].len,
3812 if (
status == WSA_IO_PENDING ||
status == ERROR_IO_PENDING)
3817 (
int) wsabuf[0].len);
3827 (
int) wsabuf[0].len,
3850 case sizeof(
struct sockaddr_in):
3851 case sizeof(struct sockaddr_in6):
3854 case sizeof(struct sockaddr_in6) - 4:
3861 switch (io->addr.sin_family)
3864 memcpy(dst, &io->
addr,
sizeof(
struct sockaddr_in));
3868 memcpy(dst, &io->
addr6,
sizeof(
struct sockaddr_in6));
3892 const struct sockaddr *sa = (
const struct sockaddr *)
BPTR(buf);
3893 switch (sa->sa_family)
3896 sa_len =
sizeof(
struct sockaddr_in);
3899 msg(
M_FATAL,
"ERROR: received incoming packet with too short length of %d -- must be at least %d.",
buf_len(buf), sa_len);
3901 memcpy(dst, sa, sa_len);
3906 sa_len =
sizeof(
struct sockaddr_in6);
3909 msg(
M_FATAL,
"ERROR: received incoming packet with too short length of %d -- must be at least %d.",
buf_len(buf), sa_len);
3911 memcpy(dst, sa, sa_len);
3916 msg(
M_FATAL,
"ERROR: received incoming packet with invalid address family %d.", sa->sa_family);
3981 dmsg(
D_WIN32_IO,
"WIN32 I/O: Completion non-queued success [%d]", ret);
4021 unsigned int rwflags,
4023 unsigned int *persistent)
4030 rwflags &= ~EVENT_READ;
4041 if (!persistent || *persistent != rwflags)
4046 *persistent = rwflags;
4065#if UNIX_SOCK_SUPPORT
4072sockaddr_unix_name(
const struct sockaddr_un *local,
const char *null)
4074 if (local && local->sun_family == PF_UNIX)
4076 return local->sun_path;
4085create_socket_unix(
void)
4089 if ((sd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
4091 msg(
M_ERR,
"Cannot create unix domain socket");
4103 struct sockaddr_un *local,
4107 const mode_t orig_umask = umask(0);
4109 if (bind(sd, (
struct sockaddr *) local,
sizeof(
struct sockaddr_un)))
4112 "%s: Socket bind[%d] failed on unix domain socket %s",
4115 sockaddr_unix_name(local,
"NULL"));
4124 struct sockaddr_un *remote)
4126 socklen_t remote_len =
sizeof(
struct sockaddr_un);
4130 ret = accept(sd, (
struct sockaddr *) remote, &remote_len);
4142 struct sockaddr_un *remote)
4144 int status = connect(sd, (
struct sockaddr *) remote,
sizeof(
struct sockaddr_un));
4153sockaddr_unix_init(
struct sockaddr_un *local,
const char *path)
4155 local->sun_family = PF_UNIX;
4156 strncpynt(local->sun_path, path,
sizeof(local->sun_path));
4160socket_delete_unix(
const struct sockaddr_un *local)
4162 const char *name = sockaddr_unix_name(local, NULL);
4163 if (name && strlen(name))
4172#ifdef HAVE_GETPEEREID
4175 if (getpeereid(sd, &u, &g) == -1)
4188#elif defined(SO_PEERCRED)
4189 struct ucred peercred;
4190 socklen_t so_len =
sizeof(peercred);
4191 if (getsockopt(sd, SOL_SOCKET, SO_PEERCRED, &peercred, &so_len) == -1)
4197 *uid = peercred.uid;
4201 *gid = peercred.gid;
void argv_parse_cmd(struct argv *argres, const char *cmdstr)
Parses a command string, tokenizes it and puts each element into a separate struct argv argument slot...
void argv_free(struct argv *a)
Frees all memory allocations allocated by the struct argv related functions.
bool argv_printf(struct argv *argres, const char *format,...)
printf() variant which populates a struct argv.
bool argv_printf_cat(struct argv *argres, const char *format,...)
printf() inspired argv concatenation.
struct argv argv_new(void)
Allocates a new struct argv and ensures it is initialised.
void free_buf(struct buffer *buf)
bool buf_printf(struct buffer *buf, const char *format,...)
bool buf_puts(struct buffer *buf, const char *str)
bool string_class(const char *str, const unsigned int inclusive, const unsigned int exclusive)
void * gc_malloc(size_t size, bool clear, struct gc_arena *a)
struct buffer alloc_buf_gc(size_t size, struct gc_arena *gc)
struct buffer alloc_buf(size_t size)
void gc_addspecial(void *addr, void(*free_function)(void *), struct gc_arena *a)
static bool buf_copy(struct buffer *dest, const struct buffer *src)
static bool buf_copy_excess(struct buffer *dest, struct buffer *src, int len)
static bool buf_write_prepend(struct buffer *dest, const void *src, int size)
#define CC_DIGIT
digit isdigit()
static void buf_reset(struct buffer *buf)
static bool buf_safe(const struct buffer *buf, size_t len)
static bool buf_read(struct buffer *src, void *dest, int size)
static bool buf_advance(struct buffer *buf, int size)
static int buf_len(const struct buffer *buf)
static int buf_forward_capacity(const struct buffer *buf)
#define ALLOC_OBJ_CLEAR_GC(dptr, type, gc)
static void strncpynt(char *dest, const char *src, size_t maxlen)
static void gc_free(struct gc_arena *a)
#define ALLOC_OBJ_CLEAR(dptr, type)
static bool buf_defined(const struct buffer *buf)
#define CC_ALNUM
alphanumeric isalnum()
#define buf_init(buf, offset)
static void gc_freeaddrinfo_callback(void *addr)
static struct gc_arena gc_new(void)
static int buf_forward_capacity_total(const struct buffer *buf)
#define HAVE_IPI_SPEC_DST
void dco_mp_start_vpn(HANDLE handle, struct link_socket *sock)
Initializes and binds the kernel UDP transport socket for multipeer mode.
void dco_p2p_new_peer(HANDLE handle, OVERLAPPED *ov, struct link_socket *sock, struct signal_info *sig_info)
void setenv_int(struct env_set *es, const char *name, int value)
void setenv_str(struct env_set *es, const char *name, const char *value)
static void event_ctl(struct event_set *es, event_t event, unsigned int rwflags, void *arg)
void set_nonblock(socket_descriptor_t fd)
void set_cloexec(socket_descriptor_t fd)
static void openvpn_fd_set(socket_descriptor_t fd, fd_set *setp)
int get_server_poll_remaining_time(struct event_timeout *server_poll_timeout)
Interface functions to the internal and external multiplexers.
static SERVICE_STATUS status
void management_set_state(struct management *man, const int state, const char *detail, const in_addr_t *tun_local_ip, const struct in6_addr *tun_local_ip6, const struct openvpn_sockaddr *local, const struct openvpn_sockaddr *remote)
void management_sleep(const int n)
A sleep function that services the management layer for n seconds rather than doing nothing.
#define OPENVPN_STATE_RESOLVE
#define OPENVPN_STATE_TCP_CONNECT
const char * hostname_randomize(const char *hostname, struct gc_arena *gc)
void alloc_buf_sock_tun(struct buffer *buf, const struct frame *frame)
void set_mtu_discover_type(socket_descriptor_t sd, int mtu_type, sa_family_t proto_af)
#define OPENVPN_PLUGIN_IPCHANGE
#define OPENVPN_PLUGIN_FUNC_SUCCESS
const char * strerror_win32(DWORD errnum, struct gc_arena *gc)
#define MODE_POINT_TO_POINT
static bool dco_enabled(const struct options *o)
Returns whether the current configuration has dco enabled.
bool plugin_defined(const struct plugin_list *pl, const int type)
static int plugin_call(const struct plugin_list *pl, const int type, const struct argv *av, struct plugin_return *pr, struct env_set *es)
bool establish_http_proxy_passthru(struct http_proxy_info *p, socket_descriptor_t sd, const char *host, const char *port, struct event_timeout *server_poll_timeout, struct buffer *lookahead, struct signal_info *sig_info)
static int openvpn_run_script(const struct argv *a, const struct env_set *es, const unsigned int flags, const char *hook)
Will run a script and return the exit code of the script if between 0 and 255, -1 otherwise.
void throw_signal_soft(const int signum, const char *signal_text)
Throw a soft global signal.
int signal_reset(struct signal_info *si, int signum)
Clear the signal if its current value equals signum.
void throw_signal(const int signum)
Throw a hard signal.
struct signal_info siginfo_static
void register_signal(struct signal_info *si, int signum, const char *signal_text)
Register a soft signal in the signal_info struct si respecting priority.
static void get_signal(volatile int *sig)
Copy the global signal_received (if non-zero) to the passed-in argument sig.
void link_socket_init_phase1(struct context *c, int sock_index, int mode)
static void resolve_bind_local(struct link_socket *sock, const sa_family_t af)
static int socket_get_sndbuf(socket_descriptor_t sd)
static void socket_set_sndbuf(socket_descriptor_t sd, int size)
static socket_descriptor_t socket_listen_accept(socket_descriptor_t sd, struct link_socket_actual *act, const char *remote_dynamic, const struct addrinfo *local, bool do_listen, bool nowait, volatile int *signal_received)
static bool dns_addr_safe(const char *addr)
void link_socket_init_phase2(struct context *c, struct link_socket *sock)
int socket_send_queue(struct link_socket *sock, struct buffer *buf, const struct link_socket_actual *to)
static void ipchange_fmt(const bool include_cmd, struct argv *argv, const struct link_socket_info *info, struct gc_arena *gc)
const char * proto2ascii(int proto, sa_family_t af, bool display_form)
static int socket_get_last_error(const struct link_socket *sock)
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.
ssize_t link_socket_write_tcp(struct link_socket *sock, struct buffer *buf, struct link_socket_actual *to)
void link_socket_update_buffer_sizes(struct link_socket *sock, int rcvbuf, int sndbuf)
static socket_descriptor_t create_socket_udp(struct addrinfo *addrinfo, const unsigned int flags)
static void phase2_tcp_server(struct link_socket *sock, const char *remote_dynamic, struct signal_info *sig_info)
static void create_socket(struct link_socket *sock, struct addrinfo *addr)
const struct in6_addr * link_socket_current_remote_ipv6(const struct link_socket_info *info)
void set_actual_address(struct link_socket_actual *actual, struct addrinfo *ai)
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 socket_set_rcvbuf(socket_descriptor_t sd, int size)
static void stream_buf_set_next(struct stream_buf *sb)
const char * socket_stat(const struct link_socket *s, unsigned int rwflags, struct gc_arena *gc)
void bad_address_length(int actual, int expected)
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_sockaddr_ex(const struct sockaddr *sa, const char *separator, const unsigned int flags, struct gc_arena *gc)
static bool stream_buf_added(struct stream_buf *sb, int length_added)
event_t socket_listen_event_handle(struct link_socket *s)
void sd_close(socket_descriptor_t *sd)
const char * print_in_port_t(in_port_t port, struct gc_arena *gc)
static int get_addr_generic(sa_family_t af, unsigned int flags, const char *hostname, void *network, unsigned int *netbits, int resolve_retry_seconds, struct signal_info *sig_info, int msglevel)
static void linksock_print_addr(struct link_socket *sock)
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)
static void socket_set_mark(socket_descriptor_t sd, int mark)
void setenv_in6_addr(struct env_set *es, const char *name_prefix, const struct in6_addr *addr, const unsigned int flags)
static void stream_buf_close(struct stream_buf *sb)
const char * print_link_socket_actual(const struct link_socket_actual *act, struct gc_arena *gc)
static void stream_buf_get_final(struct stream_buf *sb, struct buffer *buf)
static void socket_connect(socket_descriptor_t *sd, const struct sockaddr *dest, const int connect_timeout, struct signal_info *sig_info)
static void bind_local(struct link_socket *sock, const sa_family_t ai_family)
bool stream_buf_read_setup_dowork(struct link_socket *sock)
static void phase2_socks_client(struct link_socket *sock, struct signal_info *sig_info)
static bool socket_set_tcp_nodelay(socket_descriptor_t sd, int state)
socket_descriptor_t socket_do_accept(socket_descriptor_t sd, struct link_socket_actual *act, const bool nowait)
static void socket_do_listen(socket_descriptor_t sd, const struct addrinfo *local, bool do_listen, bool do_set_nonblock)
void setenv_sockaddr(struct env_set *es, const char *name_prefix, const struct openvpn_sockaddr *addr, const unsigned int flags)
int socket_recv_queue(struct link_socket *sock, int maxsize)
void link_socket_close(struct link_socket *sock)
void link_socket_connection_initiated(struct link_socket_info *info, const struct link_socket_actual *act, const char *common_name, struct env_set *es)
const char * print_link_socket_actual_ex(const struct link_socket_actual *act, const char *separator, const unsigned int flags, struct gc_arena *gc)
void socket_set_buffers(socket_descriptor_t fd, const struct socket_buffer_size *sbs, bool reduce_size)
Sets the receive and send buffer sizes of a socket descriptor.
struct in6_addr add_in6_addr(struct in6_addr base, uint32_t add)
static bool streqnull(const char *a, const char *b)
static void phase2_set_socket_flags(struct link_socket *sock)
static void resolve_remote(struct link_socket *sock, int phase, const char **remote_dynamic, struct signal_info *sig_info)
sa_family_t ascii2af(const char *proto_name)
static int do_preresolve_host(struct context *c, const char *hostname, const char *servname, const int af, const int flags)
void link_socket_bad_outgoing_addr(void)
int sockethandle_finalize(sockethandle_t sh, struct overlapped_io *io, struct buffer *buf, struct link_socket_actual *from)
in_addr_t link_socket_current_remote(const struct link_socket_info *info)
int openvpn_inet_aton(const char *dotted_quad, struct in_addr *addr)
static int socket_get_rcvbuf(socket_descriptor_t sd)
int link_socket_read_tcp(struct link_socket *sock, struct buffer *buf)
int openvpn_connect(socket_descriptor_t sd, const struct sockaddr *remote, int connect_timeout, volatile int *signal_received)
unsigned int socket_set(struct link_socket *s, struct event_set *es, unsigned int rwflags, void *arg, unsigned int *persistent)
const char * proto_remote(int proto, bool remote)
static unsigned int sf2gaf(const unsigned int getaddr_flags, const unsigned int sockflags)
static int get_cached_dns_entry(struct cached_dns_entry *dns_cache, const char *hostname, const char *servname, int ai_family, int resolve_flags, struct addrinfo **ai)
bool ipv6_addr_safe(const char *ipv6_text_addr)
const char * print_in6_addr(struct in6_addr a6, unsigned int flags, struct gc_arena *gc)
void do_preresolve(struct context *c)
bool ip_or_dns_addr_safe(const char *addr, const bool allow_fqdn)
void link_socket_bad_incoming_addr(struct buffer *buf, const struct link_socket_info *info, const struct link_socket_actual *from_addr)
static void phase2_tcp_client(struct link_socket *sock, struct signal_info *sig_info)
void socket_bind(socket_descriptor_t sd, struct addrinfo *local, int ai_family, const char *prefix, bool ipv6only)
int ascii2proto(const char *proto_name)
socket_descriptor_t create_socket_tcp(struct addrinfo *addrinfo)
static void socket_frame_init(const struct frame *frame, struct link_socket *sock)
const char * print_in_addr_t(in_addr_t addr, unsigned int flags, struct gc_arena *gc)
static void stream_buf_reset(struct stream_buf *sb)
static void stream_buf_get_next(struct stream_buf *sb, struct buffer *buf)
static void create_socket_dco_win(struct context *c, struct link_socket *sock, struct signal_info *sig_info)
static void tcp_connection_established(const struct link_socket_actual *act)
static bool socket_set_flags(socket_descriptor_t sd, unsigned int sockflags)
struct link_socket * link_socket_new(void)
static const char * getaddrinfo_addr_family_name(int af)
Small helper function for openvpn_getaddrinfo to print the address family when resolving fails.
static int read_sockaddr_from_packet(struct buffer *buf, struct sockaddr *dst)
Extracts a sockaddr from a packet payload.
bool sockets_read_residual(const struct context *c)
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.
void setenv_trusted(struct env_set *es, const struct link_socket_info *info)
const char * addr_family_name(int af)
void read_sockaddr_from_overlapped(struct overlapped_io *io, struct sockaddr *dst, int overlapped_ret)
bool link_socket_update_flags(struct link_socket *sock, unsigned int sockflags)
bool ip_addr_dotted_quad_safe(const char *dotted_quad)
static void stream_buf_init(struct stream_buf *sb, struct buffer *buf, const unsigned int sockflags, const int proto)
#define IA_EMPTY_IF_UNDEF
static event_t socket_event_handle(const struct link_socket *sock)
#define IPV4_INVALID_ADDR
static const char * print_sockaddr(const struct sockaddr *addr, struct gc_arena *gc)
static BOOL SocketHandleGetOverlappedResult(sockethandle_t sh, struct overlapped_io *io)
#define GETADDR_CACHE_MASK
static bool link_socket_actual_defined(const struct link_socket_actual *act)
#define LS_MODE_TCP_ACCEPT_FROM
#define GETADDR_MSG_VIRT_OUT
static bool proto_is_udp(int proto)
Returns if the protocol being used is UDP.
#define GETADDR_UPDATE_MANAGEMENT_STATE
static bool link_socket_connection_oriented(const struct link_socket *sock)
static bool addr_local(const struct sockaddr *addr)
static bool stream_buf_read_setup(struct link_socket *sock)
#define PS_DONT_SHOW_ADDR
#define GETADDR_HOST_ORDER
static void SocketHandleSetLastError(sockethandle_t sh, DWORD err)
static int SocketHandleGetLastError(sockethandle_t sh)
static void SocketHandleSetInvalError(sockethandle_t sh)
#define PS_SHOW_PORT_IF_DEFINED
#define GETADDR_RANDOMIZE
#define RESOLV_RETRY_INFINITE
static bool proto_is_tcp(int proto)
returns if the proto is a TCP variant (tcp-server, tcp-client or tcp)
#define GETADDR_FATAL_ON_SIGNAL
static void addr_zero_host(struct openvpn_sockaddr *addr)
static bool addr_defined_ipi(const struct link_socket_actual *lsa)
#define SF_USE_IP_PKTINFO
static bool proto_is_dgram(int proto)
Return if the protocol is datagram (UDP)
uint16_t packet_size_type
static bool socket_is_dco_win(const struct link_socket *s)
Returns true if we are on Windows and this link is running on DCO-WIN.
static int af_addr_size(sa_family_t af)
#define SF_HOST_RANDOMIZE
#define SF_GETADDRINFO_DGRAM
#define LS_MODE_TCP_LISTEN
#define PS_DONT_SHOW_FAMILY
static int link_socket_write_win32(struct link_socket *sock, struct buffer *buf, struct link_socket_actual *to)
#define SA_SET_IF_NONZERO
#define openvpn_close_socket(s)
#define GETADDR_MENTION_RESOLVE_RETRY
#define GETADDR_WARN_ON_SIGNAL
static bool addrlist_match(const struct openvpn_sockaddr *a1, const struct addrinfo *addrlist)
void establish_socks_proxy_passthru(struct socks_proxy_info *p, socket_descriptor_t sd, const char *host, const char *servname, struct event_timeout *server_poll_timeout, struct signal_info *sig_info)
void establish_socks_proxy_udpassoc(struct socks_proxy_info *p, socket_descriptor_t ctrl_sd, struct openvpn_sockaddr *relay_addr, struct event_timeout *server_poll_timeout, struct signal_info *sig_info)
Wrapper structure for dynamically allocated memory.
int len
Length in bytes of the actual content within the allocated memory.
int offset
Offset in bytes of the actual content within the allocated memory.
struct cached_dns_entry * next
struct local_list * local_list
const char * socks_proxy_port
struct http_proxy_options * http_proxy_options
const char * socks_proxy_server
struct connection_entry ** array
struct link_socket_addr * link_socket_addrs
Local and remote addresses on the external network.
struct http_proxy_info * http_proxy
struct socks_proxy_info * socks_proxy
struct cached_dns_entry * dns_cache
struct tuntap * tuntap
Tun/tap virtual network interface.
struct event_timeout server_poll_interval
const struct link_socket * accept_from
struct link_socket ** link_sockets
Contains all state information for one tunnel.
int mode
Role of this context within the OpenVPN process.
struct signal_info * sig
Internal error signaling object.
struct plugin_list * plugins
List of plug-ins.
struct context_2 c2
Level 2 context.
struct options options
Options loaded from command line or configuration file.
struct gc_arena gc
Garbage collection arena for allocations done in the scope of this context structure.
struct context_1 c1
Level 1 context.
struct link_socket * sock
Packet geometry parameters.
Garbage collection arena used to keep track of dynamically allocated memory.
struct http_proxy_options options
struct openvpn_sockaddr dest
struct link_socket_actual actual
struct addrinfo * remote_list
struct addrinfo * bind_local
struct addrinfo * current_remote
bool connection_established
struct link_socket_addr * lsa
const char * ipchange_command
const struct plugin_list * plugins
struct event_timeout * server_poll_timeout
unsigned int rwflags_debug
struct socket_buffer_size socket_buffer_sizes
struct link_socket_actual socks_relay
struct rw_handle listen_handle
struct link_socket_info info
const char * proxy_dest_port
struct rw_handle rw_handle
struct overlapped_io writes
socket_descriptor_t ctrl_sd
struct stream_buf stream_buf
struct socks_proxy_info * socks_proxy
int resolve_retry_seconds
const char * proxy_dest_host
struct http_proxy_info * http_proxy
struct cached_dns_entry * dns_cache
struct buffer stream_buf_data
struct event_arg ev_arg
this struct will store a pointer to either mi or link_socket, depending on the event type,...
struct overlapped_io reads
struct local_entry * array[CONNECTION_LIST_SIZE]
struct man_connection connection
union openvpn_sockaddr::@25 addr
int resolve_retry_seconds
const char * ip_remote_hint
struct connection_entry ce
struct sockaddr_in6 addr6
const char * display_form
volatile int signal_received
bool residual_fully_formed
enum tun_driver_type backend_driver
The backend driver that used for this tun/tap device.
OVERLAPPED dco_new_peer_ov
struct tuntap_options options
unsigned short sa_family_t
SOCKET socket_descriptor_t
static int socket_defined(const socket_descriptor_t sd)
#define ENABLE_IP_PKTINFO
void tun_open_device(struct tuntap *tt, const char *dev_node, const char **device_guid, struct gc_arena *gc)
void init_net_event_win32(struct rw_handle *event, long network_events, socket_descriptor_t sd, unsigned int flags)
void overlapped_io_init(struct overlapped_io *o, const struct frame *frame, BOOL event_state)
void close_net_event_win32(struct rw_handle *event, socket_descriptor_t sd, unsigned int flags)
char * overlapped_io_state_ascii(const struct overlapped_io *o)
void overlapped_io_close(struct overlapped_io *o)
static bool defined_net_event_win32(const struct rw_handle *event)
#define IOSTATE_IMMEDIATE_RETURN