119
* Used to set socket buffer sizes
121
struct socket_buffer_size
79
128
* This is the main socket structure used by OpenVPN. The SOCKET_
80
129
* defines try to abstract away our implementation differences between
81
130
* using sockets on Posix vs. Win32.
83
132
struct link_socket
85
/* if true, indicates a stream protocol returned more than one encapsulated packet */
86
# define SOCKET_READ_RESIDUAL(sock) (sock.stream_buf.residual_fully_formed)
134
struct link_socket_info info;
136
socket_descriptor_t sd;
139
socket_descriptor_t ctrl_sd; /* only used for UDP over Socks */
89
/* these macros are called in the context of the openvpn() function */
90
# define SOCKET_SET_READ(sock) { if (stream_buf_read_setup (&sock)) { \
91
wait_add (&event_wait, sock.reads.overlapped.hEvent); \
92
socket_recv_queue (&sock, 0); }}
93
# define SOCKET_SET_WRITE(sock) { wait_add (&event_wait, sock.writes.overlapped.hEvent); }
94
# define SOCKET_ISSET(sock, set) ( wait_trigger (&event_wait, sock.set.overlapped.hEvent))
95
# define SOCKET_SETMAXFD(sock)
96
# define SOCKET_READ_STAT(sock) (overlapped_io_state_ascii (&sock.reads, "sr"))
97
# define SOCKET_WRITE_STAT(sock) (overlapped_io_state_ascii (&sock.writes, "sw"))
98
143
struct overlapped_io reads;
99
144
struct overlapped_io writes;
101
/* these macros are called in the context of the openvpn() function */
102
# define SOCKET_SET_READ(sock) { if (stream_buf_read_setup (&sock)) \
103
FD_SET (sock.sd, &event_wait.reads); }
104
# define SOCKET_SET_WRITE(sock) { FD_SET (sock.sd, &event_wait.writes); }
105
# define SOCKET_ISSET(sock, set) (FD_ISSET (sock.sd, &event_wait.set))
106
# define SOCKET_SETMAXFD(sock) { wait_update_maxfd (&event_wait, sock.sd); }
107
# define SOCKET_READ_STAT(sock) (SOCKET_ISSET (sock, reads) ? "SR" : "sr")
108
# define SOCKET_WRITE_STAT(sock) (SOCKET_ISSET (sock, writes) ? "SW" : "sw")
145
struct rw_handle rw_handle;
146
struct rw_handle listen_handle; /* For listening on TCP socket in server mode */
111
socket_descriptor_t sd;
112
socket_descriptor_t ctrl_sd; /* only used for UDP over Socks */
149
/* used for printing status info only */
150
unsigned int rwflags_debug;
152
/* used for long-term queueing of pre-accepted socket listen */
153
bool listen_persistent_queued;
114
155
/* set on initial call to init phase 1 */
156
struct remote_list *remote_list;
157
const char *remote_host;
115
159
const char *local_host;
116
const char *remote_host;
119
int proto; /* Protocol (PROTO_x defined below) */
123
163
# define INETD_NONE 0
124
164
# define INETD_WAIT 1
125
165
# define INETD_NOWAIT 2
128
struct link_socket_addr *lsa;
129
const char *ipchange_command;
168
# define LS_MODE_DEFAULT 0
169
# define LS_MODE_TCP_LISTEN 1
170
# define LS_MODE_TCP_ACCEPT_FROM 2
130
173
int resolve_retry_seconds;
131
174
int connect_retry_seconds;
132
175
int mtu_discover_type;
177
struct socket_buffer_size socket_buffer_sizes;
134
179
int mtu; /* OS discovered MTU, or 0 if unknown */
135
int mtu_changed; /* Set to true when mtu value is changed */
137
181
bool did_resolve_remote;
139
# define CONNECTION_ESTABLISHED(ls) ((ls)->set_outgoing_initial)
140
bool set_outgoing_initial;
142
183
/* for stream sockets */
143
184
struct stream_buf stream_buf;
144
185
struct buffer stream_buf_data;
145
186
bool stream_reset;
188
#ifdef ENABLE_HTTP_PROXY
148
190
struct http_proxy_info *http_proxy;
150
194
/* Socks proxy */
151
195
struct socks_proxy_info *socks_proxy;
152
196
struct sockaddr_in socks_relay; /* Socks UDP relay address */
199
#if defined(ENABLE_HTTP_PROXY) || defined(ENABLE_SOCKS)
154
200
/* The OpenVPN server we will use the proxy to connect to */
155
201
const char *proxy_dest_host;
156
202
int proxy_dest_port;
205
#if PASSTOS_CAPABILITY
206
/* used to get/set TOS. */
212
int gremlin; /* --gremlin bits */
192
int link_socket_read_socks_udp (struct link_socket *sock,
194
struct sockaddr_in *from);
196
int link_socket_write_socks_udp (struct link_socket *sock,
198
struct sockaddr_in *to);
200
void link_socket_reset (struct link_socket *sock);
202
void link_socket_init_phase1 (struct link_socket *sock,
203
const char *local_host,
204
const char *remote_host,
208
struct http_proxy_info *http_proxy,
209
struct socks_proxy_info *socks_proxy,
213
struct link_socket_addr *lsa,
214
const char *ipchange_command,
215
int resolve_retry_seconds,
216
int connect_retry_seconds,
217
int mtu_discover_type);
246
struct link_socket *link_socket_new (void);
249
* Initialize link_socket object.
253
link_socket_init_phase1 (struct link_socket *sock,
254
const char *local_host,
255
struct remote_list *remote_list,
259
const struct link_socket *accept_from,
260
#ifdef ENABLE_HTTP_PROXY
261
struct http_proxy_info *http_proxy,
264
struct socks_proxy_info *socks_proxy,
272
struct link_socket_addr *lsa,
273
const char *ipchange_command,
274
const struct plugin_list *plugins,
275
int resolve_retry_seconds,
276
int connect_retry_seconds,
277
int mtu_discover_type,
220
281
void link_socket_init_phase2 (struct link_socket *sock,
221
282
const struct frame *frame,
222
283
volatile int *signal_received);
285
void link_socket_post_fork (const struct link_socket *sock,
286
const struct sockaddr_in *remote);
224
288
void socket_adjust_frame_parameters (struct frame *frame, int proto);
226
290
void frame_adjust_path_mtu (struct frame *frame, int pmtu, int proto);
228
void link_socket_set_outgoing_addr (const struct buffer *buf,
229
struct link_socket *sock,
230
const struct sockaddr_in *addr);
232
void link_socket_incoming_addr (struct buffer *buf,
233
const struct link_socket *sock,
234
const struct sockaddr_in *from_addr);
236
void link_socket_get_outgoing_addr (struct buffer *buf,
237
const struct link_socket *sock,
238
struct sockaddr_in *addr);
240
292
void link_socket_close (struct link_socket *sock);
242
294
const char *print_sockaddr_ex (const struct sockaddr_in *addr,
244
const char* separator);
246
const char *print_sockaddr (const struct sockaddr_in *addr);
248
const char *print_in_addr_t (in_addr_t addr, bool empty_if_undef);
250
void setenv_sockaddr (const char *name_prefix,
251
const struct sockaddr_in *addr);
296
const char* separator,
297
struct gc_arena *gc);
299
const char *print_sockaddr (const struct sockaddr_in *addr,
300
struct gc_arena *gc);
302
#define IA_EMPTY_IF_UNDEF (1<<0)
303
#define IA_NET_ORDER (1<<1)
304
const char *print_in_addr_t (in_addr_t addr, unsigned int flags, struct gc_arena *gc);
306
#define SA_IP_PORT (1<<0)
307
#define SA_SET_IF_NONZERO (1<<1)
308
void setenv_sockaddr (struct env_set *es,
309
const char *name_prefix,
310
const struct sockaddr_in *addr,
313
void setenv_in_addr_t (struct env_set *es,
314
const char *name_prefix,
253
318
void bad_address_length (int actual, int expected);
255
in_addr_t link_socket_current_remote (const struct link_socket *sock);
320
in_addr_t link_socket_current_remote (const struct link_socket_info *info);
322
void link_socket_connection_initiated (const struct buffer *buf,
323
struct link_socket_info *info,
324
const struct sockaddr_in *addr,
325
const char *common_name,
328
void link_socket_bad_incoming_addr (struct buffer *buf,
329
const struct link_socket_info *info,
330
const struct sockaddr_in *from_addr);
332
void link_socket_bad_outgoing_addr (void);
334
void setenv_trusted (struct env_set *es, const struct link_socket_info *info);
336
void remote_list_randomize (struct remote_list *l);
339
* Low-level functions
342
/* return values of openvpn_inet_aton */
343
#define OIA_HOSTNAME 0
346
int openvpn_inet_aton (const char *dotted_quad, struct in_addr *addr);
348
socket_descriptor_t create_socket_tcp (void);
350
socket_descriptor_t socket_do_accept (socket_descriptor_t sd,
351
struct sockaddr_in *remote,
372
483
else if (status < 0)
374
485
const int err = openvpn_errno_socket ();
487
return err == WSAECONNRESET || err == WSAECONNABORTED;
375
489
return err == ECONNRESET;
497
link_socket_verify_incoming_addr (struct buffer *buf,
498
const struct link_socket_info *info,
499
const struct sockaddr_in *from_addr)
503
if (from_addr->sin_family != AF_INET)
505
if (!addr_defined (from_addr))
507
if (info->remote_float || !addr_defined (&info->lsa->remote))
509
if (addr_match_proto (from_addr, &info->lsa->remote, info->proto))
516
link_socket_get_outgoing_addr (struct buffer *buf,
517
const struct link_socket_info *info,
518
struct sockaddr_in *addr)
522
struct link_socket_addr *lsa = info->lsa;
523
if (addr_defined (&lsa->actual))
525
addr->sin_family = lsa->actual.sin_family;
526
addr->sin_addr.s_addr = lsa->actual.sin_addr.s_addr;
527
addr->sin_port = lsa->actual.sin_port;
531
link_socket_bad_outgoing_addr ();
538
link_socket_set_outgoing_addr (const struct buffer *buf,
539
struct link_socket_info *info,
540
const struct sockaddr_in *addr,
541
const char *common_name,
544
if (!buf || buf->len > 0)
546
struct link_socket_addr *lsa = info->lsa;
548
/* new or changed address? */
549
(!info->connection_established
550
|| !addr_match_proto (addr, &lsa->actual, info->proto))
551
/* address undef or address == remote or --float */
552
&& (info->remote_float
553
|| !addr_defined (&lsa->remote)
554
|| addr_match_proto (addr, &lsa->remote, info->proto))
557
link_socket_connection_initiated (buf, info, addr, common_name, es);
522
696
struct buffer *buf,
523
697
struct sockaddr_in *to)
525
if (sock->socks_proxy)
527
return link_socket_write_socks_udp (sock, buf, to);
532
return link_socket_write_win32 (sock, buf, to);
534
return link_socket_write_udp_posix (sock, buf, to);
540
link_socket_write_tcp (struct link_socket *sock,
542
struct sockaddr_in *to)
544
packet_size_type len = BLEN (buf);
545
msg (D_STREAM_DEBUG, "STREAM: WRITE %d offset=%d", (int)len, buf->offset);
546
ASSERT (len <= sock->stream_buf.maxlen);
548
ASSERT (buf_write_prepend (buf, &len, sizeof (len)));
550
700
return link_socket_write_win32 (sock, buf, to);
552
return link_socket_write_tcp_posix (sock, buf, to);
702
return link_socket_write_udp_posix (sock, buf, to);
727
#if PASSTOS_CAPABILITY
730
* Extract TOS bits. Assumes that ipbuf is a valid IPv4 packet.
733
link_socket_extract_tos (struct link_socket *ls, const struct buffer *ipbuf)
737
struct openvpn_iphdr *iph = (struct openvpn_iphdr *) BPTR (ipbuf);
739
ls->ptos_defined = true;
744
* Set socket properties to reflect TOS bits which were extracted
745
* from tunnel packet.
748
link_socket_set_tos (struct link_socket *ls)
750
if (ls && ls->ptos_defined)
751
setsockopt (ls->sd, IPPROTO_IP, IP_TOS, &ls->ptos, sizeof (ls->ptos));
757
* Socket I/O wait functions
761
socket_read_residual (const struct link_socket *s)
763
return s && s->stream_buf.residual_fully_formed;
766
static inline event_t
767
socket_event_handle (const struct link_socket *s)
770
return &s->rw_handle;
776
event_t socket_listen_event_handle (struct link_socket *s);
779
socket_set (struct link_socket *s,
780
struct event_set *es,
781
unsigned int rwflags,
783
unsigned int *persistent);
786
socket_set_listen_persistent (struct link_socket *s,
787
struct event_set *es,
790
if (s && !s->listen_persistent_queued)
792
event_ctl (es, socket_listen_event_handle (s), EVENT_READ, arg);
793
s->listen_persistent_queued = true;
798
socket_reset_listen_persistent (struct link_socket *s)
801
reset_net_event_win32 (&s->listen_handle, s->sd);
805
const char *socket_stat (const struct link_socket *s, unsigned int rwflags, struct gc_arena *gc);
577
807
#endif /* SOCKET_H */