From bceb259d949f0adf601710754334391f8b72134c Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Wed, 8 Oct 2014 16:30:44 +0200 Subject: [PATCH] [3537] Kea logs that the packet contains invalid giaddr/hops combination. --- src/bin/dhcp4/dhcp4_messages.mes | 7 +++++++ src/bin/dhcp4/dhcp4_srv.cc | 11 +++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/bin/dhcp4/dhcp4_messages.mes b/src/bin/dhcp4/dhcp4_messages.mes index 46a43ca0ab..e72c2631bc 100644 --- a/src/bin/dhcp4/dhcp4_messages.mes +++ b/src/bin/dhcp4/dhcp4_messages.mes @@ -158,6 +158,13 @@ This debug message is issued when the client being in the INIT-REBOOT state requested an address which is not assigned to him. The server will respond to this client with DHCPNAK. +% DHCP4_INVALID_RELAY_INFO malformed packet received from client-id %1, hwaddr %2: %3 +This message is logged when the client sends invalid combination of +values in the giaddr and hops fields. If the packet is relayed it should +contain non-zero values in both fields. If the packet is sent from the +directly connected client, both values should be set to zero. All other +combinations are invalid and trigger packet drop. + % DHCP4_LEASE_ADVERT lease %1 advertised (client client-id %2, hwaddr %3) This debug message indicates that the server successfully advertised a lease. It is up to the client to choose one server out of othe advertised diff --git a/src/bin/dhcp4/dhcp4_srv.cc b/src/bin/dhcp4/dhcp4_srv.cc index fa4f6dd75f..a6b5bd2cc5 100644 --- a/src/bin/dhcp4/dhcp4_srv.cc +++ b/src/bin/dhcp4/dhcp4_srv.cc @@ -1632,10 +1632,21 @@ Dhcpv4Srv::accept(const Pkt4Ptr& query) const { bool Dhcpv4Srv::acceptDirectRequest(const Pkt4Ptr& pkt) const { try { + // This is the first call to the isRelayed function for this packet, + // so we have to catch exceptions which will be emitted if the + // packet contains invalid combination of hops and giaddr. For all + // other invocations of isRelayed function we will not catch + // exceptions because we eliminate malformed packets here. if (pkt->isRelayed()) { return (true); } } catch (const Exception& ex) { + OptionPtr client_id = pkt->getOption(DHO_DHCP_CLIENT_IDENTIFIER); + HWAddrPtr hwaddr = pkt->getHWAddr(); + LOG_INFO(dhcp4_logger, DHCP4_INVALID_RELAY_INFO) + .arg(client_id ? client_id->toText():"(no client-id)") + .arg(hwaddr ? hwaddr->toText():"(no hwaddr info)") + .arg(ex.what()); return (false); } // The source address must not be zero for the DHCPINFORM message from -- GitLab