From b56aad58ee6185dc3d40810779ed709a4e73f4c0 Mon Sep 17 00:00:00 2001 From: Fred Morcos Date: Fri, 20 May 2022 12:41:36 +0200 Subject: [PATCH] Add IPv4 and IPv6 address reversal to ComboAddress --- pdns/iputils.hh | 26 ++++++++++++++++++++++++++ pdns/test-iputils_hh.cc | 21 +++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/pdns/iputils.hh b/pdns/iputils.hh index 7a949f6f2a..311d9f17e5 100644 --- a/pdns/iputils.hh +++ b/pdns/iputils.hh @@ -283,6 +283,32 @@ union ComboAddress { return "invalid "+stringerror(); } + [[nodiscard]] string toStringReversed() const + { + if (isIPv4()) { + const auto ip = ntohl(sin4.sin_addr.s_addr); + auto a = (ip >> 0) & 0xFF; + auto b = (ip >> 8) & 0xFF; + auto c = (ip >> 16) & 0xFF; + auto d = (ip >> 24) & 0xFF; + return std::to_string(a) + "." + std::to_string(b) + "." + std::to_string(c) + "." + std::to_string(d); + } + else { + const auto* addr = &sin6.sin6_addr; + std::stringstream res{}; + res << std::hex; + for (int i = 15; i >= 0; i--) { + auto byte = addr->s6_addr[i]; + res << ((byte >> 0) & 0xF) << "."; + res << ((byte >> 4) & 0xF); + if (i != 0) { + res << "."; + } + } + return res.str(); + } + } + string toStringWithPort() const { if(sin4.sin_family==AF_INET) diff --git a/pdns/test-iputils_hh.cc b/pdns/test-iputils_hh.cc index 0d358023df..a299fed6e8 100644 --- a/pdns/test-iputils_hh.cc +++ b/pdns/test-iputils_hh.cc @@ -162,6 +162,27 @@ BOOST_AUTO_TEST_CASE(test_ComboAddressTruncate) { } } +BOOST_AUTO_TEST_CASE(test_ComboAddressReverse) +{ + ComboAddress a{"1.2.3.4"}; + BOOST_CHECK_EQUAL(a.toStringReversed(), "4.3.2.1"); + + ComboAddress b{"192.168.0.1"}; + BOOST_CHECK_EQUAL(b.toStringReversed(), "1.0.168.192"); + + ComboAddress c{"2001:db8::567:89ab"}; + BOOST_CHECK_EQUAL(c.toStringReversed(), "b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2"); + + ComboAddress d{"::1"}; + BOOST_CHECK_EQUAL(d.toStringReversed(), "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0"); + + ComboAddress e{"ab:cd::10"}; + BOOST_CHECK_EQUAL(e.toStringReversed(), "0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.c.0.0.b.a.0.0"); + + ComboAddress f{"4321:0:1:2:3:4:567:89ab"}; + BOOST_CHECK_EQUAL(f.toStringReversed(), "b.a.9.8.7.6.5.0.4.0.0.0.3.0.0.0.2.0.0.0.1.0.0.0.0.0.0.0.1.2.3.4"); +} + BOOST_AUTO_TEST_CASE(test_Mapping) { ComboAddress lh("::1"); -- 2.47.2