X-Git-Url: http://git.tdb.fi/?p=netvis.git;a=blobdiff_plain;f=source%2Faddress.cpp;h=4b56625ec1acd3a71b322d12484bbbdea3e72599;hp=3a499716ec4720bfd24b8c297f25a3353bc6e977;hb=e4b57e21ec2bc7f99c182eea23ecec297e111799;hpb=c1ea3cf06729622e2287e1604b1847d14fd2089c diff --git a/source/address.cpp b/source/address.cpp index 3a49971..4b56625 100644 --- a/source/address.cpp +++ b/source/address.cpp @@ -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 ""; } @@ -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(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"); }