]> git.tdb.fi Git - netvis.git/blobdiff - source/address.cpp
Support IPv6
[netvis.git] / source / address.cpp
index 3a499716ec4720bfd24b8c297f25a3353bc6e977..4b56625ec1acd3a71b322d12484bbbdea3e72599 100644 (file)
@@ -21,6 +21,14 @@ Address::Address(uint32_t a):
                data[i] = a>>(24-i*8);
 }
 
+Address::Address(const in6_addr &a):
+       type(ETH_P_IPV6),
+       length(16),
+       mask_bits(128)
+{
+       copy(a.s6_addr, a.s6_addr+16, data);
+}
+
 Address::Address(unsigned short t, const unsigned char *d, unsigned char l):
        type(t),
        length(l)
@@ -53,6 +61,11 @@ string Address::str() const
                char buf[INET_ADDRSTRLEN];
                return inet_ntop(AF_INET, data, buf, INET_ADDRSTRLEN);
        }
+       else if(type==ETH_P_IPV6)
+       {
+               char buf[INET6_ADDRSTRLEN];
+               return inet_ntop(AF_INET6, data, buf, INET6_ADDRSTRLEN);
+       }
        else
                return "<unknown>";
 }
@@ -94,6 +107,15 @@ void Address::to_sockaddr(sockaddr_storage &sa) const
                sa_in.sin_port = 0;
                sa_in.sin_addr.s_addr = *(uint32_t *)data;
        }
+       else if(type==ETH_P_IPV6)
+       {
+               sockaddr_in6 &sa_in6 = reinterpret_cast<sockaddr_in6 &>(sa);
+               sa_in6.sin6_family = AF_INET6;
+               sa_in6.sin6_port = 0;
+               sa_in6.sin6_flowinfo = 0;
+               copy(data, data+16, sa_in6.sin6_addr.s6_addr);
+               sa_in6.sin6_scope_id = 0;
+       }
        else
                throw runtime_error("Unknown type");
 }