From c354d7ae0249e0984ff4585a27343002b5a635cc Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Sun, 16 Apr 2023 11:55:57 +0200 Subject: [PATCH] Add ability to compare IPv6 addresses --- r5dev/public/tier1/NetAdr.h | 3 +++ r5dev/public/utility/utility.cpp | 19 +++++++++++++++++++ r5dev/public/utility/utility.h | 4 ++++ r5dev/tier1/NetAdr.cpp | 29 +++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+) diff --git a/r5dev/public/tier1/NetAdr.h b/r5dev/public/tier1/NetAdr.h index 81d5743c..f3f343db 100644 --- a/r5dev/public/tier1/NetAdr.h +++ b/r5dev/public/tier1/NetAdr.h @@ -28,6 +28,9 @@ public: netadrtype_t GetType(void) const; uint16_t GetPort(void) const; + bool CompareAdr(const CNetAdr& other) const; + bool ComparePort(const CNetAdr& other) const; + const char* ToString(bool onlyBase = false) const; void ToString(char* pchBuffer, size_t unBufferSize, bool onlyBase = false) const; void ToAdrinfo(addrinfo* pHint) const; diff --git a/r5dev/public/utility/utility.cpp b/r5dev/public/utility/utility.cpp index 71ab4909..645ac1b3 100644 --- a/r5dev/public/utility/utility.cpp +++ b/r5dev/public/utility/utility.cpp @@ -1078,6 +1078,25 @@ string Format(const char* szFormat, ...) return result; } +/////////////////////////////////////////////////////////////////////////////// +// For comparing two IPv6 addresses. +int CompareIPv6(const IN6_ADDR& ipA, const IN6_ADDR& ipB) +{ + // Return 0 if ipA == ipB, -1 if ipA < ipB and 1 if ipA > ipB. + for (int i = 0; i < 16; ++i) + { + if (ipA.s6_addr[i] < ipB.s6_addr[i]) + { + return -1; + } + else if (ipA.s6_addr[i] > ipB.s6_addr[i]) + { + return 1; + } + } + return 0; +} + /////////////////////////////////////////////////////////////////////////////// // For obtaining a duration from a certain interval. std::chrono::nanoseconds IntervalToDuration(const float flInterval) diff --git a/r5dev/public/utility/utility.h b/r5dev/public/utility/utility.h index fe7a2c34..fb7c732b 100644 --- a/r5dev/public/utility/utility.h +++ b/r5dev/public/utility/utility.h @@ -109,6 +109,10 @@ Iter MaxElementABS(Iter first, Iter last) return ExtremeElementABS(first, last, std::greater<>()); } +///////////////////////////////////////////////////////////////////////////// +// Net +int CompareIPv6(const IN6_ADDR& ipA, const IN6_ADDR& ipB); + ///////////////////////////////////////////////////////////////////////////// // Time std::chrono::nanoseconds IntervalToDuration(const float flInterval); diff --git a/r5dev/tier1/NetAdr.cpp b/r5dev/tier1/NetAdr.cpp index 1304a360..20762c30 100644 --- a/r5dev/tier1/NetAdr.cpp +++ b/r5dev/tier1/NetAdr.cpp @@ -76,6 +76,35 @@ uint16_t CNetAdr::GetPort(void) const return port; } +////////////////////////////////////////////////////////////////////// +// Compares two addresses. +////////////////////////////////////////////////////////////////////// +bool CNetAdr::CompareAdr(const CNetAdr& other) const +{ + if (type != other.type) + { + return false; + } + if (type == netadrtype_t::NA_LOOPBACK) + { + return true; + } + if (type == netadrtype_t::NA_IP) + { + return (CompareIPv6(adr, other.adr) == 0); + } + + return false; +} + +////////////////////////////////////////////////////////////////////// +// Compares two ports. +////////////////////////////////////////////////////////////////////// +bool CNetAdr::ComparePort(const CNetAdr& other) const +{ + return port == other.port; +} + ////////////////////////////////////////////////////////////////////// // Convert address to string. //////////////////////////////////////////////////////////////////////