summaryrefslogtreecommitdiff
path: root/src/networkAddress.cpp
diff options
context:
space:
mode:
authorOthmar Gsenger <otti@anytun.org>2008-04-12 11:38:42 +0000
committerOthmar Gsenger <otti@anytun.org>2008-04-12 11:38:42 +0000
commitfffd213c8cba2135afda493d797c41c10354770e (patch)
treebb5eea1b12871d8c3fed0e687d83be3e504d11b2 /src/networkAddress.cpp
parentsvn cleanup (diff)
big svn cleanup
Diffstat (limited to 'src/networkAddress.cpp')
-rw-r--r--src/networkAddress.cpp204
1 files changed, 204 insertions, 0 deletions
diff --git a/src/networkAddress.cpp b/src/networkAddress.cpp
new file mode 100644
index 0000000..cd93576
--- /dev/null
+++ b/src/networkAddress.cpp
@@ -0,0 +1,204 @@
+/*
+ * anytun
+ *
+ * The secure anycast tunneling protocol (satp) defines a protocol used
+ * for communication between any combination of unicast and anycast
+ * tunnel endpoints. It has less protocol overhead than IPSec in Tunnel
+ * mode and allows tunneling of every ETHER TYPE protocol (e.g.
+ * ethernet, ip, arp ...). satp directly includes cryptography and
+ * message authentication based on the methodes used by SRTP. It is
+ * intended to deliver a generic, scaleable and secure solution for
+ * tunneling and relaying of packets of any protocol.
+ *
+ *
+ * Copyright (C) 2007 anytun.org <satp@wirdorange.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see the file COPYING included with this
+ * distribution); if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "threadUtils.hpp"
+#include "datatypes.h"
+#include <exception>
+
+#include "networkAddress.h"
+
+NetworkAddress::NetworkAddress()
+{
+ network_address_type_=ipv4;
+ ipv4_address_.s_addr=0;
+}
+
+NetworkAddress::NetworkAddress(const NetworkAddress & ref) : mutex_(),ipv4_address_(ref.ipv4_address_),ipv6_address_(ref.ipv6_address_),ethernet_address_(ref.ethernet_address_),network_address_type_(ref.network_address_type_)
+{
+}
+
+NetworkAddress::NetworkAddress(in6_addr ipv6_address)
+{
+ network_address_type_=ipv6;
+ ipv6_address_ = ipv6_address;
+}
+
+NetworkAddress::NetworkAddress(in_addr ipv4_address)
+{
+ network_address_type_=ipv4;
+ ipv4_address_ = ipv4_address;
+}
+
+NetworkAddress::NetworkAddress(uint64_t ethernet_address)
+{
+ network_address_type_=ethernet;
+ ethernet_address_=ethernet_address;
+}
+
+
+NetworkAddress::~NetworkAddress()
+{
+}
+
+NetworkAddress::NetworkAddress(const network_address_type_t type, const char * address )
+{
+ setNetworkAddress( type, address);
+}
+
+void NetworkAddress::setNetworkAddress(const network_address_type_t type, const char * address )
+{
+ if (type==ipv4)
+ {
+ inet_pton(AF_INET, address, &ipv4_address_);
+ } else if (type==ipv6) {
+ inet_pton(AF_INET6, address, &ipv6_address_);
+ } else if (type==ethernet) {
+ //TODO
+ } else {
+ //TODO
+ }
+ network_address_type_ = type;
+}
+
+void NetworkAddress::getNetworkAddress(const char *)
+{
+}
+
+network_address_type_t NetworkAddress::getNetworkAddressType()
+{
+ return network_address_type_;
+}
+
+std::string NetworkAddress::toString() const
+{
+ if (network_address_type_==ipv4){
+ char buf[INET_ADDRSTRLEN];
+ if(!inet_ntop(AF_INET, &ipv4_address_, buf, sizeof(buf)))
+ return std::string("");
+ return std::string(buf);
+ }
+ else if (network_address_type_==ipv6) {
+ char buf[INET6_ADDRSTRLEN];
+ if(!inet_ntop(AF_INET6, &ipv6_address_, buf, sizeof(buf)))
+ return std::string("");
+ return std::string(buf);
+ }
+ else if (network_address_type_==ethernet) {
+ // TODO
+ }
+ return std::string("");
+}
+
+bool NetworkAddress::operator<(const NetworkAddress &right) const
+{
+ if (network_address_type_!=right.network_address_type_)
+ return false;
+ if (network_address_type_==ipv4)
+ {
+ return (ipv4_address_.s_addr < right.ipv4_address_.s_addr);
+ } else if (network_address_type_==ipv6) {
+ for(int i=0;i<4;i++)
+ if (ipv6_address_.s6_addr32[i]<right.ipv6_address_.s6_addr32[i])
+ return true;
+ return false;
+ } else if (network_address_type_==ethernet) {
+ //TODO
+ } else {
+ //TODO
+ }
+ return false;
+}
+
+
+NetworkAddress NetworkAddress::operator<<(uint8_t shift) const
+{
+ if (network_address_type_==ipv4)
+ {
+ in_addr new_v4_addr;
+ new_v4_addr.s_addr = ipv4_address_.s_addr << shift;
+ return (NetworkAddress(new_v4_addr));
+ } else if (network_address_type_==ipv6) {
+ in6_addr new_v6_addr;
+ for(int i=0;i<4;i++)
+ {
+ new_v6_addr.s6_addr32[i]=ipv6_address_.s6_addr32[i]<<1;
+ if (i<3 && ipv6_address_.s6_addr32[i+1] || uint32_t (0x80000000))
+ new_v6_addr.s6_addr32[i] &=1;
+ }
+ return NetworkAddress(new_v6_addr);
+ } else if (network_address_type_==ethernet) {
+ //TODO
+ } else {
+ //TODO
+ }
+ return false;
+}
+
+NetworkAddress NetworkAddress::operator&(const NetworkAddress &right) const
+{
+ if (network_address_type_!=right.network_address_type_)
+ throw std::runtime_error("network_address_types did not match");
+ if (network_address_type_==ipv4)
+ {
+ in_addr new_v4_addr;
+ new_v4_addr.s_addr = ipv4_address_.s_addr & right.ipv4_address_.s_addr;
+ return (NetworkAddress(new_v4_addr));
+ } else if (network_address_type_==ipv6) {
+ in6_addr new_v6_addr;
+ for(int i=0;i<4;i++)
+ new_v6_addr.s6_addr32[i]=ipv6_address_.s6_addr32[i]&right.ipv6_address_.s6_addr32[i];
+ return NetworkAddress(new_v6_addr);
+ } else if (network_address_type_==ethernet) {
+ //TODO
+ } else {
+ //TODO
+ }
+ return false;
+}
+
+NetworkAddress NetworkAddress::operator&=(const NetworkAddress &right)
+{
+ if (network_address_type_!=right.network_address_type_)
+ throw std::runtime_error("network_address_types did not match");
+ if (network_address_type_==ipv4)
+ {
+ ipv4_address_.s_addr &= right.ipv4_address_.s_addr;
+ return *this;
+ } else if (network_address_type_==ipv6) {
+ for(int i=0;i<4;i++)
+ ipv6_address_.s6_addr32[i]&=right.ipv6_address_.s6_addr32[i];
+ return *this;
+ } else if (network_address_type_==ethernet) {
+ //TODO
+ } else {
+ //TODO
+ }
+ return false;
+}