From 0a4089286781b3030ced6a6f60f8f966ef578e9f Mon Sep 17 00:00:00 2001 From: Stephen Shelton Date: Mon, 11 May 2020 11:55:36 -0600 Subject: [PATCH] Implement SockAddr operator<() and operator==() --- llarp/net/ip_address.cpp | 4 ++-- llarp/net/sock_addr.cpp | 23 +++++++++++++++++++++++ llarp/net/sock_addr.hpp | 6 ++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/llarp/net/ip_address.cpp b/llarp/net/ip_address.cpp index 61823d3fa..6d705d999 100644 --- a/llarp/net/ip_address.cpp +++ b/llarp/net/ip_address.cpp @@ -117,13 +117,13 @@ namespace llarp bool IpAddress::operator<(const IpAddress& other) const { - throw std::runtime_error("FIXME - IpAddress::operator<()"); + return createSockAddr() < other.createSockAddr(); } bool IpAddress::operator==(const IpAddress& other) const { - throw std::runtime_error("FIXME - IpAddress::operator==()"); + return createSockAddr() == other.createSockAddr(); } std::ostream& diff --git a/llarp/net/sock_addr.cpp b/llarp/net/sock_addr.cpp index 6b42be974..9ea76efc4 100644 --- a/llarp/net/sock_addr.cpp +++ b/llarp/net/sock_addr.cpp @@ -147,6 +147,29 @@ namespace llarp return &m_addr; } + bool + SockAddr::operator<(const SockAddr& other) const + { + return (m_addr.sin6_addr.s6_addr < other.m_addr.sin6_addr.s6_addr); + } + + bool + SockAddr::operator==(const SockAddr& other) const + { + if (m_addr.sin6_family != other.m_addr.sin6_family) + return false; + + if (getPort() != other.getPort()) + return false; + + return ( + 0 + == memcmp( + m_addr.sin6_addr.s6_addr, + other.m_addr.sin6_addr.s6_addr, + sizeof(m_addr.sin6_addr.s6_addr))); + } + void SockAddr::fromString(std::string_view str) { diff --git a/llarp/net/sock_addr.hpp b/llarp/net/sock_addr.hpp index f379f5402..806244251 100644 --- a/llarp/net/sock_addr.hpp +++ b/llarp/net/sock_addr.hpp @@ -39,6 +39,12 @@ namespace llarp operator const sockaddr*() const; operator const sockaddr_in6*() const; + bool + operator<(const SockAddr& other) const; + + bool + operator==(const SockAddr& other) const; + void fromString(std::string_view str);