@@ -1258,7 +1258,7 @@ read_incoming_tun(struct context *c)
c->c2.buf = c->c2.buffers->read_tun_buf;
#ifdef _WIN32
- if (c->c1.tuntap->wintun)
+ if (c->c1.tuntap->windows_driver == WINDOWS_DRIVER_WINTUN)
{
read_wintun(c->c1.tuntap, &c->c2.buf);
if (c->c2.buf.len == -1)
@@ -1274,7 +1274,7 @@ read_incoming_tun(struct context *c)
{
read_tun_buffered(c->c1.tuntap, &c->c2.buf);
}
-#else
+#else /* ifdef _WIN32 */
ASSERT(buf_init(&c->c2.buf, FRAME_HEADROOM(&c->c2.frame)));
ASSERT(buf_safe(&c->c2.buf, MAX_RW_SIZE_TUN(&c->c2.frame)));
c->c2.buf.len = read_tun(c->c1.tuntap, BPTR(&c->c2.buf), MAX_RW_SIZE_TUN(&c->c2.frame));
@@ -1734,7 +1734,7 @@ do_init_tun(struct context *c)
&c->net_ctx);
#ifdef _WIN32
- c->c1.tuntap->wintun = c->options.wintun;
+ c->c1.tuntap->windows_driver = c->options.windows_driver;
#endif
init_tun_post(c->c1.tuntap,
@@ -854,7 +854,7 @@ init_options(struct options *o, const bool init_gc)
o->tuntap_options.dhcp_masq_offset = 0; /* use network address as internal DHCP server address */
o->route_method = ROUTE_METHOD_ADAPTIVE;
o->block_outside_dns = false;
- o->wintun = false;
+ o->windows_driver = WINDOWS_DRIVER_TAP_WINDOWS6;
#endif
o->vlan_accept = VLAN_ALL;
o->vlan_pvid = 1;
@@ -3002,7 +3002,7 @@ options_postprocess_mutate_invariant(struct options *options)
#ifdef _WIN32
/* when using wintun, kernel doesn't send DHCP requests, so use netsh to set IP address and netmask */
- if (options->wintun)
+ if (options->windows_driver == WINDOWS_DRIVER_WINTUN)
{
options->tuntap_options.ip_win32_type = IPW32_SET_NETSH;
}
@@ -4076,23 +4076,23 @@ foreign_option(struct options *o, char *argv[], int len, struct env_set *es)
*
* @param str value of --windows-driver option
* @param msglevel msglevel to report parsing error
- * @return bool true if --windows-driver is wintun, false otherwise
+ * @return enum windows_driver_type driver type, WINDOWS_DRIVER_UNSPECIFIED on unknown --windows-driver value
*/
-static bool
+static enum windows_driver_type
parse_windows_driver(const char *str, const int msglevel)
{
if (streq(str, "tap-windows6"))
{
- return false;
+ return WINDOWS_DRIVER_TAP_WINDOWS6;
}
else if (streq(str, "wintun"))
{
- return true;
+ return WINDOWS_DRIVER_WINTUN;
}
else
{
msg(msglevel, "--windows-driver must be tap-windows6 or wintun");
- return false;
+ return WINDOWS_DRIVER_UNSPECIFIED;
}
}
#endif
@@ -5367,7 +5367,7 @@ add_option(struct options *options,
else if (streq(p[0], "windows-driver") && p[1] && !p[2])
{
VERIFY_PERMISSION(OPT_P_GENERAL);
- options->wintun = parse_windows_driver(p[1], M_FATAL);
+ options->windows_driver = parse_windows_driver(p[1], M_FATAL);
}
#endif
else if (streq(p[0], "dev-node") && p[1] && !p[2])
@@ -634,7 +634,7 @@ struct options
bool show_net_up;
int route_method;
bool block_outside_dns;
- bool wintun;
+ enum windows_driver_type windows_driver;
#endif
bool use_peer_id;
@@ -786,7 +786,7 @@ init_tun_post(struct tuntap *tt,
overlapped_io_init(&tt->writes, frame, TRUE, true);
tt->adapter_index = TUN_ADAPTER_INDEX_INVALID;
- if (tt->wintun)
+ if (tt->windows_driver == WINDOWS_DRIVER_WINTUN)
{
tt->wintun_send_ring_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,
PAGE_READWRITE,
@@ -1388,7 +1388,7 @@ do_ifconfig_ipv4(struct tuntap *tt, const char *ifname, int tun_mtu,
{
ASSERT(ifname != NULL);
- if (tt->options.msg_channel && tt->wintun)
+ if (tt->options.msg_channel && tt->windows_driver == WINDOWS_DRIVER_WINTUN)
{
do_address_service(true, AF_INET, tt);
do_dns_service(true, AF_INET, tt);
@@ -3253,6 +3253,22 @@ read_tun(struct tuntap *tt, uint8_t *buf, int len)
#elif defined(_WIN32)
+static const char *
+print_windows_driver(enum windows_driver_type windows_driver)
+{
+ switch (windows_driver)
+ {
+ case WINDOWS_DRIVER_TAP_WINDOWS6:
+ return "tap-windows6";
+
+ case WINDOWS_DRIVER_WINTUN:
+ return "wintun";
+
+ default:
+ return "unspecified";
+ }
+}
+
int
tun_read_queue(struct tuntap *tt, int maxsize)
{
@@ -3676,14 +3692,16 @@ get_tap_reg(struct gc_arena *gc)
if (status == ERROR_SUCCESS && data_type == REG_SZ)
{
- if (!strcmp(component_id, TAP_WIN_COMPONENT_ID) ||
- !strcmp(component_id, "root\\" TAP_WIN_COMPONENT_ID) ||
- !strcmp(component_id, WINTUN_COMPONENT_ID))
+ enum windows_driver_type windows_driver = WINDOWS_DRIVER_UNSPECIFIED;
+
+ if ((windows_driver = WINDOWS_DRIVER_TAP_WINDOWS6, !strcmp(component_id, TAP_WIN_COMPONENT_ID))
+ || (windows_driver = WINDOWS_DRIVER_TAP_WINDOWS6, !strcmp(component_id, "root\\" TAP_WIN_COMPONENT_ID))
+ || (windows_driver = WINDOWS_DRIVER_WINTUN, !strcmp(component_id, WINTUN_COMPONENT_ID)))
{
struct tap_reg *reg;
ALLOC_OBJ_CLEAR_GC(reg, struct tap_reg, gc);
reg->guid = string_alloc(net_cfg_instance_id, gc);
- reg->wintun = !strcmp(component_id, WINTUN_COMPONENT_ID);
+ reg->windows_driver = windows_driver;
/* link into return list */
if (!first)
@@ -3926,7 +3944,7 @@ show_tap_win_adapters(int msglev, int warnlev)
{
if (!strcmp(tr->guid, pr->guid))
{
- msg(msglev, "'%s' %s %s", pr->name, tr->guid, tr->wintun ? "wintun" : "tap-windows6");
+ msg(msglev, "'%s' %s %s", pr->name, tr->guid, print_windows_driver(tr->windows_driver));
++links;
}
}
@@ -4045,7 +4063,7 @@ get_unspecified_device_guid(const int device_number,
int actual_name_size,
const struct tap_reg *tap_reg_src,
const struct panel_reg *panel_reg_src,
- bool *wintun,
+ enum windows_driver_type *windows_driver,
struct gc_arena *gc)
{
const struct tap_reg *tap_reg = tap_reg_src;
@@ -4095,9 +4113,9 @@ get_unspecified_device_guid(const int device_number,
/* Save GUID for return value */
ret = alloc_buf_gc(256, gc);
buf_printf(&ret, "%s", tap_reg->guid);
- if (wintun != NULL)
+ if (windows_driver != NULL)
{
- *wintun = tap_reg->wintun;
+ *windows_driver = tap_reg->windows_driver;
}
return BSTR(&ret);
}
@@ -4110,7 +4128,7 @@ static const char *
get_device_guid(const char *name,
char *actual_name,
int actual_name_size,
- bool *wintun,
+ enum windows_driver_type *windows_driver,
const struct tap_reg *tap_reg,
const struct panel_reg *panel_reg,
struct gc_arena *gc)
@@ -4146,9 +4164,9 @@ get_device_guid(const char *name,
{
buf_printf(&actual, "%s", name);
}
- if (wintun)
+ if (windows_driver)
{
- *wintun = tr->wintun;
+ *windows_driver = tr->windows_driver;
}
return BSTR(&ret);
}
@@ -4159,9 +4177,9 @@ get_device_guid(const char *name,
if (tr)
{
buf_printf(&actual, "%s", name);
- if (wintun)
+ if (windows_driver)
{
- *wintun = tr->wintun;
+ *windows_driver = tr->windows_driver;
}
buf_printf(&ret, "%s", tr->guid);
return BSTR(&ret);
@@ -6135,7 +6153,7 @@ tun_try_open_device(struct tuntap *tt, const char *device_guid, const struct dev
const char *path = NULL;
char tuntap_device_path[256];
- if (tt->wintun)
+ if (tt->windows_driver == WINDOWS_DRIVER_WINTUN)
{
const struct device_instance_id_interface *dev_if;
@@ -6172,11 +6190,11 @@ tun_try_open_device(struct tuntap *tt, const char *device_guid, const struct dev
0);
if (tt->hand == INVALID_HANDLE_VALUE)
{
- msg(D_TUNTAP_INFO, "CreateFile failed on %s device: %s", tt->wintun ? "Wintun" : "TAP-Windows", path);
+ msg(D_TUNTAP_INFO, "CreateFile failed on %s device: %s", print_windows_driver(tt->windows_driver), path);
return false;
}
- if (tt->wintun)
+ if (tt->windows_driver == WINDOWS_DRIVER_WINTUN)
{
/* Wintun adapter may be considered "open" after ring buffers are successfuly registered. */
if (!wintun_register_ring_buffer(tt))
@@ -6207,34 +6225,24 @@ tun_open_device(struct tuntap *tt, const char *dev_node, const char **device_gui
*/
if (dev_node)
{
- bool is_picked_device_wintun = false;
+ enum windows_driver_type windows_driver = WINDOWS_DRIVER_UNSPECIFIED;
/* Get the device GUID for the device specified with --dev-node. */
- *device_guid = get_device_guid(dev_node, actual_buffer, sizeof(actual_buffer), &is_picked_device_wintun, tap_reg, panel_reg, &gc);
+ *device_guid = get_device_guid(dev_node, actual_buffer, sizeof(actual_buffer), &windows_driver, tap_reg, panel_reg, &gc);
if (!*device_guid)
{
msg(M_FATAL, "Adapter '%s' not found", dev_node);
}
- if (tt->wintun)
- {
- if (!is_picked_device_wintun)
- {
- msg(M_FATAL, "Adapter '%s' is TAP-Windows, Wintun expected. If you want to use this device, remove --windows-driver wintun.", dev_node);
- }
- }
- else
+ if (tt->windows_driver != windows_driver)
{
- if (is_picked_device_wintun)
- {
- msg(M_FATAL, "Adapter '%s' is Wintun, TAP-Windows expected. If you want to use this device, add --windows-driver wintun.", dev_node);
- }
+ msg(M_FATAL, "Adapter '%s' is using %s driver, %s expected. If you want to use this device, adjust --windows-driver.", dev_node, print_windows_driver(windows_driver), print_windows_driver(tt->windows_driver));
}
if (!tun_try_open_device(tt, *device_guid, device_instance_id_interface))
{
- msg(M_FATAL, "Failed to open %s adapter: %s", tt->wintun ? "Wintun" : "TAP-Windows", dev_node);
+ msg(M_FATAL, "Failed to open %s adapter: %s", print_windows_driver(tt->windows_driver), dev_node);
}
}
else
@@ -6244,35 +6252,23 @@ tun_open_device(struct tuntap *tt, const char *dev_node, const char **device_gui
/* Try opening all TAP devices until we find one available */
while (true)
{
- bool is_picked_device_wintun = false;
+ enum windows_driver_type windows_driver = WINDOWS_DRIVER_UNSPECIFIED;
*device_guid = get_unspecified_device_guid(device_number,
actual_buffer,
sizeof(actual_buffer),
tap_reg,
panel_reg,
- &is_picked_device_wintun,
+ &windows_driver,
&gc);
if (!*device_guid)
{
- msg(M_FATAL, "All %s adapters on this system are currently in use.", tt->wintun ? "wintun" : "TAP - Windows");
+ msg(M_FATAL, "All %s adapters on this system are currently in use.", print_windows_driver(tt->windows_driver));
}
- if (tt->wintun)
- {
- if (!is_picked_device_wintun)
- {
- /* wintun driver specified but picked adapter is not wintun, proceed to next one */
- goto next;
- }
- }
- else
+ if (tt->windows_driver != windows_driver)
{
- if (is_picked_device_wintun)
- {
- /* tap-windows6 driver specified but picked adapter is wintun, proceed to next one */
- goto next;
- }
+ goto next;
}
if (tun_try_open_device(tt, *device_guid, device_instance_id_interface))
@@ -6289,7 +6285,7 @@ tun_open_device(struct tuntap *tt, const char *dev_node, const char **device_gui
* GUID using the registry */
tt->actual_name = string_alloc(actual_buffer, NULL);
- msg(M_INFO, "%s device [%s] opened", tt->wintun ? "Wintun" : "TAP-WIN32", tt->actual_name);
+ msg(M_INFO, "%s device [%s] opened", print_windows_driver(tt->windows_driver), tt->actual_name);
tt->adapter_index = get_adapter_index(*device_guid);
gc_free(&gc);
@@ -6400,7 +6396,7 @@ open_tun(const char *dev, const char *dev_type, const char *dev_node, struct tun
tun_open_device(tt, dev_node, &device_guid);
- if (!tt->wintun)
+ if (tt->windows_driver == WINDOWS_DRIVER_TAP_WINDOWS6)
{
tuntap_post_open(tt, device_guid);
}
@@ -6411,7 +6407,7 @@ open_tun(const char *dev, const char *dev_type, const char *dev_node, struct tun
const char *
tap_win_getinfo(const struct tuntap *tt, struct gc_arena *gc)
{
- if (!tt->wintun)
+ if (tt->windows_driver == WINDOWS_DRIVER_TAP_WINDOWS6)
{
struct buffer out = alloc_buf_gc(256, gc);
DWORD len;
@@ -6429,7 +6425,7 @@ tap_win_getinfo(const struct tuntap *tt, struct gc_arena *gc)
void
tun_show_debug(struct tuntap *tt)
{
- if (!tt->wintun)
+ if (tt->windows_driver == WINDOWS_DRIVER_TAP_WINDOWS6)
{
struct buffer out = alloc_buf(1024);
DWORD len;
@@ -6514,7 +6510,7 @@ close_tun(struct tuntap *tt, openvpn_net_ctx_t *ctx)
}
}
#if 1
- if (tt->wintun)
+ if (tt->windows_driver == WINDOWS_DRIVER_WINTUN)
{
if (tt->options.msg_channel)
{
@@ -6570,7 +6566,7 @@ close_tun(struct tuntap *tt, openvpn_net_ctx_t *ctx)
free(tt->actual_name);
}
- if (tt->wintun)
+ if (tt->windows_driver == WINDOWS_DRIVER_WINTUN)
{
CloseHandle(tt->rw_handle.read);
CloseHandle(tt->rw_handle.write);
@@ -43,6 +43,12 @@
#ifdef _WIN32
#define WINTUN_COMPONENT_ID "wintun"
+
+enum windows_driver_type {
+ WINDOWS_DRIVER_UNSPECIFIED,
+ WINDOWS_DRIVER_TAP_WINDOWS6,
+ WINDOWS_DRIVER_WINTUN
+};
#endif
#if defined(_WIN32) || defined(TARGET_ANDROID)
@@ -181,7 +187,7 @@ struct tuntap
* ~0 if undefined */
DWORD adapter_index;
- bool wintun; /* true if wintun is used instead of tap-windows6 */
+ enum windows_driver_type windows_driver;
int standby_iter;
HANDLE wintun_send_ring_handle;
@@ -221,7 +227,7 @@ tuntap_defined(const struct tuntap *tt)
inline bool
tuntap_is_wintun(struct tuntap *tt)
{
- return tt && tt->wintun;
+ return tt && tt->windows_driver == WINDOWS_DRIVER_WINTUN;
}
inline bool
@@ -365,7 +371,7 @@ route_order(void)
struct tap_reg
{
const char *guid;
- bool wintun;
+ enum windows_driver_type windows_driver;
struct tap_reg *next;
};
@@ -642,7 +648,7 @@ write_wintun(struct tuntap *tt, struct buffer *buf)
static inline int
write_tun_buffered(struct tuntap *tt, struct buffer *buf)
{
- if (tt->wintun)
+ if (tt->windows_driver == WINDOWS_DRIVER_WINTUN)
{
return write_wintun(tt, buf);
}
@@ -712,7 +718,7 @@ tun_set(struct tuntap *tt,
}
}
#ifdef _WIN32
- if (!tt->wintun && (rwflags & EVENT_READ))
+ if (tt->windows_driver == WINDOWS_DRIVER_TAP_WINDOWS6 && (rwflags & EVENT_READ))
{
tun_read_queue(tt, 0);
}
Signed-off-by: Simon Rozman <simon@rozman.si> --- src/openvpn/forward.c | 4 +- src/openvpn/init.c | 2 +- src/openvpn/options.c | 16 +++---- src/openvpn/options.h | 2 +- src/openvpn/tun.c | 108 ++++++++++++++++++++---------------------- src/openvpn/tun.h | 16 +++++-- 6 files changed, 75 insertions(+), 73 deletions(-)