iPXE
efi_pxe.c File Reference

EFI PXE base code protocol. More...

#include <string.h>
#include <errno.h>
#include <ipxe/refcnt.h>
#include <ipxe/list.h>
#include <ipxe/netdevice.h>
#include <ipxe/fakedhcp.h>
#include <ipxe/process.h>
#include <ipxe/uri.h>
#include <ipxe/in.h>
#include <ipxe/socket.h>
#include <ipxe/tcpip.h>
#include <ipxe/xferbuf.h>
#include <ipxe/open.h>
#include <ipxe/dhcppkt.h>
#include <ipxe/udp.h>
#include <ipxe/efi/efi.h>
#include <ipxe/efi/efi_snp.h>
#include <ipxe/efi/efi_pxe.h>
#include <ipxe/efi/efi_null.h>
#include <ipxe/efi/Protocol/PxeBaseCode.h>
#include <ipxe/efi/Protocol/AppleNetBoot.h>
#include <usr/ifmgmt.h>
#include <config/general.h>

Go to the source code of this file.

Data Structures

struct  efi_pxe
 A PXE base code. More...
struct  sockaddr_efi
 An EFI socket address. More...
struct  efi_pxe_udp_pseudo_header
 EFI UDP pseudo-header. More...

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 FILE_SECBOOT (PERMITTED)
static void efi_pxe_free (struct refcnt *refcnt)
 Free PXE base code.
static LIST_HEAD (efi_pxes)
 List of PXE base codes.
static struct efi_pxeefi_pxe_find (EFI_HANDLE handle)
 Locate PXE base code.
static void efi_pxe_ip_sockaddr (struct efi_pxe *pxe, EFI_IP_ADDRESS *ip, struct sockaddr *sa)
 Populate socket address from EFI IP address.
static const char * efi_pxe_ip_ntoa (struct efi_pxe *pxe, EFI_IP_ADDRESS *ip)
 Transcribe EFI IP address (for debugging)
static int efi_pxe_ip (struct efi_pxe *pxe)
 Populate local IP address.
static int efi_pxe_ip_filter (struct efi_pxe *pxe, EFI_IP_ADDRESS *ip)
 Check if IP address matches filter.
static void efi_pxe_tftp_close (struct efi_pxe *pxe, int rc)
 Close PXE (M)TFTP download interface.
static size_t efi_pxe_tftp_window (struct efi_pxe *pxe)
 Check PXE (M)TFTP download flow control window.
static int efi_pxe_tftp_deliver (struct efi_pxe *pxe, struct io_buffer *iobuf, struct xfer_metadata *meta)
 Receive new PXE (M)TFTP download data.
static int efi_pxe_tftp_open (struct efi_pxe *pxe, EFI_IP_ADDRESS *ip, const char *filename)
 Open (M)TFTP download interface.
static void efi_pxe_udp_close (struct efi_pxe *pxe, int rc)
 Close UDP interface.
static int efi_pxe_udp_deliver (struct efi_pxe *pxe, struct io_buffer *iobuf, struct xfer_metadata *meta)
 Receive UDP packet.
static int efi_pxe_udp_open (struct efi_pxe *pxe)
 Open UDP interface.
static void efi_pxe_udp_schedule_close (struct efi_pxe *pxe)
 Schedule close of UDP interface.
static void efi_pxe_udp_scheduled_close (struct efi_pxe *pxe)
 Scheduled close of UDP interface.
static const char * efi_pxe_fake_name (struct efi_pxe *pxe, EFI_PXE_BASE_CODE_PACKET *packet)
 Name fake DHCP packet.
static BOOLEAN efi_pxe_fake (struct efi_pxe *pxe, int(*fake)(struct net_device *netdev, void *data, size_t len), EFI_PXE_BASE_CODE_PACKET *packet)
 Construct fake DHCP packet and flag.
static void efi_pxe_fake_all (struct efi_pxe *pxe)
 Construct fake DHCP packets.
static EFI_STATUS EFIAPI efi_pxe_start (EFI_PXE_BASE_CODE_PROTOCOL *base, BOOLEAN use_ipv6)
 Start PXE base code.
static EFI_STATUS EFIAPI efi_pxe_stop (EFI_PXE_BASE_CODE_PROTOCOL *base)
 Stop PXE base code.
static EFI_STATUS EFIAPI efi_pxe_dhcp (EFI_PXE_BASE_CODE_PROTOCOL *base, BOOLEAN sort)
 Perform DHCP.
static EFI_STATUS EFIAPI efi_pxe_discover (EFI_PXE_BASE_CODE_PROTOCOL *base, UINT16 type, UINT16 *layer, BOOLEAN bis, EFI_PXE_BASE_CODE_DISCOVER_INFO *info)
 Perform boot server discovery.
static EFI_STATUS EFIAPI efi_pxe_mtftp (EFI_PXE_BASE_CODE_PROTOCOL *base, EFI_PXE_BASE_CODE_TFTP_OPCODE opcode, VOID *data, BOOLEAN overwrite, UINT64 *len, UINTN *blksize, EFI_IP_ADDRESS *ip, UINT8 *filename, EFI_PXE_BASE_CODE_MTFTP_INFO *info, BOOLEAN callback)
 Perform (M)TFTP.
static EFI_STATUS EFIAPI efi_pxe_udp_write (EFI_PXE_BASE_CODE_PROTOCOL *base, UINT16 flags, EFI_IP_ADDRESS *dest_ip, EFI_PXE_BASE_CODE_UDP_PORT *dest_port, EFI_IP_ADDRESS *gateway, EFI_IP_ADDRESS *src_ip, EFI_PXE_BASE_CODE_UDP_PORT *src_port, UINTN *hdr_len, VOID *hdr, UINTN *len, VOID *data)
 Transmit UDP packet.
static EFI_STATUS EFIAPI efi_pxe_udp_read (EFI_PXE_BASE_CODE_PROTOCOL *base, UINT16 flags, EFI_IP_ADDRESS *dest_ip, EFI_PXE_BASE_CODE_UDP_PORT *dest_port, EFI_IP_ADDRESS *src_ip, EFI_PXE_BASE_CODE_UDP_PORT *src_port, UINTN *hdr_len, VOID *hdr, UINTN *len, VOID *data)
 Receive UDP packet.
static EFI_STATUS EFIAPI efi_pxe_set_ip_filter (EFI_PXE_BASE_CODE_PROTOCOL *base, EFI_PXE_BASE_CODE_IP_FILTER *filter)
 Set receive filter.
static EFI_STATUS EFIAPI efi_pxe_arp (EFI_PXE_BASE_CODE_PROTOCOL *base, EFI_IP_ADDRESS *ip, EFI_MAC_ADDRESS *mac)
 Resolve MAC address.
static EFI_STATUS EFIAPI efi_pxe_set_parameters (EFI_PXE_BASE_CODE_PROTOCOL *base, BOOLEAN *autoarp, BOOLEAN *sendguid, UINT8 *ttl, UINT8 *tos, BOOLEAN *callback)
 Set parameters.
static EFI_STATUS EFIAPI efi_pxe_set_station_ip (EFI_PXE_BASE_CODE_PROTOCOL *base, EFI_IP_ADDRESS *ip, EFI_IP_ADDRESS *netmask)
 Set IP address.
static EFI_STATUS EFIAPI efi_pxe_set_packets (EFI_PXE_BASE_CODE_PROTOCOL *base, BOOLEAN *dhcpdisc_ok, BOOLEAN *dhcpack_ok, BOOLEAN *proxyoffer_ok, BOOLEAN *pxebsdisc_ok, BOOLEAN *pxebsack_ok, BOOLEAN *pxebsbis_ok, EFI_PXE_BASE_CODE_PACKET *dhcpdisc, EFI_PXE_BASE_CODE_PACKET *dhcpack, EFI_PXE_BASE_CODE_PACKET *proxyoffer, EFI_PXE_BASE_CODE_PACKET *pxebsdisc, EFI_PXE_BASE_CODE_PACKET *pxebsack, EFI_PXE_BASE_CODE_PACKET *pxebsbis)
 Update cached DHCP packets.
static EFI_STATUS EFIAPI efi_apple_get_response (EFI_PXE_BASE_CODE_PACKET *packet, UINTN *len, VOID *data)
 Get DHCP/BSDP response.
static EFI_STATUS EFIAPI efi_apple_get_dhcp_response (EFI_APPLE_NET_BOOT_PROTOCOL *apple, UINTN *len, VOID *data)
 Get DHCP response.
static EFI_STATUS EFIAPI efi_apple_get_bsdp_response (EFI_APPLE_NET_BOOT_PROTOCOL *apple, UINTN *len, VOID *data)
 Get BSDP response.
int efi_pxe_install (EFI_HANDLE handle, struct net_device *netdev)
 Install PXE base code protocol.
void efi_pxe_uninstall (EFI_HANDLE handle)
 Uninstall PXE base code protocol.

Variables

static struct interface_operation efi_pxe_tftp_operations []
 PXE file data transfer interface operations.
static struct interface_descriptor efi_pxe_tftp_desc
 PXE file data transfer interface descriptor.
static struct interface_operation efi_pxe_udp_operations []
 PXE UDP interface operations.
static struct interface_descriptor efi_pxe_udp_desc
 PXE UDP interface descriptor.
static struct process_descriptor efi_pxe_process_desc
 UDP close process descriptor.
static EFI_PXE_BASE_CODE_PROTOCOL efi_pxe_base_code_protocol
 PXE base code protocol.
static EFI_APPLE_NET_BOOT_PROTOCOL efi_apple_net_boot_protocol
 Apple NetBoot protocol.

Detailed Description

EFI PXE base code protocol.

Definition in file efi_pxe.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ efi_pxe_free()

void efi_pxe_free ( struct refcnt * refcnt)
static

Free PXE base code.

Parameters
refcntReference count

Definition at line 117 of file efi_pxe.c.

117 {
118 struct efi_pxe *pxe = container_of ( refcnt, struct efi_pxe, refcnt );
119
120 netdev_put ( pxe->netdev );
121 free ( pxe );
122}
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition netdevice.h:576
static void(* free)(struct refcnt *refcnt))
Definition refcnt.h:55
#define container_of(ptr, type, field)
Get containing structure.
Definition stddef.h:36
A PXE base code.
Definition efi_pxe.c:70
struct net_device * netdev
Underlying network device.
Definition efi_pxe.c:74
A reference counter.
Definition refcnt.h:27

References container_of, free, efi_pxe::netdev, and netdev_put().

Referenced by efi_pxe_install().

◆ LIST_HEAD()

LIST_HEAD ( efi_pxes )
static

List of PXE base codes.

◆ efi_pxe_find()

struct efi_pxe * efi_pxe_find ( EFI_HANDLE handle)
static

Locate PXE base code.

Parameters
handleEFI handle
Return values
pxePXE base code, or NULL

Definition at line 133 of file efi_pxe.c.

133 {
134 struct efi_pxe *pxe;
135
136 /* Locate base code */
137 list_for_each_entry ( pxe, &efi_pxes, list ) {
138 if ( pxe->handle == handle )
139 return pxe;
140 }
141
142 return NULL;
143}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
uint16_t handle
Handle.
Definition smbios.h:5
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition list.h:432
struct list_head list
List of PXE base codes.
Definition efi_pxe.c:78
EFI_HANDLE handle
Installed handle.
Definition efi_pxe.c:81

References EFI_HANDLE, efi_pxe::handle, handle, efi_pxe::list, list_for_each_entry, and NULL.

Referenced by efi_pxe_uninstall().

◆ efi_pxe_ip_sockaddr()

void efi_pxe_ip_sockaddr ( struct efi_pxe * pxe,
EFI_IP_ADDRESS * ip,
struct sockaddr * sa )
static

Populate socket address from EFI IP address.

Parameters
pxePXE base code
ipEFI IP address
saSocket address to fill in

Definition at line 192 of file efi_pxe.c.

193 {
194 union {
195 struct sockaddr sa;
196 struct sockaddr_efi se;
197 } *sockaddr = container_of ( sa, typeof ( *sockaddr ), sa );
198
199 /* Initialise socket address */
200 memset ( sockaddr, 0, sizeof ( *sockaddr ) );
201 sockaddr->sa.sa_family = pxe->tcpip->sa_family;
202 memcpy ( &sockaddr->se.se_addr, ip, pxe->net->net_addr_len );
203 sockaddr->se.se_scope_id = pxe->netdev->scope_id;
204}
typeof(acpi_finder=acpi_find)
ACPI table finder.
Definition acpi.c:48
void * memcpy(void *dest, const void *src, size_t len) __nonnull
void * memset(void *dest, int character, size_t len) __nonnull
IP4_t ip
Destination IP address.
Definition pxe_api.h:1
struct tcpip_net_protocol * tcpip
TCP/IP network-layer protocol.
Definition efi_pxe.c:90
struct net_protocol * net
Network-layer protocol.
Definition efi_pxe.c:92
unsigned int scope_id
Scope ID.
Definition netdevice.h:361
uint8_t net_addr_len
Network-layer address length.
Definition netdevice.h:102
An EFI socket address.
Definition efi_pxe.c:156
Generalized socket address structure.
Definition socket.h:97
sa_family_t sa_family
Socket address family.
Definition socket.h:102
sa_family_t sa_family
Network address family.
Definition tcpip.h:145
struct sockaddr sa
Definition syslog.c:57

