29#include <tap-windows.h>
59#define DCO_WIN_REFERENCE_STRING "ovpn-dco"
62#if defined(_WIN32) || defined(TARGET_ANDROID)
64#define TUN_ADAPTER_INDEX_INVALID ((DWORD)-1)
67#define IPW32_SET_ADAPTIVE_DELAY_WINDOW 300
68#define IPW32_SET_ADAPTIVE_TRY_NETSH 20
71#define DHCP_OPTIONS_DHCP_OPTIONAL (1<<0)
72#define DHCP_OPTIONS_DHCP_REQUIRED (1<<1)
78#define IPW32_SET_MANUAL 0
79#define IPW32_SET_NETSH 1
80#define IPW32_SET_IPAPI 2
81#define IPW32_SET_DHCP_MASQ 3
82#define IPW32_SET_ADAPTIVE 4
127#define N_SEARCH_LIST_LEN 10
143#if defined(TARGET_ANDROID)
144 const char *http_proxy;
149#elif defined(TARGET_LINUX)
180#define TUNNEL_TYPE(tt) ((tt) ? ((tt)->type) : DEV_TYPE_UNDEF)
183#define TUNNEL_TOPOLOGY(tt) ((tt) ? ((tt)->topology) : TOP_UNDEF)
253 return tt && tt->
hand != NULL;
255 return tt && tt->fd >= 0;
263void open_tun(
const char *dev,
const char *dev_type,
const char *dev_node,
269 const char **device_guid,
struct gc_arena *
gc);
277void tuncfg(
const char *dev,
const char *dev_type,
const char *dev_node,
278 int persist_mode,
const char *username,
283 const char *dev_type,
284 const char *dev_node,
288 const char *dev_type,
290 const char *ifconfig_local_parm,
291 const char *ifconfig_remote_netmask_parm,
292 const char *ifconfig_ipv6_local_parm,
293 int ifconfig_ipv6_netbits_parm,
294 const char *ifconfig_ipv6_remote_parm,
295 struct addrinfo *local_public,
296 struct addrinfo *remote_public,
297 const bool strict_warn,
329bool is_dev_type(
const char *dev,
const char *dev_type,
const char *match_type);
352#define IFCONFIG_BEFORE_TUN_OPEN 0
353#define IFCONFIG_AFTER_TUN_OPEN 1
355#define IFCONFIG_DEFAULT IFCONFIG_AFTER_TUN_OPEN
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)
376#elif defined(TARGET_ANDROID)
383#define ROUTE_BEFORE_TUN 0
384#define ROUTE_AFTER_TUN 1
385#define ROUTE_ORDER_DEFAULT ROUTE_AFTER_TUN
394#if defined(TARGET_ANDROID)
441const IP_ADAPTER_INFO *
get_adapter(
const IP_ADAPTER_INFO *ai, DWORD index);
489 return GetLastError() == ERROR_FILE_NOT_FOUND;
502 return GetLastError() == ERROR_OPERATION_ABORTED;
605 unsigned int rwflags,
607 unsigned int *persistent)
615 if (!persistent || *persistent != rwflags)
620 *persistent = rwflags;
char * string_alloc(const char *str, struct gc_arena *gc)
static void event_ctl(struct event_set *es, event_t event, unsigned int rwflags, void *arg)
static SERVICE_STATUS status
#define OPENVPN_IPH_GET_VER(v)
Wrapper structure for dynamically allocated memory.
const char * device_interface
struct device_instance_id_interface * next
LPBYTE net_cfg_instance_id
Packet geometry parameters.
Garbage collection arena used to keep track of dynamically allocated memory.
enum tun_driver_type windows_driver
struct in6_addr dns6[N_DHCP_ADDR]
in_addr_t nbdd[N_DHCP_ADDR]
in_addr_t ntp[N_DHCP_ADDR]
in_addr_t wins[N_DHCP_ADDR]
in_addr_t dns[N_DHCP_ADDR]
const char * netbios_scope
bool dhcp_masq_custom_offset
int domain_search_list_len
const char * domain_search_list[N_SEARCH_LIST_LEN]
unsigned int rwflags_debug
struct rw_handle rw_handle
enum tun_driver_type backend_driver
The backend driver that used for this tun/tap device.
OVERLAPPED dco_new_peer_ov
bool did_ifconfig_ipv6_setup
if the internal variables related to ifconfig-ipv6 of this struct have been set up.
struct in6_addr remote_ipv6
bool did_ifconfig_setup
if the internal variables related to ifconfig of this struct have been set up.
struct overlapped_io writes
in_addr_t adapter_netmask
struct overlapped_io reads
struct in6_addr local_ipv6
bool ipapi_context_defined
void ipconfig_register_dns(const struct env_set *es)
void tun_show_debug(struct tuntap *tt)
static bool tuntap_abort(int status)
void open_tun(const char *dev, const char *dev_type, const char *dev_node, struct tuntap *tt, openvpn_net_ctx_t *ctx)
int dev_type_enum(const char *dev, const char *dev_type)
void close_tun_handle(struct tuntap *tt)
void fork_register_dns_action(struct tuntap *tt)
#define IFCONFIG_AFTER_TUN_OPEN
#define N_SEARCH_LIST_LEN
#define IFCONFIG_BEFORE_TUN_OPEN
bool dhcp_renew_by_adapter_index(const DWORD adapter_index)
int ascii2ipset(const char *name)
const IP_ADAPTER_INFO * get_tun_adapter(const struct tuntap *tt, const IP_ADAPTER_INFO *list)
bool is_adapter_up(const struct tuntap *tt, const IP_ADAPTER_INFO *list)
const IP_ADAPTER_INFO * get_adapter_info(DWORD index, struct gc_arena *gc)
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)
const char * tun_stat(const struct tuntap *tt, unsigned int rwflags, struct gc_arena *gc)
static bool is_ip_packet_valid(const struct buffer *buf)
const IP_PER_ADAPTER_INFO * get_per_adapter_info(const DWORD index, struct gc_arena *gc)
static bool tuntap_is_dco_win(struct tuntap *tt)
#define ROUTE_ORDER_DEFAULT
void show_tap_win_adapters(int msglev, int warnlev)
int tun_write_win32(struct tuntap *tt, struct buffer *buf)
bool is_ip_in_adapter_subnet(const IP_ADAPTER_INFO *ai, const in_addr_t ip, in_addr_t *highest_netmask)
struct afunix_context afunix_context_t
const char * tap_win_getinfo(const struct tuntap *tt, struct gc_arena *gc)
void show_adapters(int msglev)
bool is_dev_type(const char *dev, const char *dev_type, const char *match_type)
int tun_write_queue(struct tuntap *tt, struct buffer *buf)
static bool tuntap_defined(const struct tuntap *tt)
bool dhcp_release_by_adapter_index(const DWORD adapter_index)
bool tun_standby(struct tuntap *tt)
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
const char * dev_type_string(const char *dev, const char *dev_type)
@ WINDOWS_DRIVER_UNSPECIFIED
@ DRIVER_UTUN
macOS internal tun driver
@ DRIVER_AFUNIX
using an AF_UNIX socket to pass packets from/to an external program.
@ WINDOWS_DRIVER_TAP_WINDOWS6
void close_tun(struct tuntap *tt, openvpn_net_ctx_t *ctx)
const IP_ADAPTER_INFO * get_adapter_info_list(struct gc_arena *gc)
void tap_allow_nonadmin_access(const char *dev_node)
bool tun_name_is_fixed(const char *dev)
const IP_ADAPTER_INFO * get_adapter(const IP_ADAPTER_INFO *ai, DWORD index)
static void tun_set(struct tuntap *tt, struct event_set *es, unsigned int rwflags, void *arg, unsigned int *persistent)
void warn_on_use_of_common_subnets(openvpn_net_ctx_t *ctx)
int tun_read_queue(struct tuntap *tt, int maxsize)
static event_t tun_event_handle(const struct tuntap *tt)
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)
static int ifconfig_order(struct tuntap *tt)
static void open_tun_null(struct tuntap *tt)
const char * ifconfig_options_string(const struct tuntap *tt, bool remote, bool disable, struct gc_arena *gc)
const char * guess_tuntap_dev(const char *dev, const char *dev_type, const char *dev_node, struct gc_arena *gc)
const char * ipset2ascii(int index)
void do_ifconfig_setenv(const struct tuntap *tt, struct env_set *es)
static bool tuntap_is_dco_win_timeout(struct tuntap *tt, int status)
void undo_ifconfig(struct tuntap *tt, openvpn_net_ctx_t *ctx)
undo_ifconfig - undo configuration of the tunnel interface
bool is_tun_p2p(const struct tuntap *tt)
const char * ipset2ascii_all(struct gc_arena *gc)
static int route_order(struct tuntap *tt)
void tun_standby_init(struct tuntap *tt)
void show_valid_win32_tun_subnets(void)
static bool tuntap_stop(int status)
const char * print_tun_backend_driver(enum tun_driver_type driver)
Return a string representation of the tun backed driver type.
static bool is_tun_type_set(const struct tuntap *tt)
DWORD adapter_index_of_ip(const IP_ADAPTER_INFO *list, const in_addr_t ip, int *count, in_addr_t *netmask)
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)
void verify_255_255_255_252(in_addr_t local, in_addr_t remote)
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)