summaryrefslogtreecommitdiffstats
path: root/src/interface/efi/efi_cachedhcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interface/efi/efi_cachedhcp.c')
-rw-r--r--src/interface/efi/efi_cachedhcp.c51
1 files changed, 15 insertions, 36 deletions
diff --git a/src/interface/efi/efi_cachedhcp.c b/src/interface/efi/efi_cachedhcp.c
index b9e49cf48..2f33fcefb 100644
--- a/src/interface/efi/efi_cachedhcp.c
+++ b/src/interface/efi/efi_cachedhcp.c
@@ -22,6 +22,7 @@
*/
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
+FILE_SECBOOT ( PERMITTED );
#include <string.h>
#include <errno.h>
@@ -46,79 +47,57 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
*/
int efi_cachedhcp_record ( EFI_HANDLE device,
EFI_DEVICE_PATH_PROTOCOL *path ) {
- EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
unsigned int vlan;
- union {
- EFI_PXE_BASE_CODE_PROTOCOL *pxe;
- void *interface;
- } pxe;
+ EFI_PXE_BASE_CODE_PROTOCOL *pxe;
EFI_PXE_BASE_CODE_MODE *mode;
- EFI_STATUS efirc;
int rc;
/* Get VLAN tag, if any */
vlan = efi_path_vlan ( path );
/* Look for a PXE base code instance on the image's device handle */
- if ( ( efirc = bs->OpenProtocol ( device,
- &efi_pxe_base_code_protocol_guid,
- &pxe.interface, efi_image_handle,
- NULL,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL ))!=0){
- rc = -EEFI ( efirc );
+ if ( ( rc = efi_open ( device, &efi_pxe_base_code_protocol_guid,
+ &pxe ) ) != 0 ) {
DBGC ( device, "EFI %s has no PXE base code instance: %s\n",
efi_handle_name ( device ), strerror ( rc ) );
- goto err_open;
+ return rc;
}
/* Do not attempt to cache IPv6 packets */
- mode = pxe.pxe->Mode;
+ mode = pxe->Mode;
if ( mode->UsingIpv6 ) {
- rc = -ENOTSUP;
DBGC ( device, "EFI %s has IPv6 PXE base code\n",
efi_handle_name ( device ) );
- goto err_ipv6;
+ return -ENOTSUP;
}
/* Record DHCPACK, if present */
if ( mode->DhcpAckReceived &&
- ( ( rc = cachedhcp_record ( &cached_dhcpack, vlan,
- virt_to_user ( &mode->DhcpAck ),
+ ( ( rc = cachedhcp_record ( &cached_dhcpack, vlan, &mode->DhcpAck,
sizeof ( mode->DhcpAck ) ) ) != 0 ) ) {
DBGC ( device, "EFI %s could not record DHCPACK: %s\n",
efi_handle_name ( device ), strerror ( rc ) );
- goto err_dhcpack;
+ return rc;
}
/* Record ProxyDHCPOFFER, if present */
if ( mode->ProxyOfferReceived &&
( ( rc = cachedhcp_record ( &cached_proxydhcp, vlan,
- virt_to_user ( &mode->ProxyOffer ),
+ &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;
+ return rc;
}
/* Record PxeBSACK, if present */
if ( mode->PxeReplyReceived &&
- ( ( rc = cachedhcp_record ( &cached_pxebs, vlan,
- virt_to_user ( &mode->PxeReply ),
- sizeof ( mode->PxeReply ) ) ) != 0)){
+ ( ( rc = cachedhcp_record ( &cached_pxebs, vlan, &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;
+ return rc;
}
- /* Success */
- rc = 0;
-
- err_pxebs:
- err_proxydhcp:
- err_dhcpack:
- err_ipv6:
- bs->CloseProtocol ( device, &efi_pxe_base_code_protocol_guid,
- efi_image_handle, NULL );
- err_open:
- return rc;
+ return 0;
}