2
* OpenVPN -- An application to securely tunnel IP networks
3
* over a single TCP/UDP port, with support for SSL/TLS-based
4
* session authentication and key exchange,
5
* packet encryption, packet authentication, and
8
* Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales@openvpn.net>
10
* This program is free software; you can redistribute it and/or modify
11
* it under the terms of the GNU General Public License version 2
12
* as published by the Free Software Foundation.
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
19
* You should have received a copy of the GNU General Public License
20
* along with this program (see the file COPYING included with this
21
* distribution); if not, write to the Free Software Foundation, Inc.,
22
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
40
* OpenVPN's default port number as assigned by IANA.
42
#define OPENVPN_PORT 1194
45
* Maximum size passed passed to setsockopt SNDBUF/RCVBUF
47
#define SOCKET_SND_RCV_BUF_MAX 1000000
50
* Number of seconds that "resolv-retry infinite"
53
#define RESOLV_RETRY_INFINITE 1000000000
56
* packet_size_type is used to communicate packet size
57
* over the wire when stream oriented protocols are
61
typedef uint16_t packet_size_type;
63
/* convert a packet_size_type from host to network order */
64
#define htonps(x) htons(x)
66
/* convert a packet_size_type from network to host order */
67
#define ntohps(x) ntohs(x)
69
/* OpenVPN sockaddr struct */
70
struct openvpn_sockaddr
72
/*int dummy;*/ /* add offset to force a bug if sa not explicitly dereferenced */
75
struct sockaddr_in in4;
77
struct sockaddr_in6 in6;
82
/* actual address of remote, based on source address of received packets */
83
struct link_socket_actual
85
/*int dummy;*/ /* add offset to force a bug if dest not explicitly dereferenced */
86
struct openvpn_sockaddr dest;
89
#ifdef HAVE_IN_PKTINFO
90
struct in_pktinfo in4;
96
struct in6_pktinfo in6;
102
/* IP addresses which are persistant across SIGUSR1s */
103
struct link_socket_addr
105
struct openvpn_sockaddr local;
106
struct openvpn_sockaddr remote; /* initial remote */
107
struct link_socket_actual actual; /* reply to this address */
110
struct link_socket_info
112
struct link_socket_addr *lsa;
113
bool connection_established;
114
const char *ipchange_command;
115
const struct plugin_list *plugins;
117
int proto; /* Protocol (PROTO_x defined below) */
118
int mtu_changed; /* Set to true when mtu value is changed */
122
* Used to extract packets encapsulated in streams into a buffer,
123
* in this case IP packets embedded in a TCP stream.
127
struct buffer buf_init;
128
struct buffer residual;
130
bool residual_fully_formed;
134
int len; /* -1 if not yet known */
136
bool error; /* if true, fatal TCP error has occurred,
137
requiring that connection be restarted */
139
# define PS_DISABLED 0
140
# define PS_ENABLED 1
141
# define PS_FOREIGN 2
142
int port_share_state;
147
* Used to set socket buffer sizes
149
struct socket_buffer_size
156
* This is the main socket structure used by OpenVPN. The SOCKET_
157
* defines try to abstract away our implementation differences between
158
* using sockets on Posix vs. Win32.
162
struct link_socket_info info;
164
socket_descriptor_t sd;
167
socket_descriptor_t ctrl_sd; /* only used for UDP over Socks */
171
struct overlapped_io reads;
172
struct overlapped_io writes;
173
struct rw_handle rw_handle;
174
struct rw_handle listen_handle; /* For listening on TCP socket in server mode */
177
/* used for printing status info only */
178
unsigned int rwflags_debug;
180
/* used for long-term queueing of pre-accepted socket listen */
181
bool listen_persistent_queued;
183
/* Does config file contain any <connection> ... </connection> blocks? */
184
bool connection_profiles_defined;
186
const char *remote_host;
188
const char *local_host;
192
# define INETD_NONE 0
193
# define INETD_WAIT 1
194
# define INETD_NOWAIT 2
197
# define LS_MODE_DEFAULT 0
198
# define LS_MODE_TCP_LISTEN 1
199
# define LS_MODE_TCP_ACCEPT_FROM 2
202
int resolve_retry_seconds;
203
int connect_retry_seconds;
205
int connect_retry_max;
206
int mtu_discover_type;
208
struct socket_buffer_size socket_buffer_sizes;
210
int mtu; /* OS discovered MTU, or 0 if unknown */
212
bool did_resolve_remote;
214
# define SF_USE_IP_PKTINFO (1<<0)
215
# define SF_TCP_NODELAY (1<<1)
216
# define SF_PORT_SHARE (1<<2)
217
# define SF_HOST_RANDOMIZE (1<<3)
218
# define SF_GETADDRINFO_DGRAM (1<<4)
219
unsigned int sockflags;
221
/* for stream sockets */
222
struct stream_buf stream_buf;
223
struct buffer stream_buf_data;
226
#ifdef ENABLE_HTTP_PROXY
228
struct http_proxy_info *http_proxy;
233
struct socks_proxy_info *socks_proxy;
234
struct link_socket_actual socks_relay; /* Socks UDP relay address */
237
#if defined(ENABLE_HTTP_PROXY) || defined(ENABLE_SOCKS)
238
/* The OpenVPN server we will use the proxy to connect to */
239
const char *proxy_dest_host;
243
#if PASSTOS_CAPABILITY
244
/* used to get/set TOS. */
250
int gremlin; /* --gremlin bits */
255
* Some Posix/Win32 differences.
259
#define MSG_NOSIGNAL 0
264
#define openvpn_close_socket(s) closesocket(s)
266
int socket_recv_queue (struct link_socket *sock, int maxsize);
268
int socket_send_queue (struct link_socket *sock,
270
const struct link_socket_actual *to);
272
int socket_finalize (
274
struct overlapped_io *io,
276
struct link_socket_actual *from);
280
#define openvpn_close_socket(s) close(s)
284
struct link_socket *link_socket_new (void);
286
void socket_bind (socket_descriptor_t sd,
287
struct openvpn_sockaddr *local,
290
int openvpn_connect (socket_descriptor_t sd,
291
struct openvpn_sockaddr *remote,
293
volatile int *signal_received);
296
* Initialize link_socket object.
300
link_socket_init_phase1 (struct link_socket *sock,
301
const bool connection_profiles_defined,
302
const char *local_host,
304
const char *remote_host,
308
const struct link_socket *accept_from,
309
#ifdef ENABLE_HTTP_PROXY
310
struct http_proxy_info *http_proxy,
313
struct socks_proxy_info *socks_proxy,
321
struct link_socket_addr *lsa,
322
const char *ipchange_command,
323
const struct plugin_list *plugins,
324
int resolve_retry_seconds,
325
int connect_retry_seconds,
327
int connect_retry_max,
328
int mtu_discover_type,
331
unsigned int sockflags);
333
void link_socket_init_phase2 (struct link_socket *sock,
334
const struct frame *frame,
335
volatile int *signal_received);
337
void socket_adjust_frame_parameters (struct frame *frame, int proto);
339
void frame_adjust_path_mtu (struct frame *frame, int pmtu, int proto);
341
void link_socket_close (struct link_socket *sock);
343
void sd_close (socket_descriptor_t *sd);
345
#define PS_SHOW_PORT_IF_DEFINED (1<<0)
346
#define PS_SHOW_PORT (1<<1)
347
#define PS_SHOW_PKTINFO (1<<2)
348
#define PS_DONT_SHOW_ADDR (1<<3)
350
const char *print_sockaddr_ex (const struct openvpn_sockaddr *addr,
351
const char* separator,
352
const unsigned int flags,
353
struct gc_arena *gc);
356
const char *print_sockaddr (const struct openvpn_sockaddr *addr,
357
struct gc_arena *gc);
359
const char *print_link_socket_actual_ex (const struct link_socket_actual *act,
360
const char* separator,
361
const unsigned int flags,
362
struct gc_arena *gc);
364
const char *print_link_socket_actual (const struct link_socket_actual *act,
365
struct gc_arena *gc);
368
#define IA_EMPTY_IF_UNDEF (1<<0)
369
#define IA_NET_ORDER (1<<1)
370
const char *print_in_addr_t (in_addr_t addr, unsigned int flags, struct gc_arena *gc);
371
const char *print_in6_addr (struct in6_addr addr6, unsigned int flags, struct gc_arena *gc);
372
struct in6_addr add_in6_addr( struct in6_addr base, uint32_t add );
374
#define SA_IP_PORT (1<<0)
375
#define SA_SET_IF_NONZERO (1<<1)
376
void setenv_sockaddr (struct env_set *es,
377
const char *name_prefix,
378
const struct openvpn_sockaddr *addr,
381
void setenv_in_addr_t (struct env_set *es,
382
const char *name_prefix,
386
void setenv_link_socket_actual (struct env_set *es,
387
const char *name_prefix,
388
const struct link_socket_actual *act,
391
void bad_address_length (int actual, int expected);
394
/* IPV4_INVALID_ADDR: returned by link_socket_current_remote()
395
* to ease redirect-gateway logic for ipv4 tunnels on ipv6 endpoints
397
#define IPV4_INVALID_ADDR 0xffffffff
399
in_addr_t link_socket_current_remote (const struct link_socket_info *info);
401
void link_socket_connection_initiated (const struct buffer *buf,
402
struct link_socket_info *info,
403
const struct link_socket_actual *addr,
404
const char *common_name,
407
void link_socket_bad_incoming_addr (struct buffer *buf,
408
const struct link_socket_info *info,
409
const struct link_socket_actual *from_addr);
411
void link_socket_bad_outgoing_addr (void);
413
void setenv_trusted (struct env_set *es, const struct link_socket_info *info);
415
bool link_socket_update_flags (struct link_socket *ls, unsigned int sockflags);
416
void link_socket_update_buffer_sizes (struct link_socket *ls, int rcvbuf, int sndbuf);
419
* Low-level functions
422
/* return values of openvpn_inet_aton */
423
#define OIA_HOSTNAME 0
426
int openvpn_inet_aton (const char *dotted_quad, struct in_addr *addr);
428
/* integrity validation on pulled options */
429
bool ip_addr_dotted_quad_safe (const char *dotted_quad);
430
bool ip_or_dns_addr_safe (const char *addr, const bool allow_fqdn);
431
bool mac_addr_safe (const char *mac_addr);
432
bool ipv6_addr_safe (const char *ipv6_text_addr);
434
socket_descriptor_t create_socket_tcp (void);
436
socket_descriptor_t socket_do_accept (socket_descriptor_t sd,
437
struct link_socket_actual *act,
442
bool proto_is_net(int proto);
443
bool proto_is_dgram(int proto);
444
bool proto_is_udp(int proto);
445
bool proto_is_tcp(int proto);
448
#if UNIX_SOCK_SUPPORT
450
socket_descriptor_t create_socket_unix (void);
452
void socket_bind_unix (socket_descriptor_t sd,
453
struct sockaddr_un *local,
456
socket_descriptor_t socket_accept_unix (socket_descriptor_t sd,
457
struct sockaddr_un *remote);
459
int socket_connect_unix (socket_descriptor_t sd,
460
struct sockaddr_un *remote);
462
void sockaddr_unix_init (struct sockaddr_un *local, const char *path);
464
const char *sockaddr_unix_name (const struct sockaddr_un *local, const char *null);
466
void socket_delete_unix (const struct sockaddr_un *local);
468
bool unix_socket_get_peer_uid_gid (const socket_descriptor_t sd, int *uid, int *gid);
476
struct resolve_list {
481
#define GETADDR_RESOLVE (1<<0)
482
#define GETADDR_FATAL (1<<1)
483
#define GETADDR_HOST_ORDER (1<<2)
484
#define GETADDR_MENTION_RESOLVE_RETRY (1<<3)
485
#define GETADDR_FATAL_ON_SIGNAL (1<<4)
486
#define GETADDR_WARN_ON_SIGNAL (1<<5)
487
#define GETADDR_MSG_VIRT_OUT (1<<6)
488
#define GETADDR_TRY_ONCE (1<<7)
489
#define GETADDR_UPDATE_MANAGEMENT_STATE (1<<8)
490
#define GETADDR_RANDOMIZE (1<<9)
492
/* [ab]use flags bits to get socktype info downstream */
493
/* TODO(jjo): resolve tradeoff between hackiness|args-overhead */
494
#define GETADDR_DGRAM (1<<10)
495
#define dnsflags_to_socktype(flags) ((flags & GETADDR_DGRAM) ? SOCK_DGRAM : SOCK_STREAM)
497
in_addr_t getaddr (unsigned int flags,
498
const char *hostname,
499
int resolve_retry_seconds,
501
volatile int *signal_received);
503
in_addr_t getaddr_multi (unsigned int flags,
504
const char *hostname,
505
int resolve_retry_seconds,
507
volatile int *signal_received,
508
struct resolve_list *reslist);
511
* Transport protocol naming and other details.
515
* Use enum's instead of #define to allow for easier
516
* optional proto support
519
PROTO_NONE, /* catch for uninitialized */
533
int ascii2proto (const char* proto_name);
534
const char *proto2ascii (int proto, bool display_form);
535
const char *proto2ascii_all (struct gc_arena *gc);
536
int proto_remote (int proto, bool remote);
537
const char *addr_family_name(int af);
540
* Overhead added to packets by various protocols.
542
#define IPv4_UDP_HEADER_SIZE 28
543
#define IPv4_TCP_HEADER_SIZE 40
544
#define IPv6_UDP_HEADER_SIZE 48
545
#define IPv6_TCP_HEADER_SIZE 60
547
extern const int proto_overhead[];
550
datagram_overhead (int proto)
552
ASSERT (proto >= 0 && proto < PROTO_N);
553
return proto_overhead [proto];
557
* Misc inline functions
561
legal_ipv4_port (int port)
563
return port > 0 && port < 65536;
567
is_proto_tcp(const int p)
569
return p > 0; /* depends on the definition of PROTO_x */
573
link_socket_proto_connection_oriented (int proto)
575
return !proto_is_dgram(proto);
579
link_socket_connection_oriented (const struct link_socket *sock)
582
return link_socket_proto_connection_oriented (sock->info.proto);
588
addr_defined (const struct openvpn_sockaddr *addr)
591
switch (addr->addr.sa.sa_family) {
592
case AF_INET: return addr->addr.in4.sin_addr.s_addr != 0;
594
case AF_INET6: return !IN6_IS_ADDR_UNSPECIFIED(&addr->addr.in6.sin6_addr);
600
addr_defined_ipi (const struct link_socket_actual *lsa)
602
#if ENABLE_IP_PKTINFO
604
switch (lsa->dest.addr.sa.sa_family) {
605
#ifdef HAVE_IN_PKTINFO
606
case AF_INET: return lsa->pi.in4.ipi_spec_dst.s_addr != 0;
608
#ifdef IP_RECVDSTADDR
609
case AF_INET: return lsa->pi.in4.s_addr != 0;
612
case AF_INET6: return !IN6_IS_ADDR_UNSPECIFIED(&lsa->pi.in6.ipi6_addr);
623
link_socket_actual_defined (const struct link_socket_actual *act)
625
return act && addr_defined (&act->dest);
629
addr_match (const struct openvpn_sockaddr *a1, const struct openvpn_sockaddr *a2)
631
switch(a1->addr.sa.sa_family) {
633
return a1->addr.in4.sin_addr.s_addr == a2->addr.in4.sin_addr.s_addr;
636
return IN6_ARE_ADDR_EQUAL(&a1->addr.in6.sin6_addr, &a2->addr.in6.sin6_addr);
643
static inline in_addr_t
644
addr_host (const struct openvpn_sockaddr *addr)
647
* "public" addr returned is checked against ifconfig for
648
* possible clash: non sense for now given
649
* that we do ifconfig only IPv4
651
#if defined(USE_PF_INET6)
652
if(addr->addr.sa.sa_family != AF_INET)
655
ASSERT(addr->addr.sa.sa_family == AF_INET);
657
return ntohl (addr->addr.in4.sin_addr.s_addr);
661
addr_port_match (const struct openvpn_sockaddr *a1, const struct openvpn_sockaddr *a2)
663
switch(a1->addr.sa.sa_family) {
665
return a1->addr.in4.sin_addr.s_addr == a2->addr.in4.sin_addr.s_addr
666
&& a1->addr.in4.sin_port == a2->addr.in4.sin_port;
669
return IN6_ARE_ADDR_EQUAL(&a1->addr.in6.sin6_addr, &a2->addr.in6.sin6_addr)
670
&& a1->addr.in6.sin6_port == a2->addr.in6.sin6_port;
678
addr_match_proto (const struct openvpn_sockaddr *a1,
679
const struct openvpn_sockaddr *a2,
682
return link_socket_proto_connection_oriented (proto)
683
? addr_match (a1, a2)
684
: addr_port_match (a1, a2);
688
addr_zero_host(struct openvpn_sockaddr *addr)
690
switch(addr->addr.sa.sa_family) {
692
addr->addr.in4.sin_addr.s_addr = 0;
696
memset(&addr->addr.in6.sin6_addr, 0, sizeof (struct in6_addr));
703
addr_copy_sa(struct openvpn_sockaddr *dst, const struct openvpn_sockaddr *src)
705
dst->addr = src->addr;
709
addr_copy_host(struct openvpn_sockaddr *dst, const struct openvpn_sockaddr *src)
711
switch(src->addr.sa.sa_family) {
713
dst->addr.in4.sin_addr.s_addr = src->addr.in4.sin_addr.s_addr;
717
dst->addr.in6.sin6_addr = src->addr.in6.sin6_addr;
724
addr_inet4or6(struct sockaddr *addr)
726
return addr->sa_family == AF_INET || addr->sa_family == AF_INET6;
729
int addr_guess_family(int proto, const char *name);
731
af_addr_size(unsigned short af)
733
#if defined(USE_PF_INET6) || defined (USE_PF_UNIX)
735
case AF_INET: return sizeof (struct sockaddr_in);
737
case AF_UNIX: return sizeof (struct sockaddr_un);
740
case AF_INET6: return sizeof (struct sockaddr_in6);
744
/* could be called from socket_do_accept() with empty addr */
745
msg (M_ERR, "Bad address family: %d\n", af);
750
#else /* only AF_INET */
751
return sizeof(struct sockaddr_in);
756
link_socket_actual_match (const struct link_socket_actual *a1, const struct link_socket_actual *a2)
758
return addr_port_match (&a1->dest, &a2->dest);
764
socket_foreign_protocol_detected (const struct link_socket *sock)
766
return link_socket_connection_oriented (sock)
767
&& sock->stream_buf.port_share_state == PS_FOREIGN;
770
static inline const struct buffer *
771
socket_foreign_protocol_head (const struct link_socket *sock)
773
return &sock->stream_buf.buf;
777
socket_foreign_protocol_sd (const struct link_socket *sock)
785
socket_connection_reset (const struct link_socket *sock, int status)
787
if (link_socket_connection_oriented (sock))
789
if (sock->stream_reset || sock->stream_buf.error)
793
const int err = openvpn_errno_socket ();
795
return err == WSAECONNRESET || err == WSAECONNABORTED;
797
return err == ECONNRESET;
805
link_socket_verify_incoming_addr (struct buffer *buf,
806
const struct link_socket_info *info,
807
const struct link_socket_actual *from_addr)
811
switch (from_addr->dest.addr.sa.sa_family) {
816
if (!link_socket_actual_defined (from_addr))
818
if (info->remote_float || !addr_defined (&info->lsa->remote))
820
if (addr_match_proto (&from_addr->dest, &info->lsa->remote, info->proto))
828
link_socket_get_outgoing_addr (struct buffer *buf,
829
const struct link_socket_info *info,
830
struct link_socket_actual **act)
834
struct link_socket_addr *lsa = info->lsa;
835
if (link_socket_actual_defined (&lsa->actual))
839
link_socket_bad_outgoing_addr ();
847
link_socket_set_outgoing_addr (const struct buffer *buf,
848
struct link_socket_info *info,
849
const struct link_socket_actual *act,
850
const char *common_name,
853
if (!buf || buf->len > 0)
855
struct link_socket_addr *lsa = info->lsa;
857
/* new or changed address? */
858
(!info->connection_established
859
|| !addr_match_proto (&act->dest, &lsa->actual.dest, info->proto))
860
/* address undef or address == remote or --float */
861
&& (info->remote_float
862
|| !addr_defined (&lsa->remote)
863
|| addr_match_proto (&act->dest, &lsa->remote, info->proto))
866
link_socket_connection_initiated (buf, info, act, common_name, es);
872
* Stream buffer handling -- stream_buf is a helper class
873
* to assist in the packetization of stream transport protocols
877
void stream_buf_init (struct stream_buf *sb,
879
const unsigned int sockflags,
882
void stream_buf_close (struct stream_buf* sb);
883
bool stream_buf_added (struct stream_buf *sb, int length_added);
886
stream_buf_read_setup (struct link_socket* sock)
888
bool stream_buf_read_setup_dowork (struct link_socket* sock);
889
if (link_socket_connection_oriented (sock))
890
return stream_buf_read_setup_dowork (sock);
896
* Socket Read Routines
899
int link_socket_read_tcp (struct link_socket *sock,
905
link_socket_read_udp_win32 (struct link_socket *sock,
907
struct link_socket_actual *from)
909
return socket_finalize (sock->sd, &sock->reads, buf, from);
914
int link_socket_read_udp_posix (struct link_socket *sock,
917
struct link_socket_actual *from);
921
/* read a TCP or UDP packet from link */
923
link_socket_read (struct link_socket *sock,
926
struct link_socket_actual *from)
928
if (proto_is_udp(sock->info.proto)) /* unified UDPv4 and UDPv6 */
933
res = link_socket_read_udp_win32 (sock, buf, from);
935
res = link_socket_read_udp_posix (sock, buf, maxsize, from);
939
else if (proto_is_tcp(sock->info.proto)) /* unified TCPv4 and TCPv6 */
941
/* from address was returned by accept */
942
addr_copy_sa(&from->dest, &sock->info.lsa->actual.dest);
943
return link_socket_read_tcp (sock, buf);
948
return -1; /* NOTREACHED */
953
* Socket Write routines
956
int link_socket_write_tcp (struct link_socket *sock,
958
struct link_socket_actual *to);
963
link_socket_write_win32 (struct link_socket *sock,
965
struct link_socket_actual *to)
969
if (overlapped_io_active (&sock->writes))
971
status = socket_finalize (sock->sd, &sock->writes, NULL, NULL);
973
err = WSAGetLastError ();
975
socket_send_queue (sock, buf, to);
978
WSASetLastError (err);
988
link_socket_write_udp_posix (struct link_socket *sock,
990
struct link_socket_actual *to)
992
#if ENABLE_IP_PKTINFO
993
int link_socket_write_udp_posix_sendmsg (struct link_socket *sock,
995
struct link_socket_actual *to);
997
if (proto_is_udp(sock->info.proto) && (sock->sockflags & SF_USE_IP_PKTINFO)
998
&& addr_defined_ipi(to))
999
return link_socket_write_udp_posix_sendmsg (sock, buf, to);
1002
return sendto (sock->sd, BPTR (buf), BLEN (buf), 0,
1003
(struct sockaddr *) &to->dest.addr.sa,
1004
(socklen_t) af_addr_size(to->dest.addr.sa.sa_family));
1008
link_socket_write_tcp_posix (struct link_socket *sock,
1010
struct link_socket_actual *to)
1012
return send (sock->sd, BPTR (buf), BLEN (buf), MSG_NOSIGNAL);
1018
link_socket_write_udp (struct link_socket *sock,
1020
struct link_socket_actual *to)
1023
return link_socket_write_win32 (sock, buf, to);
1025
return link_socket_write_udp_posix (sock, buf, to);
1029
/* write a TCP or UDP packet to link */
1031
link_socket_write (struct link_socket *sock,
1033
struct link_socket_actual *to)
1035
if (proto_is_udp(sock->info.proto)) /* unified UDPv4 and UDPv6 */
1037
return link_socket_write_udp (sock, buf, to);
1039
else if (proto_is_tcp(sock->info.proto)) /* unified TCPv4 and TCPv6 */
1041
return link_socket_write_tcp (sock, buf, to);
1046
return -1; /* NOTREACHED */
1050
#if PASSTOS_CAPABILITY
1053
* Extract TOS bits. Assumes that ipbuf is a valid IPv4 packet.
1056
link_socket_extract_tos (struct link_socket *ls, const struct buffer *ipbuf)
1060
struct openvpn_iphdr *iph = (struct openvpn_iphdr *) BPTR (ipbuf);
1061
ls->ptos = iph->tos;
1062
ls->ptos_defined = true;
1067
* Set socket properties to reflect TOS bits which were extracted
1068
* from tunnel packet.
1071
link_socket_set_tos (struct link_socket *ls)
1073
if (ls && ls->ptos_defined)
1074
setsockopt (ls->sd, IPPROTO_IP, IP_TOS, &ls->ptos, sizeof (ls->ptos));
1080
* Socket I/O wait functions
1084
socket_read_residual (const struct link_socket *s)
1086
return s && s->stream_buf.residual_fully_formed;
1089
static inline event_t
1090
socket_event_handle (const struct link_socket *s)
1093
return &s->rw_handle;
1099
event_t socket_listen_event_handle (struct link_socket *s);
1102
socket_set (struct link_socket *s,
1103
struct event_set *es,
1104
unsigned int rwflags,
1106
unsigned int *persistent);
1109
socket_set_listen_persistent (struct link_socket *s,
1110
struct event_set *es,
1113
if (s && !s->listen_persistent_queued)
1115
event_ctl (es, socket_listen_event_handle (s), EVENT_READ, arg);
1116
s->listen_persistent_queued = true;
1121
socket_reset_listen_persistent (struct link_socket *s)
1124
reset_net_event_win32 (&s->listen_handle, s->sd);
1128
const char *socket_stat (const struct link_socket *s, unsigned int rwflags, struct gc_arena *gc);
1130
#endif /* SOCKET_H */