summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Pointner <equinox@anytun.org>2007-06-21 17:32:14 +0000
committerChristian Pointner <equinox@anytun.org>2007-06-21 17:32:14 +0000
commitca78a99ef24f205880bb78ce8d6091be6c27bb1d (patch)
treec4d53dc692a814c37b8c791af49167f514839894
parentadded options parser (diff)
added remote host auto detection
-rw-r--r--anytun.cpp9
-rw-r--r--options.cpp102
-rw-r--r--options.h36
-rw-r--r--packetSource.cpp2
-rw-r--r--packetSource.h4
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
<< " <remote/netmask> 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);
};