References container_of, ip, memcpy(), memset(), efi_pxe::net, net_protocol::net_addr_len, efi_pxe::netdev, sa, sockaddr::sa_family, tcpip_net_protocol::sa_family, net_device::scope_id, efi_pxe::tcpip, and typeof().

Referenced by efi_pxe_tftp_open(), and efi_pxe_udp_write().

◆ efi_pxe_ip_ntoa()

const char * efi_pxe_ip_ntoa ( struct efi_pxe * pxe,
EFI_IP_ADDRESS * ip )
static

Transcribe EFI IP address (for debugging)

Parameters
pxePXE base code
ipEFI IP address
Return values
textTranscribed IP address

Definition at line 213 of file efi_pxe.c.

214 {
215
216 return pxe->net->ntoa ( ip );
217}
const char *(* ntoa)(const void *net_addr)
Transcribe network-layer address.
Definition netdevice.h:95

References ip, efi_pxe::net, and net_protocol::ntoa.

Referenced by efi_pxe_arp(), efi_pxe_discover(), efi_pxe_mtftp(), efi_pxe_set_ip_filter(), efi_pxe_set_station_ip(), efi_pxe_tftp_open(), efi_pxe_udp_read(), and efi_pxe_udp_write().

◆ efi_pxe_ip()

int efi_pxe_ip ( struct efi_pxe * pxe)
static

Populate local IP address.

Parameters
pxePXE base code
Return values
rcReturn status code

Definition at line 225 of file efi_pxe.c.

225 {
227 struct in_addr address;
228 struct in_addr netmask;
229
230 /* It's unclear which of the potentially many IPv6 addresses
231 * is supposed to be used.
232 */
233 if ( mode->UsingIpv6 )
234 return -ENOTSUP;
235
236 /* Fetch IP address and subnet mask */
238 &address );
240 &netmask );
241
242 /* Populate IP address and subnet mask */
243 memset ( &mode->StationIp, 0, sizeof ( mode->StationIp ) );
244 memcpy ( &mode->StationIp, &address, sizeof ( address ) );
245 memset ( &mode->SubnetMask, 0, sizeof ( mode->SubnetMask ) );
246 memcpy ( &mode->SubnetMask, &netmask, sizeof ( netmask ) );
247
248 return 0;
249}
const struct setting ip_setting
const struct setting netmask_setting
uint64_t address
Base address.
Definition ena.h:13
uint16_t mode
Acceleration mode.
Definition ena.h:15
#define ENOTSUP
Operation not supported.
Definition errno.h:590
static struct settings * netdev_settings(struct net_device *netdev)
Get per-netdevice configuration settings block.
Definition netdevice.h:587
int fetch_ipv4_setting(struct settings *settings, const struct setting *setting, struct in_addr *inp)
Fetch value of IPv4 address setting.
Definition settings.c:913
EFI_PXE_BASE_CODE_MODE.
EFI_PXE_BASE_CODE_MODE mode
PXE base code mode.
Definition efi_pxe.c:85
IP address structure.
Definition in.h:42

References address, ENOTSUP, fetch_ipv4_setting(), ip_setting, memcpy(), memset(), efi_pxe::mode, mode, efi_pxe::netdev, netdev_settings(), and netmask_setting.

Referenced by efi_pxe_dhcp(), and efi_pxe_start().

◆ efi_pxe_ip_filter()

int efi_pxe_ip_filter ( struct efi_pxe * pxe,
EFI_IP_ADDRESS * ip )
static

Check if IP address matches filter.

Parameters
pxePXE base code
ipEFI IP address
Return values
is_matchIP address matches filter

Definition at line 258 of file efi_pxe.c.

258 {
261 uint8_t filters = filter->Filters;
262 union {
264 struct in_addr in;
265 struct in6_addr in6;
266 } *u = container_of ( ip, typeof ( *u ), ip );
267 size_t addr_len = pxe->net->net_addr_len;
268 unsigned int i;
269
270 /* Match everything, if applicable */
272 return 1;
273
274 /* Match all multicasts, if applicable */
276 if ( mode->UsingIpv6 ) {
277 if ( IN6_IS_ADDR_MULTICAST ( &u->in6 ) )
278 return 1;
279 } else {
280 if ( IN_IS_MULTICAST ( u->in.s_addr ) )
281 return 1;
282 }
283 }
284
285 /* Match IPv4 broadcasts, if applicable */
287 if ( ( ! mode->UsingIpv6 ) &&
288 ( u->in.s_addr == INADDR_BROADCAST ) )
289 return 1;
290 }
291
292 /* Match station address, if applicable */
294 if ( memcmp ( ip, &mode->StationIp, addr_len ) == 0 )
295 return 1;
296 }
297
298 /* Match explicit addresses, if applicable */
299 for ( i = 0 ; i < filter->IpCnt ; i++ ) {
300 if ( memcmp ( ip, &filter->IpList[i], addr_len ) == 0 )
301 return 1;
302 }
303
304 return 0;
305}
__be32 in[4]
Definition CIB_PRM.h:7
#define EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST
Definition PxeBaseCode.h:86
#define EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP
Definition PxeBaseCode.h:85
#define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS
Definition PxeBaseCode.h:87
#define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST
Definition PxeBaseCode.h:88
unsigned char uint8_t
Definition stdint.h:10
union @104331263140136355135267063077374276003064103115 u
#define INADDR_BROADCAST
Definition in.h:22
#define IN6_IS_ADDR_MULTICAST(addr)
Definition in.h:68
#define IN_IS_MULTICAST(addr)
Definition in.h:34
UINT8_t filter
Receive packet filter.
Definition pxe_api.h:11
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition string.c:115
IP Receive Filter structure.
Definition PxeBaseCode.h:78
IP6 address structure.
Definition in.h:51
16-byte buffer aligned on a 4-byte boundary.

References container_of, EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST, EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS, EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST, EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP, filter, in, IN6_IS_ADDR_MULTICAST, IN_IS_MULTICAST, INADDR_BROADCAST, ip, memcmp(), efi_pxe::mode, mode, efi_pxe::net, net_protocol::net_addr_len, typeof(), and u.

Referenced by efi_pxe_udp_read().

◆ efi_pxe_tftp_close()

void efi_pxe_tftp_close ( struct efi_pxe * pxe,
int rc )
static

Close PXE (M)TFTP download interface.

Parameters
pxePXE base code
rcReason for close

Definition at line 320 of file efi_pxe.c.

320 {
321
322 /* Restart interface */
323 intf_restart ( &pxe->tftp, rc );
324
325 /* Record overall status */
326 pxe->rc = rc;
327}
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
void intf_restart(struct interface *intf, int rc)
Shut down and restart an object interface.
Definition interface.c:344
struct interface tftp
(M)TFTP download interface
Definition efi_pxe.c:98
int rc
Overall return status.
Definition efi_pxe.c:102

References intf_restart(), efi_pxe::rc, rc, and efi_pxe::tftp.

Referenced by efi_pxe_mtftp(), efi_pxe_stop(), and efi_pxe_tftp_deliver().

◆ efi_pxe_tftp_window()

size_t efi_pxe_tftp_window ( struct efi_pxe * pxe)
static

Check PXE (M)TFTP download flow control window.

Parameters
pxePXE base code
Return values
lenLength of window

Definition at line 335 of file efi_pxe.c.

335 {
336
337 /* Return requested blocksize */
338 return pxe->blksize;
339}
size_t blksize
Block size (for TFTP)
Definition efi_pxe.c:100

References efi_pxe::blksize.

◆ efi_pxe_tftp_deliver()

int efi_pxe_tftp_deliver ( struct efi_pxe * pxe,
struct io_buffer * iobuf,
struct xfer_metadata * meta )
static

Receive new PXE (M)TFTP download data.

Parameters
pxePXE base code
iobufI/O buffer
metaTransfer metadata
Return values
rcReturn status code

Definition at line 349 of file efi_pxe.c.

