[gPXE git] mainline commit to master: [dhcp] Honor PXEBS_SKIP option in discovery control

git at etherboot.org git at etherboot.org
Tue May 25 17:41:31 EDT 2010


In the Main gPXE repository, branch master has been updated.
      adds  42fb96f [dhcp] Honor PXEBS_SKIP option in discovery control
      from  9b0e589 [wpa] Remove PMKID checking

Summary of changes:
 src/net/udp/dhcp.c |   29 ++++++++++++++++++++++++++++-
 1 files changed, 28 insertions(+), 1 deletions(-)


- Log -----------------------------------------------------------------
------
commit 42fb96f750b4de922bfbb1d67342a16288059bc9
Author: Joshua Oreman <oremanj at rwcr.net>
Date: Tue May 25 16:17:40 2010 -0400
Committer: Joshua Oreman <oremanj at rwcr.net>

[dhcp] Honor PXEBS_SKIP option in discovery control

It is permissible for a DHCP packet containing PXE options to specify
only "discovery control", instead of the more typical boot menu +
prompt options. This is the strategy used by older versions of
dnsmasq; by specifying the discovery control as PXEBS_SKIP, they cause
vendor PXE ROMs to ignore boot server discovery and just use the
filename and next-server options in the initial (Proxy)DHCP packet.
Modify gPXE to accept this behavior, to be more compatible with the
Intel firmware.

Signed-off-by: Joshua Oreman <oremanj at rwcr.net>
Tested-by: Kyle Kienapfel <kyle at shadowmage.org>

diff --git a/src/net/udp/dhcp.c b/src/net/udp/dhcp.c
index ce2c820..fa09741 100644
--- a/src/net/udp/dhcp.c
+++ b/src/net/udp/dhcp.c
@@ -401,6 +401,7 @@ static void dhcp_rx_offer ( struct dhcp_session *dhcp,
 	int has_pxeclient;
 	int pxeopts_len;
 	int has_pxeopts;
+	uint8_t discovery_control;
 	struct dhcp_offer *offer;
 	int i;
 
@@ -439,9 +440,35 @@ static void dhcp_rx_offer ( struct dhcp_session *dhcp,
 	has_pxeclient = ( ( vci_len >= ( int ) sizeof ( vci ) ) &&
 			  ( strncmp ( "PXEClient", vci, sizeof (vci) ) == 0 ));
 
-	/* Identify presence of PXE-specific options */
+	/*
+	 * Identify presence of PXE-specific options
+	 *
+	 * The Intel firmware appears to check for:
+	 * - PXE_DISCOVERY_CONTROL exists and has bit 3 set, or
+	 * - both PXE_BOOT_MENU and PXE_BOOT_MENU_PROMPT exist
+	 *
+	 * If DISCOVERY_CONTROL bit 3 is set, the firmware treats this
+	 * packet like a "normal" non-PXE DHCP packet with respect to
+	 * boot filename, except that it can come from ProxyDHCP. This
+	 * is the scheme that dnsmasq uses in the simple case.
+	 *
+	 * Otherwise, if one of the boot menu / boot menu prompt
+	 * options exists but not both, the firmware signals an
+	 * error. If neither exists, the packet is not considered to
+	 * contain DHCP options.
+	 *
+	 * In an effort to preserve semantics but be more flexible, we
+	 * check only for bit 3 of DISCOVERY_CONTROL or the presence
+	 * of BOOT_MENU. We don't care (yet) about the menu prompt.
+	 */
 	pxeopts_len = dhcppkt_fetch ( dhcppkt, DHCP_PXE_BOOT_MENU, NULL, 0 );
 	has_pxeopts = ( pxeopts_len >= 0 );
+	if ( dhcppkt_fetch ( dhcppkt, DHCP_PXE_DISCOVERY_CONTROL,
+			     &discovery_control, 1 ) >= 0 ) {
+		/* Honor request to skip boot server discovery and use
+		   the provided filename */
+		has_pxeopts = has_pxeopts || ( discovery_control & PXEBS_SKIP );
+	}
 	if ( has_pxeclient )
 		DBGC ( dhcp, "%s", ( has_pxeopts ? " pxe" : " proxy" ) );
 
-----------------------------------------------------------------------


-- 
Main gPXE repository


More information about the gPXE-commits mailing list