diff --git a/src/bin/dhcp4/dhcp4_messages.mes b/src/bin/dhcp4/dhcp4_messages.mes index 46a43ca0ab09b96cd5ab3ce8bc2cf989a2a089bf..e72c2631bc843dbe9e41ba9f9cc64bd83cad5502 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 fa4f6dd75ffa8abe3e8e2020dc7360121aff6fcf..a6b5bd2cc54522183a52e6b7439220339f99fd7c 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