iPXE
efi_cachedhcp.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2021 Michael Brown <mbrown@fensystems.co.uk>.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17 * 02110-1301, USA.
18 *
19 * You can also choose to distribute this program under the terms of
20 * the Unmodified Binary Distribution Licence (as given in the file
21 * COPYING.UBDL), provided that you have satisfied its requirements.
22 */
23
24FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
25FILE_SECBOOT ( PERMITTED );
26
27#include <string.h>
28#include <errno.h>
29#include <ipxe/cachedhcp.h>
30#include <ipxe/efi/efi.h>
31#include <ipxe/efi/efi_path.h>
34
35/** @file
36 *
37 * EFI cached DHCP packet
38 *
39 */
40
41/**
42 * Record cached DHCP packet
43 *
44 * @v device Device handle
45 * @v path Device path
46 * @ret rc Return status code
47 */
50 unsigned int vlan;
53 int rc;
54
55 /* Get VLAN tag, if any */
56 vlan = efi_path_vlan ( path );
57
58 /* Look for a PXE base code instance on the image's device handle */
60 &pxe ) ) != 0 ) {
61 DBGC ( device, "EFI %s has no PXE base code instance: %s\n",
63 return rc;
64 }
65
66 /* Do not attempt to cache IPv6 packets */
67 mode = pxe->Mode;
68 if ( mode->UsingIpv6 ) {
69 DBGC ( device, "EFI %s has IPv6 PXE base code\n",
71 return -ENOTSUP;
72 }
73
74 /* Record DHCPACK, if present */
75 if ( mode->DhcpAckReceived &&
76 ( ( rc = cachedhcp_record ( &cached_dhcpack, vlan, &mode->DhcpAck,
77 sizeof ( mode->DhcpAck ) ) ) != 0 ) ) {
78 DBGC ( device, "EFI %s could not record DHCPACK: %s\n",
80 return rc;
81 }
82
83 /* Record ProxyDHCPOFFER, if present */
84 if ( mode->ProxyOfferReceived &&
86 &mode->ProxyOffer,
87 sizeof ( mode->ProxyOffer ) ) ) != 0)){
88 DBGC ( device, "EFI %s could not record ProxyDHCPOFFER: %s\n",
90 return rc;
91 }
92
93 /* Record PxeBSACK, if present */
94 if ( mode->PxeReplyReceived &&
95 ( ( rc = cachedhcp_record ( &cached_pxebs, vlan, &mode->PxeReply,
96 sizeof ( mode->PxeReply ) ) ) != 0 )){
97 DBGC ( device, "EFI %s could not record PXEBSACK: %s\n",
99 return rc;
100 }
101
102 return 0;
103}
EFI PXE Base Code Protocol definitions, which is used to access PXE-compatible devices for network ac...
struct _EFI_PXE_BASE_CODE_PROTOCOL EFI_PXE_BASE_CODE_PROTOCOL
Definition PxeBaseCode.h:30
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
struct cached_dhcp_packet cached_proxydhcp
Cached ProxyDHCPOFFER.
Definition cachedhcp.c:69
struct cached_dhcp_packet cached_pxebs
Cached PXEBSACK.
Definition cachedhcp.c:74
struct cached_dhcp_packet cached_dhcpack
Cached DHCPACK.
Definition cachedhcp.c:63
int cachedhcp_record(struct cached_dhcp_packet *cache, unsigned int vlan, const void *data, size_t max_len)
Record cached DHCP packet.
Definition cachedhcp.c:203
Cached DHCP packet.
int efi_cachedhcp_record(EFI_HANDLE device, EFI_DEVICE_PATH_PROTOCOL *path)
Record cached DHCP packet.
EFI cached DHCP packet.
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition efi_debug.c:652
EFI_GUID efi_pxe_base_code_protocol_guid
PXE base code protocol GUID.
Definition efi_guid.c:321
unsigned int efi_path_vlan(EFI_DEVICE_PATH_PROTOCOL *path)
Get VLAN tag from device path.
Definition efi_path.c:237
EFI device paths.
uint16_t mode
Acceleration mode.
Definition ena.h:15
Error codes.
#define DBGC(...)
Definition compiler.h:505
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:896
#define ENOTSUP
Operation not supported.
Definition errno.h:590
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
Definition compiler.h:926
EFI API.
#define efi_open(handle, protocol, interface)
Open protocol for ephemeral use.
Definition efi.h:444
#define EFI_HANDLE
Definition efi.h:53
String functions.
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition DevicePath.h:46
EFI_PXE_BASE_CODE_MODE.
EFI_PXE_BASE_CODE_MODE * Mode
The pointer to the EFI_PXE_BASE_CODE_MODE data for this device.
A hardware device.
Definition device.h:77