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-2024 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 "ring_buffer.h"
43#include "dco.h"
44
59
60#ifdef _WIN32
61#define WINTUN_COMPONENT_ID "wintun"
62#define DCO_WIN_REFERENCE_STRING "ovpn-dco"
63#endif
64
65#if defined(_WIN32) || defined(TARGET_ANDROID)
66
67#define TUN_ADAPTER_INDEX_INVALID ((DWORD)-1)
68
69/* time constants for --ip-win32 adaptive */
70#define IPW32_SET_ADAPTIVE_DELAY_WINDOW 300
71#define IPW32_SET_ADAPTIVE_TRY_NETSH 20
72
73/* bit flags for DHCP options */
74#define DHCP_OPTIONS_DHCP_OPTIONAL (1<<0)
75#define DHCP_OPTIONS_DHCP_REQUIRED (1<<1)
76
78 /* --ip-win32 options */
80
81#define IPW32_SET_MANUAL 0 /* "--ip-win32 manual" */
82#define IPW32_SET_NETSH 1 /* "--ip-win32 netsh" */
83#define IPW32_SET_IPAPI 2 /* "--ip-win32 ipapi" */
84#define IPW32_SET_DHCP_MASQ 3 /* "--ip-win32 dynamic" */
85#define IPW32_SET_ADAPTIVE 4 /* "--ip-win32 adaptive" */
86#define IPW32_SET_N 5
88
89#ifdef _WIN32
91#endif
92
93 /* --ip-win32 dynamic options */
97
98 /* --tap-sleep option */
100
101 /* --dhcp-option options */
102
104
105 const char *domain; /* DOMAIN (15) */
106
107 const char *netbios_scope; /* NBS (47) */
108
109 int netbios_node_type; /* NBT 1,2,4,8 (46) */
110
111#define N_DHCP_ADDR 4 /* Max # of addresses allowed for
112 * DNS, WINS, etc. */
113
114 /* DNS (6) */
115 in_addr_t dns[N_DHCP_ADDR];
116 int dns_len;
117
118 /* WINS (44) */
119 in_addr_t wins[N_DHCP_ADDR];
120 int wins_len;
121
122 /* NTP (42) */
123 in_addr_t ntp[N_DHCP_ADDR];
124 int ntp_len;
125
126 /* NBDD (45) */
127 in_addr_t nbdd[N_DHCP_ADDR];
128 int nbdd_len;
130#define N_SEARCH_LIST_LEN 10 /* Max # of entries in domin-search list */
131
132 /* SEARCH (119), MacOS, Linux, Win10 1809+ */
135
136 /* DISABLE_NBT (43, Vendor option 001) */
137 bool disable_nbt;
140 bool dhcp_pre_release;
142 bool register_dns;
144 struct in6_addr dns6[N_DHCP_ADDR];
145 int dns6_len;
146#if defined(TARGET_ANDROID)
147 const char *http_proxy;
148 int http_proxy_port;
149#endif
150};
151
152#elif defined(TARGET_LINUX)
153
154struct tuntap_options {
155 int txqueuelen;
156};
157
158#else /* if defined(_WIN32) || defined(TARGET_ANDROID) */
159
160struct tuntap_options {
161 int dummy; /* not used */
162};
163
164#endif /* if defined(_WIN32) || defined(TARGET_ANDROID) */
165
166/*
167 * Define a TUN/TAP dev.
168 */
169#ifndef WIN32
170typedef struct afunix_context
174
175#else /* ifndef WIN32 */
176typedef struct {
177 int dummy;
179#endif
181struct tuntap
183#define TUNNEL_TYPE(tt) ((tt) ? ((tt)->type) : DEV_TYPE_UNDEF)
184 int type; /* DEV_TYPE_x as defined in proto.h */
186#define TUNNEL_TOPOLOGY(tt) ((tt) ? ((tt)->topology) : TOP_UNDEF)
187 int topology; /* one of the TOP_x values */
188
193
197
202 bool persistent_if; /* if existed before, keep on program end */
204 struct tuntap_options options; /* options set on command line */
206 char *actual_name; /* actual name of TUN/TAP dev, usually including unit number */
207
208 /* ifconfig parameters */
209 in_addr_t local;
210 in_addr_t remote_netmask;
212 struct in6_addr local_ipv6;
213 struct in6_addr remote_ipv6;
214 int netbits_ipv6;
215
216#ifdef _WIN32
217 HANDLE hand;
218 OVERLAPPED dco_new_peer_ov; /* used for async NEW_PEER dco call, which might wait for TCP connect */
221 struct rw_handle rw_handle;
222
223 /* used for setting interface address via IP Helper API
224 * or DHCP masquerade */
228 in_addr_t adapter_netmask;
229
230 /* Windows adapter index for TAP-Windows adapter,
231 * ~0 if undefined */
232 DWORD adapter_index;
234 int standby_iter;
240#else /* ifdef _WIN32 */
241 int fd; /* file descriptor for TUN/TAP dev */
242#endif /* ifdef _WIN32 */
243
244#ifdef TARGET_SOLARIS
245 int ip_fd;
246#endif
247
248 /* used for printing status info only */
249 unsigned int rwflags_debug;
253};
254
255static inline bool
256tuntap_defined(const struct tuntap *tt)
257{
258#ifdef _WIN32
259 return tt && tt->hand != NULL;
260#else
261 return tt && tt->fd >= 0;
262#endif
263}
264
265#ifdef _WIN32
266static inline bool
267tuntap_is_wintun(struct tuntap *tt)
268{
269 return tt && tt->backend_driver == WINDOWS_DRIVER_WINTUN;
270}
271
272static inline bool
273tuntap_ring_empty(struct tuntap *tt)
274{
275 return tuntap_is_wintun(tt) && (tt->wintun_send_ring->head == tt->wintun_send_ring->tail);
276}
277#endif
278
279/*
280 * Function prototypes
281 */
282
283void open_tun(const char *dev, const char *dev_type, const char *dev_node,
284 struct tuntap *tt, openvpn_net_ctx_t *ctx);
285
286void close_tun(struct tuntap *tt, openvpn_net_ctx_t *ctx);
287
288void tun_open_device(struct tuntap *tt, const char *dev_node,
289 const char **device_guid, struct gc_arena *gc);
290
291void close_tun_handle(struct tuntap *tt);
293int write_tun(struct tuntap *tt, uint8_t *buf, int len);
295int read_tun(struct tuntap *tt, uint8_t *buf, int len);
297void tuncfg(const char *dev, const char *dev_type, const char *dev_node,
298 int persist_mode, const char *username,
299 const char *groupname, const struct tuntap_options *options,
300 openvpn_net_ctx_t *ctx);
301
302const char *guess_tuntap_dev(const char *dev,
303 const char *dev_type,
304 const char *dev_node,
305 struct gc_arena *gc);
306
307struct tuntap *init_tun(const char *dev, /* --dev option */
308 const char *dev_type, /* --dev-type option */
309 int topology, /* one of the TOP_x values */
310 const char *ifconfig_local_parm, /* --ifconfig parm 1 */
311 const char *ifconfig_remote_netmask_parm, /* --ifconfig parm 2 */
312 const char *ifconfig_ipv6_local_parm, /* --ifconfig parm 1 / IPv6 */
313 int ifconfig_ipv6_netbits_parm, /* --ifconfig parm 1 / bits */
314 const char *ifconfig_ipv6_remote_parm, /* --ifconfig parm 2 / IPv6 */
315 struct addrinfo *local_public,
316 struct addrinfo *remote_public,
317 const bool strict_warn,
318 struct env_set *es,
320 struct tuntap *tt);
321
322void init_tun_post(struct tuntap *tt,
323 const struct frame *frame,
324 const struct tuntap_options *options);
325
326void do_ifconfig_setenv(const struct tuntap *tt,
327 struct env_set *es);
328
338void do_ifconfig(struct tuntap *tt, const char *ifname, int tun_mtu,
339 const struct env_set *es, openvpn_net_ctx_t *ctx);
340
347void undo_ifconfig(struct tuntap *tt, openvpn_net_ctx_t *ctx);
348
349bool is_dev_type(const char *dev, const char *dev_type, const char *match_type);
350
351int dev_type_enum(const char *dev, const char *dev_type);
352
353const char *dev_type_string(const char *dev, const char *dev_type);
354
355const char *ifconfig_options_string(const struct tuntap *tt, bool remote, bool disable, struct gc_arena *gc);
356
357bool is_tun_p2p(const struct tuntap *tt);
358
360
364const char *
366
367/*
368 * Should ifconfig be called before or after
369 * tun dev open?
370 */
372#define IFCONFIG_BEFORE_TUN_OPEN 0
373#define IFCONFIG_AFTER_TUN_OPEN 1
375#define IFCONFIG_DEFAULT IFCONFIG_AFTER_TUN_OPEN
376
377static inline int
378ifconfig_order(struct tuntap *tt)
379{
380 if (tt->backend_driver == DRIVER_AFUNIX)
381 {
383 }
384#if defined(TARGET_LINUX)
386#elif defined(TARGET_SOLARIS)
388#elif defined(TARGET_OPENBSD)
390#elif defined(TARGET_DARWIN)
392#elif defined(TARGET_NETBSD)
394#elif defined(_WIN32)
396#elif defined(TARGET_ANDROID)
398#else /* if defined(TARGET_LINUX) */
399 return IFCONFIG_DEFAULT;
400#endif
401}
403#define ROUTE_BEFORE_TUN 0
404#define ROUTE_AFTER_TUN 1
405#define ROUTE_ORDER_DEFAULT ROUTE_AFTER_TUN
406
407static inline int
408route_order(struct tuntap *tt)
409{
410 if (tt->backend_driver == DRIVER_AFUNIX)
411 {
412 return ROUTE_BEFORE_TUN;
413 }
414#if defined(TARGET_ANDROID)
415 return ROUTE_BEFORE_TUN;
416#else
417 return ROUTE_ORDER_DEFAULT;
418#endif
419}
420
421
422#ifdef _WIN32
424struct tap_reg
426 const char *guid;
428 struct tap_reg *next;
429};
431struct panel_reg
433 const char *name;
434 const char *guid;
435 struct panel_reg *next;
436};
443};
444
445int ascii2ipset(const char *name);
446
447const char *ipset2ascii(int index);
448
449const char *ipset2ascii_all(struct gc_arena *gc);
450
451void verify_255_255_255_252(in_addr_t local, in_addr_t remote);
452
453const IP_ADAPTER_INFO *get_adapter_info_list(struct gc_arena *gc);
454
455const IP_ADAPTER_INFO *get_tun_adapter(const struct tuntap *tt, const IP_ADAPTER_INFO *list);
456
457const IP_ADAPTER_INFO *get_adapter_info(DWORD index, struct gc_arena *gc);
458
459const IP_PER_ADAPTER_INFO *get_per_adapter_info(const DWORD index, struct gc_arena *gc);
460
461const IP_ADAPTER_INFO *get_adapter(const IP_ADAPTER_INFO *ai, DWORD index);
462
463bool is_adapter_up(const struct tuntap *tt, const IP_ADAPTER_INFO *list);
464
465bool is_ip_in_adapter_subnet(const IP_ADAPTER_INFO *ai, const in_addr_t ip, in_addr_t *highest_netmask);
466
467DWORD adapter_index_of_ip(const IP_ADAPTER_INFO *list,
468 const in_addr_t ip,
469 int *count,
470 in_addr_t *netmask);
471
472void show_tap_win_adapters(int msglev, int warnlev);
473
474void show_adapters(int msglev);
475
476void tap_allow_nonadmin_access(const char *dev_node);
477
479
480const char *tap_win_getinfo(const struct tuntap *tt, struct gc_arena *gc);
481
482void tun_show_debug(struct tuntap *tt);
483
484bool dhcp_release_by_adapter_index(const DWORD adapter_index);
485
486bool dhcp_renew_by_adapter_index(const DWORD adapter_index);
487
488void fork_register_dns_action(struct tuntap *tt);
489
490void ipconfig_register_dns(const struct env_set *es);
491
492void tun_standby_init(struct tuntap *tt);
493
494bool tun_standby(struct tuntap *tt);
495
496int tun_read_queue(struct tuntap *tt, int maxsize);
497
498int tun_write_queue(struct tuntap *tt, struct buffer *buf);
499
500static inline bool
502{
503 /*
504 * This corresponds to the STATUS_NO_SUCH_DEVICE
505 * error in tapdrvr.c.
506 */
507 if (status < 0)
508 {
509 return GetLastError() == ERROR_FILE_NOT_FOUND;
510 }
511 return false;
512}
513
514static inline bool
516{
517 /*
518 * Typically generated when driver is halted.
519 */
520 if (status < 0)
521 {
522 return GetLastError() == ERROR_OPERATION_ABORTED;
523 }
524 return false;
525}
526
527int tun_write_win32(struct tuntap *tt, struct buffer *buf);
528
529static inline ULONG
530wintun_ring_packet_align(ULONG size)
531{
532 return (size + (WINTUN_PACKET_ALIGN - 1)) & ~(WINTUN_PACKET_ALIGN - 1);
533}
534
535static inline ULONG
536wintun_ring_wrap(ULONG value)
537{
538 return value & (WINTUN_RING_CAPACITY - 1);
539}
540
541static inline void
542read_wintun(struct tuntap *tt, struct buffer *buf)
543{
544 struct tun_ring *ring = tt->wintun_send_ring;
545 ULONG head = ring->head;
546 ULONG tail = ring->tail;
547 ULONG content_len;
548 struct TUN_PACKET *packet;
549 ULONG aligned_packet_size;
550
551 *buf = tt->reads.buf_init;
552 buf->len = 0;
553
554 if ((head >= WINTUN_RING_CAPACITY) || (tail >= WINTUN_RING_CAPACITY))
555 {
556 msg(M_INFO, "Wintun: ring capacity exceeded");
557 buf->len = -1;
558 return;
559 }
560
561 if (head == tail)
562 {
563 /* nothing to read */
564 return;
565 }
566
567 content_len = wintun_ring_wrap(tail - head);
568 if (content_len < sizeof(struct TUN_PACKET_HEADER))
569 {
570 msg(M_INFO, "Wintun: incomplete packet header in send ring");
571 buf->len = -1;
572 return;
573 }
574
575 packet = (struct TUN_PACKET *) &ring->data[head];
576 if (packet->size > WINTUN_MAX_PACKET_SIZE)
577 {
578 msg(M_INFO, "Wintun: packet too big in send ring");
579 buf->len = -1;
580 return;
581 }
582
583 aligned_packet_size = wintun_ring_packet_align(sizeof(struct TUN_PACKET_HEADER) + packet->size);
584 if (aligned_packet_size > content_len)
585 {
586 msg(M_INFO, "Wintun: incomplete packet in send ring");
587 buf->len = -1;
588 return;
589 }
590
591 buf_write(buf, packet->data, packet->size);
592
593 head = wintun_ring_wrap(head + aligned_packet_size);
594 ring->head = head;
595}
596
597static inline bool
598is_ip_packet_valid(const struct buffer *buf)
599{
600 const struct openvpn_iphdr *ih = (const struct openvpn_iphdr *)BPTR(buf);
601
602 if (OPENVPN_IPH_GET_VER(ih->version_len) == 4)
603 {
604 if (BLEN(buf) < sizeof(struct openvpn_iphdr))
605 {
606 return false;
607 }
608 }
609 else if (OPENVPN_IPH_GET_VER(ih->version_len) == 6)
610 {
611 if (BLEN(buf) < sizeof(struct openvpn_ipv6hdr))
612 {
613 return false;
614 }
615 }
616 else
617 {
618 return false;
619 }
620
621 return true;
622}
623
624static inline int
625write_wintun(struct tuntap *tt, struct buffer *buf)
626{
627 struct tun_ring *ring = tt->wintun_receive_ring;
628 ULONG head = ring->head;
629 ULONG tail = ring->tail;
630 ULONG aligned_packet_size;
631 ULONG buf_space;
632 struct TUN_PACKET *packet;
633
634 /* wintun marks ring as corrupted (overcapacity) if it receives invalid IP packet */
635 if (!is_ip_packet_valid(buf))
636 {
637 msg(D_LOW, "write_wintun(): drop invalid IP packet");
638 return 0;
639 }
640
641 if ((head >= WINTUN_RING_CAPACITY) || (tail >= WINTUN_RING_CAPACITY))
642 {
643 msg(M_INFO, "write_wintun(): head/tail value is over capacity");
644 return -1;
645 }
646
647 aligned_packet_size = wintun_ring_packet_align(sizeof(struct TUN_PACKET_HEADER) + BLEN(buf));
648 buf_space = wintun_ring_wrap(head - tail - WINTUN_PACKET_ALIGN);
649 if (aligned_packet_size > buf_space)
650 {
651 msg(M_INFO, "write_wintun(): ring is full");
652 return 0;
653 }
654
655 /* copy packet size and data into ring */
656 packet = (struct TUN_PACKET * )&ring->data[tail];
657 packet->size = BLEN(buf);
658 memcpy(packet->data, BPTR(buf), BLEN(buf));
659
660 /* move ring tail */
661 ring->tail = wintun_ring_wrap(tail + aligned_packet_size);
662 if (ring->alertable != 0)
663 {
664 SetEvent(tt->rw_handle.write);
665 }
666
667 return BLEN(buf);
668}
669
670static inline int
671write_tun_buffered(struct tuntap *tt, struct buffer *buf)
672{
674 {
675 return write_wintun(tt, buf);
676 }
677 else
678 {
679 return tun_write_win32(tt, buf);
680 }
681}
682
683static inline bool
684tuntap_is_dco_win(struct tuntap *tt)
685{
686 return tt && tt->backend_driver == DRIVER_DCO;
687}
688
689static inline bool
691{
692 return tuntap_is_dco_win(tt) && (status < 0) && (openvpn_errno() == ERROR_NETNAME_DELETED);
693}
694
695#else /* ifdef _WIN32 */
696
697static inline bool
699{
700 return false;
701}
702
703static inline bool
705{
706 return false;
707}
708
709static inline void
710tun_standby_init(struct tuntap *tt)
711{
712}
713
714static inline bool
715tun_standby(struct tuntap *tt)
716{
717 return true;
718}
719
720
721static inline bool
722tuntap_is_dco_win(struct tuntap *tt)
723{
724 return false;
725}
726
727static inline bool
729{
730 return false;
731}
732
733#endif /* ifdef _WIN32 */
734
735/*
736 * TUN/TAP I/O wait functions
737 */
738
739static inline event_t
740tun_event_handle(const struct tuntap *tt)
741{
742#ifdef _WIN32
743 return &tt->rw_handle;
744#else
745 return tt->fd;
746#endif
747}
748
749static inline void
750tun_set(struct tuntap *tt,
751 struct event_set *es,
752 unsigned int rwflags,
753 void *arg,
754 unsigned int *persistent)
755{
756 if (!tuntap_defined(tt) || tuntap_is_dco_win(tt))
757 {
758 return;
759 }
760
761 /* if persistent is defined, call event_ctl only if rwflags has changed since last call */
762 if (!persistent || *persistent != rwflags)
763 {
764 event_ctl(es, tun_event_handle(tt), rwflags, arg);
765 if (persistent)
766 {
767 *persistent = rwflags;
768 }
769 }
770#ifdef _WIN32
771 if (tt->backend_driver == WINDOWS_DRIVER_TAP_WINDOWS6 && (rwflags & EVENT_READ))
772 {
773 tun_read_queue(tt, 0);
774 }
775#endif
776 tt->rwflags_debug = rwflags;
777
778}
779
780const char *tun_stat(const struct tuntap *tt, unsigned int rwflags, struct gc_arena *gc);
781bool tun_name_is_fixed(const char *dev);
782
783static inline bool
784is_tun_type_set(const struct tuntap *tt)
785{
786 return tt && tt->type != DEV_TYPE_UNDEF;
787}
788
789static inline void
790open_tun_null(struct tuntap *tt)
791{
792 tt->actual_name = string_alloc("null", NULL);
793}
794#endif /* TUN_H */
char * string_alloc(const char *str, struct gc_arena *gc)
Definition buffer.c:649
#define BPTR(buf)
Definition buffer.h:124
static bool buf_write(struct buffer *dest, const void *src, size_t size)
Definition buffer.h:668
#define BLEN(buf)
Definition buffer.h:127
void * dco_context_t
Definition dco.h:267
#define D_LOW
Definition errlevel.h:97
#define M_INFO
Definition errlevel.h:55
#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:53
void * openvpn_net_ctx_t
Definition networking.h:39
#define openvpn_errno()
Definition error.h:72
#define msg(flags,...)
Definition error.h:144
#define DEV_TYPE_UNDEF
Definition proto.h:35
#define OPENVPN_IPH_GET_VER(v)
Definition proto.h:93
#define WINTUN_PACKET_ALIGN
Definition ring_buffer.h:42
#define WINTUN_MAX_PACKET_SIZE
Definition ring_buffer.h:41
#define WINTUN_RING_CAPACITY
Definition ring_buffer.h:39
UCHAR data[WINTUN_MAX_PACKET_SIZE]
Definition ring_buffer.h:80
uint32_t size
Definition ring_buffer.h:79
pid_t childprocess
Definition tun.h:171
Wrapper structure for dynamically allocated memory.
Definition buffer.h:61
int len
Length in bytes of the actual content within the allocated memory.
Definition buffer.h:66
const char * device_interface
Definition tun.h:440
struct device_instance_id_interface * next
Definition tun.h:441
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 buffer buf_init
Definition win32.h:217
struct panel_reg * next
Definition tun.h:434
const char * name
Definition tun.h:432
const char * guid
Definition tun.h:433
HANDLE write
Definition win32.h:81
Definition tun.h:424
struct tap_reg * next
Definition tun.h:427
enum tun_driver_type windows_driver
Definition tun.h:426
const char * guid
Definition tun.h:425
Wintun ring buffer See https://github.com/WireGuard/wintun#ring-layout.
Definition ring_buffer.h:51
UCHAR data[WINTUN_RING_CAPACITY+WINTUN_RING_TRAILING_BYTES]
Definition ring_buffer.h:55
volatile LONG alertable
Definition ring_buffer.h:54
volatile ULONG head
Definition ring_buffer.h:52
volatile ULONG tail
Definition ring_buffer.h:53
int wins_len
Definition tun.h:119
struct in6_addr dns6[N_DHCP_ADDR]
Definition tun.h:143
in_addr_t nbdd[N_DHCP_ADDR]
Definition tun.h:126
int dns_len
Definition tun.h:115
int dns6_len
Definition tun.h:144
in_addr_t ntp[N_DHCP_ADDR]
Definition tun.h:122
int ntp_len
Definition tun.h:123
in_addr_t wins[N_DHCP_ADDR]
Definition tun.h:118
int tap_sleep
Definition tun.h:99
int dhcp_lease_time
Definition tun.h:96
in_addr_t dns[N_DHCP_ADDR]
Definition tun.h:114
const char * netbios_scope
Definition tun.h:107
int nbdd_len
Definition tun.h:127
bool ip_win32_defined
Definition tun.h:79
bool dhcp_masq_custom_offset
Definition tun.h:94
const char * domain
Definition tun.h:105
int domain_search_list_len
Definition tun.h:133
bool dhcp_renew
Definition tun.h:138
const char * domain_search_list[N_SEARCH_LIST_LEN]
Definition tun.h:132
HANDLE msg_channel
Definition tun.h:90
int dhcp_masq_offset
Definition tun.h:95
int netbios_node_type
Definition tun.h:109
int ip_win32_type
Definition tun.h:87
bool dhcp_pre_release
Definition tun.h:139
bool register_dns
Definition tun.h:141
bool disable_nbt
Definition tun.h:136
int dhcp_options
Definition tun.h:103
Definition tun.h:181
unsigned int rwflags_debug
Definition tun.h:248
in_addr_t local
Definition tun.h:208
int type
Definition tun.h:183
ULONG ipapi_instance
Definition tun.h:226
int netbits_ipv6
Definition tun.h:213
DWORD adapter_index
Definition tun.h:231
int standby_iter
Definition tun.h:233
struct rw_handle rw_handle
Definition tun.h:220
enum tun_driver_type backend_driver
The backend driver that used for this tun/tap device.
Definition tun.h:191
HANDLE wintun_receive_ring_handle
Definition tun.h:236
OVERLAPPED dco_new_peer_ov
Definition tun.h:217
bool did_ifconfig_ipv6_setup
if the internal variables related to ifconfig-ipv6 of this struct have been set up.
Definition tun.h:199
struct in6_addr remote_ipv6
Definition tun.h:212
bool did_ifconfig_setup
if the internal variables related to ifconfig of this struct have been set up.
Definition tun.h:195
int topology
Definition tun.h:186
struct overlapped_io writes
Definition tun.h:219
in_addr_t adapter_netmask
Definition tun.h:227
HANDLE hand
Definition tun.h:216
struct tun_ring * wintun_receive_ring
Definition tun.h:238
struct overlapped_io reads
Definition tun.h:218
struct in6_addr local_ipv6
Definition tun.h:211
HANDLE wintun_send_ring_handle
Definition tun.h:235
ULONG ipapi_context
Definition tun.h:225
dco_context_t dco
Definition tun.h:250
char * actual_name
Definition tun.h:205
struct tun_ring * wintun_send_ring
Definition tun.h:237
in_addr_t remote_netmask
Definition tun.h:209
afunix_context_t afunix
Definition tun.h:251
bool ipapi_context_defined
Definition tun.h:224
bool persistent_if
Definition tun.h:201
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:5356
void tun_show_debug(struct tuntap *tt)
Definition tun.c:6886
static bool tuntap_abort(int status)
Definition tun.h:514
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:6829
int dev_type_enum(const char *dev, const char *dev_type)
Definition tun.c:554
void close_tun_handle(struct tuntap *tt)
Definition tun.c:6963
void fork_register_dns_action(struct tuntap *tt)
Definition tun.c:6130
#define IFCONFIG_AFTER_TUN_OPEN
Definition tun.h:372
static void read_wintun(struct tuntap *tt, struct buffer *buf)
Definition tun.h:541
#define N_SEARCH_LIST_LEN
Definition tun.h:129
static bool tuntap_is_wintun(struct tuntap *tt)
Definition tun.h:266
#define IFCONFIG_BEFORE_TUN_OPEN
Definition tun.h:371
bool dhcp_renew_by_adapter_index(const DWORD adapter_index)
Definition tun.c:5290
int ascii2ipset(const char *name)
Definition tun.c:7107
const IP_ADAPTER_INFO * get_tun_adapter(const struct tuntap *tt, const IP_ADAPTER_INFO *list)
Definition tun.c:4741
bool is_adapter_up(const struct tuntap *tt, const IP_ADAPTER_INFO *list)
Definition tun.c:4754
static bool tuntap_ring_empty(struct tuntap *tt)
Definition tun.h:272
const IP_ADAPTER_INFO * get_adapter_info(DWORD index, struct gc_arena *gc)
Definition tun.c:4656
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:881
const char * tun_stat(const struct tuntap *tt, unsigned int rwflags, struct gc_arena *gc)
Definition tun.c:778
static bool is_ip_packet_valid(const struct buffer *buf)
Definition tun.h:597
const IP_PER_ADAPTER_INFO * get_per_adapter_info(const DWORD index, struct gc_arena *gc)
Definition tun.c:4550
static bool tuntap_is_dco_win(struct tuntap *tt)
Definition tun.h:683
#define ROUTE_ORDER_DEFAULT
Definition tun.h:404
void show_tap_win_adapters(int msglev, int warnlev)
Definition tun.c:4244
int tun_write_win32(struct tuntap *tt, struct buffer *buf)
Definition tun.c:3756
bool is_ip_in_adapter_subnet(const IP_ADAPTER_INFO *ai, const in_addr_t ip, in_addr_t *highest_netmask)
Definition tun.c:4799
struct afunix_context afunix_context_t
const char * tap_win_getinfo(const struct tuntap *tt, struct gc_arena *gc)
Definition tun.c:6868
void show_adapters(int msglev)
Definition tun.c:5099
bool is_dev_type(const char *dev, const char *dev_type, const char *match_type)
Definition tun.c:536
static int write_tun_buffered(struct tuntap *tt, struct buffer *buf)
Definition tun.h:670
int tun_write_queue(struct tuntap *tt, struct buffer *buf)
Definition tun.c:3693
static bool tuntap_defined(const struct tuntap *tt)
Definition tun.h:255
bool dhcp_release_by_adapter_index(const DWORD adapter_index)
Definition tun.c:5250
bool tun_standby(struct tuntap *tt)
Definition tun.c:5823
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:1693
const char * dev_type_string(const char *dev, const char *dev_type)
Definition tun.c:573
static int write_wintun(struct tuntap *tt, struct buffer *buf)
Definition tun.h:624
tun_driver_type
Definition tun.h:45
@ WINDOWS_DRIVER_WINTUN
Definition tun.h:48
@ DRIVER_NULL
Definition tun.h:54
@ WINDOWS_DRIVER_UNSPECIFIED
Definition tun.h:46
@ DRIVER_UTUN
macOS internal tun driver
Definition tun.h:57
@ DRIVER_GENERIC_TUNTAP
Definition tun.h:49
@ DRIVER_AFUNIX
using an AF_UNIX socket to pass packets from/to an external program.
Definition tun.h:53
@ WINDOWS_DRIVER_TAP_WINDOWS6
Definition tun.h:47
@ DRIVER_DCO
Definition tun.h:55
void close_tun(struct tuntap *tt, openvpn_net_ctx_t *ctx)
Definition tun.c:7004
const IP_ADAPTER_INFO * get_adapter_info_list(struct gc_arena *gc)
Definition tun.c:4523
static ULONG wintun_ring_packet_align(ULONG size)
Definition tun.h:529
void tap_allow_nonadmin_access(const char *dev_node)
Definition tun.c:5148
bool tun_name_is_fixed(const char *dev)
Definition tun.c:1917
const IP_ADAPTER_INFO * get_adapter(const IP_ADAPTER_INFO *ai, DWORD index)
Definition tun.c:4637
static void tun_set(struct tuntap *tt, struct event_set *es, unsigned int rwflags, void *arg, unsigned int *persistent)
Definition tun.h:749
#define IFCONFIG_DEFAULT
Definition tun.h:374
void warn_on_use_of_common_subnets(openvpn_net_ctx_t *ctx)
Definition tun.c:717
#define N_DHCP_ADDR
Definition tun.h:111
int tun_read_queue(struct tuntap *tt, int maxsize)
Definition tun.c:3629
static event_t tun_event_handle(const struct tuntap *tt)
Definition tun.h:739
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:1027
static int ifconfig_order(struct tuntap *tt)
Definition tun.h:377
static void open_tun_null(struct tuntap *tt)
Definition tun.h:789
const char * ifconfig_options_string(const struct tuntap *tt, bool remote, bool disable, struct gc_arena *gc)
Definition tun.c:740
const char * guess_tuntap_dev(const char *dev, const char *dev_type, const char *dev_node, struct gc_arena *gc)
Definition tun.c:593
const char * ipset2ascii(int index)
Definition tun.c:7122
void do_ifconfig_setenv(const struct tuntap *tt, struct env_set *es)
Definition tun.c:837
static bool tuntap_is_dco_win_timeout(struct tuntap *tt, int status)
Definition tun.h:689
void undo_ifconfig(struct tuntap *tt, openvpn_net_ctx_t *ctx)
undo_ifconfig - undo configuration of the tunnel interface
Definition tun.c:1792
bool is_tun_p2p(const struct tuntap *tt)
Definition tun.c:813
const char * ipset2ascii_all(struct gc_arena *gc)
Definition tun.c:7136
static int route_order(struct tuntap *tt)
Definition tun.h:407
void tun_standby_init(struct tuntap *tt)
Definition tun.c:5817
void show_valid_win32_tun_subnets(void)
Definition tun.c:4211
static bool tuntap_stop(int status)
Definition tun.h:500
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
static ULONG wintun_ring_wrap(ULONG value)
Definition tun.h:535
#define ROUTE_BEFORE_TUN
Definition tun.h:402
static bool is_tun_type_set(const struct tuntap *tt)
Definition tun.h:783
DWORD adapter_index_of_ip(const IP_ADAPTER_INFO *list, const in_addr_t ip, int *count, in_addr_t *netmask)
Definition tun.c:4832
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:6648
void verify_255_255_255_252(in_addr_t local, in_addr_t remote)
Definition tun.c:4174
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)