]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[dhcp] Perform ProxyDHCP only if we do not already have PXE options
authorMichael Brown <mcb30@etherboot.org>
Tue, 19 May 2009 14:54:35 +0000 (15:54 +0100)
committerMichael Brown <mcb30@etherboot.org>
Wed, 20 May 2009 06:56:29 +0000 (07:56 +0100)
This prevents gPXE from wasting time attempting to contact a ProxyDHCP
server on port 4011 if the DHCP response already contains the relevant
PXE options.  This behaviour is hinted at (though not explicitly
specified) in the PXE spec, and seems to match what the Intel client
does.

Suggested-by: Simon Kelley <simon@thekelleys.org.uk>
src/net/udp/dhcp.c

index 9c1e09daeedcf43ce9c6eaa7c9757384c24c280b..851b75e1f71b3ed7db87d597b38bf574fc6adaa4 100644 (file)
@@ -335,6 +335,8 @@ static void dhcp_discovery_rx ( struct dhcp_session *dhcp,
        char vci[9]; /* "PXEClient" */
        int vci_len;
        int has_pxeclient;
+       int pxeopts_len;
+       int has_pxeopts;
        int8_t priority = 0;
        uint8_t no_pxedhcp = 0;
        unsigned long elapsed;
@@ -355,8 +357,10 @@ static void dhcp_discovery_rx ( struct dhcp_session *dhcp,
                                  vci, sizeof ( vci ) );
        has_pxeclient = ( ( vci_len >= ( int ) sizeof ( vci ) ) &&
                          ( strncmp ( "PXEClient", vci, sizeof (vci) ) == 0 ));
+       pxeopts_len = dhcppkt_fetch ( dhcppkt, DHCP_VENDOR_ENCAP, NULL, 0 );
+       has_pxeopts = ( pxeopts_len >= 0 );
        if ( has_pxeclient )
-               DBGC ( dhcp, " pxe" );
+               DBGC ( dhcp, "%s", ( has_pxeopts ? " pxe" : " proxy" ) );
 
        /* Identify priority */
        dhcppkt_fetch ( dhcppkt, DHCP_EB_PRIORITY, &priority,
@@ -382,7 +386,7 @@ static void dhcp_discovery_rx ( struct dhcp_session *dhcp,
        }
 
        /* Select as ProxyDHCP offer, if applicable */
-       if ( has_pxeclient && ( msgtype == DHCPOFFER ) &&
+       if ( has_pxeclient && ( ! has_pxeopts ) && ( msgtype == DHCPOFFER ) &&
             ( priority >= dhcp->proxy_priority ) ) {
                dhcp->proxy_server = server_id;
                dhcp->proxy_priority = priority;