From c454d0d1d3f6d4ea4962a746cbed20d1aa003f6e Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Thu, 21 Apr 2022 00:16:22 +0000 Subject: [PATCH] test: osd: add a /0 cidr test for 32-bit... ...and make the OSDMap handle it. Signed-off-by: Greg Farnum --- src/osd/OSDMap.cc | 6 +++++- src/test/osd/TestOSDMap.cc | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 992871e9c8c30..f5a19f9656c33 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -1398,7 +1398,11 @@ void OSDMap::range_bits::parse(const entity_addr_t& addr) { ipv6 = true; } else if (addr.is_ipv4()) { bits.ipv4.ip_32_bits = ntohl(addr.in4_addr().sin_addr.s_addr); - bits.ipv4.mask = UINT32_MAX << (32-addr.get_nonce()); + if (addr.get_nonce() > 0) { + bits.ipv4.mask = UINT32_MAX << (32-addr.get_nonce()); + } else { + bits.ipv4.mask = 0; + } } else { // uh... } diff --git a/src/test/osd/TestOSDMap.cc b/src/test/osd/TestOSDMap.cc index d3733672ac7f9..5435cefb5af8e 100644 --- a/src/test/osd/TestOSDMap.cc +++ b/src/test/osd/TestOSDMap.cc @@ -2215,7 +2215,7 @@ TEST_F(OSDMapTest, blocklisting_ranges) { } } -TEST_F(OSDMapTest, blocklisting_weirder) { +TEST_F(OSDMapTest, blocklisting_everything) { set_up_map(6); //whatever OSDMap::Incremental range_blocklist_inc(osdmap.get_epoch() + 1); entity_addr_t baddr; @@ -2246,6 +2246,38 @@ TEST_F(OSDMapTest, blocklisting_weirder) { } ASSERT_TRUE(blocklisted); } + + OSDMap::Incremental swap_blocklist_inc(osdmap.get_epoch()+1); + swap_blocklist_inc.old_range_blocklist.push_back(baddr); + + entity_addr_t caddr; + caddr.parse("1.1.1.1/0"); + caddr.type = entity_addr_t::TYPE_CIDR; + swap_blocklist_inc.new_range_blocklist[caddr] = ceph_clock_now(); + osdmap.apply_incremental(swap_blocklist_inc); + + for (const auto& a: ip_addrs) { + entity_addr_t addr; + addr.parse(a); + addr.set_type(entity_addr_t::TYPE_LEGACY); + if (!addr.is_ipv4()) continue; + bool blocklisted = osdmap.is_blocklisted(addr, g_ceph_context); + if (!blocklisted) { + cout << "erroneously not blocklisted " << addr << std::endl; + } + ASSERT_TRUE(blocklisted); + } + for (const auto& a: unblocked_ip_addrs) { + entity_addr_t addr; + addr.parse(a); + addr.set_type(entity_addr_t::TYPE_LEGACY); + if (!addr.is_ipv4()) continue; + bool blocklisted = osdmap.is_blocklisted(addr, g_ceph_context); + if (!blocklisted) { + cout << "erroneously not blocklisted " << addr << std::endl; + } + ASSERT_TRUE(blocklisted); + } } INSTANTIATE_TEST_SUITE_P( -- 2.39.5