From 9c17463a80d8127537c6cfaf7f323e58083209c1 Mon Sep 17 00:00:00 2001 From: tearfur <46261767+tearfur@users.noreply.github.com> Date: Sat, 1 Jul 2023 22:39:35 +0800 Subject: [PATCH] fix: revert "perf: improve IPv4 `tr_address` comparison" (#5709) * Revert "perf: improve IPv4 `tr_address` comparison (#5651)" This reverts commit 70decc1d9dfbdc46112c29fdf38f829d34f6e867. * added tests * add ipv4 equal test and std header --- libtransmission/net.cc | 4 +--- tests/libtransmission/net-test.cc | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/libtransmission/net.cc b/libtransmission/net.cc index 6992d5211..4e77f09db 100644 --- a/libtransmission/net.cc +++ b/libtransmission/net.cc @@ -596,9 +596,7 @@ int tr_address::compare(tr_address const& that) const noexcept // <=> return this->is_ipv4() ? 1 : -1; } - // in_addr_t is by definition uint32_t, so we convert it to int64_t, - // the smallest signed integer type that can contain all values of uint32_t. - return this->is_ipv4() ? static_cast(int64_t{ ntohl(this->addr.addr4.s_addr) } - ntohl(that.addr.addr4.s_addr)) : + return this->is_ipv4() ? memcmp(&this->addr.addr4, &that.addr.addr4, sizeof(this->addr.addr4)) : memcmp(&this->addr.addr6.s6_addr, &that.addr.addr6.s6_addr, sizeof(this->addr.addr6.s6_addr)); } diff --git a/tests/libtransmission/net-test.cc b/tests/libtransmission/net-test.cc index 27ddc3b8b..f4f29b239 100644 --- a/tests/libtransmission/net-test.cc +++ b/tests/libtransmission/net-test.cc @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -179,3 +180,28 @@ TEST_F(NetTest, isGlobalUnicastAddress) EXPECT_EQ(expected, address->is_global_unicast_address()) << presentation; } } + +TEST_F(NetTest, ipCompare) +{ + static auto constexpr IpPairs = std::array{ std::tuple{ "223.18.245.229"sv, "8.8.8.8"sv, 1 }, + std::tuple{ "0.0.0.0"sv, "255.255.255.255"sv, -1 }, + std::tuple{ "8.8.8.8"sv, "8.8.8.8"sv, 0 }, + std::tuple{ "8.8.8.8"sv, "2001:0:0eab:dead::a0:abcd:4e"sv, 1 }, + std::tuple{ "2001:1890:1112:1::20"sv, "2001:0:0eab:dead::a0:abcd:4e"sv, 1 }, + std::tuple{ "2001:1890:1112:1::20"sv, "2001:1890:1112:1::20"sv, 0 } }; + + for (auto const& [ip_str1, ip_str2, res] : IpPairs) + { + auto const ip1 = *tr_address::from_string(ip_str1); + auto const ip2 = *tr_address::from_string(ip_str2); + + std::cerr << ip_str1 << " Vs " << ip_str2 << std::endl; + + EXPECT_EQ(ip1.compare(ip2) < 0, res < 0); + EXPECT_EQ(ip1.compare(ip2) > 0, res > 0); + EXPECT_EQ(ip1.compare(ip2) == 0, res == 0); + EXPECT_EQ(ip1 < ip2, res < 0); + EXPECT_EQ(ip1 > ip2, res > 0); + EXPECT_EQ(ip1 == ip2, res == 0); + } +}