]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[dhcp] Allow for missing server ID in ProxyDHCPACK
authorMichael Brown <mcb30@etherboot.org>
Wed, 21 Jan 2009 00:55:42 +0000 (00:55 +0000)
committerMichael Brown <mcb30@etherboot.org>
Wed, 21 Jan 2009 00:55:42 +0000 (00:55 +0000)
The Linux PXE server (http://www.kano.org.uk/projects/pxe) does not
set the server identifier in its ProxyDHCP responses.  If the server
ID is missing, do not treat this as an error.

This resolves the "vague and unsettling memory" mentioned in commit
fdb8481d ("[dhcp] Verify server identifier on ProxyDHCPACKs").

Note that we already accept ProxyDHCPOFFERs without a server
identifier; they get treated as potential BOOTP packets.

src/net/udp/dhcp.c

index 2ef8c084dda59a8f5a03bb416ed22cd257461edb..40670232b4c3ddee985cdc33712a32e2654bcfaa 100644 (file)
@@ -845,16 +845,20 @@ static void dhcp_rx_proxydhcpack ( struct dhcp_session *dhcp,
        struct in_addr ack_server_id = { 0 };
        int rc;
 
-       /* Verify server ID matches */
+       /* Verify server ID matches, if present */
        assert ( dhcp->proxydhcpoffer != NULL );
-       dhcppkt_fetch ( &dhcp->proxydhcpoffer->dhcppkt, DHCP_SERVER_IDENTIFIER,
-                       &offer_server_id, sizeof ( offer_server_id ) );
-       dhcppkt_fetch ( &proxydhcpack->dhcppkt, DHCP_SERVER_IDENTIFIER,
-                       &ack_server_id, sizeof ( ack_server_id ) );
-       if ( offer_server_id.s_addr != ack_server_id.s_addr ) {
-               DBGC ( dhcp, "DHCP %p ignoring ProxyDHCPACK with wrong server "
-                      "ID %s\n", dhcp, inet_ntoa ( ack_server_id ) );
-               return;
+       if ( ( rc = dhcppkt_fetch ( &proxydhcpack->dhcppkt,
+                                   DHCP_SERVER_IDENTIFIER, &ack_server_id,
+                                   sizeof ( ack_server_id ) ) ) > 0 ) {
+               dhcppkt_fetch ( &dhcp->proxydhcpoffer->dhcppkt,
+                               DHCP_SERVER_IDENTIFIER, &offer_server_id,
+                               sizeof ( offer_server_id ) );
+               if ( offer_server_id.s_addr != ack_server_id.s_addr ) {
+                       DBGC ( dhcp, "DHCP %p ignoring ProxyDHCPACK with "
+                              "wrong server ID %s\n",
+                              dhcp, inet_ntoa ( ack_server_id ) );
+                       return;
+               }
        }
 
        /* Rename settings */