summaryrefslogtreecommitdiff
path: root/node/InetAddress.hpp
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2017-10-25 16:01:36 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2017-10-25 16:01:36 -0700
commitfac7dc9c913a94550692c31ca6c24fa4db5b5b52 (patch)
tree0538fb414506b57caec90230c47e434bec5d172b /node/InetAddress.hpp
parent508fa6a7fed894fd616239c04aeb0c2e8f6b9022 (diff)
downloadinfinitytier-fac7dc9c913a94550692c31ca6c24fa4db5b5b52.tar.gz
infinitytier-fac7dc9c913a94550692c31ca6c24fa4db5b5b52.zip
Stop duplciate IPv6 addresses due to privacy mode IPs.
Diffstat (limited to 'node/InetAddress.hpp')
-rw-r--r--node/InetAddress.hpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/node/InetAddress.hpp b/node/InetAddress.hpp
index 79bf76ad..c1ea6c13 100644
--- a/node/InetAddress.hpp
+++ b/node/InetAddress.hpp
@@ -405,6 +405,26 @@ struct InetAddress : public sockaddr_storage
return false;
}
+ /**
+ * Performs an IP-only comparison or, if that is impossible, a memcmp()
+ *
+ * This version compares only the first 64 bits of IPv6 addresses.
+ *
+ * @param a InetAddress to compare again
+ * @return True if only IP portions are equal (false for non-IP or null addresses)
+ */
+ inline bool ipsEqual2(const InetAddress &a) const
+ {
+ if (ss_family == a.ss_family) {
+ if (ss_family == AF_INET)
+ return (reinterpret_cast<const struct sockaddr_in *>(this)->sin_addr.s_addr == reinterpret_cast<const struct sockaddr_in *>(&a)->sin_addr.s_addr);
+ if (ss_family == AF_INET6)
+ return (memcmp(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr,reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_addr.s6_addr,8) == 0);
+ return (memcmp(this,&a,sizeof(InetAddress)) == 0);
+ }
+ return false;
+ }
+
inline unsigned long hashCode() const
{
if (ss_family == AF_INET) {