351 {
352 int rc;
353
354 /* Deliver to data transfer buffer */
355 if ( ( rc = xferbuf_deliver ( &pxe->buf, iob_disown ( iobuf ),
356 meta ) ) != 0 )
357 goto err_deliver;
358
359 return 0;
360
361 err_deliver:
362 efi_pxe_tftp_close ( pxe, rc );
363 return rc;
364}
static void efi_pxe_tftp_close(struct efi_pxe *pxe, int rc)
Close PXE (M)TFTP download interface.
Definition efi_pxe.c:320
uint8_t meta
Metadata flags.
Definition ena.h:3
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition iobuf.h:217
struct xfer_buffer buf
Data transfer buffer.
Definition efi_pxe.c:95
int xferbuf_deliver(struct xfer_buffer *xferbuf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Add received data to data transfer buffer.
Definition xferbuf.c:175

References efi_pxe::buf, efi_pxe_tftp_close(), iob_disown, meta, rc, and xferbuf_deliver().

◆ efi_pxe_tftp_open()

int efi_pxe_tftp_open ( struct efi_pxe * pxe,
EFI_IP_ADDRESS * ip,
const char * filename )
static

Open (M)TFTP download interface.

Parameters
pxePXE base code
ipEFI IP address
filenameFilename
Return values
rcReturn status code

Definition at line 385 of file efi_pxe.c.

386 {
387 struct sockaddr server;
388 struct uri *uri;
389 int rc;
390
391 /* Parse server address and filename */
392 efi_pxe_ip_sockaddr ( pxe, ip, &server );
393 uri = pxe_uri ( &server, filename );
394 if ( ! uri ) {
395 DBGC ( pxe, "PXE %s could not parse %s:%s\n", pxe->name,
396 efi_pxe_ip_ntoa ( pxe, ip ), filename );
397 rc = -ENOTSUP;
398 goto err_parse;
399 }
400
401 /* Open URI */
402 if ( ( rc = xfer_open_uri ( &pxe->tftp, uri ) ) != 0 ) {
403 DBGC ( pxe, "PXE %s could not open: %s\n",
404 pxe->name, strerror ( rc ) );
405 goto err_open;
406 }
407
408 err_open:
409 uri_put ( uri );
410 err_parse:
411 return rc;
412}
static void efi_pxe_ip_sockaddr(struct efi_pxe *pxe, EFI_IP_ADDRESS *ip, struct sockaddr *sa)
Populate socket address from EFI IP address.
Definition efi_pxe.c:192
static const char * efi_pxe_ip_ntoa(struct efi_pxe *pxe, EFI_IP_ADDRESS *ip)
Transcribe EFI IP address (for debugging)
Definition efi_pxe.c:213
#define DBGC(...)
Definition compiler.h:505
int xfer_open_uri(struct interface *intf, struct uri *uri)
Open URI.
Definition open.c:68
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
const char * name
Name.
Definition efi_pxe.c:76
A Uniform Resource Identifier.
Definition uri.h:65
struct uri * pxe_uri(struct sockaddr *sa_server, const char *filename)
Construct URI from server address and filename.
Definition uri.c:810
static void uri_put(struct uri *uri)
Decrement URI reference count.
Definition uri.h:206

References DBGC, efi_pxe_ip_ntoa(), efi_pxe_ip_sockaddr(), ENOTSUP, ip, efi_pxe::name, pxe_uri(), rc, strerror(), efi_pxe::tftp, uri_put(), and xfer_open_uri().

Referenced by efi_pxe_mtftp().

◆ efi_pxe_udp_close()

void efi_pxe_udp_close ( struct efi_pxe * pxe,
int rc )
static

Close UDP interface.

Parameters
pxePXE base code
rcReason for close

Definition at line 437 of file efi_pxe.c.

437 {
438 struct io_buffer *iobuf;
439 struct io_buffer *tmp;
440
441 /* Release our claim on SNP devices, if applicable */
442 if ( process_running ( &pxe->process ) )
444
445 /* Stop process */
446 process_del ( &pxe->process );
447
448 /* Restart UDP interface */
449 intf_restart ( &pxe->udp, rc );
450
451 /* Flush any received UDP packets */
452 list_for_each_entry_safe ( iobuf, tmp, &pxe->queue, list ) {
453 list_del ( &iobuf->list );
454 free_iob ( iobuf );
455 }
456}
static void efi_snp_release(void)
Release network devices for use via SNP.
Definition efi_snp.h:100
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition iobuf.c:153
unsigned long tmp
Definition linux_pci.h:65
#define list_for_each_entry_safe(pos, tmp, head, member)
Iterate over entries in a list, safe against deletion of the current entry.
Definition list.h:459
#define list_del(list)
Delete an entry from a list.
Definition list.h:120
void process_del(struct process *process)
Remove process from process list.
Definition process.c:80
static int process_running(struct process *process)
Check if process is running.
Definition process.h:176
struct interface udp
UDP interface.
Definition efi_pxe.c:105
struct list_head queue
List of received UDP packets.
Definition efi_pxe.c:107
struct process process
UDP interface closer process.
Definition efi_pxe.c:109
A persistent I/O buffer.
Definition iobuf.h:38
struct list_head list
List of which this buffer is a member.
Definition iobuf.h:45

References efi_snp_release(), free_iob(), intf_restart(), io_buffer::list, list_del, list_for_each_entry_safe, efi_pxe::process, process_del(), process_running(), efi_pxe::queue, rc, tmp, and efi_pxe::udp.

Referenced by efi_pxe_stop(), and efi_pxe_udp_scheduled_close().

◆ efi_pxe_udp_deliver()

int efi_pxe_udp_deliver ( struct efi_pxe * pxe,
struct io_buffer * iobuf,
struct xfer_metadata * meta )
static

Receive UDP packet.

Parameters
pxePXE base code
iobufI/O buffer
metaData transfer metadata
Return values
rcReturn status code

Definition at line 466 of file efi_pxe.c.

467 {
468 struct sockaddr_efi *se_src;
469 struct sockaddr_efi *se_dest;
470 struct tcpip_net_protocol *tcpip;
471 struct net_protocol *net;
472 struct efi_pxe_udp_pseudo_header *pshdr;
473 size_t addr_len;
474 size_t pshdr_len;
475 int rc;
476
477 /* Sanity checks */
478 assert ( meta != NULL );
479 se_src = ( ( struct sockaddr_efi * ) meta->src );
480 assert ( se_src != NULL );
481 se_dest = ( ( struct sockaddr_efi * ) meta->dest );
482 assert ( se_dest != NULL );
483 assert ( se_src->se_family == se_dest->se_family );
484
485 /* Determine protocol */
486 tcpip = tcpip_net_protocol ( se_src->se_family );
487 if ( ! tcpip ) {
488 rc = -ENOTSUP;
489 goto err_unsupported;
490 }
491 net = tcpip->net_protocol;
492 addr_len = net->net_addr_len;
493
494 /* Construct pseudo-header */
495 pshdr_len = ( sizeof ( *pshdr ) + ( 2 * addr_len ) );
496 if ( ( rc = iob_ensure_headroom ( iobuf, pshdr_len ) ) != 0 )
497 goto err_headroom;
498 memcpy ( iob_push ( iobuf, addr_len ), &se_src->se_addr, addr_len );
499 memcpy ( iob_push ( iobuf, addr_len ), &se_dest->se_addr, addr_len );
500 pshdr = iob_push ( iobuf, sizeof ( *pshdr ) );
501 pshdr->net = net;
502 pshdr->dest_port = ntohs ( se_dest->se_port );
503 pshdr->src_port = ntohs ( se_src->se_port );
504
505 /* Add to queue */
506 list_add_tail ( &iobuf->list, &pxe->queue );
507
508 return 0;
509
510 err_unsupported:
511 err_headroom:
512 free_iob ( iobuf );
513 return rc;
514}
#define assert(condition)
Assert a condition at run-time.
Definition assert.h:50
#define ntohs(value)
Definition byteswap.h:137
int iob_ensure_headroom(struct io_buffer *iobuf, size_t len)
Ensure I/O buffer has sufficient headroom.
Definition iobuf.c:235
#define iob_push(iobuf, len)
Definition iobuf.h:89
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition list.h:94
EFI UDP pseudo-header.
Definition efi_pxe.c:422
struct net_protocol * net
Network-layer protocol.
Definition efi_pxe.c:424
uint16_t src_port
Source port.
Definition efi_pxe.c:428
uint16_t dest_port
Destination port.
Definition efi_pxe.c:426
A network-layer protocol.
Definition netdevice.h:65
sa_family_t se_family
Socket address family (part of struct sockaddr)
Definition efi_pxe.c:158
uint16_t se_port
TCP/IP port (part of struct sockaddr_tcpip)
Definition efi_pxe.c:162
EFI_IP_ADDRESS se_addr
IP address.
Definition efi_pxe.c:170
A network-layer protocol of the TCP/IP stack (eg.
Definition tcpip.h:141
struct net_protocol * net_protocol
Network-layer protocol.
Definition tcpip.h:149
struct tcpip_net_protocol * tcpip_net_protocol(sa_family_t sa_family)
Find TCP/IP network-layer protocol.
Definition tcpip.c:69

References assert, efi_pxe_udp_pseudo_header::dest_port, ENOTSUP, free_iob(), iob_ensure_headroom(), iob_push, io_buffer::list, list_add_tail, memcpy(), meta, efi_pxe_udp_pseudo_header::net, net_protocol::net_addr_len, tcpip_net_protocol::net_protocol, ntohs, NULL, efi_pxe::queue, rc, sockaddr_efi::se_addr, sockaddr_efi::se_family, sockaddr_efi::se_port, efi_pxe_udp_pseudo_header::src_port, and tcpip_net_protocol().

◆ efi_pxe_udp_open()

int efi_pxe_udp_open ( struct efi_pxe * pxe)
static

Open UDP interface.

Parameters
pxePXE base code
Return values
rcReturn status code

Definition at line 532 of file efi_pxe.c.

532 {
533 int rc;
534
535 /* If interface is already open, then cancel the scheduled close */
536 if ( process_running ( &pxe->process ) ) {
537 process_del ( &pxe->process );
538 return 0;
539 }
540
541 /* Open promiscuous UDP interface */
542 if ( ( rc = udp_open_promisc ( &pxe->udp ) ) != 0 ) {
543 DBGC ( pxe, "PXE %s could not open UDP connection: %s\n",
544 pxe->name, strerror ( rc ) );
545 return rc;
546 }
547
548 /* Claim network devices */
550
551 return 0;
552}
static void efi_snp_claim(void)
Claim network devices for use by iPXE.
Definition efi_snp.h:92
int udp_open_promisc(struct interface *xfer)
Open a promiscuous UDP connection.
Definition udp.c:145

References DBGC, efi_snp_claim(), efi_pxe::name, efi_pxe::process, process_del(), process_running(), rc, strerror(), efi_pxe::udp, and udp_open_promisc().

Referenced by efi_pxe_udp_read(), and efi_pxe_udp_write().

◆ efi_pxe_udp_schedule_close()

void efi_pxe_udp_schedule_close ( struct efi_pxe * pxe)
static

Schedule close of UDP interface.

Parameters
pxePXE base code

Definition at line 559 of file efi_pxe.c.

559 {
560
561 /* The EFI PXE base code protocol does not provide any
562 * explicit UDP open/close methods. To avoid the overhead of
563 * reopening a socket for each read/write operation, we start
564 * a process which will close the socket immediately if the
565 * next call into iPXE is anything other than a UDP
566 * read/write.
567 */
568 process_add ( &pxe->process );
569}
void process_add(struct process *process)
Add process to process list.
Definition process.c:60

References efi_pxe::process, and process_add().

Referenced by efi_pxe_udp_read(), and efi_pxe_udp_write().

◆ efi_pxe_udp_scheduled_close()

void efi_pxe_udp_scheduled_close ( struct efi_pxe * pxe)
static

Scheduled close of UDP interface.

Parameters
pxePXE base code

Definition at line 576 of file efi_pxe.c.

576 {
577
578 /* Close UDP interface */
579 efi_pxe_udp_close ( pxe, 0 );
580}
static void efi_pxe_udp_close(struct efi_pxe *pxe, int rc)
Close UDP interface.
Definition efi_pxe.c:437

References efi_pxe_udp_close().

◆ efi_pxe_fake_name()

const char * efi_pxe_fake_name ( struct efi_pxe * pxe,
EFI_PXE_BASE_CODE_PACKET * packet )
static

Name fake DHCP packet.

Parameters
pxePXE base code
packetPacket
Return values
nameName of packet

Definition at line 600 of file efi_pxe.c.

601 {
603
604 if ( packet == &mode->DhcpDiscover ) {
605 return "DhcpDiscover";
606 } else if ( packet == &mode->DhcpAck ) {
607 return "DhcpAck";
608 } else if ( packet == &mode->ProxyOffer ) {
609 return "ProxyOffer";
610 } else if ( packet == &mode->PxeDiscover ) {
611 return "PxeDiscover";
612 } else if ( packet == &mode->PxeReply ) {
613 return "PxeReply";
614 } else if ( packet == &mode->PxeBisReply ) {
615 return "PxeBisReply";
616 } else {
617 return "<UNKNOWN>";
618 }
619}

References efi_pxe::mode, and mode.

Referenced by efi_pxe_fake().

◆ efi_pxe_fake()

BOOLEAN efi_pxe_fake ( struct efi_pxe * pxe,
int(* fake )(struct net_device *netdev, void *data, size_t len),
EFI_PXE_BASE_CODE_PACKET * packet )
static

Construct fake DHCP packet and flag.

Parameters
pxePXE base code
fakeFake packet constructor
packetPacket to fill in
Return values
existsPacket existence flag

Definition at line 629 of file efi_pxe.c.

632 {
634 struct dhcp_packet dhcppkt;
635 struct dhcphdr *dhcphdr;
636 unsigned int len;
637 int rc;
638
639 /* The fake packet constructors do not support IPv6 */
640 if ( mode->UsingIpv6 )
641 return FALSE;
642
643 /* Attempt to construct packet */
644 if ( ( rc = fake ( pxe->netdev, packet, sizeof ( *packet ) ) != 0 ) ) {
645 DBGC ( pxe, "PXE %s could not fake %s: %s\n", pxe->name,
646 efi_pxe_fake_name ( pxe, packet ), strerror ( rc ) );
647 return FALSE;
648 }
649
650 /* The WDS bootstrap wdsmgfw.efi has a buggy DHCPv4 packet
651 * parser which does not correctly handle DHCP padding bytes.
652 * Specifically, if a padding byte (i.e. a zero) is
653 * encountered, the parse will first increment the pointer by
654 * one to skip over the padding byte but will then drop into
655 * the code path for handling normal options, which increments
656 * the pointer by two to skip over the (already-skipped) type
657 * field and the (non-existent) length field.
658 *
659 * The upshot of this bug in WDS is that the parser will fail
660 * with an error 0xc0000023 if the number of spare bytes after
661 * the end of the options is not an exact multiple of three.
662 *
663 * Work around this buggy parser by adding an explicit
664 * DHCP_END tag.
665 */
667 struct dhcphdr, op );
668 dhcppkt_init ( &dhcppkt, dhcphdr, sizeof ( *packet ) );
669 len = dhcppkt_len ( &dhcppkt );
670 if ( len < sizeof ( *packet ) )
671 packet->Raw[len] = DHCP_END;
672
673 return TRUE;
674}
void dhcppkt_init(struct dhcp_packet *dhcppkt, struct dhcphdr *data, size_t len)
Initialise DHCP packet.
Definition dhcppkt.c:301
static size_t dhcppkt_len(struct dhcp_packet *dhcppkt)
Get used length of DHCP packet.
Definition dhcppkt.h:60
ring len
Length.
Definition dwmac.h:226
static const char * efi_pxe_fake_name(struct efi_pxe *pxe, EFI_PXE_BASE_CODE_PACKET *packet)
Name fake DHCP packet.
Definition efi_pxe.c:600
#define DHCP_END
End of options.
Definition dhcp.h:549
static uint16_t struct vmbus_xfer_pages_operations * op
Definition netvsc.h:327
A DHCP packet.
Definition dhcppkt.h:21
A DHCP header.
Definition dhcp.h:616
#define TRUE
Definition tlan.h:46
#define FALSE
Definition tlan.h:45
EFI_PXE_BASE_CODE_DHCPV4_PACKET Dhcpv4

References EFI_PXE_BASE_CODE_DHCPV4_PACKET::BootpOpcode, container_of, data, DBGC, DHCP_END, dhcppkt_init(), dhcppkt_len(), EFI_PXE_BASE_CODE_PACKET::Dhcpv4, efi_pxe_fake_name(), FALSE, len, efi_pxe::mode, mode, efi_pxe::name, efi_pxe::netdev, netdev, op, EFI_PXE_BASE_CODE_PACKET::Raw, rc, strerror(), and TRUE.

Referenced by efi_pxe_fake_all().

◆ efi_pxe_fake_all()

void efi_pxe_fake_all ( struct efi_pxe * pxe)
static

Construct fake DHCP packets.

Parameters
pxePXE base code

Definition at line 681 of file efi_pxe.c.

681 {
683
684 /* Construct fake packets */
685 mode->DhcpDiscoverValid =
687 &mode->DhcpDiscover );
688 mode->DhcpAckReceived =
690 &mode->DhcpAck );
691 mode->PxeReplyReceived =
693 &mode->PxeReply );
694}
static BOOLEAN efi_pxe_fake(struct efi_pxe *pxe, int(*fake)(struct net_device *netdev, void *data, size_t len), EFI_PXE_BASE_CODE_PACKET *packet)
Construct fake DHCP packet and flag.
Definition efi_pxe.c:629
int create_fakedhcpdiscover(struct net_device *netdev, void *data, size_t max_len)
Create fake DHCPDISCOVER packet.
Definition fakedhcp.c:110
int create_fakepxebsack(struct net_device *netdev, void *data, size_t max_len)
Create fake PXE Boot Server ACK packet.
Definition fakedhcp.c:179
int create_fakedhcpack(struct net_device *netdev, void *data, size_t max_len)
Create fake DHCPACK packet.
Definition fakedhcp.c:137

