From e718b2c47831bf89633128618515761775beda5d Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Thu, 8 May 2008 22:13:18 +0000 Subject: first working version of linux tun device --- src/anytun.cpp | 12 +++++++++ src/linux/tunDevice.cpp | 66 +++++++++++++++++++++++++++++++++++++++++++------ src/linux/tunDevice.h | 10 ++++---- src/ovpn/tunDevice.h | 4 --- 4 files changed, 75 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/anytun.cpp b/src/anytun.cpp index 0637997..8c6600b 100644 --- a/src/anytun.cpp +++ b/src/anytun.cpp @@ -455,6 +455,18 @@ int main(int argc, char* argv[]) cLog.msg(Log::PRIO_NOTICE) << "post up script '" << gOpt.getPostUpScript() << "' returned " << postup_ret; } + +// Buffer buff(u_int32_t(1600)); +// int len; +// while(1) +// { +// len = dev.read(buff.getBuf(), buff.getLength()); +// cLog.msg(Log::PRIO_NOTICE) << "read " << len << " bytes form interface " << dev.getActualName(); +// } + +// exit(0); + + if(gOpt.getChroot()) chrootAndDrop(gOpt.getChrootDir(), gOpt.getUsername()); if(gOpt.getDaemonize()) diff --git a/src/linux/tunDevice.cpp b/src/linux/tunDevice.cpp index 1d07826..fefcf20 100644 --- a/src/linux/tunDevice.cpp +++ b/src/linux/tunDevice.cpp @@ -28,41 +28,91 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include +#include +#include + +#include +#define DEFAULT_DEVICE "/dev/net/tun" + #include "tunDevice.h" #include "threadUtils.hpp" -TunDevice::TunDevice(const char* dev_name,const char* dev_type, const char* ifcfg_lp, const char* ifcfg_rnmp) + +TunDevice::TunDevice(const char* dev_name, const char* dev_type, const char* ifcfg_lp, const char* ifcfg_rnmp) { + fd_ = -1; + type_ = TYPE_UNDEF; + + fd_ = ::open(DEFAULT_DEVICE, O_RDWR | O_NONBLOCK); + + if(fd_ < 0) + throw std::runtime_error("can't init tun/tap device"); + + struct ifreq ifr; + memset(&ifr, 0, sizeof(ifr)); + +// tun device + ifr.ifr_flags = IFF_TUN; + type_ = TYPE_TUN; + +// tap device +// ifr.ifr_flags = IFF_TAP | IFF_NO_PI; +// type_ = TYPE_TAP; + if(dev_name) + strncpy(ifr.ifr_name, dev_name, IFNAMSIZ); + + if(!ioctl(fd_, TUNSETIFF, &ifr)) { + actual_name_ = ifr.ifr_name; + } else if(!ioctl(fd_, (('T' << 8) | 202), &ifr)) { + actual_name_ = ifr.ifr_name; + } else + throw std::runtime_error("can't init tun/tap device"); } TunDevice::~TunDevice() { - + if(fd_ > 0) + ::close(fd_); } short TunDevice::read(u_int8_t* buf, u_int32_t len) { - return 0; + if(fd_ < 0) + return -1; + + return ::read(fd_, buf, len); } int TunDevice::write(u_int8_t* buf, u_int32_t len) { - return 0; + if(fd_ < 0) + return -1; + + return ::write(fd_, buf, len); } -char* TunDevice::getActualName() +const char* TunDevice::getActualName() { - return NULL; + return actual_name_.c_str(); } u_int32_t TunDevice::getType() { - return TYPE_UNDEF; + return type_; } const char* TunDevice::getTypeString() { + if(fd_ < 0) + return NULL; + + switch(type_) + { + case TYPE_UNDEF: return "undef"; break; + case TYPE_TUN: return "tun"; break; + case TYPE_TAP: return "tap"; break; + } return NULL; } - diff --git a/src/linux/tunDevice.h b/src/linux/tunDevice.h index ae286f7..4588964 100644 --- a/src/linux/tunDevice.h +++ b/src/linux/tunDevice.h @@ -44,20 +44,20 @@ public: TunDevice(const char* dev,const char* dev_type, const char* ifcfg_lp, const char* ifcfg_rnmp); ~TunDevice(); - void open(); - void close(); - bool isOpen(); - short read(u_int8_t* buf, u_int32_t len); int write(u_int8_t* buf, u_int32_t len); - char* getActualName(); + const char* getActualName(); u_int32_t getType(); const char* getTypeString(); private: void operator=(const TunDevice &src); TunDevice(const TunDevice &src); + + int fd_; + u_int32_t type_; + std::string actual_name_; }; #endif diff --git a/src/ovpn/tunDevice.h b/src/ovpn/tunDevice.h index af08132..56b06fd 100644 --- a/src/ovpn/tunDevice.h +++ b/src/ovpn/tunDevice.h @@ -44,10 +44,6 @@ public: TunDevice(const char* dev,const char* dev_type, const char* ifcfg_lp, const char* ifcfg_rnmp); ~TunDevice(); - void open(); - void close(); - bool isOpen(); - short read(u_int8_t* buf, u_int32_t len); int write(u_int8_t* buf, u_int32_t len); -- cgit v1.2.3