Hi all!

 

Trying to track down an unexpected behavior for one of our teams here:

“We tried to PXEBoot a VM using IPv6 and even though the server replied with all requested boot options, the firmware for some reason did a DHCPv6 release instead of going for a network boot.”

 

The team dug in with some debugging and tracked things down to this process and the associated code:

  1. DHCP server is sending REPLY with valid boot params and tftp server address.
  2. UEFI upon receiving this REPLY, it is trying to send UDP request with port 4011 and uses TFTP global address as destination address.
  3. Ip6Output() in /NetworkPkg/Ip6Dxe/Ip6Output.c drops the UDP request generated in Step-2. This is due to route miss.
    1. Function: https://github.com/tianocore/edk2/blob/20ca52882877ba9025da2ee58c8dab7808eca457/NetworkPkg/Ip6Dxe/Ip6Output.c#L476
    2. Error return: https://github.com/tianocore/edk2/blob/20ca52882877ba9025da2ee58c8dab7808eca457/NetworkPkg/Ip6Dxe/Ip6Output.c#L701
  4. As the UDP request with port 4011 failed, UEFI does a RELEASE message and errors out.
  5. Below the code snippet inside UEFI where packet is getting dropped.

 

Here’s some questions from the team:

  1. Why is UEFI doing UDP request with port 4011 to TFTP server address. We expect it to start TFTP with data provided in REPLY by server.
  2. In data center, the blades are not directly connected to server. So how can UEFI learn the routes to send a unicast request using global address.
  3. In case of IPv4, we don’t see any UDP request using port 4011. Why alone for IPv6?

 

 

Thoughts? Thanks in advance!

 

- Bret