[syslinux] [PATCH 0/1] EFI PXE DHCP/proxyDHCP issues fix
Patrick Masotta
masottaus at yahoo.com
Mon Mar 16 09:22:37 PDT 2015
This patch fixes some problems when parsing DHCP/proxyDHCP
answers on PXE scenarios.
Before the patch proxyDHCP answers were ignored, and the
IPinfo structure was populated based on a DhcpDiscover pkt
instead of DhcpAck
The BootFile detection now follows the EDKII function
PxeBcImpl.c\DiscoverBootFile()
It was tested on VMware BIOS/EFI clients and HP Elitebook
EFI notebooks,
Feedback appreciated.
Best,
Patrick
Signed-off-by: Patrick Masotta <masottaus at yahoo.com>
---
diff -uprN a/efi/pxe.c b/efi/pxe.c
--- a/efi/pxe.c 2014-10-06 10:27:44.000000000 -0600
+++ b/efi/pxe.c 2015-03-14 06:22:20.840557180 -0600
@@ -123,7 +123,7 @@ void net_parse_dhcp(void)
* Get the DHCP client identifiers (query info 1)
*/
Print(L"Getting cached packet ");
- parse_dhcp(&mode->DhcpDiscover.Dhcpv4, pkt_len);
+ parse_dhcp(&mode->DhcpAck.Dhcpv4, pkt_len);
/*
* We don't use flags from the request packet, so
* this is a good time to initialize DHCPMagic...
@@ -135,26 +135,28 @@ void net_parse_dhcp(void)
*/
*(char *)&DHCPMagic = 1;
- /*
- * Get the BOOTP/DHCP packet that brought us file (and an IP
- * address). This lives in the DHCPACK packet (query info 2)
- */
- parse_dhcp(&mode->DhcpAck.Dhcpv4, pkt_len);
- /*
- * Save away MAC address (assume this is in query info 2. If this
- * turns out to be problematic it might be better getting it from
- * the query info 1 packet
+ /*
+ * Get the boot file and other info.
+ * Based on EDKII PxeBcImpl.c\DiscoverBootFile()
*/
- hardlen = mode->DhcpAck.Dhcpv4.BootpHwAddrLen;
- MAC_len = hardlen > 16 ? 0 : hardlen;
- MAC_type = mode->DhcpAck.Dhcpv4.BootpHwType;
- memcpy(MAC, mode->DhcpAck.Dhcpv4.BootpHwAddr, MAC_len);
- /*
- * Get the boot file and other info. This lives in the CACHED_REPLY
- * packet (query info 3)
- */
- parse_dhcp(&mode->PxeReply.Dhcpv4, pkt_len);
+ EFI_PXE_BASE_CODE_DHCPV4_PACKET* pkt_v4;
+
+ if(mode->PxeReplyReceived)
+ pkt_v4 = &mode->PxeReply.Dhcpv4;
+ else
+ if(mode->ProxyOfferReceived)
+ pkt_v4 = &mode->ProxyOffer.Dhcpv4;
+ else
+ pkt_v4 = &mode->DhcpAck.Dhcpv4;
+
+ parse_dhcp(pkt_v4, pkt_len);
+
+ hardlen = pkt_v4->BootpHwAddrLen;
+ MAC_len = hardlen > 16 ? 0 : hardlen;
+ MAC_type = pkt_v4->BootpHwType;
+ memcpy(MAC, pkt_v4->BootpHwAddr, MAC_len);
+
Print(L"\n");
/*
More information about the Syslinux
mailing list