diff options
Diffstat (limited to 'src/networkAddress.cpp')
-rw-r--r-- | src/networkAddress.cpp | 204 |
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; +} |