From fd7e04ea8b40270c4181c6910cf4ca1437c68cad Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Wed, 21 Jan 2009 00:07:07 +0000 Subject: tun mode works now on windows --- src/anytun.suo | Bin 52736 -> 53760 bytes src/anytun.vcproj | 2 +- src/deviceConfig.hpp | 3 +++ src/networkAddress.cpp | 24 ++++++++++++++++++++++++ src/networkAddress.h | 3 +++ src/win32/tunDevice.cpp | 27 +++++++++++++++++++-------- 6 files changed, 50 insertions(+), 9 deletions(-) diff --git a/src/anytun.suo b/src/anytun.suo index a2e5d9e..6e9cf16 100644 Binary files a/src/anytun.suo and b/src/anytun.suo differ diff --git a/src/anytun.vcproj b/src/anytun.vcproj index b10773f..1f4d47d 100644 --- a/src/anytun.vcproj +++ b/src/anytun.vcproj @@ -42,7 +42,7 @@ Name="VCCLCompilerTool" AdditionalOptions="/I "C:\Program Files\boost\boost_1_35_0\"" Optimization="0" - PreprocessorDefinitions="LOG_STDOUT;USE_SSL_CRYPTO;NO_DAEMON;NO_EXEC;NO_SYSLOG;NO_SIGNALCONTROLLER;WIN32_LEAN_AND_MEAN" + PreprocessorDefinitions="NO_ROUTING;LOG_STDOUT;USE_SSL_CRYPTO;NO_DAEMON;NO_EXEC;NO_SYSLOG;NO_SIGNALCONTROLLER;WIN32_LEAN_AND_MEAN" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" diff --git a/src/deviceConfig.hpp b/src/deviceConfig.hpp index a3dbe74..acca46e 100644 --- a/src/deviceConfig.hpp +++ b/src/deviceConfig.hpp @@ -65,6 +65,9 @@ public: type_ = TYPE_TUN; else if(dev_type == "tap") type_ = TYPE_TAP; + + if(type_ == TYPE_TUN && (ifcfg_lp == "" || ifcfg_rnmp == "")) + throw std::runtime_error("Device type tun requires ifconfig parameters (--ifconfig)"); #endif if(ifcfg_lp != "") diff --git a/src/networkAddress.cpp b/src/networkAddress.cpp index f922c00..059b670 100644 --- a/src/networkAddress.cpp +++ b/src/networkAddress.cpp @@ -105,6 +105,30 @@ network_address_type_t NetworkAddress::getNetworkAddressType() const return network_address_type_; } +const boost::asio::ip::address_v4& NetworkAddress::getNetworkAddressV4() const +{ + if(network_address_type_ != ipv4) + throw std::runtime_error("wrong address type"); + + return ipv4_address_; +} + +const boost::asio::ip::address_v6& NetworkAddress::getNetworkAddressV6() const +{ + if(network_address_type_ != ipv6) + throw std::runtime_error("wrong address type"); + + return ipv6_address_; +} + +const u_int64_t NetworkAddress::getNetworkAdrressEther() const +{ + if(network_address_type_ != ethernet) + throw std::runtime_error("wrong address type"); + + return ethernet_address_; +} + std::string NetworkAddress::toString() const { if (network_address_type_==ipv4){ diff --git a/src/networkAddress.h b/src/networkAddress.h index f866cca..7510eb1 100644 --- a/src/networkAddress.h +++ b/src/networkAddress.h @@ -70,6 +70,9 @@ public: ipv4_bytes_type to_bytes_v4() const; ipv6_bytes_type to_bytes_v6() const; ethernet_bytes_type to_bytes_ethernet() const; + const boost::asio::ip::address_v4& getNetworkAddressV4() const; + const boost::asio::ip::address_v6& getNetworkAddressV6() const; + const u_int64_t getNetworkAdrressEther() const; protected: Mutex mutex_; boost::asio::ip::address_v4 ipv4_address_; diff --git a/src/win32/tunDevice.cpp b/src/win32/tunDevice.cpp index e4c2cf9..e6167d3 100644 --- a/src/win32/tunDevice.cpp +++ b/src/win32/tunDevice.cpp @@ -31,24 +31,23 @@ #include #include +#include +#include +#include "../endian.h" #include "../tunDevice.h" #include "../threadUtils.hpp" #include "../log.h" #include "common.h" -#include -#include #define REG_KEY_LENGTH 256 #define REG_NAME_LENGTH 256 TunDevice::TunDevice(std::string dev_name, std::string dev_type, std::string ifcfg_lp, std::string ifcfg_rnmp) : conf_(dev_name, dev_type, ifcfg_lp, ifcfg_rnmp, 1400) { -// if(conf_.type_ != TYPE_TUN && conf_.type_ != TYPE_TAP) -// throw std::runtime_error("unable to recognize type of device (tun or tap)"); - if(conf_.type_ != TYPE_TAP) - throw std::runtime_error("currently only support for typ devices on windows"); + if(conf_.type_ != TYPE_TUN && conf_.type_ != TYPE_TAP) + throw std::runtime_error("unable to recognize type of device (tun or tap)"); HKEY key, key2; LONG err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, NETWORK_CONNECTIONS_KEY, 0, KEY_ENUMERATE_SUB_KEYS, &key); @@ -126,6 +125,18 @@ TunDevice::TunDevice(std::string dev_name, std::string dev_type, std::string ifc actual_node_ = adapterid; actual_name_ = adaptername; + if(conf_.type_ == TYPE_TUN) { + u_long ep[2]; + ep[0] = htonl(conf_.local_.getNetworkAddressV4().to_ulong()); + ep[1] = htonl(conf_.remote_netmask_.getNetworkAddressV4().to_ulong()); + if(!DeviceIoControl(handle_, TAP_IOCTL_CONFIG_POINT_TO_POINT, ep, sizeof(ep), ep, sizeof(ep), &len, NULL)) { + CloseHandle(handle_); + std::stringstream msg; + msg << "Unable to set device point-to-point mode: " << LogErrno(GetLastError()); + throw std::runtime_error(msg.str()); + } + } + int status = true; if(!DeviceIoControl(handle_, TAP_IOCTL_SET_MEDIA_STATUS, &status, sizeof(status), &status, sizeof(status), &len, NULL)) { CloseHandle(handle_); @@ -134,8 +145,8 @@ TunDevice::TunDevice(std::string dev_name, std::string dev_type, std::string ifc throw std::runtime_error(msg.str()); } - if(ifcfg_lp != "" && ifcfg_rnmp != "") - do_ifconfig(); +// if(ifcfg_lp != "" && ifcfg_rnmp != "") +// do_ifconfig(); roverlapped_.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); woverlapped_.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); -- cgit v1.2.3