When provisioning IP configuration, we shall not ask what kind of
adapter this is. Rather, we should ask what method of provisioning we
are configured to use.
It is options.c's job to rule out invalid combinations.
- do_ifconfig_ipv4(): unify the workflow with its IPv6 counterpart
No need to distinguish Wintun and TAP-Windows6 here. This also fixes
an issue with --windows-driver wintun overriding --ip-win32 manual,
the later being perfectly fine choice for Wintun too.
- open_tun() & tuntap_post_open(): unify Wintun and TAP-Windows6
workflow. This allows allows --ip-win32 ipapi now.
- close_tun() the cleanup has been revised to match the ifconfig
workflow in reverse.
Signed-off-by: Simon Rozman
---
src/openvpn/tun.c | 127 --
1 file changed, 65 insertions(+), 62 deletions(-)
diff --git a/src/openvpn/tun.c b/src/openvpn/tun.c
index 42193d97..f7224093 100644
--- a/src/openvpn/tun.c
+++ b/src/openvpn/tun.c
@@ -1381,34 +1381,29 @@ do_ifconfig_ipv4(struct tuntap *tt, const char *ifname,
int tun_mtu,
env_set_destroy(aix_es);
}
#elif defined (_WIN32)
-{
-ASSERT(ifname != NULL);
-
-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);
-}
-else
-{
-switch (tt->options.ip_win32_type)
-{
-case IPW32_SET_MANUAL:
-msg(M_INFO,
-" NOTE: Please manually set the IP/netmask of
'%s' to %s/%s (if it is not already set)",
-ifname, ifconfig_local,
-print_in_addr_t(tt->adapter_netmask, 0, &gc));
-break;
+ASSERT(ifname != NULL);
-case IPW32_SET_NETSH:
-netsh_ifconfig(&tt->options, ifname, tt->local,
- tt->adapter_netmask,
NI_IP_NETMASK|NI_OPTIONS);
-
-break;
-}
-}
+if (tt->options.ip_win32_type == IPW32_SET_MANUAL)
+{
+msg(M_INFO,
+" NOTE: Please manually set the IP/netmask of '%s' to
%s/%s (if it is not already set)",
+ifname, ifconfig_local,
+print_in_addr_t(tt->adapter_netmask, 0, &gc));
+}
+else if (tt->options.ip_win32_type == IPW32_SET_DHCP_MASQ ||
tt->options.ip_win32_type == IPW32_SET_ADAPTIVE)
+{
+/* Let the DHCP configure the interface. */
+}
+else if (tt->options.msg_channel)
+{
+do_address_service(true, AF_INET, tt);
+do_dns_service(true, AF_INET, tt);
+}
+else if (tt->options.ip_win32_type == IPW32_SET_NETSH)
+{
+netsh_ifconfig(&tt->options, ifname, tt->local,
+ tt->adapter_netmask, NI_IP_NETMASK|NI_OPTIONS);
}
-
#else /* if defined(TARGET_LINUX) */
msg(M_FATAL, "Sorry, but I don't know how to do 'ifconfig' commands on
this operating system. You should ifconfig your TUN/TAP device manually or use
an --up script.");
#endif /* if defined(TARGET_LINUX) */
@@ -6357,36 +6352,39 @@ tuntap_post_open(struct tuntap *tt, const char
*device_guid)
bool dhcp_masq = false;
bool dhcp_masq_post = false;
-/* get driver version info */
-tuntap_get_version_info(tt);
+if (tt->windows_driver == WINDOWS_DRIVER_TAP_WINDOWS6)
+{
+/* get driver version info */
+tuntap_get_version_info(tt);
-/* get driver MTU */
-tuntap_get_mtu(tt);
+/* get driver MTU */
+tuntap_get_mtu(tt);
-/*
- * Preliminaries for setting TAP-Windows adapter TCP/IP
- * properties via --ip-win32 dynamic or --ip-win32 adaptive.
- */
-if (tt->did_ifconfig_setup)
-{
-tuntap_set_ip_props(tt, &dhcp_masq, &dhcp_masq_post);
-}
+/*
+ * Preliminaries for setting TAP-Windows adapter TCP/IP
+ * properties via --ip-win32 dynamic or --ip-win32 adaptive.
+ */
+if (tt->did_ifconfig_setup)
+{
+tuntap_set_ip_props(tt, &dhcp_masq, &dhcp_masq_post);
+}
-/* set point-to-point mode if TUN device */
-if (tt->type == DEV_TYPE_TUN)
-{
-tuntap_set_ptp(tt);
-}
+/* set point-to-point mode if TUN device */
+if (tt->type == DEV_TYPE_TUN)
+{
+tuntap_set_ptp(tt);
+}
-/* should we tell the TAP-Windows driver to masquerade as a DHCP server as
a means
- * of setting the adapter address? */
-if (dhcp_masq)
-{
-tuntap_dhcp_mask(tt, device_guid);
-}
+/* should we tell the TAP-Windows driver to masquerade as a DHCP
server as a means
+ * of setting the adapter address? */
+if (dhcp_masq)
+{
+tuntap_dhcp_mask(tt, device_guid);
+}
-/* set driver media status to 'connected' */
-tuntap_set_co