]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#3140] Chekpoint: began lease query update
authorFrancis Dupont <fdupont@isc.org>
Thu, 16 Oct 2025 23:24:47 +0000 (01:24 +0200)
committerFrancis Dupont <fdupont@isc.org>
Wed, 5 Nov 2025 21:46:19 +0000 (22:46 +0100)
src/hooks/dhcp/lease_query/lease_query_impl4.cc
src/hooks/dhcp/lease_query/lease_query_impl6.cc

index f92e5c67a27e71d76dc925143688bd5e6f86e150..f5c79687b199fb66b5f904ef6197b1a456b02c26 100644 (file)
@@ -59,6 +59,8 @@ LeaseQueryImpl4::processQuery(PktPtr base_query, bool& invalid,
     IOAddress requester_ip = query->getGiaddr();
     if (requester_ip.isV4Zero())  {
         invalid = true;
+        StatsMgr::instance().addValue("pkt4-rfc-violation",
+                                      static_cast<int64_t>(1));
         isc_throw(BadValue, "giaddr cannot be 0.0.0.0");
     }
 
@@ -73,6 +75,7 @@ LeaseQueryImpl4::processQuery(PktPtr base_query, bool& invalid,
     OptionPtr client_server_id;
     if (!acceptServerId(query, client_server_id)) {
         invalid = true;
+        // Drop statistic updated by acceptServerId.
         isc_throw(BadValue, "rejecting query from: "
                   << requester_ip.toText() << ", unknown server-id: "
                   << (client_server_id ? client_server_id->toText() : "malformed"));
@@ -115,6 +118,8 @@ LeaseQueryImpl4::processQuery(PktPtr base_query, bool& invalid,
     default:
         // We have some combination of the three which is invalid.
         invalid = true;
+        StatsMgr::instance().addValue("pkt4-rfc-violation",
+                                      static_cast<int64_t>(1));
         isc_throw(BadValue, "malformed lease query: "
                   << "ciaddr: [" << ciaddr
                   << "] HWAddr: [" << hwaddr->toText()
@@ -565,10 +570,14 @@ LeaseQueryImpl4::acceptServerId(const Pkt4Ptr& query, OptionPtr& server_id_opt)
     // Unable to convert the option to the option type which encapsulates it.
     // We treat this as non-matching server id.
     if (!option_custom) {
+        StatsMgr::instance().addValue("pkt4-rfc-violation",
+                                      static_cast<int64_t>(1));
         return (false);
     }
     // The server identifier option should carry exactly one IPv4 address.
     if (option_custom->getDataFieldsNum() != 1) {
+        StatsMgr::instance().addValue("pkt4-rfc-violation",
+                                      static_cast<int64_t>(1));
         return (false);
     }
 
@@ -576,6 +585,8 @@ LeaseQueryImpl4::acceptServerId(const Pkt4Ptr& query, OptionPtr& server_id_opt)
     IOAddress client_server_id = option_custom->readAddress();
     if (!client_server_id.isV4() ||
         (client_server_id == IOAddress::IPV4_ZERO_ADDRESS())) {
+        StatsMgr::instance().addValue("pkt4-rfc-violation",
+                                      static_cast<int64_t>(1));
         return (false);
     }
 
@@ -627,7 +638,14 @@ LeaseQueryImpl4::acceptServerId(const Pkt4Ptr& query, OptionPtr& server_id_opt)
     OptionCustomPtr cfg_server_id = boost::dynamic_pointer_cast<OptionCustom>
         (cfg->getCfgOption()->get(DHCP4_OPTION_SPACE, DHO_DHCP_SERVER_IDENTIFIER).option_);
 
-    return (cfg_server_id && (cfg_server_id->readAddress() == client_server_id));
+    if (cfg_server_id && (cfg_server_id->readAddress() == client_server_id)) {
+        return (true);
+    }
+
+    // Everything failed so the query is not for us.
+    StatsMgr::instance().addValue("pkt4-not-for-us",
+                                  static_cast<int64_t>(1));
+    return (false);
 }
 
 void
index 9cb0313a6304da8b83698d55ce834027507a5e40..d3d09829e90b136dc13e0db91c9dfb73ba50c8e2 100644 (file)
@@ -102,6 +102,8 @@ LeaseQueryImpl6::processQuery(PktPtr base_query, bool& invalid,
     DuidPtr req_clientid = query->getClientId();
     if (!req_clientid) {
         invalid = true;
+        StatsMgr::instance().addValue("pkt6-rfc-violation",
+                                      static_cast<int64_t>(1));
         isc_throw(BadValue, "DHCPV6_LEASEQUERY must supply a D6O_CLIENTID");
     }
 
@@ -110,6 +112,7 @@ LeaseQueryImpl6::processQuery(PktPtr base_query, bool& invalid,
         testServerId(query);
     } catch (const BadValue&) {
         invalid = true;
+        // Drop statistic updated by testServerId.
         throw;
     }
 
@@ -118,6 +121,8 @@ LeaseQueryImpl6::processQuery(PktPtr base_query, bool& invalid,
     if (requester_ip.isV6Zero())  {
         /// Not sure this really possible.
         invalid = true;
+        StatsMgr::instance().addValue("pkt6-rfc-violation",
+                                      static_cast<int64_t>(1));
         isc_throw(BadValue, "DHCPV6_LEASEQUERY source address cannot be ::");
     }
 
@@ -136,6 +141,8 @@ LeaseQueryImpl6::processQuery(PktPtr base_query, bool& invalid,
                                 (query->getOption(D6O_LQ_QUERY));
     if (!lq_option) {
         invalid = true;
+        StatsMgr::instance().addValue("pkt6-rfc-violation",
+                                      static_cast<int64_t>(1));
         isc_throw(BadValue, "DHCPV6_LEASEQUERY must supply a D6O_LQ_QUERY option");
     }
 
@@ -148,6 +155,8 @@ LeaseQueryImpl6::processQuery(PktPtr base_query, bool& invalid,
     } catch (const std::exception& ex) {
         // unpack() should catch this?
         invalid = true;
+        StatsMgr::instance().addValue("pkt6-rfc-violation",
+                                      static_cast<int64_t>(1));
         isc_throw(BadValue, "error reading query field(s):" << ex.what());
     }
 
@@ -1067,14 +1076,20 @@ LeaseQueryImpl6::testServerId(const Pkt6Ptr& query) {
         try {
             client_duid.reset(new DUID(client_server_id->getData()));
         } catch (const std::exception& ex) {
+            StatsMgr::instance().addValue("pkt6-rfc-violation",
+                                          static_cast<int64_t>(1));
             isc_throw(BadValue, "DHCPV6_LEASEQUERY D6O_SERVERID malformed: "
                       << ex.what());
         }
 
         DuidPtr server_id = CfgMgr::instance().getCurrentCfg()->getCfgDUID()->getCurrentDuid();
         if (!server_id) {
+            StatsMgr::instance().addValue("pkt6-rfc-violation",
+                                          static_cast<int64_t>(1));
             isc_throw(Unexpected, "Server has no current server id?");
         } else if (*client_duid != *server_id) {
+            StatsMgr::instance().addValue("pkt6-not-for-us",
+                                          static_cast<int64_t>(1));
             isc_throw(BadValue, "rejecting DHCPV6_LEASEQUERY from: "
                       << query->getRemoteAddr() << ", unknown server-id: "
                       << (client_server_id ? client_server_id->toText() : "malformed"));