From ca78a99ef24f205880bb78ce8d6091be6c27bb1d Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Thu, 21 Jun 2007 17:32:14 +0000 Subject: added remote host auto detection --- anytun.cpp | 9 ++++- options.cpp | 102 +++++++++++++++++++++++++++++++++++++++++++++++++------ options.h | 36 ++++++++++++++------ packetSource.cpp | 2 +- packetSource.h | 4 +-- 5 files changed, 128 insertions(+), 25 deletions(-) diff --git a/anytun.cpp b/anytun.cpp index bebb71b..8a4fed5 100644 --- a/anytun.cpp +++ b/anytun.cpp @@ -68,6 +68,9 @@ void* sender(void* p) int len = param->dev->read(pack); pack.resizeBack(len); + if(param->opt->getRemoteAddr() == "") + continue; + // add payload type if(param->dev->getType() == TunDevice::TYPE_TUN) pack.addPayloadType(PAYLOAD_TYPE_TUN); @@ -111,10 +114,14 @@ void* receiver(void* p) pack.removeAuthTag(); if(at != param->a->calc(pack)) continue; + + // autodetect peer + if(param->opt->getRemoteAddr() == "") + param->opt->setRemoteAddrPort(remote_host, remote_port); // compare sender_id and seq with window pack.removeHeader(); - + // decypher the packet param->c->cypher(pack); diff --git a/options.cpp b/options.cpp index 31bdb1b..2be4538 100644 --- a/options.cpp +++ b/options.cpp @@ -86,6 +86,8 @@ Options::Options() bool Options::parse(int argc, char* argv[]) { + Lock lock(mutex); + progname_ = argv[0]; argc--; @@ -109,7 +111,7 @@ bool Options::parse(int argc, char* argv[]) return true; } -void Options::printUsage() const +void Options::printUsage() { std::cout << "USAGE:" << std::endl; std::cout << "anytun [-h|--help] prints this..." << std::endl; @@ -124,8 +126,9 @@ void Options::printUsage() const << " the remote address(tun) or netmask(tap)" << std::endl; } -void Options::printOptions() const +void Options::printOptions() { + Lock lock(mutex); std::cout << "Options:" << std::endl; std::cout << "sender_id='" << sender_id_ << "'" << std::endl; std::cout << "local_addr='" << local_addr_ << "'" << std::endl; @@ -137,43 +140,122 @@ void Options::printOptions() const std::cout << "ifconfig_param_remote_netmask='" << ifconfig_param_remote_netmask_ << "'" << std::endl; } -sender_id_t Options::getSenderId() const +std::string Options::getProgname() +{ + Lock lock(mutex); + return progname_; +} + +Options& Options::setProgname(std::string p) +{ + Lock lock(mutex); + progname_ = p; + return *this; +} + +sender_id_t Options::getSenderId() { return sender_id_; } -std::string Options::getLocalAddr() const +Options& Options::setSenderId(sender_id_t s) { + sender_id_ = s; + return *this; +} + +std::string Options::getLocalAddr() +{ + Lock lock(mutex); return local_addr_; } -u_int16_t Options::getLocalPort() const +Options& Options::setLocalAddr(std::string l) +{ + Lock lock(mutex); + local_addr_ = l; + return *this; +} + +u_int16_t Options::getLocalPort() { return local_port_; } -std::string Options::getRemoteAddr() const +Options& Options::setLocalPort(u_int16_t l) { + local_port_ = l; + return *this; +} + +std::string Options::getRemoteAddr() +{ + Lock lock(mutex); return remote_addr_; } -u_int16_t Options::getRemotePort() const +Options& Options::setRemoteAddr(std::string r) +{ + Lock lock(mutex); + remote_addr_ = r; + return *this; +} + +u_int16_t Options::getRemotePort() { return remote_port_; } -std::string Options::getDevName() const +Options& Options::setRemotePort(u_int16_t r) +{ + remote_port_ = r; + return *this; +} + +Options& Options::setRemoteAddrPort(std::string addr, u_int16_t port) { + Lock lock(mutex); + remote_addr_ = addr; + remote_port_ = port; + return *this; +} + +std::string Options::getDevName() +{ + Lock lock(mutex); return dev_name_; } -std::string Options::getIfconfigParamLocal() const +Options& Options::setDevName(std::string d) { + Lock lock(mutex); + dev_name_ = d; + return *this; +} + +std::string Options::getIfconfigParamLocal() +{ + Lock lock(mutex); return ifconfig_param_local_; } -std::string Options::getIfconfigParamRemoteNetmask() const +Options& Options::setIfconfigParamLocal(std::string i) +{ + Lock lock(mutex); + ifconfig_param_local_ = i; + return *this; +} + +std::string Options::getIfconfigParamRemoteNetmask() { + Lock lock(mutex); return ifconfig_param_remote_netmask_; } +Options& Options::setIfconfigParamRemoteNetmask(std::string i) +{ + Lock lock(mutex); + ifconfig_param_remote_netmask_ = i; + return *this; +} + diff --git a/options.h b/options.h index 9088b28..48cb31d 100644 --- a/options.h +++ b/options.h @@ -31,25 +31,39 @@ #ifndef _OPTIONS_H_ #define _OPTIONS_H_ +#include "threadUtils.hpp" + class Options { public: Options(); bool parse(int argc, char* argv[]); - void printUsage() const; - void printOptions() const; + void printUsage(); + void printOptions(); - std::string getProgname() const; - sender_id_t getSenderId() const; - std::string getLocalAddr() const; - u_int16_t getLocalPort() const; - std::string getRemoteAddr() const; - u_int16_t getRemotePort() const; - std::string getDevName() const; - std::string getIfconfigParamLocal() const; - std::string getIfconfigParamRemoteNetmask() const; + std::string getProgname(); + Options& setProgname(std::string p); + sender_id_t getSenderId(); + Options& setSenderId(sender_id_t s); + std::string getLocalAddr(); + Options& setLocalAddr(std::string l); + u_int16_t getLocalPort(); + Options& setLocalPort(u_int16_t l); + std::string getRemoteAddr(); + Options& setRemoteAddr(std::string r); + u_int16_t getRemotePort(); + Options& setRemotePort(u_int16_t r); + Options& setRemoteAddrPort(std::string addr, u_int16_t port); + std::string getDevName(); + Options& setDevName(std::string d); + std::string getIfconfigParamLocal(); + Options& setIfconfigParamLocal(std::string i); + std::string getIfconfigParamRemoteNetmask(); + Options& setIfconfigParamRemoteNetmask(std::string i); private: + Mutex mutex; + std::string progname_; sender_id_t sender_id_; std::string local_addr_; diff --git a/packetSource.cpp b/packetSource.cpp index a20d7bb..063d142 100644 --- a/packetSource.cpp +++ b/packetSource.cpp @@ -46,7 +46,7 @@ UDPPacketSource::UDPPacketSource(std::string localaddr, u_int16_t port) : UDPSoc { } -u_int32_t UDPPacketSource::recv(Buffer& buf, std::string addr, u_int16_t &port) +u_int32_t UDPPacketSource::recv(Buffer& buf, std::string& addr, u_int16_t &port) { return recvFrom(buf, buf.getLength(), addr, port); } diff --git a/packetSource.h b/packetSource.h index d2902d9..a085b04 100644 --- a/packetSource.h +++ b/packetSource.h @@ -37,7 +37,7 @@ class PacketSource public: virtual ~PacketSource() {} - virtual u_int32_t recv(Buffer& buf, std::string addr, u_int16_t &port) = 0; + virtual u_int32_t recv(Buffer& buf, std::string& addr, u_int16_t &port) = 0; virtual void send(Buffer& buf, std::string addr, u_int16_t port) = 0; }; @@ -48,7 +48,7 @@ public: UDPPacketSource(u_int16_t port); UDPPacketSource(std::string localaddr, u_int16_t port); - u_int32_t recv(Buffer& buf, std::string addr, u_int16_t &port); + u_int32_t recv(Buffer& buf, std::string& addr, u_int16_t &port); void send(Buffer& buf, std::string addr, u_int16_t port); }; -- cgit v1.2.3