From 6a25ca1e5e80196d6fbb455f0f7205d36cd7d0f8 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Fri, 17 Oct 2025 01:24:47 +0200 Subject: [PATCH] [#3140] Chekpoint: began lease query update --- .../dhcp/lease_query/lease_query_impl4.cc | 20 ++++++++++++++++++- .../dhcp/lease_query/lease_query_impl6.cc | 15 ++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/hooks/dhcp/lease_query/lease_query_impl4.cc b/src/hooks/dhcp/lease_query/lease_query_impl4.cc index f92e5c67a2..f5c79687b1 100644 --- a/src/hooks/dhcp/lease_query/lease_query_impl4.cc +++ b/src/hooks/dhcp/lease_query/lease_query_impl4.cc @@ -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(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(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(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(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(1)); return (false); } @@ -627,7 +638,14 @@ LeaseQueryImpl4::acceptServerId(const Pkt4Ptr& query, OptionPtr& server_id_opt) OptionCustomPtr cfg_server_id = boost::dynamic_pointer_cast (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(1)); + return (false); } void diff --git a/src/hooks/dhcp/lease_query/lease_query_impl6.cc b/src/hooks/dhcp/lease_query/lease_query_impl6.cc index 9cb0313a63..d3d09829e9 100644 --- a/src/hooks/dhcp/lease_query/lease_query_impl6.cc +++ b/src/hooks/dhcp/lease_query/lease_query_impl6.cc @@ -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(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(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(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(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(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(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(1)); isc_throw(BadValue, "rejecting DHCPV6_LEASEQUERY from: " << query->getRemoteAddr() << ", unknown server-id: " << (client_server_id ? client_server_id->toText() : "malformed")); -- 2.47.3