[syslinux] [PATCH 0/1] Network UEFI PXE DHCP/proxyDHCP fix

jeff_sloan at selinc.com jeff_sloan at selinc.com
Thu Jun 11 13:02:46 PDT 2015


from: Jeff Sloan <jeff_sloan at selinc.com>

Update UEFI PXE proxyDHCP handling.

This patch is based on commit ID 8a00e49

Modify two files to specify valid ip addresses. These files are efi/pxe.c 
and efi/udp.c.

In efi/pxe.c: In net_parse_dhcp function.

If ProxyOffer has been received, start with DhcpAck packet since it is the 
most complete. This requires a minimum of changes to the packet except 
that it contains NULL server ip so populate server from ProxyOffer packet. 
The information is loaded into pkt_v4 and then parsed.

In efi/udp.c: Both updates are in core_udp_connect and core_udp_sendto 
functions.

1. Disable UseDefaultAddress, which is not complete.

2. Set StationAddress and SubnetMask to correct values from IPInfo struct 
because both fields are not necessarily populated.

Signed-off-by: Jeff Sloan <jeff_sloan at selinc.com>
---
diffstat results:
 pxe.c |   16 +++++++++++++++-
 udp.c |   12 ++++++++++--
 2 files changed, 25 insertions(+), 3 deletions(-)

Common subdirectories: orig_repo/syslinux-master/efi/i386 and 
syslinux-master/efi/i386
diff -up orig_repo/syslinux-master/efi/pxe.c syslinux-master/efi/pxe.c
--- orig_repo/syslinux-master/efi/pxe.c 2015-06-09 02:50:15.000000000 
-0700
+++ syslinux-master/efi/pxe.c   2015-06-10 13:45:29.000000000 -0700
@@ -150,7 +150,21 @@ void net_parse_dhcp(void)
     if (mode->PxeReplyReceived)
        pkt_v4 = &mode->PxeReply.Dhcpv4;
     else if (mode->ProxyOfferReceived)
-       pkt_v4 = &mode->ProxyOffer.Dhcpv4;
+       {
+       /*
+        * Starting with DhcpAck packet to get all ip addresses except 
server ip
+        * which can be pulled from the ProxyOffer packet. 
+        */ 
+       pkt_v4 = &mode->DhcpAck.Dhcpv4;
+
+       /* 
+        * Grab the proxyserver ip from ProxyOffer packet
+        */
+       pkt_v4->BootpSiAddr[0] = mode->ProxyOffer.Dhcpv4.BootpSiAddr[0];
+       pkt_v4->BootpSiAddr[1] = mode->ProxyOffer.Dhcpv4.BootpSiAddr[1];
+       pkt_v4->BootpSiAddr[2] = mode->ProxyOffer.Dhcpv4.BootpSiAddr[2];
+       pkt_v4->BootpSiAddr[3] = mode->ProxyOffer.Dhcpv4.BootpSiAddr[3];
+    }
 
     if (pkt_v4)
        parse_dhcp(pkt_v4, pkt_len);
diff -up orig_repo/syslinux-master/efi/udp.c syslinux-master/efi/udp.c
--- orig_repo/syslinux-master/efi/udp.c 2015-06-09 02:50:15.000000000 
-0700
+++ syslinux-master/efi/udp.c   2015-06-02 05:54:11.000000000 -0700
@@ -150,11 +150,15 @@ void core_udp_connect(struct pxe_pvt_ino
     /* Re-use the existing local port number */
     udata.StationPort = socket->net.efi.localport;
 
-    udata.UseDefaultAddress = TRUE;
+    udata.UseDefaultAddress = FALSE;
     memcpy(&udata.RemoteAddress, &ip, sizeof(ip));
     udata.RemotePort = port;
     udata.AcceptPromiscuous = TRUE;
     udata.TimeToLive = 64;
+    ip = IPInfo.myip;
+    memcpy(&udata.StationAddress, &ip, sizeof(ip));
+    ip = IPInfo.netmask;
+    memcpy(&udata.SubnetMask, &ip, sizeof(ip));
 
     status = core_udp_configure(udp, &udata, L"core_udp_connect");
     if (status != EFI_SUCCESS) {
@@ -372,11 +376,15 @@ void core_udp_sendto(struct pxe_pvt_inod
     /* Re-use the existing local port number */
     udata.StationPort = socket->net.efi.localport;
 
-    udata.UseDefaultAddress = TRUE;
+    udata.UseDefaultAddress = FALSE;
     memcpy(&udata.RemoteAddress, &ip, sizeof(ip));
     udata.RemotePort = port;
     udata.AcceptPromiscuous = TRUE;
     udata.TimeToLive = 64;
+    ip = IPInfo.myip;
+    memcpy(&udata.StationAddress, &ip, sizeof(ip));
+    ip = IPInfo.netmask;
+    memcpy(&udata.SubnetMask, &ip, sizeof(ip));
 
     status = core_udp_configure(udp, &udata, L"core_udp_sendto");
     if (status != EFI_SUCCESS)
Common subdirectories: orig_repo/syslinux-master/efi/x86_64 and 
syslinux-master/efi/x86_64


More information about the Syslinux mailing list