References create_fakedhcpack(), create_fakedhcpdiscover(), create_fakepxebsack(), efi_pxe_fake(), efi_pxe::mode, and mode.

Referenced by efi_pxe_dhcp(), and efi_pxe_start().

◆ efi_pxe_start()

EFI_STATUS EFIAPI efi_pxe_start ( EFI_PXE_BASE_CODE_PROTOCOL * base,
BOOLEAN use_ipv6 )
static

Start PXE base code.

Parameters
basePXE base code protocol
use_ipv6Use IPv6
Return values
efircEFI status code

Definition at line 710 of file efi_pxe.c.

711 {
712 struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
715 sa_family_t family = ( use_ipv6 ? AF_INET6 : AF_INET );
716 int rc;
717
718 DBGC ( pxe, "PXE %s START %s\n",
719 pxe->name, ( use_ipv6 ? "IPv6" : "IPv4" ) );
720
721 /* Initialise mode structure */
722 memset ( mode, 0, sizeof ( *mode ) );
723 mode->AutoArp = TRUE;
724 mode->TTL = DEFAULT_TTL;
725 mode->ToS = DEFAULT_ToS;
726 mode->IpFilter.Filters =
731
732 /* Check for IPv4/IPv6 support */
733 mode->Ipv6Supported = ( ipv6 != NULL );
734 mode->Ipv6Available = ( ipv6 != NULL );
735 pxe->tcpip = tcpip_net_protocol ( family );
736 if ( ! pxe->tcpip ) {
737 DBGC ( pxe, "PXE %s has no support for %s\n",
738 pxe->name, socket_family_name ( family ) );
739 return EFI_UNSUPPORTED;
740 }
741 pxe->net = pxe->tcpip->net_protocol;
742 mode->UsingIpv6 = use_ipv6;
743
744 /* Populate station IP address */
745 if ( ( rc = efi_pxe_ip ( pxe ) ) != 0 )
746 return rc;
747
748 /* Construct fake DHCP packets */
749 efi_pxe_fake_all ( pxe );
750
751 /* Record that base code is started */
752 mode->Started = TRUE;
753 DBGC ( pxe, "PXE %s using %s\n",
754 pxe->name, pxe->net->ntoa ( &mode->StationIp ) );
755
756 return 0;
757}
#define DEFAULT_ToS
Definition PxeBaseCode.h:41
#define DEFAULT_TTL
Default IP TTL and ToS.
Definition PxeBaseCode.h:40
#define EFI_UNSUPPORTED
Enumeration of EFI_STATUS.
static int efi_pxe_ip(struct efi_pxe *pxe)
Populate local IP address.
Definition efi_pxe.c:225
static void efi_pxe_fake_all(struct efi_pxe *pxe)
Construct fake DHCP packets.
Definition efi_pxe.c:681
#define AF_INET
IPv4 Internet addresses.
Definition socket.h:64
#define AF_INET6
IPv6 Internet addresses.
Definition socket.h:65
uint32_t base
Base.
Definition librm.h:3
uint16_t sa_family_t
A socket address family.
Definition socket.h:86
static const char * socket_family_name(int family)
Name address family.
Definition socket.h:76

References AF_INET, AF_INET6, base, container_of, DBGC, DEFAULT_ToS, DEFAULT_TTL, EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST, EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS, EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST, EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP, efi_pxe_fake_all(), efi_pxe_ip(), EFI_UNSUPPORTED, EFIAPI, memset(), efi_pxe::mode, mode, efi_pxe::name, efi_pxe::net, tcpip_net_protocol::net_protocol, net_protocol::ntoa, NULL, rc, socket_family_name(), efi_pxe::tcpip, tcpip_net_protocol(), and TRUE.

Referenced by efi_pxe_install().

◆ efi_pxe_stop()

EFI_STATUS EFIAPI efi_pxe_stop ( EFI_PXE_BASE_CODE_PROTOCOL * base)
static

Stop PXE base code.

Parameters
basePXE base code protocol
Return values
efircEFI status code

Definition at line 765 of file efi_pxe.c.

765 {
766 struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
768
769 DBGC ( pxe, "PXE %s STOP\n", pxe->name );
770
771 /* Record that base code is stopped */
772 mode->Started = FALSE;
773
774 /* Close TFTP */
775 efi_pxe_tftp_close ( pxe, 0 );
776
777 /* Close UDP */
778 efi_pxe_udp_close ( pxe, 0 );
779
780 return 0;
781}

References base, container_of, DBGC, efi_pxe_tftp_close(), efi_pxe_udp_close(), EFIAPI, FALSE, efi_pxe::mode, mode, and efi_pxe::name.

Referenced by efi_pxe_uninstall().

◆ efi_pxe_dhcp()

EFI_STATUS EFIAPI efi_pxe_dhcp ( EFI_PXE_BASE_CODE_PROTOCOL * base,
BOOLEAN sort )
static

Perform DHCP.

Parameters
basePXE base code protocol
sortOffers should be sorted
Return values
efircEFI status code

Definition at line 790 of file efi_pxe.c.

791 {
792 struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
793 struct net_device *netdev = pxe->netdev;
794 int rc;
795
796 DBGC ( pxe, "PXE %s DHCP %s\n",
797 pxe->name, ( sort ? "sorted" : "unsorted" ) );
798
799 /* Claim network devices */
801
802 /* Initiate configuration */
803 if ( ( rc = netdev_configure_all ( netdev ) ) != 0 ) {
804 DBGC ( pxe, "PXE %s could not initiate configuration: %s\n",
805 pxe->name, strerror ( rc ) );
806 goto err_configure;
807 }
808
809 /* Wait for configuration to complete (or time out) */
811 step();
812
813 /* Report timeout if configuration failed */
814 if ( ! netdev_configuration_ok ( netdev ) ) {
815 rc = -ETIMEDOUT;
816 goto err_timeout;
817 }
818
819 /* Update station IP address */
820 if ( ( rc = efi_pxe_ip ( pxe ) ) != 0 )
821 goto err_ip;
822
823 /* Update faked DHCP packets */
824 efi_pxe_fake_all ( pxe );
825
826 err_ip:
827 err_timeout:
828 err_configure:
830 return EFIRC ( rc );
831}
static struct net_device * netdev
Definition gdbudp.c:53
#define ETIMEDOUT
Connection timed out.
Definition errno.h:670
#define EFIRC(rc)
Convert an iPXE status code to an EFI status code.
Definition efi.h:167
int netdev_configure_all(struct net_device *netdev)
Start network device configuration via all supported configurators.
Definition netdevice.c:1336
int netdev_configuration_ok(struct net_device *netdev)
Check if network device has at least one successful configuration.
Definition netdevice.c:1392
int netdev_configuration_in_progress(struct net_device *netdev)
Check if network device configuration is in progress.
Definition netdevice.c:1380
void step(void)
Single-step a single process.
Definition process.c:99
A network device.
Definition netdevice.h:353

References base, container_of, DBGC, efi_pxe_fake_all(), efi_pxe_ip(), efi_snp_claim(), efi_snp_release(), EFIAPI, EFIRC, ETIMEDOUT, efi_pxe::name, efi_pxe::netdev, netdev, netdev_configuration_in_progress(), netdev_configuration_ok(), netdev_configure_all(), rc, step(), and strerror().

◆ efi_pxe_discover()

EFI_STATUS EFIAPI efi_pxe_discover ( EFI_PXE_BASE_CODE_PROTOCOL * base,
UINT16 type,
UINT16 * layer,
BOOLEAN bis,
EFI_PXE_BASE_CODE_DISCOVER_INFO * info )
static

Perform boot server discovery.

Parameters
basePXE base code protocol
typeBoot server type
layerBoot server layer
bisUse boot integrity services
infoAdditional information
Return values
efircEFI status code

Definition at line 844 of file efi_pxe.c.

845 {
846 struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
848 unsigned int i;
849
850 DBGC ( pxe, "PXE %s DISCOVER type %d layer %d%s\n",
851 pxe->name, type, *layer, ( bis ? " bis" : "" ) );
852 if ( info ) {
853 DBGC ( pxe, "%s%s%s%s %s",
854 ( info->UseMCast ? " mcast" : "" ),
855 ( info->UseBCast ? " bcast" : "" ),
856 ( info->UseUCast ? " ucast" : "" ),
857 ( info->MustUseList ? " list" : "" ),
858 efi_pxe_ip_ntoa ( pxe, &info->ServerMCastIp ) );
859 for ( i = 0 ; i < info->IpCnt ; i++ ) {
860 ip = &info->SrvList[i].IpAddr;
861 DBGC ( pxe, " %d%s:%s", info->SrvList[i].Type,
862 ( info->SrvList[i].AcceptAnyResponse ?
863 ":any" : "" ), efi_pxe_ip_ntoa ( pxe, ip ) );
864 }
865 }
866 DBGC ( pxe, "\n" );
867
868 /* Not used by any bootstrap I can find to test with */
869 return EFI_UNSUPPORTED;
870}
u32 info
Definition ar9003_mac.h:0
uint32_t type
Operating system type.
Definition ena.h:1

References base, container_of, DBGC, efi_pxe_ip_ntoa(), EFI_UNSUPPORTED, info, ip, efi_pxe::name, and type.

◆ efi_pxe_mtftp()

EFI_STATUS EFIAPI efi_pxe_mtftp ( EFI_PXE_BASE_CODE_PROTOCOL * base,
EFI_PXE_BASE_CODE_TFTP_OPCODE opcode,
VOID * data,
BOOLEAN overwrite,
UINT64 * len,
UINTN * blksize,
EFI_IP_ADDRESS * ip,
UINT8 * filename,
EFI_PXE_BASE_CODE_MTFTP_INFO * info,
BOOLEAN callback )
static

Perform (M)TFTP.

Parameters
basePXE base code protocol
opcodeTFTP opcode
dataData buffer
overwriteOverwrite file
lenLength of data buffer
blksizeBlock size
ipServer address
filenameFilename
infoAdditional information
callbackPass packets to callback instead of data buffer
Return values
efircEFI status code

Definition at line 888 of file efi_pxe.c.

