From 8fd23d4249be748356e591e0dd70ea82f70dcec5 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sat, 31 Jan 2009 01:47:38 +0000 Subject: moved to new handling if ifconfig parameters (more windows friendly) --- src/anytun.cpp | 10 ++++++---- src/deviceConfig.hpp | 21 +++++++++++++++------ src/linux/tunDevice.cpp | 15 ++++----------- src/networkAddress.cpp | 18 ++++++++++++++++++ src/networkAddress.h | 3 +++ src/options.cpp | 31 +++++++------------------------ src/options.h | 9 +++------ src/tunDevice.h | 2 +- 8 files changed, 57 insertions(+), 52 deletions(-) (limited to 'src') diff --git a/src/anytun.cpp b/src/anytun.cpp index a5de1ff..fb9c429 100644 --- a/src/anytun.cpp +++ b/src/anytun.cpp @@ -93,10 +93,11 @@ void createConnection(const PacketSourceEndpoint & remote_end, window_size_t seq gSyncQueue.push(sc); #endif #ifndef NO_ROUTING - if (gOpt.getIfconfigParamRemoteNetmask() != "") + OptionNetwork net = gOpt.getIfconfigParam(); + if (net.net_addr != "") { - NetworkAddress addr(gOpt.getIfconfigParamRemoteNetmask()); - NetworkPrefix prefix(addr,128); + NetworkAddress addr(net.net_addr); + NetworkPrefix prefix(addr,net.prefix_length); gRoutingTable.addRoute(prefix,mux); #ifndef ANYTUN_NOSYNC SyncCommand sc2 (prefix); @@ -365,7 +366,8 @@ int main(int argc, char* argv[]) #endif #endif - TunDevice dev(gOpt.getDevName(), gOpt.getDevType(), gOpt.getIfconfigParamLocal(), gOpt.getIfconfigParamRemoteNetmask()); + OptionNetwork net = gOpt.getIfconfigParam(); + TunDevice dev(gOpt.getDevName(), gOpt.getDevType(), net.net_addr, net.prefix_length); cLog.msg(Log::PRIO_NOTICE) << "dev opened - name '" << dev.getActualName() << "', node '" << dev.getActualNode() << "'"; cLog.msg(Log::PRIO_NOTICE) << "dev type is '" << dev.getTypeString() << "'"; #ifndef NO_EXEC diff --git a/src/deviceConfig.hpp b/src/deviceConfig.hpp index acca46e..3e6c912 100644 --- a/src/deviceConfig.hpp +++ b/src/deviceConfig.hpp @@ -33,6 +33,8 @@ #define _DEVICE_CONFIG_HPP_ #include "networkAddress.h" +#include + class TunDevice; enum device_type_t { TYPE_UNDEF, TYPE_TUN, TYPE_TAP }; @@ -40,7 +42,7 @@ enum device_type_t { TYPE_UNDEF, TYPE_TUN, TYPE_TAP }; class DeviceConfig { public: - DeviceConfig(std::string dev_name ,std::string dev_type, std::string ifcfg_lp, std::string ifcfg_rnmp, u_int16_t mtu) + DeviceConfig(std::string dev_name ,std::string dev_type, std::string ifcfg_addr, u_int16_t ifcfg_prefix, u_int16_t mtu) { mtu_ = mtu; type_ = TYPE_UNDEF; @@ -70,15 +72,22 @@ public: throw std::runtime_error("Device type tun requires ifconfig parameters (--ifconfig)"); #endif - if(ifcfg_lp != "") - local_.setNetworkAddress(ipv4, ifcfg_lp.c_str()); - if(ifcfg_rnmp != "") - remote_netmask_.setNetworkAddress(ipv4, ifcfg_rnmp.c_str()); + if(ifcfg_addr != "") + addr_.setNetworkAddress(ipv4, ifcfg_addr.c_str()); + prefix_ = ifcfg_prefix; + u_int32_t mask = 0; + for(u_int16_t i = 0; i < prefix_; ++i) { + mask = mask >> 1; + mask |= 0x80000000L; + } + netmask_.setNetworkAddress(boost::asio::ip::address_v4(mask)); } private: device_type_t type_; - NetworkAddress local_, remote_netmask_; + NetworkAddress addr_; + NetworkAddress netmask_; + u_int16_t prefix_; u_int16_t mtu_; friend class TunDevice; diff --git a/src/linux/tunDevice.cpp b/src/linux/tunDevice.cpp index 403cd99..8fde8ae 100644 --- a/src/linux/tunDevice.cpp +++ b/src/linux/tunDevice.cpp @@ -46,7 +46,7 @@ #include "threadUtils.hpp" #include "log.h" -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) +TunDevice::TunDevice(std::string dev_name, std::string dev_type, std::string ifcfg_addr, u_int16_t ifcfg_prefix) : conf_(dev_name, dev_type, ifcfg_addr, ifcfg_prefix, 1400) { struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); @@ -84,7 +84,7 @@ TunDevice::TunDevice(std::string dev_name, std::string dev_type, std::string ifc } actual_node_ = DEFAULT_DEVICE; - if(ifcfg_lp != "" && ifcfg_rnmp != "") + if(ifcfg_addr != "") do_ifconfig(); } @@ -157,14 +157,8 @@ void TunDevice::init_post() void TunDevice::do_ifconfig() { std::ostringstream command; - command << "/sbin/ifconfig " << actual_name_ << " " << conf_.local_.toString(); - - if(conf_.type_ == TYPE_TUN) - command << " pointopoint "; - else - command << " netmask "; - - command << conf_.remote_netmask_.toString() << " mtu " << conf_.mtu_; + command << "/sbin/ifconfig " << actual_name_ << " " << conf_.addr_.toString() + << " netmask " << conf_.netmask_.toString() << " mtu " << conf_.mtu_; int result = system(command.str().c_str()); if(result == -1) @@ -177,5 +171,4 @@ void TunDevice::do_ifconfig() else cLog.msg(Log::PRIO_ERR) << "Execution of ifconfig: unkown error"; } - } diff --git a/src/networkAddress.cpp b/src/networkAddress.cpp index 059b670..6863fab 100644 --- a/src/networkAddress.cpp +++ b/src/networkAddress.cpp @@ -100,6 +100,24 @@ void NetworkAddress::setNetworkAddress(const network_address_type_t type, const network_address_type_ = type; } +void NetworkAddress::setNetworkAddress(boost::asio::ip::address_v4 addr) +{ + network_address_type_=ipv4; + ipv4_address_ = addr; +} + +void NetworkAddress::setNetworkAddress(boost::asio::ip::address_v6 addr) +{ + network_address_type_=ipv6; + ipv6_address_ = addr; +} + +void NetworkAddress::setNetworkAddress(u_int64_t addr) +{ + network_address_type_=ethernet; + ethernet_address_=addr; +} + network_address_type_t NetworkAddress::getNetworkAddressType() const { return network_address_type_; diff --git a/src/networkAddress.h b/src/networkAddress.h index 7510eb1..d683b4c 100644 --- a/src/networkAddress.h +++ b/src/networkAddress.h @@ -64,6 +64,9 @@ public: NetworkAddress(const network_address_type_t type, const std::string & address ); ~NetworkAddress(); void setNetworkAddress(const network_address_type_t type, const std::string & address ); + void setNetworkAddress(boost::asio::ip::address_v4); + void setNetworkAddress(boost::asio::ip::address_v6); + void setNetworkAddress(u_int64_t); network_address_type_t getNetworkAddressType() const; std::string toString() const; bool operator<(const NetworkAddress &s) const; diff --git a/src/options.cpp b/src/options.cpp index b39790b..8d4240b 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -167,8 +167,6 @@ Options::Options() : key_(u_int32_t(0)), salt_(u_int32_t(0)) dev_name_ = ""; dev_type_ = ""; - ifconfig_param_local_ = ""; - ifconfig_param_remote_netmask_ = ""; post_up_script_ = ""; sender_id_ = 0; @@ -357,7 +355,7 @@ bool Options::parse(int argc, char* argv[]) PARSE_SCALAR_PARAM("-d","--dev", dev_name_) PARSE_SCALAR_PARAM("-t","--type", dev_type_) - PARSE_SCALAR_PARAM2("-n","--ifconfig", ifconfig_param_local_, ifconfig_param_remote_netmask_) + PARSE_SCALAR_PARAM("-n","--ifconfig", ifconfig_param_) #ifndef NO_EXEC PARSE_SCALAR_PARAM("-x","--post-up-script", post_up_script_) #endif @@ -463,8 +461,7 @@ void Options::printUsage() std::cout << " [-d|--dev] device name" << std::endl; std::cout << " [-t|--type] device type" << std::endl; - std::cout << " [-n|--ifconfig] the local address for the tun/tap device" << std::endl; - std::cout << " the remote address(tun) or netmask(tap)" << std::endl; + std::cout << " [-n|--ifconfig] / the local address for the tun/tap device and the used prefix length" << std::endl; #ifndef NO_EXEC std::cout << " [-x|--post-up-script]