|
@@ -287,6 +287,30 @@ InetAddress InetAddress::network() const
|
|
return r;
|
|
return r;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifdef ZT_SDK
|
|
|
|
+ bool InetAddress::isEqualPrefix(const InetAddress &addr) const
|
|
|
|
+ {
|
|
|
|
+ if (addr.ss_family == ss_family) {
|
|
|
|
+ switch(ss_family) {
|
|
|
|
+ case AF_INET6: {
|
|
|
|
+ const InetAddress mask(netmask());
|
|
|
|
+ InetAddress addr_mask(addr.netmask());
|
|
|
|
+ const uint8_t *n = reinterpret_cast<const uint8_t *>(reinterpret_cast<const struct sockaddr_in6 *>(&addr_mask)->sin6_addr.s6_addr);
|
|
|
|
+ const uint8_t *m = reinterpret_cast<const uint8_t *>(reinterpret_cast<const struct sockaddr_in6 *>(&mask)->sin6_addr.s6_addr);
|
|
|
|
+ const uint8_t *a = reinterpret_cast<const uint8_t *>(reinterpret_cast<const struct sockaddr_in6 *>(&addr)->sin6_addr.s6_addr);
|
|
|
|
+ const uint8_t *b = reinterpret_cast<const uint8_t *>(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr);
|
|
|
|
+ for(unsigned int i=0;i<16;++i) {
|
|
|
|
+ if ((a[i] & m[i]) != (b[i] & n[i]))
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
+
|
|
bool InetAddress::containsAddress(const InetAddress &addr) const
|
|
bool InetAddress::containsAddress(const InetAddress &addr) const
|
|
{
|
|
{
|
|
if (addr.ss_family == ss_family) {
|
|
if (addr.ss_family == ss_family) {
|