892 {
893 struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
894 int rc;
895
896 DBGC ( pxe, "PXE %s MTFTP %d%s %p+%llx", pxe->name, opcode,
897 ( overwrite ? " overwrite" : "" ), data, *len );
898 if ( blksize )
899 DBGC ( pxe, " blksize %zd", ( ( size_t ) *blksize ) );
900 DBGC ( pxe, " %s:%s", efi_pxe_ip_ntoa ( pxe, ip ), filename );
901 if ( info ) {
902 DBGC ( pxe, " %s:%d:%d:%d:%d",
903 efi_pxe_ip_ntoa ( pxe, &info->MCastIp ),
904 info->CPort, info->SPort, info->ListenTimeout,
905 info->TransmitTimeout );
906 }
907 DBGC ( pxe, "%s\n", ( callback ? " callback" : "" ) );
908
909 /* Fail unless operation is supported */
912 DBGC ( pxe, "PXE %s unsupported MTFTP opcode %d\n",
913 pxe->name, opcode );
914 rc = -ENOTSUP;
915 goto err_opcode;
916 }
917
918 /* Claim network devices */
920
921 /* Determine block size. Ignore the requested block size
922 * unless we are using callbacks, since limiting HTTP to a
923 * 512-byte TCP window is not sensible.
924 */
925 pxe->blksize = ( ( callback && blksize ) ? *blksize : -1UL );
926
927 /* Initialise data transfer buffer */
928 xferbuf_fixed_init ( &pxe->buf, data, *len );
929
930 /* Open download */
931 if ( ( rc = efi_pxe_tftp_open ( pxe, ip,
932 ( ( const char * ) filename ) ) ) != 0 )
933 goto err_open;
934
935 /* Wait for download to complete */
936 pxe->rc = -EINPROGRESS;
937 while ( pxe->rc == -EINPROGRESS )
938 step();
939 if ( ( rc = pxe->rc ) != 0 ) {
940 DBGC ( pxe, "PXE %s download failed: %s\n",
941 pxe->name, strerror ( rc ) );
942 goto err_download;
943 }
944
945 err_download:
946 efi_pxe_tftp_close ( pxe, rc );
947 err_open:
948 xferbuf_fixed_init ( &pxe->buf, NULL, 0 );
950 err_opcode:
951 return EFIRC ( rc );
952}
@ EFI_PXE_BASE_CODE_TFTP_READ_FILE
@ EFI_PXE_BASE_CODE_MTFTP_READ_FILE
int overwrite(const WINDOW *, WINDOW *)
static int efi_pxe_tftp_open(struct efi_pxe *pxe, EFI_IP_ADDRESS *ip, const char *filename)
Open (M)TFTP download interface.
Definition efi_pxe.c:385
uint8_t data[48]
Additional event data.
Definition ena.h:11
uint8_t opcode
Opcode.
Definition ena.h:5
#define EINPROGRESS
Operation in progress.
Definition errno.h:419
uint32_t blksize
Cipher block size.
Definition pccrr.h:1
static void xferbuf_fixed_init(struct xfer_buffer *xferbuf, void *data, size_t len)
Initialise fixed-size data transfer buffer.
Definition xferbuf.h:81

References base, blksize, efi_pxe::blksize, efi_pxe::buf, container_of, data, DBGC, EFI_PXE_BASE_CODE_MTFTP_READ_FILE, EFI_PXE_BASE_CODE_TFTP_READ_FILE, efi_pxe_ip_ntoa(), efi_pxe_tftp_close(), efi_pxe_tftp_open(), efi_snp_claim(), efi_snp_release(), EFIRC, EINPROGRESS, ENOTSUP, info, ip, len, efi_pxe::name, NULL, opcode, overwrite(), efi_pxe::rc, rc, step(), strerror(), VOID, and xferbuf_fixed_init().

◆ efi_pxe_udp_write()

EFI_STATUS EFIAPI efi_pxe_udp_write ( EFI_PXE_BASE_CODE_PROTOCOL * base,
UINT16 flags,
EFI_IP_ADDRESS * dest_ip,
EFI_PXE_BASE_CODE_UDP_PORT * dest_port,
EFI_IP_ADDRESS * gateway,
EFI_IP_ADDRESS * src_ip,
EFI_PXE_BASE_CODE_UDP_PORT * src_port,
UINTN * hdr_len,
VOID * hdr,
UINTN * len,
VOID * data )
static

Transmit UDP packet.

Parameters
basePXE base code protocol
flagsOperation flags
dest_ipDestination address
dest_portDestination port
gatewayGateway address
src_ipSource address
src_portSource port
hdr_lenHeader length
hdrHeader data
lenLength
dataData
Return values
efircEFI status code

Definition at line 971 of file efi_pxe.c.

976 {
977 struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
979 struct io_buffer *iobuf;
980 struct xfer_metadata meta;
981 union {
982 struct sockaddr_tcpip st;
983 struct sockaddr sa;
984 } dest;
985 union {
986 struct sockaddr_tcpip st;
987 struct sockaddr sa;
988 } src;
989 int rc;
990
991 DBGC2 ( pxe, "PXE %s UDP WRITE ", pxe->name );
992 if ( src_ip )
993 DBGC2 ( pxe, "%s", efi_pxe_ip_ntoa ( pxe, src_ip ) );
994 DBGC2 ( pxe, ":" );
995 if ( src_port &&
997 DBGC2 ( pxe, "%d", *src_port );
998 } else {
999 DBGC2 ( pxe, "*" );
1000 }
1001 DBGC2 ( pxe, "->%s:%d", efi_pxe_ip_ntoa ( pxe, dest_ip ), *dest_port );
1002 if ( gateway )
1003 DBGC2 ( pxe, " via %s", efi_pxe_ip_ntoa ( pxe, gateway ) );
1004 if ( hdr_len )
1005 DBGC2 ( pxe, " %p+%zx", hdr, ( ( size_t ) *hdr_len ) );
1006 DBGC2 ( pxe, " %p+%zx", data, ( ( size_t ) *len ) );
1008 DBGC2 ( pxe, " frag" );
1009 DBGC2 ( pxe, "\n" );
1010
1011 /* Open UDP connection (if applicable) */
1012 if ( ( rc = efi_pxe_udp_open ( pxe ) ) != 0 )
1013 goto err_open;
1014
1015 /* Construct destination address */
1016 efi_pxe_ip_sockaddr ( pxe, dest_ip, &dest.sa );
1017 dest.st.st_port = htons ( *dest_port );
1018
1019 /* Construct source address */
1020 efi_pxe_ip_sockaddr ( pxe, ( src_ip ? src_ip : &mode->StationIp ),
1021 &src.sa );
1022 if ( src_port &&
1024 src.st.st_port = htons ( *src_port );
1025 } else {
1026 /* The API does not allow for a sensible concept of
1027 * binding to a local port, so just use a random value.
1028 */
1029 src.st.st_port = ( random() | htons ( 1024 ) );
1030 if ( src_port )
1031 *src_port = ntohs ( src.st.st_port );
1032 }
1033
1034 /* Allocate I/O buffer */
1035 iobuf = xfer_alloc_iob ( &pxe->udp,
1036 ( *len + ( hdr_len ? *hdr_len : 0 ) ) );
1037 if ( ! iobuf ) {
1038 rc = -ENOMEM;
1039 goto err_alloc;
1040 }
1041
1042 /* Populate I/O buffer */
1043 if ( hdr_len )
1044 memcpy ( iob_put ( iobuf, *hdr_len ), hdr, *hdr_len );
1045 memcpy ( iob_put ( iobuf, *len ), data, *len );
1046
1047 /* Construct metadata */
1048 memset ( &meta, 0, sizeof ( meta ) );
1049 meta.src = &src.sa;
1050 meta.dest = &dest.sa;
1051 meta.netdev = pxe->netdev;
1052
1053 /* Deliver I/O buffer */
1054 if ( ( rc = xfer_deliver ( &pxe->udp, iob_disown ( iobuf ),
1055 &meta ) ) != 0 ) {
1056 DBGC ( pxe, "PXE %s could not transmit: %s\n",
1057 pxe->name, strerror ( rc ) );
1058 goto err_deliver;
1059 }
1060
1061 err_deliver:
1062 free_iob ( iobuf );
1063 err_alloc:
1065 err_open:
1066 return EFIRC ( rc );
1067}
struct golan_inbox_hdr hdr
Message header.
Definition CIB_PRM.h:0
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_MAY_FRAGMENT
if(len >=6 *4) __asm__ __volatile__("movsl" if(len >=5 *4) __asm__ __volatile__("movsl" if(len >=4 *4) __asm__ __volatile__("movsl" if(len >=3 *4) __asm__ __volatile__("movsl" if(len >=2 *4) __asm__ __volatile__("movsl" if(len >=1 *4) __asm__ __volatile__("movsl" if((len % 4) >=2) __asm__ __volatile__("movsw" if((len % 2) >=1) __asm__ __volatile__("movsb" retur dest)
Definition string.h:151
static const void * src
Definition string.h:48
static int efi_pxe_udp_open(struct efi_pxe *pxe)
Open UDP interface.
Definition efi_pxe.c:532
static void efi_pxe_udp_schedule_close(struct efi_pxe *pxe)
Schedule close of UDP interface.
Definition efi_pxe.c:559
uint8_t flags
Flags.
Definition ena.h:7
#define DBGC2(...)
Definition compiler.h:522
#define ENOMEM
Not enough space.
Definition errno.h:535
#define htons(value)
Definition byteswap.h:136
#define iob_put(iobuf, len)
Definition iobuf.h:125
IP4_t dest_ip
Destination IP address.
Definition pxe_api.h:2
IP4_t src_ip
IP address of this station.
Definition pxe_api.h:1
UDP_PORT_t src_port
Source UDP port.
Definition pxe_api.h:3
long int random(void)
Generate a pseudo-random number between 0 and 2147483647L or 2147483562?
Definition random.c:32
Data transfer metadata.
Definition xfer.h:23
struct sockaddr_tcpip st
Definition syslog.c:58
int xfer_deliver(struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver datagram.
Definition xfer.c:195
struct io_buffer * xfer_alloc_iob(struct interface *intf, size_t len)
Allocate I/O buffer.
Definition xfer.c:159

References base, container_of, data, DBGC, DBGC2, dest, dest_ip, EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT, EFI_PXE_BASE_CODE_UDP_OPFLAGS_MAY_FRAGMENT, efi_pxe_ip_ntoa(), efi_pxe_ip_sockaddr(), efi_pxe_udp_open(), efi_pxe_udp_schedule_close(), EFIRC, ENOMEM, flags, free_iob(), hdr, htons, iob_disown, iob_put, len, memcpy(), memset(), meta, efi_pxe::mode, mode, efi_pxe::name, efi_pxe::netdev, ntohs, random(), rc, sa, src, src_ip, src_port, st, strerror(), efi_pxe::udp, VOID, xfer_alloc_iob(), and xfer_deliver().

◆ efi_pxe_udp_read()

EFI_STATUS EFIAPI efi_pxe_udp_read ( EFI_PXE_BASE_CODE_PROTOCOL * base,
UINT16 flags,
EFI_IP_ADDRESS * dest_ip,
EFI_PXE_BASE_CODE_UDP_PORT * dest_port,
EFI_IP_ADDRESS * src_ip,
EFI_PXE_BASE_CODE_UDP_PORT * src_port,
UINTN * hdr_len,
VOID * hdr,
UINTN * len,
VOID * data )
static

Receive UDP packet.

Parameters
basePXE base code protocol
flagsOperation flags
dest_ipDestination address
dest_portDestination port
src_ipSource address
src_portSource port
hdr_lenHeader length
hdrHeader data
lenLength
dataData
Return values
efircEFI status code

Definition at line 1085 of file efi_pxe.c.

1090 {
1091 struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
1092 struct io_buffer *iobuf;
1093 struct efi_pxe_udp_pseudo_header *pshdr;
1094 EFI_IP_ADDRESS *actual_dest_ip;
1095 EFI_IP_ADDRESS *actual_src_ip;
1096 size_t addr_len;
1097 size_t frag_len;
1098 int rc;
1099
1100 DBGC2 ( pxe, "PXE %s UDP READ ", pxe->name );
1102 DBGC2 ( pxe, "(filter)" );
1104 DBGC2 ( pxe, "*" );
1105 } else if ( dest_ip ) {
1106 DBGC2 ( pxe, "%s", efi_pxe_ip_ntoa ( pxe, dest_ip ) );
1107 }
1108 DBGC2 ( pxe, ":" );
1110 DBGC2 ( pxe, "*" );
1111 } else if ( dest_port ) {
1112 DBGC2 ( pxe, "%d", *dest_port );
1113 } else {
1114 DBGC2 ( pxe, "<NULL>" );
1115 }
1116 DBGC2 ( pxe, "<-" );
1118 DBGC2 ( pxe, "*" );
1119 } else if ( src_ip ) {
1120 DBGC2 ( pxe, "%s", efi_pxe_ip_ntoa ( pxe, src_ip ) );
1121 } else {
1122 DBGC2 ( pxe, "<NULL>" );
1123 }
1124 DBGC2 ( pxe, ":" );
1126 DBGC2 ( pxe, "*" );
1127 } else if ( src_port ) {
1128 DBGC2 ( pxe, "%d", *src_port );
1129 } else {
1130 DBGC2 ( pxe, "<NULL>" );
1131 }
1132 if ( hdr_len )
1133 DBGC2 ( pxe, " %p+%zx", hdr, ( ( size_t ) *hdr_len ) );
1134 DBGC2 ( pxe, " %p+%zx\n", data, ( ( size_t ) *len ) );
1135
1136 /* Open UDP connection (if applicable) */
1137 if ( ( rc = efi_pxe_udp_open ( pxe ) ) != 0 )
1138 goto err_open;
1139
1140 /* Try receiving a packet, if the queue is empty */
1141 if ( list_empty ( &pxe->queue ) )
1142 step();
1143
1144 /* Remove first packet from the queue */
1145 iobuf = list_first_entry ( &pxe->queue, struct io_buffer, list );
1146 if ( ! iobuf ) {
1147 rc = -ETIMEDOUT; /* "no packet" */
1148 goto err_empty;
1149 }
1150 list_del ( &iobuf->list );
1151
1152 /* Strip pseudo-header */
1153 pshdr = iobuf->data;
1154 addr_len = ( pshdr->net->net_addr_len );
1155 iob_pull ( iobuf, sizeof ( *pshdr ) );
1156 actual_dest_ip = iobuf->data;
1157 iob_pull ( iobuf, addr_len );
1158 actual_src_ip = iobuf->data;
1159 iob_pull ( iobuf, addr_len );
1160 DBGC2 ( pxe, "PXE %s UDP RX %s:%d", pxe->name,
1161 pshdr->net->ntoa ( actual_dest_ip ), pshdr->dest_port );
1162 DBGC2 ( pxe, "<-%s:%d len %#zx\n", pshdr->net->ntoa ( actual_src_ip ),
1163 pshdr->src_port, iob_len ( iobuf ) );
1164
1165 /* Filter based on network-layer protocol */
1166 if ( pshdr->net != pxe->net ) {
1167 DBGC2 ( pxe, "PXE %s filtered out %s packet\n",
1168 pxe->name, pshdr->net->name );
1169 rc = -ETIMEDOUT; /* "no packet" */
1170 goto err_filter;
1171 }
1172
1173 /* Filter based on port numbers */
1175 ( dest_port && ( *dest_port == pshdr->dest_port ) ) ) ) {
1176 DBGC2 ( pxe, "PXE %s filtered out destination port %d\n",
1177 pxe->name, pshdr->dest_port );
1178 rc = -ETIMEDOUT; /* "no packet" */
1179 goto err_filter;
1180 }
1182 ( src_port && ( *src_port == pshdr->src_port ) ) ) ) {
1183 DBGC2 ( pxe, "PXE %s filtered out source port %d\n",
1184 pxe->name, pshdr->src_port );
1185 rc = -ETIMEDOUT; /* "no packet" */
1186 goto err_filter;
1187 }
1188
1189 /* Filter based on source IP address */
1191 ( src_ip &&
1192 ( memcmp ( src_ip, actual_src_ip, addr_len ) == 0 ) ) ) ) {
1193 DBGC2 ( pxe, "PXE %s filtered out source IP %s\n",
1194 pxe->name, pshdr->net->ntoa ( actual_src_ip ) );
1195 rc = -ETIMEDOUT; /* "no packet" */
1196 goto err_filter;
1197 }
1198
1199 /* Filter based on destination IP address */
1201 efi_pxe_ip_filter ( pxe, actual_dest_ip ) ) ||
1204 ( dest_ip && ( memcmp ( dest_ip, actual_dest_ip,
1205 addr_len ) == 0 ) ) ) ) ) ) {
1206 DBGC2 ( pxe, "PXE %s filtered out destination IP %s\n",
1207 pxe->name, pshdr->net->ntoa ( actual_dest_ip ) );
1208 rc = -ETIMEDOUT; /* "no packet" */
1209 goto err_filter;
1210 }
1211
1212 /* Fill in addresses and port numbers */
1213 if ( dest_ip )
1214 memcpy ( dest_ip, actual_dest_ip, addr_len );
1215 if ( dest_port )
1216 *dest_port = pshdr->dest_port;
1217 if ( src_ip )
1218 memcpy ( src_ip, actual_src_ip, addr_len );
1219 if ( src_port )
1220 *src_port = pshdr->src_port;
1221
1222 /* Fill in header, if applicable */
1223 if ( hdr_len ) {
1224 frag_len = iob_len ( iobuf );
1225 if ( frag_len > *hdr_len )
1226 frag_len = *hdr_len;
1227 memcpy ( hdr, iobuf->data, frag_len );
1228 iob_pull ( iobuf, frag_len );
1229 *hdr_len = frag_len;
1230 }
1231
1232 /* Fill in data buffer */
1233 frag_len = iob_len ( iobuf );
1234 if ( frag_len > *len )
1235 frag_len = *len;
1236 memcpy ( data, iobuf->data, frag_len );
1237 iob_pull ( iobuf, frag_len );
1238 *len = frag_len;
1239
1240 /* Check for overflow */
1241 if ( iob_len ( iobuf ) ) {
1242 rc = -ERANGE;
1243 goto err_too_short;
1244 }
1245
1246 /* Success */
1247 rc = 0;
1248
1249 err_too_short:
1250 err_filter:
1251 free_iob ( iobuf );
1252 err_empty:
1254 err_open:
1255 return EFIRC ( rc );
1256}
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP
static int efi_pxe_ip_filter(struct efi_pxe *pxe, EFI_IP_ADDRESS *ip)
Check if IP address matches filter.
Definition efi_pxe.c:258
#define ERANGE
Result too large.
Definition errno.h:640
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition iobuf.h:160
#define iob_pull(iobuf, len)
Definition iobuf.h:107
#define list_first_entry(list, type, member)
Get the container of the first entry in a list.
Definition list.h:334
#define list_empty(list)
Test whether a list is empty.
Definition list.h:137
void * data
Start of data.
Definition iobuf.h:53
const char * name
Protocol name.
Definition netdevice.h:67

