summaryrefslogtreecommitdiff
path: root/networkAddress.cpp
diff options
context:
space:
mode:
authorOthmar Gsenger <otti@anytun.org>2008-02-27 19:30:28 +0000
committerOthmar Gsenger <otti@anytun.org>2008-02-27 19:30:28 +0000
commitfa7c78d39976a0679315b5a8229594ced13a5b0f (patch)
tree63e5919d5f3ec9272955ce8888440f5062eaf645 /networkAddress.cpp
parentadded network prefix (diff)
added networkAddress operators
Diffstat (limited to 'networkAddress.cpp')
-rw-r--r--networkAddress.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/networkAddress.cpp b/networkAddress.cpp
index cd40d86..2d53f75 100644
--- a/networkAddress.cpp
+++ b/networkAddress.cpp
@@ -30,6 +30,7 @@
#include "threadUtils.hpp"
#include "datatypes.h"
+#include <exception>
#include "networkAddress.h"
@@ -37,6 +38,29 @@ NetworkAddress::NetworkAddress()
{
}
+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()
{
}
@@ -85,3 +109,49 @@ bool NetworkAddress::operator<(const NetworkAddress &right) const
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;
+}