]> granicus.if.org Git - pdns/commitdiff
rec: Make more specific Netmask < to less specific ones
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 14 Jun 2017 16:16:26 +0000 (18:16 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 13 Nov 2017 14:53:40 +0000 (15:53 +0100)
Having the most specific ones first, then the less specific ones
then the empty one makes it easier to match the most specific first.

(cherry picked from commit a009559d3bc4d648edc3b5fff062b622bbde2389)

pdns/iputils.hh
pdns/test-iputils_hh.cc

index 9a2414fc1410c51fe2896cb53e5eb14757000313..432b5351fbda666e159574aecee0894a88ae9527 100644 (file)
@@ -444,7 +444,23 @@ public:
 
   bool operator<(const Netmask& rhs) const 
   {
-    return tie(d_network, d_bits) < tie(rhs.d_network, rhs.d_bits);
+    if (empty() && !rhs.empty())
+      return false;
+
+    if (!empty() && rhs.empty())
+      return true;
+
+    if (d_bits > rhs.d_bits)
+      return true;
+    if (d_bits < rhs.d_bits)
+      return false;
+
+    return d_network < rhs.d_network;
+  }
+
+  bool operator>(const Netmask& rhs) const
+  {
+    return rhs.operator<(*this);
   }
 
   bool operator==(const Netmask& rhs) const 
index 3e1b7ecf69f272326979acab28fa7acb88bf82fe..b94dab1d1ed6f7f692693c4699bfb2d441bdfd94 100644 (file)
@@ -195,6 +195,7 @@ BOOST_AUTO_TEST_CASE(test_Netmask) {
   Netmask all6("::/0");
   BOOST_CHECK(all6.match("::1") && all6.match("fe80::92fb:a6ff:fe4a:51da"));
 
+
   Netmask fromCombo1(ComboAddress("192.0.2.1:53"), 32);
   Netmask fromCombo2(ComboAddress("192.0.2.1:54"), 32);
   BOOST_CHECK(fromCombo1 == fromCombo2);
@@ -207,6 +208,30 @@ BOOST_AUTO_TEST_CASE(test_Netmask) {
   BOOST_CHECK(nm25.getBits() == 25);
   BOOST_CHECK(nm25.getNetwork() == ComboAddress("192.0.2.255"));
   BOOST_CHECK(nm25.getMaskedNetwork() == ComboAddress("192.0.2.128"));
+
+  /* Make sure that more specific Netmasks are lesser than less specific ones,
+     as this is very useful when matching. */
+  Netmask specific32("192.0.0.0/32");
+  Netmask specific24("192.0.0.0/24");
+  Netmask specific16("192.0.0.0/16");
+  BOOST_CHECK(specific32 < specific24);
+  BOOST_CHECK(specific24 > specific32);
+  BOOST_CHECK(specific24 < specific16);
+  BOOST_CHECK(specific16 > specific24);
+
+  Netmask sameMask1("192.0.0.0/16");
+  Netmask sameMask2("192.0.0.1/16");
+  BOOST_CHECK(sameMask1 < sameMask2);
+  BOOST_CHECK(sameMask2 > sameMask1);
+
+  /* An empty Netmask should be larger than
+     every others. */
+  Netmask empty = Netmask();
+  Netmask full("255.255.255.255/32");
+  BOOST_CHECK(empty > all);
+  BOOST_CHECK(all < empty);
+  BOOST_CHECK(empty > full);
+  BOOST_CHECK(full < empty);
 }
 
 BOOST_AUTO_TEST_CASE(test_NetmaskGroup) {