References base, container_of, data, io_buffer::data, DBGC2, dest_ip, efi_pxe_udp_pseudo_header::dest_port, EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP, EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT, EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP, EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT, EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER, efi_pxe_ip_filter(), efi_pxe_ip_ntoa(), efi_pxe_udp_open(), efi_pxe_udp_schedule_close(), EFIRC, ERANGE, ETIMEDOUT, flags, free_iob(), hdr, iob_len(), iob_pull, len, io_buffer::list, list_del, list_empty, list_first_entry, memcmp(), memcpy(), efi_pxe::name, net_protocol::name, efi_pxe::net, efi_pxe_udp_pseudo_header::net, net_protocol::net_addr_len, net_protocol::ntoa, efi_pxe::queue, rc, src_ip, efi_pxe_udp_pseudo_header::src_port, src_port, step(), and VOID.

◆ efi_pxe_set_ip_filter()

EFI_STATUS EFIAPI efi_pxe_set_ip_filter ( EFI_PXE_BASE_CODE_PROTOCOL * base,
EFI_PXE_BASE_CODE_IP_FILTER * filter )
static

Set receive filter.

Parameters
basePXE base code protocol
filterReceive filter
Return values
efircEFI status code

Definition at line 1266 of file efi_pxe.c.

1267 {
1268 struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
1270 unsigned int i;
1271
1272 DBGC ( pxe, "PXE %s SET IP FILTER %02x",
1273 pxe->name, filter->Filters );
1274 for ( i = 0 ; i < filter->IpCnt ; i++ ) {
1275 DBGC ( pxe, " %s",
1276 efi_pxe_ip_ntoa ( pxe, &filter->IpList[i] ) );
1277 }
1278 DBGC ( pxe, "\n" );
1279
1280 /* Update filter */
1281 memcpy ( &mode->IpFilter, filter, sizeof ( mode->IpFilter ) );
1282
1283 return 0;
1284}

References base, container_of, DBGC, efi_pxe_ip_ntoa(), filter, memcpy(), efi_pxe::mode, mode, and efi_pxe::name.

◆ efi_pxe_arp()

EFI_STATUS EFIAPI efi_pxe_arp ( EFI_PXE_BASE_CODE_PROTOCOL * base,
EFI_IP_ADDRESS * ip,
EFI_MAC_ADDRESS * mac )
static

Resolve MAC address.

Parameters
basePXE base code protocol
ipIP address
macMAC address to fill in
Return values
efircEFI status code

Definition at line 1294 of file efi_pxe.c.

1296 {
1297 struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
1298
1299 DBGC ( pxe, "PXE %s ARP %s %p\n",
1300 pxe->name, efi_pxe_ip_ntoa ( pxe, ip ), mac );
1301
1302 /* Not used by any bootstrap I can find to test with */
1303 return EFI_UNSUPPORTED;
1304}
uint8_t mac[ETH_ALEN]
MAC address.
Definition ena.h:13

References base, container_of, DBGC, efi_pxe_ip_ntoa(), EFI_UNSUPPORTED, EFIAPI, ip, mac, and efi_pxe::name.

◆ efi_pxe_set_parameters()

EFI_STATUS EFIAPI efi_pxe_set_parameters ( EFI_PXE_BASE_CODE_PROTOCOL * base,
BOOLEAN * autoarp,
BOOLEAN * sendguid,
UINT8 * ttl,
UINT8 * tos,
BOOLEAN * callback )
static

Set parameters.

Parameters
basePXE base code protocol
autoarpAutomatic ARP packet generation
sendguidSend GUID as client hardware address
ttlIP time to live
tosIP type of service
callbackMake callbacks
Return values
efircEFI status code

Definition at line 1318 of file efi_pxe.c.

1320 {
1321 struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
1323
1324 DBGC ( pxe, "PXE %s SET PARAMETERS", pxe->name );
1325 if ( autoarp )
1326 DBGC ( pxe, " %s", ( *autoarp ? "autoarp" : "noautoarp" ) );
1327 if ( sendguid )
1328 DBGC ( pxe, " %s", ( *sendguid ? "sendguid" : "sendmac" ) );
1329 if ( ttl )
1330 DBGC ( pxe, " ttl %d", *ttl );
1331 if ( tos )
1332 DBGC ( pxe, " tos %d", *tos );
1333 if ( callback ) {
1334 DBGC ( pxe, " %s",
1335 ( *callback ? "callback" : "nocallback" ) );
1336 }
1337 DBGC ( pxe, "\n" );
1338
1339 /* Update parameters */
1340 if ( autoarp )
1341 mode->AutoArp = *autoarp;
1342 if ( sendguid )
1343 mode->SendGUID = *sendguid;
1344 if ( ttl )
1345 mode->TTL = *ttl;
1346 if ( tos )
1347 mode->ToS = *tos;
1348 if ( callback )
1349 mode->MakeCallbacks = *callback;
1350
1351 return 0;
1352}

References base, container_of, DBGC, efi_pxe::mode, mode, and efi_pxe::name.

◆ efi_pxe_set_station_ip()

EFI_STATUS EFIAPI efi_pxe_set_station_ip ( EFI_PXE_BASE_CODE_PROTOCOL * base,
EFI_IP_ADDRESS * ip,
EFI_IP_ADDRESS * netmask )
static

Set IP address.

Parameters
basePXE base code protocol
ipIP address
netmaskSubnet mask
Return values
efircEFI status code

Definition at line 1363 of file efi_pxe.c.

1364 {
1365 struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
1367
1368 DBGC ( pxe, "PXE %s SET STATION IP ", pxe->name );
1369 if ( ip )
1370 DBGC ( pxe, "%s", efi_pxe_ip_ntoa ( pxe, ip ) );
1371 if ( netmask )
1372 DBGC ( pxe, "/%s", efi_pxe_ip_ntoa ( pxe, netmask ) );
1373 DBGC ( pxe, "\n" );
1374
1375 /* Update IP address and netmask */
1376 if ( ip )
1377 memcpy ( &mode->StationIp, ip, sizeof ( mode->StationIp ) );
1378 if ( netmask )
1379 memcpy ( &mode->SubnetMask, netmask, sizeof (mode->SubnetMask));
1380
1381 return 0;
1382}

References base, container_of, DBGC, efi_pxe_ip_ntoa(), ip, memcpy(), efi_pxe::mode, mode, and efi_pxe::name.

◆ efi_pxe_set_packets()

EFI_STATUS EFIAPI efi_pxe_set_packets ( EFI_PXE_BASE_CODE_PROTOCOL * base,
BOOLEAN * dhcpdisc_ok,
BOOLEAN * dhcpack_ok,
BOOLEAN * proxyoffer_ok,
BOOLEAN * pxebsdisc_ok,
BOOLEAN * pxebsack_ok,
BOOLEAN * pxebsbis_ok,
EFI_PXE_BASE_CODE_PACKET * dhcpdisc,
EFI_PXE_BASE_CODE_PACKET * dhcpack,
EFI_PXE_BASE_CODE_PACKET * proxyoffer,
EFI_PXE_BASE_CODE_PACKET * pxebsdisc,
EFI_PXE_BASE_CODE_PACKET * pxebsack,
EFI_PXE_BASE_CODE_PACKET * pxebsbis )
static

Update cached DHCP packets.

