aboutsummaryrefslogtreecommitdiffstats
path: root/src/interface
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2021-07-23 11:32:04 +0100
committerMichael Brown <mcb30@ipxe.org>2021-07-27 13:50:36 +0100
commite09e1142a3bd8bdb702efc92994c419a53e9933b (patch)
tree590fa32d0a9512493575ab56f91f68cd954b7a4c /src/interface
parentdb6310c3e5948a327a1c6f5706f727fd6cd67c70 (diff)
downloadipxe-e09e1142a3bd8bdb702efc92994c419a53e9933b.tar.gz
[efi] Record cached ProxyDHCPOFFER and PXEBSACK, if present
Commit cd3de55 ("[efi] Record cached DHCPACK from loaded image's device handle, if present") added the ability for a chainloaded UEFI iPXE to reuse an IPv4 address and DHCP options previously obtained by a built-in PXE stack, without needing to perform a second DHCP request. Extend this to also record the cached ProxyDHCPOFFER and PXEBSACK obtained from the EFI_PXE_BASE_CODE_PROTOCOL instance installed on the loaded image's device handle, if present. This allows a chainloaded UEFI iPXE to reuse a boot filename or other options that were provided via a ProxyDHCP or PXE boot server mechanism, rather than by standard DHCP. Tested-by: Andreas Hammarskjöld <junior@2PintSoftware.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/interface')
-rw-r--r--src/interface/efi/efi_cachedhcp.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/src/interface/efi/efi_cachedhcp.c b/src/interface/efi/efi_cachedhcp.c
index 14b531d09..1d4b98fd6 100644
--- a/src/interface/efi/efi_cachedhcp.c
+++ b/src/interface/efi/efi_cachedhcp.c
@@ -75,17 +75,40 @@ int efi_cachedhcp_record ( EFI_HANDLE device ) {
/* Record DHCPACK, if present */
if ( mode->DhcpAckReceived &&
- ( ( rc = cachedhcp_record ( virt_to_user ( &mode->DhcpAck ),
+ ( ( rc = cachedhcp_record ( &cached_dhcpack,
+ virt_to_user ( &mode->DhcpAck ),
sizeof ( mode->DhcpAck ) ) ) != 0 ) ) {
DBGC ( device, "EFI %s could not record DHCPACK: %s\n",
efi_handle_name ( device ), strerror ( rc ) );
- goto err_record;
+ goto err_dhcpack;
+ }
+
+ /* Record ProxyDHCPOFFER, if present */
+ if ( mode->ProxyOfferReceived &&
+ ( ( rc = cachedhcp_record ( &cached_proxydhcp,
+ virt_to_user ( &mode->ProxyOffer ),
+ sizeof ( mode->ProxyOffer ) ) ) != 0)){
+ DBGC ( device, "EFI %s could not record ProxyDHCPOFFER: %s\n",
+ efi_handle_name ( device ), strerror ( rc ) );
+ goto err_proxydhcp;
+ }
+
+ /* Record PxeBSACK, if present */
+ if ( mode->PxeReplyReceived &&
+ ( ( rc = cachedhcp_record ( &cached_pxebs,
+ virt_to_user ( &mode->PxeReply ),
+ sizeof ( mode->PxeReply ) ) ) != 0)){
+ DBGC ( device, "EFI %s could not record PXEBSACK: %s\n",
+ efi_handle_name ( device ), strerror ( rc ) );
+ goto err_pxebs;
}
/* Success */
rc = 0;
- err_record:
+ err_pxebs:
+ err_proxydhcp:
+ err_dhcpack:
err_ipv6:
bs->CloseProtocol ( device, &efi_pxe_base_code_protocol_guid,
efi_image_handle, NULL );