summaryrefslogtreecommitdiffstats
path: root/src/net/udp/dhcp.c
diff options
context:
space:
mode:
authorMichael Brown2009-01-23 02:32:04 +0100
committerMichael Brown2009-01-23 02:32:04 +0100
commit773d9631efc872c172a126eb64332272e6970f0f (patch)
tree2fb4b55d8bd25f8a69f6a7f04e87133650f72b5c /src/net/udp/dhcp.c
parent[dhcp] Pass PXE boot menu item to PXE Boot Server (diff)
downloadipxe-773d9631efc872c172a126eb64332272e6970f0f.tar.gz
ipxe-773d9631efc872c172a126eb64332272e6970f0f.tar.xz
ipxe-773d9631efc872c172a126eb64332272e6970f0f.zip
[dhcp] Handle missing ProxyDHCP servers
It is possible to configure a DHCP server to hand out PXE options without a ProxyDHCP server present. This requires setting option 60 to "PXEClient", which will cause gPXE to attempt ProxyDHCP. We assume in several places that dhcp->proxydhcpack is set to the DHCPACK packet containing option 60 set to "PXEClient". When we transition into ProxyDHCPREQUEST, set dhcp->proxydhcpack=dhcp->dhcpack so that this assumption holds true. We ought to rename several references to "proxydhcp" to something more accurate, such as "pxedhcp". Treating a single DHCP response as potentially both DHCPOFFER and ProxyDHCPOFFER does make the code smaller, but the variable names get confusing.
Diffstat (limited to 'src/net/udp/dhcp.c')
-rw-r--r--src/net/udp/dhcp.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/net/udp/dhcp.c b/src/net/udp/dhcp.c
index 4955ea19..14de8283 100644
--- a/src/net/udp/dhcp.c
+++ b/src/net/udp/dhcp.c
@@ -745,6 +745,13 @@ static void dhcp_next_state ( struct dhcp_session *dhcp ) {
break;
case DHCP_STATE_REQUEST:
if ( dhcp->proxydhcpoffer ) {
+ /* Store DHCPACK as ProxyDHCPACK. This
+ * handles the case in which the DHCP server
+ * itself responds with "PXEClient" and PXE
+ * options but there is no actual ProxyDHCP
+ * server resident on the machine.
+ */
+ dhcp->proxydhcpack = dhcpset_get ( dhcp->dhcpack );
dhcp_set_state ( dhcp, DHCP_STATE_PROXYREQUEST );
break;
}
@@ -990,7 +997,7 @@ static void dhcp_rx_proxydhcpack ( struct dhcp_session *dhcp,
proxydhcpack->settings.name = PROXYDHCP_SETTINGS_NAME;
/* Record ProxyDHCPACK */
- assert ( dhcp->proxydhcpack == NULL );
+ dhcpset_put ( dhcp->proxydhcpack );
dhcp->proxydhcpack = dhcpset_get ( proxydhcpack );
/* Register settings */