Parameters
basePXE base code protocol
dhcpdisc_okDHCPDISCOVER is valid
dhcpack_okDHCPACK received
proxyoffer_okProxyDHCPOFFER received
pxebsdisc_okPxeBsDISCOVER valid
pxebsack_okPxeBsACK received
pxebsbis_okPxeBsBIS received
dhcpdiscDHCPDISCOVER packet
dhcpackDHCPACK packet
proxyofferProxyDHCPOFFER packet
pxebsdiscPxeBsDISCOVER packet
pxebsackPxeBsACK packet
pxebsbisPxeBsBIS packet
Return values
efircEFI status code

Definition at line 1403 of file efi_pxe.c.

1411 {
1412 struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
1414
1415 DBGC ( pxe, "PXE %s SET PACKETS\n", pxe->name );
1416
1417 /* Update fake packet flags */
1418 if ( dhcpdisc_ok )
1419 mode->DhcpDiscoverValid = *dhcpdisc_ok;
1420 if ( dhcpack_ok )
1421 mode->DhcpAckReceived = *dhcpack_ok;
1422 if ( proxyoffer_ok )
1423 mode->ProxyOfferReceived = *proxyoffer_ok;
1424 if ( pxebsdisc_ok )
1425 mode->PxeDiscoverValid = *pxebsdisc_ok;
1426 if ( pxebsack_ok )
1427 mode->PxeReplyReceived = *pxebsack_ok;
1428 if ( pxebsbis_ok )
1429 mode->PxeBisReplyReceived = *pxebsbis_ok;
1430
1431 /* Update fake packet contents */
1432 if ( dhcpdisc )
1433 memcpy ( &mode->DhcpDiscover, dhcpdisc, sizeof ( *dhcpdisc ) );
1434 if ( dhcpack )
1435 memcpy ( &mode->DhcpAck, dhcpack, sizeof ( *dhcpack ) );
1436 if ( proxyoffer )
1437 memcpy ( &mode->ProxyOffer, proxyoffer, sizeof ( *proxyoffer ));
1438 if ( pxebsdisc )
1439 memcpy ( &mode->PxeDiscover, pxebsdisc, sizeof ( *pxebsdisc ) );
1440 if ( pxebsack )
1441 memcpy ( &mode->PxeReply, pxebsack, sizeof ( *pxebsack ) );
1442 if ( pxebsbis )
1443 memcpy ( &mode->PxeBisReply, pxebsbis, sizeof ( *pxebsbis ) );
1444
1445 return 0;
1446}

References base, container_of, DBGC, memcpy(), efi_pxe::mode, mode, and efi_pxe::name.

◆ efi_apple_get_response()

EFI_STATUS EFIAPI efi_apple_get_response ( EFI_PXE_BASE_CODE_PACKET * packet,
UINTN * len,
VOID * data )
static

Get DHCP/BSDP response.

Parameters
packetPacket
lenLength of data buffer
dataData buffer
Return values
efircEFI status code

Definition at line 1481 of file efi_pxe.c.

1482 {
1483
1484 /* Check length */
1485 if ( *len < sizeof ( *packet ) ) {
1486 *len = sizeof ( *packet );
1487 return EFI_BUFFER_TOO_SMALL;
1488 }
1489
1490 /* Copy packet */
1491 memcpy ( data, packet, sizeof ( *packet ) );
1492 *len = sizeof ( *packet );
1493
1494 return EFI_SUCCESS;
1495}
#define EFI_BUFFER_TOO_SMALL
Enumeration of EFI_STATUS.
#define EFI_SUCCESS
Enumeration of EFI_STATUS.

References data, EFI_BUFFER_TOO_SMALL, EFI_SUCCESS, len, memcpy(), and VOID.

Referenced by efi_apple_get_bsdp_response(), and efi_apple_get_dhcp_response().

◆ efi_apple_get_dhcp_response()

EFI_STATUS EFIAPI efi_apple_get_dhcp_response ( EFI_APPLE_NET_BOOT_PROTOCOL * apple,
UINTN * len,
VOID * data )
static

Get DHCP response.

Parameters
appleApple NetBoot protocol
lenLength of data buffer
dataData buffer
Return values
efircEFI status code

Definition at line 1506 of file efi_pxe.c.

1507 {
1508 struct efi_pxe *pxe = container_of ( apple, struct efi_pxe, apple );
1509
1510 return efi_apple_get_response ( &pxe->mode.DhcpAck, len, data );
1511}
static EFI_STATUS EFIAPI efi_apple_get_response(EFI_PXE_BASE_CODE_PACKET *packet, UINTN *len, VOID *data)
Get DHCP/BSDP response.
Definition efi_pxe.c:1481
EFI_PXE_BASE_CODE_PACKET DhcpAck
EFI_APPLE_NET_BOOT_PROTOCOL apple
Apple NetBoot protocol.
Definition efi_pxe.c:87

References efi_pxe::apple, container_of, data, EFI_PXE_BASE_CODE_MODE::DhcpAck, efi_apple_get_response(), len, efi_pxe::mode, and VOID.

◆ efi_apple_get_bsdp_response()

EFI_STATUS EFIAPI efi_apple_get_bsdp_response ( EFI_APPLE_NET_BOOT_PROTOCOL * apple,
UINTN * len,
VOID * data )
static

Get BSDP response.

Parameters
appleApple NetBoot protocol
lenLength of data buffer
dataData buffer
Return values
efircEFI status code

Definition at line 1522 of file efi_pxe.c.

1523 {
1524 struct efi_pxe *pxe = container_of ( apple, struct efi_pxe, apple );
1525
1526 return efi_apple_get_response ( &pxe->mode.PxeReply, len, data );
1527}
EFI_PXE_BASE_CODE_PACKET PxeReply

References efi_pxe::apple, container_of, data, efi_apple_get_response(), len, efi_pxe::mode, EFI_PXE_BASE_CODE_MODE::PxeReply, and VOID.

◆ efi_pxe_install()

int efi_pxe_install ( EFI_HANDLE handle,
struct net_device * netdev )

Install PXE base code protocol.

Parameters
handleEFI handle
netdevUnderlying network device
Return values
rcReturn status code

Definition at line 1549 of file efi_pxe.c.

1549 {
1550 EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
1552 struct efi_pxe *pxe;
1553 struct in_addr ip;
1554 BOOLEAN use_ipv6;
1555 int leak = 0;
1556 EFI_STATUS efirc;
1557 int rc;
1558
1559 /* Allocate and initialise structure */
1560 pxe = zalloc ( sizeof ( *pxe ) );
1561 if ( ! pxe ) {
1562 rc = -ENOMEM;
1563 goto err_alloc;
1564 }
1565 ref_init ( &pxe->refcnt, efi_pxe_free );
1566 pxe->netdev = netdev_get ( netdev );
1567 pxe->name = netdev->name;
1568 pxe->handle = handle;
1569 memcpy ( &pxe->base, &efi_pxe_base_code_protocol, sizeof ( pxe->base ));
1570 pxe->base.Mode = &pxe->mode;
1572 sizeof ( pxe->apple ) );
1573 intf_init ( &pxe->tftp, &efi_pxe_tftp_desc, &pxe->refcnt );
1574 intf_init ( &pxe->udp, &efi_pxe_udp_desc, &pxe->refcnt );
1575 INIT_LIST_HEAD ( &pxe->queue );
1577 &pxe->refcnt );
1578
1579 /* Crude heuristic: assume that we prefer to use IPv4 if we
1580 * have an IPv4 address for the network device, otherwise
1581 * prefer IPv6 (if available).
1582 */
1584 use_ipv6 = ( ip.s_addr ? FALSE : ( ipv6 != NULL ) );
1585
1586 /* Start base code */
1587 efi_pxe_start ( &pxe->base, use_ipv6 );
1588
1589 /* Install PXE base code protocol */
1590 if ( ( efirc = bs->InstallMultipleProtocolInterfaces (
1591 &handle,
1594 NULL ) ) != 0 ) {
1595 rc = -EEFI ( efirc );
1596 DBGC ( pxe, "PXE %s could not install base code protocol: %s\n",
1597 pxe->name, strerror ( rc ) );
1598 goto err_install_protocol;
1599 }
1600
1601 /* Transfer reference to list and return */
1602 list_add_tail ( &pxe->list, &efi_pxes );
1603 DBGC ( pxe, "PXE %s installed for %s\n",
1604 pxe->name, efi_handle_name ( handle ) );
1605 return 0;
1606
1607 if ( ( efirc = bs->UninstallMultipleProtocolInterfaces (
1608 handle,
1611 NULL ) ) != 0 ) {
1612 DBGC ( pxe, "PXE %s could not uninstall: %s\n",
1613 pxe->name, strerror ( -EEFI ( efirc ) ) );
1614 leak = 1;
1615 }
1616 efi_nullify_pxe ( &pxe->base );
1617 efi_nullify_apple ( &pxe->apple );
1618 err_install_protocol:
1619 if ( ! leak )
1620 ref_put ( &pxe->refcnt );
1621 err_alloc:
1622 if ( leak )
1623 DBGC ( pxe, "PXE %s nullified and leaked\n", pxe->name );
1624 return rc;
1625}
unsigned char BOOLEAN
Logical Boolean.
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
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
EFI_GUID efi_apple_net_boot_protocol_guid
Apple NetBoot protocol GUID.
Definition efi_guid.c:133
void efi_nullify_pxe(EFI_PXE_BASE_CODE_PROTOCOL *pxe)
Nullify PXE base code protocol.
Definition efi_null.c:537
void efi_nullify_apple(EFI_APPLE_NET_BOOT_PROTOCOL *apple)
Nullify Apple Net Boot protocol.
Definition efi_null.c:572
static struct interface_descriptor efi_pxe_udp_desc
PXE UDP interface descriptor.
Definition efi_pxe.c:523
static struct interface_descriptor efi_pxe_tftp_desc
PXE file data transfer interface descriptor.
Definition efi_pxe.c:374
static void efi_pxe_free(struct refcnt *refcnt)
Free PXE base code.
Definition efi_pxe.c:117
static EFI_PXE_BASE_CODE_PROTOCOL efi_pxe_base_code_protocol
PXE base code protocol.
Definition efi_pxe.c:1449
static EFI_STATUS EFIAPI efi_pxe_start(EFI_PXE_BASE_CODE_PROTOCOL *base, BOOLEAN use_ipv6)
Start PXE base code.
Definition efi_pxe.c:710
static struct process_descriptor efi_pxe_process_desc
UDP close process descriptor.
Definition efi_pxe.c:583
static EFI_APPLE_NET_BOOT_PROTOCOL efi_apple_net_boot_protocol
Apple NetBoot protocol.
Definition efi_pxe.c:1530
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition efi.h:175
EFI_SYSTEM_TABLE * efi_systab
static void intf_init(struct interface *intf, struct interface_descriptor *desc, struct refcnt *refcnt)
Initialise an object interface.
Definition interface.h:204
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition list.h:46
void * zalloc(size_t size)
Allocate cleared memory.
Definition malloc.c:662
static struct net_device * netdev_get(struct net_device *netdev)
Get reference to network device.
Definition netdevice.h:565
static void process_init_stopped(struct process *process, struct process_descriptor *desc, struct refcnt *refcnt)
Initialise process without adding to process list.
Definition process.h:146
#define ref_put(refcnt)
Drop reference to object.
Definition refcnt.h:107
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition refcnt.h:65
EFI Boot Services Table.
Definition UefiSpec.h:1931
EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES UninstallMultipleProtocolInterfaces
Definition UefiSpec.h:2011
EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES InstallMultipleProtocolInterfaces
Definition UefiSpec.h:2010
EFI_PXE_BASE_CODE_MODE * Mode
The pointer to the EFI_PXE_BASE_CODE_MODE data for this device.
EFI_PXE_BASE_CODE_PROTOCOL base
PXE base code protocol.
Definition efi_pxe.c:83
struct refcnt refcnt
Reference count.
Definition efi_pxe.c:72

References AF_INET6, efi_pxe::apple, efi_pxe::base, DBGC, EEFI, efi_apple_net_boot_protocol, efi_apple_net_boot_protocol_guid, EFI_HANDLE, efi_handle_name(), efi_nullify_apple(), efi_nullify_pxe(), efi_pxe_base_code_protocol, efi_pxe_base_code_protocol_guid, efi_pxe_free(), efi_pxe_process_desc, efi_pxe_start(), efi_pxe_tftp_desc, efi_pxe_udp_desc, efi_systab, ENOMEM, FALSE, fetch_ipv4_setting(), efi_pxe::handle, handle, INIT_LIST_HEAD, EFI_BOOT_SERVICES::InstallMultipleProtocolInterfaces, intf_init(), ip, ip_setting, efi_pxe::list, list_add_tail, memcpy(), _EFI_PXE_BASE_CODE_PROTOCOL::Mode, efi_pxe::mode, efi_pxe::name, efi_pxe::netdev, netdev, netdev_get(), netdev_settings(), NULL, efi_pxe::process, process_init_stopped(), efi_pxe::queue, rc, ref_init, ref_put, efi_pxe::refcnt, strerror(), tcpip_net_protocol(), efi_pxe::tftp, efi_pxe::udp, EFI_BOOT_SERVICES::UninstallMultipleProtocolInterfaces, and zalloc().

