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, see <https://www.gnu.org/licenses/>.
21 */
22
23#ifndef TUN_H
24#define TUN_H
25
26#ifdef _WIN32
27#include <winioctl.h>
28#include <tap-windows.h>
29#include <setupapi.h>
30#include <cfgmgr32.h>
31#endif
32
33#include "buffer.h"
34#include "error.h"
35#include "mtu.h"
36#include "win32.h"
37#include "event.h"
38#include "proto.h"
39#include "misc.h"
40#include "networking.h"
41#include "dco.h"
42
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{
76 /* --ip-win32 options */
78
79#define IPW32_SET_MANUAL 0 /* "--ip-win32 manual" */
80#define IPW32_SET_NETSH 1 /* "--ip-win32 netsh" */
81#define IPW32_SET_IPAPI 2 /* "--ip-win32 ipapi" */
82#define IPW32_SET_DHCP_MASQ 3 /* "--ip-win32 dynamic" */
83#define IPW32_SET_ADAPTIVE 4 /* "--ip-win32 adaptive" */
84#define IPW32_SET_N 5
86
87#ifdef _WIN32
89#endif
90
91 /* --ip-win32 dynamic options */
95
96 /* --tap-sleep option */
98
99 /* --dhcp-option options */
100
102
103 const char *domain; /* DOMAIN (15) */
104
105 const char *netbios_scope; /* NBS (47) */
106
107 int netbios_node_type; /* NBT 1,2,4,8 (46) */
108
109#define N_DHCP_ADDR \
110 4 /* Max # of addresses allowed for \
111 * DNS, WINS, etc. */
112
113 /* DNS (6) */
114 in_addr_t dns[N_DHCP_ADDR];
115 int dns_len;
116
117 /* WINS (44) */
118 in_addr_t wins[N_DHCP_ADDR];
119 int wins_len;
120
121 /* NTP (42) */
122 in_addr_t ntp[N_DHCP_ADDR];
123 int ntp_len;
124
125 /* NBDD (45) */
126 in_addr_t nbdd[N_DHCP_ADDR];
127 int nbdd_len;
129#define N_SEARCH_LIST_LEN 10 /* Max # of entries in domin-search list */
130
131 /* SEARCH (119), MacOS, Linux, Win10 1809+ */
134
135 /* DISABLE_NBT (43, Vendor option 001) */
136 bool disable_nbt;
139 bool dhcp_pre_release;
141 bool register_dns;
143 struct in6_addr dns6[N_DHCP_ADDR];
144 int dns6_len;
145#if defined(TARGET_ANDROID)
146 const char *http_proxy;
147 int http_proxy_port;
148#endif
149};
150
151#elif defined(TARGET_LINUX)
152
153struct tuntap_options
154{
155 int txqueuelen;
156};
157
158#else /* if defined(_WIN32) || defined(TARGET_ANDROID) */
159
160struct tuntap_options
161{
162 int dummy; /* not used */
163};
164
165#endif /* if defined(_WIN32) || defined(TARGET_ANDROID) */
166
167/*
168 * Define a TUN/TAP dev.
169 */
170#ifndef WIN32
171typedef struct afunix_context
175
176#else /* ifndef WIN32 */
177typedef struct
178{
179 int dummy;
181#endif
183struct tuntap
185#define TUNNEL_TYPE(tt) ((tt) ? ((tt)->type) : DEV_TYPE_UNDEF)
186 int type; /* DEV_TYPE_x as defined in proto.h */
188#define TUNNEL_TOPOLOGY(tt) ((tt) ? ((tt)->topology) : TOP_UNDEF)
189 int topology; /* one of the TOP_x values */
190
195
199
204 bool persistent_if; /* if existed before, keep on program end */
206 struct tuntap_options options; /* options set on command line */
208 char *actual_name; /* actual name of TUN/TAP dev, usually including unit number */
209
210 /* ifconfig parameters */
211 in_addr_t local;
212 in_addr_t remote_netmask;
214 struct in6_addr local_ipv6;
215 struct in6_addr remote_ipv6;
216 int netbits_ipv6;
217
218#ifdef _WIN32
219 HANDLE hand;
220 /* used for async NEW_PEER dco call, which might wait for TCP connect */
221 OVERLAPPED dco_new_peer_ov;
224 struct rw_handle rw_handle;
225
226 /* used for setting interface address via IP Helper API
227 * or DHCP masquerade */
231 in_addr_t adapter_netmask;
232
233 /* Windows adapter index for TAP-Windows adapter,
234 * ~0 if undefined */
235 DWORD adapter_index;
237 int standby_iter;
238
239#else /* ifdef _WIN32 */
240 int fd; /* file descriptor for TUN/TAP dev */
241#endif /* ifdef _WIN32 */
242
243#ifdef TARGET_SOLARIS
244 int ip_fd;
245#endif
246
247 /* used for printing status info only */
248 unsigned int rwflags_debug;
252};
253
254static inline bool
255tuntap_defined(const struct tuntap *tt)
256{
257#ifdef _WIN32
258 return tt && tt->hand != NULL;
259#else
260 return tt && tt->fd >= 0;
261#endif
262}
263
264/*
265 * Function prototypes
266 */
267
268void open_tun(const char *dev, const char *dev_type, const char *dev_node, struct tuntap *tt,
269 openvpn_net_ctx_t *ctx);
270
271void close_tun(struct tuntap *tt, openvpn_net_ctx_t *ctx);
272
273void tun_open_device(struct tuntap *tt, const char *dev_node, const char **device_guid,
274 struct gc_arena *gc);
275
276void close_tun_handle(struct tuntap *tt);
278int write_tun(struct tuntap *tt, uint8_t *buf, int len);
280int read_tun(struct tuntap *tt, uint8_t *buf, int len);
282void tuncfg(const char *dev, const char *dev_type, const char *dev_node, int persist_mode,
283 const char *username, const char *groupname, const struct tuntap_options *options,
284 openvpn_net_ctx_t *ctx);
285
286const char *guess_tuntap_dev(const char *dev, const char *dev_type, const char *dev_node,
287 struct gc_arena *gc);
288
289struct tuntap *init_tun(const char *dev, /* --dev option */
290 const char *dev_type, /* --dev-type option */
291 int topology, /* one of the TOP_x values */
292 const char *ifconfig_local_parm, /* --ifconfig parm 1 */
293 const char *ifconfig_remote_netmask_parm, /* --ifconfig parm 2 */
294 const char *ifconfig_ipv6_local_parm, /* --ifconfig parm 1 / IPv6 */
295 int ifconfig_ipv6_netbits_parm, /* --ifconfig parm 1 / bits */
296 const char *ifconfig_ipv6_remote_parm, /* --ifconfig parm 2 / IPv6 */
297 struct addrinfo *local_public, struct addrinfo *remote_public,
298 const bool strict_warn, struct env_set *es, openvpn_net_ctx_t *ctx,
299 struct tuntap *tt);
300
301void init_tun_post(struct tuntap *tt, const struct frame *frame,
302 const struct tuntap_options *options);
303
304void do_ifconfig_setenv(const struct tuntap *tt, struct env_set *es);
305
315void do_ifconfig(struct tuntap *tt, const char *ifname, int tun_mtu, const struct env_set *es,
316 openvpn_net_ctx_t *ctx);
317
324void undo_ifconfig(struct tuntap *tt, openvpn_net_ctx_t *ctx);
325
326bool is_dev_type(const char *dev, const char *dev_type, const char *match_type);
327
328int dev_type_enum(const char *dev, const char *dev_type);
329
330const char *dev_type_string(const char *dev, const char *dev_type);
331
332const char *ifconfig_options_string(const struct tuntap *tt, bool remote, bool disable,
333 struct gc_arena *gc);
334
335bool is_tun_p2p(const struct tuntap *tt);
336
338
342const char *print_tun_backend_driver(enum tun_driver_type driver);
343
344/*
345 * Should ifconfig be called before or after
346 * tun dev open?
347 */
349#define IFCONFIG_BEFORE_TUN_OPEN 0
350#define IFCONFIG_AFTER_TUN_OPEN 1
352#define IFCONFIG_DEFAULT IFCONFIG_AFTER_TUN_OPEN
353
354static inline int
355ifconfig_order(struct tuntap *tt)
356{
357 if (tt->backend_driver == DRIVER_AFUNIX)
358 {
360 }
361#if defined(TARGET_LINUX)
363#elif defined(TARGET_SOLARIS)
365#elif defined(TARGET_OPENBSD)
367#elif defined(TARGET_DARWIN)
369#elif defined(TARGET_NETBSD)
371#elif defined(_WIN32)
373#elif defined(TARGET_ANDROID)
375#else /* if defined(TARGET_LINUX) */
376 return IFCONFIG_DEFAULT;
377#endif
378}
380#define ROUTE_BEFORE_TUN 0
381#define ROUTE_AFTER_TUN 1
382#define ROUTE_ORDER_DEFAULT ROUTE_AFTER_TUN
383
384static inline int
385route_order(struct tuntap *tt)
386{
387 if (tt->backend_driver == DRIVER_AFUNIX)
388 {
389 return ROUTE_BEFORE_TUN;
390 }
391#if defined(TARGET_ANDROID)
392 return ROUTE_BEFORE_TUN;
393#else
394 return ROUTE_ORDER_DEFAULT;
395#endif
396}
397
398
399#ifdef _WIN32
401struct tap_reg
403 const char *guid;
405 struct tap_reg *next;
406};
408struct panel_reg
410 const char *name;
411 const char *guid;
412 struct panel_reg *next;
413};
420};
421
422int ascii2ipset(const char *name);
423
424const char *ipset2ascii(int index);
425
426const char *ipset2ascii_all(struct gc_arena *gc);
427
428void verify_255_255_255_252(in_addr_t local, in_addr_t remote);
429
430const IP_ADAPTER_INFO *get_adapter_info_list(struct gc_arena *gc);
431
432const IP_ADAPTER_INFO *get_tun_adapter(const struct tuntap *tt, const IP_ADAPTER_INFO *list);
433
434const IP_ADAPTER_INFO *get_adapter_info(DWORD index, struct gc_arena *gc);
435
436const IP_PER_ADAPTER_INFO *get_per_adapter_info(const DWORD index, struct gc_arena *gc);
437
438const IP_ADAPTER_INFO *get_adapter(const IP_ADAPTER_INFO *ai, DWORD index);
439
440bool is_adapter_up(const struct tuntap *tt, const IP_ADAPTER_INFO *list);
441
442bool is_ip_in_adapter_subnet(const IP_ADAPTER_INFO *ai, const in_addr_t ip,
443 in_addr_t *highest_netmask);
444
445DWORD adapter_index_of_ip(const IP_ADAPTER_INFO *list, const in_addr_t ip, int *count,
446 in_addr_t *netmask);
447
448void show_tap_win_adapters(int msglev, int warnlev);
449
450void show_adapters(int msglev);
451
452void tap_allow_nonadmin_access(const char *dev_node);
453
455
456const char *tap_win_getinfo(const struct tuntap *tt, struct gc_arena *gc);
457
458void tun_show_debug(struct tuntap *tt);
459
460bool dhcp_release_by_adapter_index(const DWORD adapter_index);
461
462bool dhcp_renew_by_adapter_index(const DWORD adapter_index);
463
464void fork_register_dns_action(struct tuntap *tt);
465
466void ipconfig_register_dns(const struct env_set *es);
467
468void tun_standby_init(struct tuntap *tt);
469
470bool tun_standby(struct tuntap *tt);
471
472int tun_read_queue(struct tuntap *tt, int maxsize);
473
474int tun_write_queue(struct tuntap *tt, struct buffer *buf);
475
476static inline bool
478{
479 /*
480 * This corresponds to the STATUS_NO_SUCH_DEVICE
481 * error in tapdrvr.c.
482 */
483 if (status < 0)
484 {
485 return GetLastError() == ERROR_FILE_NOT_FOUND;
486 }
487 return false;
488}
489
490static inline bool
492{
493 /*
494 * Typically generated when driver is halted.
495 */
496 if (status < 0)
497 {
498 return GetLastError() == ERROR_OPERATION_ABORTED;
499 }
500 return false;
501}
502
503int tun_write_win32(struct tuntap *tt, struct buffer *buf);
504
505static inline bool
506is_ip_packet_valid(const struct buffer *buf)
507{
508 const struct openvpn_iphdr *ih = (const struct openvpn_iphdr *)BPTR(buf);
509
510 if (OPENVPN_IPH_GET_VER(ih->version_len) == 4)
511 {
512 if (BLEN(buf) < sizeof(struct openvpn_iphdr))
513 {
514 return false;
515 }
516 }
517 else if (OPENVPN_IPH_GET_VER(ih->version_len) == 6)
518 {
519 if (BLEN(buf) < sizeof(struct openvpn_ipv6hdr))
520 {
521 return false;
522 }
523 }
524 else
525 {
526 return false;
527 }
528
529 return true;
530}
531
532static inline bool
533tuntap_is_dco_win(struct tuntap *tt)
534{
535 return tt && tt->backend_driver == DRIVER_DCO;
536}
537
538static inline bool
540{
541 return tuntap_is_dco_win(tt) && (status < 0) && (openvpn_errno() == ERROR_NETNAME_DELETED);
542}
543
544#else /* ifdef _WIN32 */
545
546static inline bool
548{
549 return false;
550}
551
552static inline bool
554{
555 return false;
556}
557
558static inline void
559tun_standby_init(struct tuntap *tt)
560{
561}
562
563static inline bool
564tun_standby(struct tuntap *tt)
565{
566 return true;
567}
568
569
570static inline bool
571tuntap_is_dco_win(struct tuntap *tt)
572{
573 return false;
574}
575
576static inline bool
578{
579 return false;
580}
581
582#endif /* ifdef _WIN32 */
583
584/*
585 * TUN/TAP I/O wait functions
586 */
587
588static inline event_t
589tun_event_handle(const struct tuntap *tt)
590{
591#ifdef _WIN32
592 return &tt->rw_handle;
593#else
594 return tt->fd;
595#endif
596}
597
598static inline void
599tun_set(struct tuntap *tt, struct event_set *es, unsigned int rwflags, void *arg,
600 unsigned int *persistent)
601{
602 if (!tuntap_defined(tt) || tuntap_is_dco_win(tt))
603 {
604 return;
605 }
606
607 /* if persistent is defined, call event_ctl only if rwflags has changed since last call */
608 if (!persistent || *persistent != rwflags)
609 {
610 event_ctl(es, tun_event_handle(tt), rwflags, arg);
611 if (persistent)
612 {
613 *persistent = rwflags;
614 }
615 }
616#ifdef _WIN32
617 if (tt->backend_driver == WINDOWS_DRIVER_TAP_WINDOWS6 && (rwflags & EVENT_READ))
618 {
619 tun_read_queue(tt, 0);
620 }
621#endif
622 tt->rwflags_debug = rwflags;
623}
624
625const char *tun_stat(const struct tuntap *tt, unsigned int rwflags, struct gc_arena *gc);
626bool tun_name_is_fixed(const char *dev);
627
628static inline bool
629is_tun_type_set(const struct tuntap *tt)
630{
631 return tt && tt->type != DEV_TYPE_UNDEF;
632}
633
634static inline void
635open_tun_null(struct tuntap *tt)
636{
637 tt->actual_name = string_alloc("null", NULL);
638}
639#endif /* TUN_H */
char * string_alloc(const char *str, struct gc_arena *gc)
Definition buffer.c:649
#define BPTR(buf)
Definition buffer.h:123
#define BLEN(buf)
Definition buffer.h:126
void * dco_context_t
Definition dco.h:261
#define EVENT_READ
Definition event.h:38
static void event_ctl(struct event_set *es, event_t event, unsigned int rwflags, void *arg)
Definition event.h:183
static SERVICE_STATUS status
Definition interactive.c:51
void * openvpn_net_ctx_t
Definition networking.h:38
#define openvpn_errno()
Definition error.h:71
#define DEV_TYPE_UNDEF
Definition proto.h:34
#define OPENVPN_IPH_GET_VER(v)
Definition proto.h:91
pid_t childprocess
Definition tun.h:172
Wrapper structure for dynamically allocated memory.
Definition buffer.h:60
const char * device_interface
Definition tun.h:417
struct device_instance_id_interface * next
Definition tun.h:418
Packet geometry parameters.
Definition mtu.h:103
Garbage collection arena used to keep track of dynamically allocated memory.
Definition buffer.h:116
uint8_t version_len
Definition proto.h:93
struct panel_reg * next
Definition tun.h:411
const char * name
Definition tun.h:409
const char * guid
Definition tun.h:410
Definition tun.h:401
struct tap_reg * next
Definition tun.h:404
enum tun_driver_type windows_driver
Definition tun.h:403
const char * guid
Definition tun.h:402
int wins_len
Definition tun.h:118
struct in6_addr dns6[N_DHCP_ADDR]
Definition tun.h:142
in_addr_t nbdd[N_DHCP_ADDR]
Definition tun.h:125
int dns_len
Definition tun.h:114
int dns6_len
Definition tun.h:143
in_addr_t ntp[N_DHCP_ADDR]
Definition tun.h:121
int ntp_len
Definition tun.h:122
in_addr_t wins[N_DHCP_ADDR]
Definition tun.h:117
int tap_sleep
Definition tun.h:97
int dhcp_lease_time
Definition tun.h:94
in_addr_t dns[N_DHCP_ADDR]
Definition tun.h:113
const char * netbios_scope
Definition tun.h:105
int nbdd_len
Definition tun.h:126
bool ip_win32_defined
Definition tun.h:77
bool dhcp_masq_custom_offset
Definition tun.h:92
const char * domain
Definition tun.h:103
int domain_search_list_len
Definition tun.h:132
bool dhcp_renew
Definition tun.h:137
const char * domain_search_list[N_SEARCH_LIST_LEN]
Definition tun.h:131
HANDLE msg_channel
Definition tun.h:88
int dhcp_masq_offset
Definition tun.h:93
int netbios_node_type
Definition tun.h:107
int ip_win32_type
Definition tun.h:85
bool dhcp_pre_release
Definition tun.h:138
bool register_dns
Definition tun.h:140
bool disable_nbt
Definition tun.h:135
int dhcp_options
Definition tun.h:101
Definition tun.h:183
unsigned int rwflags_debug
Definition tun.h:247
in_addr_t local
Definition tun.h:210
int type
Definition tun.h:185
ULONG ipapi_instance
Definition tun.h:229
int netbits_ipv6
Definition tun.h:215
DWORD adapter_index
Definition tun.h:234
int standby_iter
Definition tun.h:236
struct rw_handle rw_handle
Definition tun.h:223
enum tun_driver_type backend_driver
The backend driver that used for this tun/tap device.
Definition tun.h:193
OVERLAPPED dco_new_peer_ov
Definition tun.h:220
bool did_ifconfig_ipv6_setup
if the internal variables related to ifconfig-ipv6 of this struct have been set up.
Definition tun.h:201
struct in6_addr remote_ipv6
Definition tun.h:214
bool did_ifconfig_setup
if the internal variables related to ifconfig of this struct have been set up.
Definition tun.h:197
int topology
Definition tun.h:188
struct overlapped_io writes
Definition tun.h:222
in_addr_t adapter_netmask
Definition tun.h:230
HANDLE hand
Definition tun.h:218
struct overlapped_io reads
Definition tun.h:221
struct in6_addr local_ipv6
Definition tun.h:213
ULONG ipapi_context
Definition tun.h:228
dco_context_t dco
Definition tun.h:249
char * actual_name
Definition tun.h:207
in_addr_t remote_netmask
Definition tun.h:211
afunix_context_t afunix
Definition tun.h:250
bool ipapi_context_defined
Definition tun.h:227
bool persistent_if
Definition tun.h:203
struct env_set * es
struct gc_arena gc
Definition test_ssl.c:154
void ipconfig_register_dns(const struct env_set *es)
Definition tun.c:5075
void tun_show_debug(struct tuntap *tt)
Definition tun.c:6429
static bool tuntap_abort(int status)
Definition tun.h:490
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:6372
int dev_type_enum(const char *dev, const char *dev_type)
Definition tun.c:517
void close_tun_handle(struct tuntap *tt)
Definition tun.c:6492
void fork_register_dns_action(struct tuntap *tt)
Definition tun.c:5760
#define IFCONFIG_AFTER_TUN_OPEN
Definition tun.h:349
#define N_SEARCH_LIST_LEN
Definition tun.h:128
#define IFCONFIG_BEFORE_TUN_OPEN
Definition tun.h:348
bool dhcp_renew_by_adapter_index(const DWORD adapter_index)
Definition tun.c:5008
int ascii2ipset(const char *name)
Definition tun.c:6623
const IP_ADAPTER_INFO * get_tun_adapter(const struct tuntap *tt, const IP_ADAPTER_INFO *list)
Definition tun.c:4489
bool is_adapter_up(const struct tuntap *tt, const IP_ADAPTER_INFO *list)
Definition tun.c:4502
const IP_ADAPTER_INFO * get_adapter_info(DWORD index, struct gc_arena *gc)
Definition tun.c:4404
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:826
const char * tun_stat(const struct tuntap *tt, unsigned int rwflags, struct gc_arena *gc)
Definition tun.c:727
static bool is_ip_packet_valid(const struct buffer *buf)
Definition tun.h:505
const IP_PER_ADAPTER_INFO * get_per_adapter_info(const DWORD index, struct gc_arena *gc)
Definition tun.c:4302
static bool tuntap_is_dco_win(struct tuntap *tt)
Definition tun.h:532
#define ROUTE_ORDER_DEFAULT
Definition tun.h:381
void show_tap_win_adapters(int msglev, int warnlev)
Definition tun.c:4001
int tun_write_win32(struct tuntap *tt, struct buffer *buf)
Definition tun.c:3574
bool is_ip_in_adapter_subnet(const IP_ADAPTER_INFO *ai, const in_addr_t ip, in_addr_t *highest_netmask)
Definition tun.c:4546
struct afunix_context afunix_context_t
const char * tap_win_getinfo(const struct tuntap *tt, struct gc_arena *gc)
Definition tun.c:6413
void show_adapters(int msglev)
Definition tun.c:4838
bool is_dev_type(const char *dev, const char *dev_type, const char *match_type)
Definition tun.c:499
int tun_write_queue(struct tuntap *tt, struct buffer *buf)
Definition tun.c:3519
static bool tuntap_defined(const struct tuntap *tt)
Definition tun.h:254
bool dhcp_release_by_adapter_index(const DWORD adapter_index)
Definition tun.c:4967
bool tun_standby(struct tuntap *tt)
Definition tun.c:5497
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:1562
const char * dev_type_string(const char *dev, const char *dev_type)
Definition tun.c:536
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:6523
const IP_ADAPTER_INFO * get_adapter_info_list(struct gc_arena *gc)
Definition tun.c:4277
void tap_allow_nonadmin_access(const char *dev_node)
Definition tun.c:4887
bool tun_name_is_fixed(const char *dev)
Definition tun.c:1776
const IP_ADAPTER_INFO * get_adapter(const IP_ADAPTER_INFO *ai, DWORD index)
Definition tun.c:4385
static void tun_set(struct tuntap *tt, struct event_set *es, unsigned int rwflags, void *arg, unsigned int *persistent)
Definition tun.h:598
#define IFCONFIG_DEFAULT
Definition tun.h:351
void warn_on_use_of_common_subnets(openvpn_net_ctx_t *ctx)
Definition tun.c:666
#define N_DHCP_ADDR
Definition tun.h:109
int tun_read_queue(struct tuntap *tt, int maxsize)
Definition tun.c:3463
static event_t tun_event_handle(const struct tuntap *tt)
Definition tun.h:588
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:950
static int ifconfig_order(struct tuntap *tt)
Definition tun.h:354
static void open_tun_null(struct tuntap *tt)
Definition tun.h:634
const char * ifconfig_options_string(const struct tuntap *tt, bool remote, bool disable, struct gc_arena *gc)
Definition tun.c:690
const char * guess_tuntap_dev(const char *dev, const char *dev_type, const char *dev_node, struct gc_arena *gc)
Definition tun.c:556
const char * ipset2ascii(int index)
Definition tun.c:6638
void do_ifconfig_setenv(const struct tuntap *tt, struct env_set *es)
Definition tun.c:782
static bool tuntap_is_dco_win_timeout(struct tuntap *tt, int status)
Definition tun.h:538
void undo_ifconfig(struct tuntap *tt, openvpn_net_ctx_t *ctx)
undo_ifconfig - undo configuration of the tunnel interface
Definition tun.c:1651
bool is_tun_p2p(const struct tuntap *tt)
Definition tun.c:758
const char * ipset2ascii_all(struct gc_arena *gc)
Definition tun.c:6652
static int route_order(struct tuntap *tt)
Definition tun.h:384
void tun_standby_init(struct tuntap *tt)
Definition tun.c:5491
void show_valid_win32_tun_subnets(void)
Definition tun.c:3968
static bool tuntap_stop(int status)
Definition tun.h:476
const char * print_tun_backend_driver(enum tun_driver_type driver)
Return a string representation of the tun backed driver type.
Definition tun.c:58
#define ROUTE_BEFORE_TUN
Definition tun.h:379
static bool is_tun_type_set(const struct tuntap *tt)
Definition tun.h:628
DWORD adapter_index_of_ip(const IP_ADAPTER_INFO *list, const in_addr_t ip, int *count, in_addr_t *netmask)
Definition tun.c:4580
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:6190
void verify_255_255_255_252(in_addr_t local, in_addr_t remote)
Definition tun.c:3932
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)