OpenVPN
tun.h
Go to the documentation of this file.
1/*
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
6 * packet compression.
7 *
8 * Copyright (C) 2002-2025 OpenVPN Inc <sales@openvpn.net>
9 *
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.
13 *
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.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 */
23
24#ifndef TUN_H
25#define TUN_H
26
27#ifdef _WIN32
28#include <winioctl.h>
29#include <tap-windows.h>
30#include <setupapi.h>
31#include <cfgmgr32.h>
32#endif
33
34#include "buffer.h"
35#include "error.h"
36#include "mtu.h"
37#include "win32.h"
38#include "event.h"
39#include "proto.h"
40#include "misc.h"
41#include "networking.h"
42#include "dco.h"
43
57
58#ifdef _WIN32
59#define DCO_WIN_REFERENCE_STRING "ovpn-dco"
60#endif
61
62#if defined(_WIN32) || defined(TARGET_ANDROID)
63
64#define TUN_ADAPTER_INDEX_INVALID ((DWORD)-1)
65
66/* time constants for --ip-win32 adaptive */
67#define IPW32_SET_ADAPTIVE_DELAY_WINDOW 300
68#define IPW32_SET_ADAPTIVE_TRY_NETSH 20
69
70/* bit flags for DHCP options */
71#define DHCP_OPTIONS_DHCP_OPTIONAL (1<<0)
72#define DHCP_OPTIONS_DHCP_REQUIRED (1<<1)
73
75 /* --ip-win32 options */
77
78#define IPW32_SET_MANUAL 0 /* "--ip-win32 manual" */
79#define IPW32_SET_NETSH 1 /* "--ip-win32 netsh" */
80#define IPW32_SET_IPAPI 2 /* "--ip-win32 ipapi" */
81#define IPW32_SET_DHCP_MASQ 3 /* "--ip-win32 dynamic" */
82#define IPW32_SET_ADAPTIVE 4 /* "--ip-win32 adaptive" */
83#define IPW32_SET_N 5
85
86#ifdef _WIN32
88#endif
89
90 /* --ip-win32 dynamic options */
94
95 /* --tap-sleep option */
97
98 /* --dhcp-option options */
99
101
102 const char *domain; /* DOMAIN (15) */
103
104 const char *netbios_scope; /* NBS (47) */
105
106 int netbios_node_type; /* NBT 1,2,4,8 (46) */
107
108#define N_DHCP_ADDR 4 /* Max # of addresses allowed for
109 * DNS, WINS, etc. */
110
111 /* DNS (6) */
112 in_addr_t dns[N_DHCP_ADDR];
113 int dns_len;
114
115 /* WINS (44) */
116 in_addr_t wins[N_DHCP_ADDR];
117 int wins_len;
118
119 /* NTP (42) */
120 in_addr_t ntp[N_DHCP_ADDR];
121 int ntp_len;
122
123 /* NBDD (45) */
124 in_addr_t nbdd[N_DHCP_ADDR];
125 int nbdd_len;
127#define N_SEARCH_LIST_LEN 10 /* Max # of entries in domin-search list */
128
129 /* SEARCH (119), MacOS, Linux, Win10 1809+ */
132
133 /* DISABLE_NBT (43, Vendor option 001) */
134 bool disable_nbt;
137 bool dhcp_pre_release;
139 bool register_dns;
141 struct in6_addr dns6[N_DHCP_ADDR];
142 int dns6_len;
143#if defined(TARGET_ANDROID)
144 const char *http_proxy;
145 int http_proxy_port;
146#endif
147};
148
149#elif defined(TARGET_LINUX)
150
151struct tuntap_options {
152 int txqueuelen;
153};
154
155#else /* if defined(_WIN32) || defined(TARGET_ANDROID) */
156
157struct tuntap_options {
158 int dummy; /* not used */
159};
160
161#endif /* if defined(_WIN32) || defined(TARGET_ANDROID) */
162
163/*
164 * Define a TUN/TAP dev.
165 */
166#ifndef WIN32
167typedef struct afunix_context
171
172#else /* ifndef WIN32 */
173typedef struct {
174 int dummy;
176#endif
178struct tuntap
180#define TUNNEL_TYPE(tt) ((tt) ? ((tt)->type) : DEV_TYPE_UNDEF)
181 int type; /* DEV_TYPE_x as defined in proto.h */
183#define TUNNEL_TOPOLOGY(tt) ((tt) ? ((tt)->topology) : TOP_UNDEF)
184 int topology; /* one of the TOP_x values */
185
190
194
199 bool persistent_if; /* if existed before, keep on program end */
201 struct tuntap_options options; /* options set on command line */
203 char *actual_name; /* actual name of TUN/TAP dev, usually including unit number */
204
205 /* ifconfig parameters */
206 in_addr_t local;
207 in_addr_t remote_netmask;
209 struct in6_addr local_ipv6;
210 struct in6_addr remote_ipv6;
211 int netbits_ipv6;
212
213#ifdef _WIN32
214 HANDLE hand;
215 /* used for async NEW_PEER dco call, which might wait for TCP connect */
216 OVERLAPPED dco_new_peer_ov;
219 struct rw_handle rw_handle;
220
221 /* used for setting interface address via IP Helper API
222 * or DHCP masquerade */
226 in_addr_t adapter_netmask;
227
228 /* Windows adapter index for TAP-Windows adapter,
229 * ~0 if undefined */
230 DWORD adapter_index;
232 int standby_iter;
233
234 #else /* ifdef _WIN32 */
235 int fd; /* file descriptor for TUN/TAP dev */
236#endif /* ifdef _WIN32 */
237
238#ifdef TARGET_SOLARIS
239 int ip_fd;
240#endif
241
242 /* used for printing status info only */
243 unsigned int rwflags_debug;
247};
248
249static inline bool
250tuntap_defined(const struct tuntap *tt)
251{
252#ifdef _WIN32
253 return tt && tt->hand != NULL;
254#else
255 return tt && tt->fd >= 0;
256#endif
257}
258
259/*
260 * Function prototypes
261 */
262
263void open_tun(const char *dev, const char *dev_type, const char *dev_node,
264 struct tuntap *tt, openvpn_net_ctx_t *ctx);
265
266void close_tun(struct tuntap *tt, openvpn_net_ctx_t *ctx);
267
268void tun_open_device(struct tuntap *tt, const char *dev_node,
269 const char **device_guid, struct gc_arena *gc);
270
271void close_tun_handle(struct tuntap *tt);
273int write_tun(struct tuntap *tt, uint8_t *buf, int len);
275int read_tun(struct tuntap *tt, uint8_t *buf, int len);
277void tuncfg(const char *dev, const char *dev_type, const char *dev_node,
278 int persist_mode, const char *username,
279 const char *groupname, const struct tuntap_options *options,
280 openvpn_net_ctx_t *ctx);
281
282const char *guess_tuntap_dev(const char *dev,
283 const char *dev_type,
284 const char *dev_node,
285 struct gc_arena *gc);
286
287struct tuntap *init_tun(const char *dev, /* --dev option */
288 const char *dev_type, /* --dev-type option */
289 int topology, /* one of the TOP_x values */
290 const char *ifconfig_local_parm, /* --ifconfig parm 1 */
291 const char *ifconfig_remote_netmask_parm, /* --ifconfig parm 2 */
292 const char *ifconfig_ipv6_local_parm, /* --ifconfig parm 1 / IPv6 */
293 int ifconfig_ipv6_netbits_parm, /* --ifconfig parm 1 / bits */
294 const char *ifconfig_ipv6_remote_parm, /* --ifconfig parm 2 / IPv6 */
295 struct addrinfo *local_public,
296 struct addrinfo *remote_public,
297 const bool strict_warn,
298 struct env_set *es,
300 struct tuntap *tt);
301
302void init_tun_post(struct tuntap *tt,
303 const struct frame *frame,
304 const struct tuntap_options *options);
305
306void do_ifconfig_setenv(const struct tuntap *tt,
307 struct env_set *es);
308
318void do_ifconfig(struct tuntap *tt, const char *ifname, int tun_mtu,
319 const struct env_set *es, openvpn_net_ctx_t *ctx);
320
327void undo_ifconfig(struct tuntap *tt, openvpn_net_ctx_t *ctx);
328
329bool is_dev_type(const char *dev, const char *dev_type, const char *match_type);
330
331int dev_type_enum(const char *dev, const char *dev_type);
332
333const char *dev_type_string(const char *dev, const char *dev_type);
334
335const char *ifconfig_options_string(const struct tuntap *tt, bool remote, bool disable, struct gc_arena *gc);
336
337bool is_tun_p2p(const struct tuntap *tt);
338
340
344const char *
346
347/*
348 * Should ifconfig be called before or after
349 * tun dev open?
350 */
352#define IFCONFIG_BEFORE_TUN_OPEN 0
353#define IFCONFIG_AFTER_TUN_OPEN 1
355#define IFCONFIG_DEFAULT IFCONFIG_AFTER_TUN_OPEN
356
357static inline int
358ifconfig_order(struct tuntap *tt)
359{
360 if (tt->backend_driver == DRIVER_AFUNIX)
361 {
363 }
364#if defined(TARGET_LINUX)
366#elif defined(TARGET_SOLARIS)
368#elif defined(TARGET_OPENBSD)
370#elif defined(TARGET_DARWIN)
372#elif defined(TARGET_NETBSD)
374#elif defined(_WIN32)
376#elif defined(TARGET_ANDROID)
378#else /* if defined(TARGET_LINUX) */
379 return IFCONFIG_DEFAULT;
380#endif
381}
383#define ROUTE_BEFORE_TUN 0
384#define ROUTE_AFTER_TUN 1
385#define ROUTE_ORDER_DEFAULT ROUTE_AFTER_TUN
386
387static inline int
388route_order(struct tuntap *tt)
389{
390 if (tt->backend_driver == DRIVER_AFUNIX)
391 {
392 return ROUTE_BEFORE_TUN;
393 }
394#if defined(TARGET_ANDROID)
395 return ROUTE_BEFORE_TUN;
396#else
397 return ROUTE_ORDER_DEFAULT;
398#endif
399}
400
401
402#ifdef _WIN32
404struct tap_reg
406 const char *guid;
408 struct tap_reg *next;
409};
411struct panel_reg
413 const char *name;
414 const char *guid;
415 struct panel_reg *next;
416};
423};
424
425int ascii2ipset(const char *name);
426
427const char *ipset2ascii(int index);
428
429const char *ipset2ascii_all(struct gc_arena *gc);
430
431void verify_255_255_255_252(in_addr_t local, in_addr_t remote);
432
433const IP_ADAPTER_INFO *get_adapter_info_list(struct gc_arena *gc);
434
435const IP_ADAPTER_INFO *get_tun_adapter(const struct tuntap *tt, const IP_ADAPTER_INFO *list);
436
437const IP_ADAPTER_INFO *get_adapter_info(DWORD index, struct gc_arena *gc);
438
439const IP_PER_ADAPTER_INFO *get_per_adapter_info(const DWORD index, struct gc_arena *gc);
440
441const IP_ADAPTER_INFO *get_adapter(const IP_ADAPTER_INFO *ai, DWORD index);
442
443bool is_adapter_up(const struct tuntap *tt, const IP_ADAPTER_INFO *list);
444
445bool is_ip_in_adapter_subnet(const IP_ADAPTER_INFO *ai, const in_addr_t ip, in_addr_t *highest_netmask);
446
447DWORD adapter_index_of_ip(const IP_ADAPTER_INFO *list,
448 const in_addr_t ip,
449 int *count,
450 in_addr_t *netmask);
451
452void show_tap_win_adapters(int msglev, int warnlev);
453
454void show_adapters(int msglev);
455
456void tap_allow_nonadmin_access(const char *dev_node);
457
459
460const char *tap_win_getinfo(const struct tuntap *tt, struct gc_arena *gc);
461
462void tun_show_debug(struct tuntap *tt);
463
464bool dhcp_release_by_adapter_index(const DWORD adapter_index);
465
466bool dhcp_renew_by_adapter_index(const DWORD adapter_index);
467
468void fork_register_dns_action(struct tuntap *tt);
469
470void ipconfig_register_dns(const struct env_set *es);
471
472void tun_standby_init(struct tuntap *tt);
473
474bool tun_standby(struct tuntap *tt);
475
476int tun_read_queue(struct tuntap *tt, int maxsize);
477
478int tun_write_queue(struct tuntap *tt, struct buffer *buf);
479
480static inline bool
482{
483 /*
484 * This corresponds to the STATUS_NO_SUCH_DEVICE
485 * error in tapdrvr.c.
486 */
487 if (status < 0)
488 {
489 return GetLastError() == ERROR_FILE_NOT_FOUND;
490 }
491 return false;
492}
493
494static inline bool
496{
497 /*
498 * Typically generated when driver is halted.
499 */
500 if (status < 0)
501 {
502 return GetLastError() == ERROR_OPERATION_ABORTED;
503 }
504 return false;
505}
506
507int tun_write_win32(struct tuntap *tt, struct buffer *buf);
508
509static inline bool
510is_ip_packet_valid(const struct buffer *buf)
511{
512 const struct openvpn_iphdr *ih = (const struct openvpn_iphdr *)BPTR(buf);
513
514 if (OPENVPN_IPH_GET_VER(ih->version_len) == 4)
515 {
516 if (BLEN(buf) < sizeof(struct openvpn_iphdr))
517 {
518 return false;
519 }
520 }
521 else if (OPENVPN_IPH_GET_VER(ih->version_len) == 6)
522 {
523 if (BLEN(buf) < sizeof(struct openvpn_ipv6hdr))
524 {
525 return false;
526 }
527 }
528 else
529 {
530 return false;
531 }
532
533 return true;
534}
535
536static inline bool
537tuntap_is_dco_win(struct tuntap *tt)
538{
539 return tt && tt->backend_driver == DRIVER_DCO;
540}
541
542static inline bool
544{
545 return tuntap_is_dco_win(tt) && (status < 0) && (openvpn_errno() == ERROR_NETNAME_DELETED);
546}
547
548#else /* ifdef _WIN32 */
549
550static inline bool
552{
553 return false;
554}
555
556static inline bool
558{
559 return false;
560}
561
562static inline void
563tun_standby_init(struct tuntap *tt)
564{
565}
566
567static inline bool
568tun_standby(struct tuntap *tt)
569{
570 return true;
571}
572
573
574static inline bool
575tuntap_is_dco_win(struct tuntap *tt)
576{
577 return false;
578}
579
580static inline bool
582{
583 return false;
584}
585
586#endif /* ifdef _WIN32 */
587
588/*
589 * TUN/TAP I/O wait functions
590 */
591
592static inline event_t
593tun_event_handle(const struct tuntap *tt)
594{
595#ifdef _WIN32
596 return &tt->rw_handle;
597#else
598 return tt->fd;
599#endif
600}
601
602static inline void
603tun_set(struct tuntap *tt,
604 struct event_set *es,
605 unsigned int rwflags,
606 void *arg,
607 unsigned int *persistent)
608{
609 if (!tuntap_defined(tt) || tuntap_is_dco_win(tt))
610 {
611 return;
612 }
613
614 /* if persistent is defined, call event_ctl only if rwflags has changed since last call */
615 if (!persistent || *persistent != rwflags)
616 {
617 event_ctl(es, tun_event_handle(tt), rwflags, arg);
618 if (persistent)
619 {
620 *persistent = rwflags;
621 }
622 }
623#ifdef _WIN32
624 if (tt->backend_driver == WINDOWS_DRIVER_TAP_WINDOWS6 && (rwflags & EVENT_READ))
625 {
626 tun_read_queue(tt, 0);
627 }
628#endif
629 tt->rwflags_debug = rwflags;
630
631}
632
633const char *tun_stat(const struct tuntap *tt, unsigned int rwflags, struct gc_arena *gc);
634bool tun_name_is_fixed(const char *dev);
635
636static inline bool
637is_tun_type_set(const struct tuntap *tt)
638{
639 return tt && tt->type != DEV_TYPE_UNDEF;
640}
641
642static inline void
643open_tun_null(struct tuntap *tt)
644{
645 tt->actual_name = string_alloc("null", NULL);
646}
647#endif /* TUN_H */
char * string_alloc(const char *str, struct gc_arena *gc)
Definition buffer.c:649
#define BPTR(buf)
Definition buffer.h:124
#define BLEN(buf)
Definition buffer.h:127
void * dco_context_t
Definition dco.h:267
#define EVENT_READ
Definition event.h:39
static void event_ctl(struct event_set *es, event_t event, unsigned int rwflags, void *arg)
Definition event.h:181
static SERVICE_STATUS status
Definition interactive.c:52
void * openvpn_net_ctx_t
Definition networking.h:39
#define openvpn_errno()
Definition error.h:72
#define DEV_TYPE_UNDEF
Definition proto.h:35
#define OPENVPN_IPH_GET_VER(v)
Definition proto.h:93
pid_t childprocess
Definition tun.h:168
Wrapper structure for dynamically allocated memory.
Definition buffer.h:61
const char * device_interface
Definition tun.h:420
struct device_instance_id_interface * next
Definition tun.h:421
Packet geometry parameters.
Definition mtu.h:98
Garbage collection arena used to keep track of dynamically allocated memory.
Definition buffer.h:117
uint8_t version_len
Definition proto.h:95
struct panel_reg * next
Definition tun.h:414
const char * name
Definition tun.h:412
const char * guid
Definition tun.h:413
Definition tun.h:404
struct tap_reg * next
Definition tun.h:407
enum tun_driver_type windows_driver
Definition tun.h:406
const char * guid
Definition tun.h:405
int wins_len
Definition tun.h:116
struct in6_addr dns6[N_DHCP_ADDR]
Definition tun.h:140
in_addr_t nbdd[N_DHCP_ADDR]
Definition tun.h:123
int dns_len
Definition tun.h:112
int dns6_len
Definition tun.h:141
in_addr_t ntp[N_DHCP_ADDR]
Definition tun.h:119
int ntp_len
Definition tun.h:120
in_addr_t wins[N_DHCP_ADDR]
Definition tun.h:115
int tap_sleep
Definition tun.h:96
int dhcp_lease_time
Definition tun.h:93
in_addr_t dns[N_DHCP_ADDR]
Definition tun.h:111
const char * netbios_scope
Definition tun.h:104
int nbdd_len
Definition tun.h:124
bool ip_win32_defined
Definition tun.h:76
bool dhcp_masq_custom_offset
Definition tun.h:91
const char * domain
Definition tun.h:102
int domain_search_list_len
Definition tun.h:130
bool dhcp_renew
Definition tun.h:135
const char * domain_search_list[N_SEARCH_LIST_LEN]
Definition tun.h:129
HANDLE msg_channel
Definition tun.h:87
int dhcp_masq_offset
Definition tun.h:92
int netbios_node_type
Definition tun.h:106
int ip_win32_type
Definition tun.h:84
bool dhcp_pre_release
Definition tun.h:136
bool register_dns
Definition tun.h:138
bool disable_nbt
Definition tun.h:133
int dhcp_options
Definition tun.h:100
Definition tun.h:178
unsigned int rwflags_debug
Definition tun.h:242
in_addr_t local
Definition tun.h:205
int type
Definition tun.h:180
ULONG ipapi_instance
Definition tun.h:224
int netbits_ipv6
Definition tun.h:210
DWORD adapter_index
Definition tun.h:229
int standby_iter
Definition tun.h:231
struct rw_handle rw_handle
Definition tun.h:218
enum tun_driver_type backend_driver
The backend driver that used for this tun/tap device.
Definition tun.h:188
OVERLAPPED dco_new_peer_ov
Definition tun.h:215
bool did_ifconfig_ipv6_setup
if the internal variables related to ifconfig-ipv6 of this struct have been set up.
Definition tun.h:196
struct in6_addr remote_ipv6
Definition tun.h:209
bool did_ifconfig_setup
if the internal variables related to ifconfig of this struct have been set up.
Definition tun.h:192
int topology
Definition tun.h:183
struct overlapped_io writes
Definition tun.h:217
in_addr_t adapter_netmask
Definition tun.h:225
HANDLE hand
Definition tun.h:213
struct overlapped_io reads
Definition tun.h:216
struct in6_addr local_ipv6
Definition tun.h:208
ULONG ipapi_context
Definition tun.h:223
dco_context_t dco
Definition tun.h:244
char * actual_name
Definition tun.h:202
in_addr_t remote_netmask
Definition tun.h:206
afunix_context_t afunix
Definition tun.h:245
bool ipapi_context_defined
Definition tun.h:222
bool persistent_if
Definition tun.h:198
struct env_set * es
struct gc_arena gc
Definition test_ssl.c:155
void ipconfig_register_dns(const struct env_set *es)
Definition tun.c:5316
void tun_show_debug(struct tuntap *tt)
Definition tun.c:6741
static bool tuntap_abort(int status)
Definition tun.h:494
void open_tun(const char *dev, const char *dev_type, const char *dev_node, struct tuntap *tt, openvpn_net_ctx_t *ctx)
Definition tun.c:6684
int dev_type_enum(const char *dev, const char *dev_type)
Definition tun.c:547
void close_tun_handle(struct tuntap *tt)
Definition tun.c:6818
void fork_register_dns_action(struct tuntap *tt)
Definition tun.c:6050
#define IFCONFIG_AFTER_TUN_OPEN
Definition tun.h:352
#define N_SEARCH_LIST_LEN
Definition tun.h:126
#define IFCONFIG_BEFORE_TUN_OPEN
Definition tun.h:351
bool dhcp_renew_by_adapter_index(const DWORD adapter_index)
Definition tun.c:5250
int ascii2ipset(const char *name)
Definition tun.c:6952
const IP_ADAPTER_INFO * get_tun_adapter(const struct tuntap *tt, const IP_ADAPTER_INFO *list)
Definition tun.c:4701
bool is_adapter_up(const struct tuntap *tt, const IP_ADAPTER_INFO *list)
Definition tun.c:4714
const IP_ADAPTER_INFO * get_adapter_info(DWORD index, struct gc_arena *gc)
Definition tun.c:4616
struct tuntap * init_tun(const char *dev, const char *dev_type, int topology, const char *ifconfig_local_parm, const char *ifconfig_remote_netmask_parm, const char *ifconfig_ipv6_local_parm, int ifconfig_ipv6_netbits_parm, const char *ifconfig_ipv6_remote_parm, struct addrinfo *local_public, struct addrinfo *remote_public, const bool strict_warn, struct env_set *es, openvpn_net_ctx_t *ctx, struct tuntap *tt)
Definition tun.c:874
const char * tun_stat(const struct tuntap *tt, unsigned int rwflags, struct gc_arena *gc)
Definition tun.c:771
static bool is_ip_packet_valid(const struct buffer *buf)
Definition tun.h:509
const IP_PER_ADAPTER_INFO * get_per_adapter_info(const DWORD index, struct gc_arena *gc)
Definition tun.c:4510
static bool tuntap_is_dco_win(struct tuntap *tt)
Definition tun.h:536
#define ROUTE_ORDER_DEFAULT
Definition tun.h:384
void show_tap_win_adapters(int msglev, int warnlev)
Definition tun.c:4204
int tun_write_win32(struct tuntap *tt, struct buffer *buf)
Definition tun.c:3720
bool is_ip_in_adapter_subnet(const IP_ADAPTER_INFO *ai, const in_addr_t ip, in_addr_t *highest_netmask)
Definition tun.c:4759
struct afunix_context afunix_context_t
const char * tap_win_getinfo(const struct tuntap *tt, struct gc_arena *gc)
Definition tun.c:6723
void show_adapters(int msglev)
Definition tun.c:5059
bool is_dev_type(const char *dev, const char *dev_type, const char *match_type)
Definition tun.c:529
int tun_write_queue(struct tuntap *tt, struct buffer *buf)
Definition tun.c:3657
static bool tuntap_defined(const struct tuntap *tt)
Definition tun.h:249
bool dhcp_release_by_adapter_index(const DWORD adapter_index)
Definition tun.c:5210
bool tun_standby(struct tuntap *tt)
Definition tun.c:5783
void do_ifconfig(struct tuntap *tt, const char *ifname, int tun_mtu, const struct env_set *es, openvpn_net_ctx_t *ctx)
do_ifconfig - configure the tunnel interface
Definition tun.c:1657
const char * dev_type_string(const char *dev, const char *dev_type)
Definition tun.c:566
tun_driver_type
Definition tun.h:44
@ DRIVER_NULL
Definition tun.h:52
@ WINDOWS_DRIVER_UNSPECIFIED
Definition tun.h:45
@ DRIVER_UTUN
macOS internal tun driver
Definition tun.h:55
@ DRIVER_GENERIC_TUNTAP
Definition tun.h:47
@ DRIVER_AFUNIX
using an AF_UNIX socket to pass packets from/to an external program.
Definition tun.h:51
@ WINDOWS_DRIVER_TAP_WINDOWS6
Definition tun.h:46
@ DRIVER_DCO
Definition tun.h:53
void close_tun(struct tuntap *tt, openvpn_net_ctx_t *ctx)
Definition tun.c:6849
const IP_ADAPTER_INFO * get_adapter_info_list(struct gc_arena *gc)
Definition tun.c:4483
void tap_allow_nonadmin_access(const char *dev_node)
Definition tun.c:5108
bool tun_name_is_fixed(const char *dev)
Definition tun.c:1881
const IP_ADAPTER_INFO * get_adapter(const IP_ADAPTER_INFO *ai, DWORD index)
Definition tun.c:4597
static void tun_set(struct tuntap *tt, struct event_set *es, unsigned int rwflags, void *arg, unsigned int *persistent)
Definition tun.h:602
#define IFCONFIG_DEFAULT
Definition tun.h:354
void warn_on_use_of_common_subnets(openvpn_net_ctx_t *ctx)
Definition tun.c:710
#define N_DHCP_ADDR
Definition tun.h:108
int tun_read_queue(struct tuntap *tt, int maxsize)
Definition tun.c:3593
static event_t tun_event_handle(const struct tuntap *tt)
Definition tun.h:592
int read_tun(struct tuntap *tt, uint8_t *buf, int len)
void init_tun_post(struct tuntap *tt, const struct frame *frame, const struct tuntap_options *options)
Definition tun.c:1020
static int ifconfig_order(struct tuntap *tt)
Definition tun.h:357
static void open_tun_null(struct tuntap *tt)
Definition tun.h:642
const char * ifconfig_options_string(const struct tuntap *tt, bool remote, bool disable, struct gc_arena *gc)
Definition tun.c:733
const char * guess_tuntap_dev(const char *dev, const char *dev_type, const char *dev_node, struct gc_arena *gc)
Definition tun.c:586
const char * ipset2ascii(int index)
Definition tun.c:6967
void do_ifconfig_setenv(const struct tuntap *tt, struct env_set *es)
Definition tun.c:830
static bool tuntap_is_dco_win_timeout(struct tuntap *tt, int status)
Definition tun.h:542
void undo_ifconfig(struct tuntap *tt, openvpn_net_ctx_t *ctx)
undo_ifconfig - undo configuration of the tunnel interface
Definition tun.c:1756
bool is_tun_p2p(const struct tuntap *tt)
Definition tun.c:806
const char * ipset2ascii_all(struct gc_arena *gc)
Definition tun.c:6981
static int route_order(struct tuntap *tt)
Definition tun.h:387
void tun_standby_init(struct tuntap *tt)
Definition tun.c:5777
void show_valid_win32_tun_subnets(void)
Definition tun.c:4171
static bool tuntap_stop(int status)
Definition tun.h:480
const char * print_tun_backend_driver(enum tun_driver_type driver)
Return a string representation of the tun backed driver type.
Definition tun.c:59
#define ROUTE_BEFORE_TUN
Definition tun.h:382
static bool is_tun_type_set(const struct tuntap *tt)
Definition tun.h:636
DWORD adapter_index_of_ip(const IP_ADAPTER_INFO *list, const in_addr_t ip, int *count, in_addr_t *netmask)
Definition tun.c:4792
int write_tun(struct tuntap *tt, uint8_t *buf, int len)
void tun_open_device(struct tuntap *tt, const char *dev_node, const char **device_guid, struct gc_arena *gc)
Definition tun.c:6503
void verify_255_255_255_252(in_addr_t local, in_addr_t remote)
Definition tun.c:4134
void tuncfg(const char *dev, const char *dev_type, const char *dev_node, int persist_mode, const char *username, const char *groupname, const struct tuntap_options *options, openvpn_net_ctx_t *ctx)