Referenced by efi_image_exec().

◆ efi_pxe_uninstall()

void efi_pxe_uninstall ( EFI_HANDLE handle)

Uninstall PXE base code protocol.

Parameters
handleEFI handle

Definition at line 1632 of file efi_pxe.c.

1632 {
1633 EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
1634 struct efi_pxe *pxe;
1635 int leak = efi_shutdown_in_progress;
1636 EFI_STATUS efirc;
1637
1638 /* Locate PXE base code */
1639 pxe = efi_pxe_find ( handle );
1640 if ( ! pxe ) {
1641 DBG ( "PXE could not find base code for %s\n",
1642 efi_handle_name ( handle ) );
1643 return;
1644 }
1645
1646 /* Stop base code */
1647 efi_pxe_stop ( &pxe->base );
1648
1649 /* Uninstall PXE base code protocol */
1650 if ( ( ! efi_shutdown_in_progress ) &&
1651 ( ( efirc = bs->UninstallMultipleProtocolInterfaces (
1652 handle,
1655 NULL ) ) != 0 ) ) {
1656 DBGC ( pxe, "PXE %s could not uninstall: %s\n",
1657 pxe->name, strerror ( -EEFI ( efirc ) ) );
1658 leak = 1;
1659 }
1660 efi_nullify_pxe ( &pxe->base );
1661 efi_nullify_apple ( &pxe->apple );
1662
1663 /* Remove from list and drop list's reference */
1664 list_del ( &pxe->list );
1665 if ( ! leak )
1666 ref_put ( &pxe->refcnt );
1667
1668 /* Report leakage, if applicable */
1669 if ( leak && ( ! efi_shutdown_in_progress ) )
1670 DBGC ( pxe, "PXE %s nullified and leaked\n", pxe->name );
1671}
int efi_shutdown_in_progress
EFI shutdown is in progress.
Definition efi_init.c:60
static EFI_STATUS EFIAPI efi_pxe_stop(EFI_PXE_BASE_CODE_PROTOCOL *base)
Stop PXE base code.
Definition efi_pxe.c:765
static struct efi_pxe * efi_pxe_find(EFI_HANDLE handle)
Locate PXE base code.
Definition efi_pxe.c:133
#define DBG(...)
Print a debugging message.
Definition compiler.h:498

References efi_pxe::apple, efi_pxe::base, DBG, DBGC, EEFI, efi_apple_net_boot_protocol_guid, EFI_HANDLE, efi_handle_name(), efi_nullify_apple(), efi_nullify_pxe(), efi_pxe_base_code_protocol_guid, efi_pxe_find(), efi_pxe_stop(), efi_shutdown_in_progress, efi_systab, handle, efi_pxe::list, list_del, efi_pxe::name, NULL, ref_put, efi_pxe::refcnt, strerror(), and EFI_BOOT_SERVICES::UninstallMultipleProtocolInterfaces.

Referenced by efi_image_exec().

Variable Documentation

◆ efi_pxe_tftp_operations

struct interface_operation efi_pxe_tftp_operations[]
static
Initial value:
= {
}
static size_t efi_pxe_tftp_window(struct efi_pxe *pxe)
Check PXE (M)TFTP download flow control window.
Definition efi_pxe.c:335
static int efi_pxe_tftp_deliver(struct efi_pxe *pxe, struct io_buffer *iobuf, struct xfer_metadata *meta)
Receive new PXE (M)TFTP download data.
Definition efi_pxe.c:349
void intf_close(struct interface *intf, int rc)
Close an object interface.
Definition interface.c:250
#define INTF_OP(op_type, object_type, op_func)
Define an object interface operation.
Definition interface.h:33
size_t xfer_window(struct interface *intf)
Check flow control window.
Definition xfer.c:117

PXE file data transfer interface operations.

Definition at line 367 of file efi_pxe.c.

◆ efi_pxe_tftp_desc

struct interface_descriptor efi_pxe_tftp_desc
static
Initial value:
=
static struct interface_operation efi_pxe_tftp_operations[]
PXE file data transfer interface operations.
Definition efi_pxe.c:367
#define INTF_DESC(object_type, intf, operations)
Define an object interface descriptor.
Definition interface.h:81

PXE file data transfer interface descriptor.

Definition at line 374 of file efi_pxe.c.

Referenced by efi_pxe_install().

◆ efi_pxe_udp_operations

struct interface_operation efi_pxe_udp_operations[]
static
Initial value:
= {
}
static int efi_pxe_udp_deliver(struct efi_pxe *pxe, struct io_buffer *iobuf, struct xfer_metadata *meta)
Receive UDP packet.
Definition efi_pxe.c:466

PXE UDP interface operations.

Definition at line 517 of file efi_pxe.c.

517 {
520};

◆ efi_pxe_udp_desc

struct interface_descriptor efi_pxe_udp_desc
static
Initial value:
=
static struct interface_operation efi_pxe_udp_operations[]
PXE UDP interface operations.
Definition efi_pxe.c:517

PXE UDP interface descriptor.

Definition at line 523 of file efi_pxe.c.

Referenced by efi_pxe_install().

◆ efi_pxe_process_desc

struct process_descriptor efi_pxe_process_desc
static
Initial value:
=
static void efi_pxe_udp_scheduled_close(struct efi_pxe *pxe)
Scheduled close of UDP interface.
Definition efi_pxe.c:576
#define PROC_DESC_ONCE(object_type, process, _step)
Define a process descriptor for a process that runs only once.
Definition process.h:98
A process.
Definition process.h:18

UDP close process descriptor.

Definition at line 583 of file efi_pxe.c.

Referenced by efi_pxe_install().

◆ efi_pxe_base_code_protocol

EFI_PXE_BASE_CODE_PROTOCOL efi_pxe_base_code_protocol
static
Initial value:
= {
.Start = efi_pxe_start,
.Stop = efi_pxe_stop,
.Dhcp = efi_pxe_dhcp,
.Discover = efi_pxe_discover,
.Mtftp = efi_pxe_mtftp,
.UdpWrite = efi_pxe_udp_write,
.UdpRead = efi_pxe_udp_read,
.SetIpFilter = efi_pxe_set_ip_filter,
.Arp = efi_pxe_arp,
.SetParameters = efi_pxe_set_parameters,
.SetStationIp = efi_pxe_set_station_ip,
.SetPackets = efi_pxe_set_packets,
}
#define EFI_PXE_BASE_CODE_PROTOCOL_REVISION
static EFI_STATUS EFIAPI efi_pxe_mtftp(EFI_PXE_BASE_CODE_PROTOCOL *base, EFI_PXE_BASE_CODE_TFTP_OPCODE opcode, VOID *data, BOOLEAN overwrite, UINT64 *len, UINTN *blksize, EFI_IP_ADDRESS *ip, UINT8 *filename, EFI_PXE_BASE_CODE_MTFTP_INFO *info, BOOLEAN callback)
Perform (M)TFTP.
Definition efi_pxe.c:888
static EFI_STATUS EFIAPI efi_pxe_dhcp(EFI_PXE_BASE_CODE_PROTOCOL *base, BOOLEAN sort)
Perform DHCP.
Definition efi_pxe.c:790
static EFI_STATUS EFIAPI efi_pxe_set_ip_filter(EFI_PXE_BASE_CODE_PROTOCOL *base, EFI_PXE_BASE_CODE_IP_FILTER *filter)
Set receive filter.
Definition efi_pxe.c:1266
static EFI_STATUS EFIAPI efi_pxe_udp_write(EFI_PXE_BASE_CODE_PROTOCOL *base, UINT16 flags, EFI_IP_ADDRESS *dest_ip, EFI_PXE_BASE_CODE_UDP_PORT *dest_port, EFI_IP_ADDRESS *gateway, EFI_IP_ADDRESS *src_ip, EFI_PXE_BASE_CODE_UDP_PORT *src_port, UINTN *hdr_len, VOID *hdr, UINTN *len, VOID *data)
Transmit UDP packet.
Definition efi_pxe.c:971
static EFI_STATUS EFIAPI efi_pxe_set_packets(EFI_PXE_BASE_CODE_PROTOCOL *base, BOOLEAN *dhcpdisc_ok, BOOLEAN *dhcpack_ok, BOOLEAN *proxyoffer_ok, BOOLEAN *pxebsdisc_ok, BOOLEAN *pxebsack_ok, BOOLEAN *pxebsbis_ok, EFI_PXE_BASE_CODE_PACKET *dhcpdisc, EFI_PXE_BASE_CODE_PACKET *dhcpack, EFI_PXE_BASE_CODE_PACKET *proxyoffer, EFI_PXE_BASE_CODE_PACKET *pxebsdisc, EFI_PXE_BASE_CODE_PACKET *pxebsack, EFI_PXE_BASE_CODE_PACKET *pxebsbis)
Update cached DHCP packets.
Definition efi_pxe.c:1403
static EFI_STATUS EFIAPI efi_pxe_set_station_ip(EFI_PXE_BASE_CODE_PROTOCOL *base, EFI_IP_ADDRESS *ip, EFI_IP_ADDRESS *netmask)
Set IP address.
Definition efi_pxe.c:1363
static EFI_STATUS EFIAPI efi_pxe_discover(EFI_PXE_BASE_CODE_PROTOCOL *base, UINT16 type, UINT16 *layer, BOOLEAN bis, EFI_PXE_BASE_CODE_DISCOVER_INFO *info)
Perform boot server discovery.
Definition efi_pxe.c:844
static EFI_STATUS EFIAPI efi_pxe_arp(EFI_PXE_BASE_CODE_PROTOCOL *base, EFI_IP_ADDRESS *ip, EFI_MAC_ADDRESS *mac)
Resolve MAC address.
Definition efi_pxe.c:1294
static EFI_STATUS EFIAPI efi_pxe_set_parameters(EFI_PXE_BASE_CODE_PROTOCOL *base, BOOLEAN *autoarp, BOOLEAN *sendguid, UINT8 *ttl, UINT8 *tos, BOOLEAN *callback)
Set parameters.
Definition efi_pxe.c:1318
static EFI_STATUS EFIAPI efi_pxe_udp_read(EFI_PXE_BASE_CODE_PROTOCOL *base, UINT16 flags, EFI_IP_ADDRESS *dest_ip, EFI_PXE_BASE_CODE_UDP_PORT *dest_port, EFI_IP_ADDRESS *src_ip, EFI_PXE_BASE_CODE_UDP_PORT *src_port, UINTN *hdr_len, VOID *hdr, UINTN *len, VOID *data)
Receive UDP packet.
Definition efi_pxe.c:1085

PXE base code protocol.

Definition at line 1449 of file efi_pxe.c.

1449 {
1451 .Start = efi_pxe_start,
1452 .Stop = efi_pxe_stop,
1453 .Dhcp = efi_pxe_dhcp,
1454 .Discover = efi_pxe_discover,
1455 .Mtftp = efi_pxe_mtftp,
1456 .UdpWrite = efi_pxe_udp_write,
1457 .UdpRead = efi_pxe_udp_read,
1458 .SetIpFilter = efi_pxe_set_ip_filter,
1459 .Arp = efi_pxe_arp,
1460 .SetParameters = efi_pxe_set_parameters,
1461 .SetStationIp = efi_pxe_set_station_ip,
1462 .SetPackets = efi_pxe_set_packets,
1463};

Referenced by efi_pxe_install().

◆ efi_apple_net_boot_protocol

EFI_APPLE_NET_BOOT_PROTOCOL efi_apple_net_boot_protocol
static
Initial value:
= {
.GetDhcpResponse = efi_apple_get_dhcp_response,
.GetBsdpResponse = efi_apple_get_bsdp_response,
}
static EFI_STATUS EFIAPI efi_apple_get_bsdp_response(EFI_APPLE_NET_BOOT_PROTOCOL *apple, UINTN *len, VOID *data)
Get BSDP response.
Definition efi_pxe.c:1522
static EFI_STATUS EFIAPI efi_apple_get_dhcp_response(EFI_APPLE_NET_BOOT_PROTOCOL *apple, UINTN *len, VOID *data)
Get DHCP response.
Definition efi_pxe.c:1506

Apple NetBoot protocol.

Definition at line 1530 of file efi_pxe.c.

1530 {
1531 .GetDhcpResponse = efi_apple_get_dhcp_response,
1532 .GetBsdpResponse = efi_apple_get_bsdp_response,
1533};

Referenced by efi_pxe_install().