Browse Source

[master] Merge branch 'trac3537'

Marcin Siodelski 10 years ago
parent
commit
760c652b54
2 changed files with 18 additions and 0 deletions
  1. 7 0
      src/bin/dhcp4/dhcp4_messages.mes
  2. 11 0
      src/bin/dhcp4/dhcp4_srv.cc

+ 7 - 0
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

+ 11 - 0
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