iPXE
Data Structures | Functions | Variables
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)
 
static void efi_pxe_free (struct refcnt *refcnt)
 Free PXE base code. More...
 
static LIST_HEAD (efi_pxes)
 List of PXE base codes. More...
 
static struct efi_pxeefi_pxe_find (EFI_HANDLE handle)
 Locate PXE base code. More...
 
static void efi_pxe_ip_sockaddr (struct efi_pxe *pxe, EFI_IP_ADDRESS *ip, struct sockaddr *sa)
 Populate socket address from EFI IP address. More...
 
static const char * efi_pxe_ip_ntoa (struct efi_pxe *pxe, EFI_IP_ADDRESS *ip)
 Transcribe EFI IP address (for debugging) More...
 
static int efi_pxe_ip (struct efi_pxe *pxe)
 Populate local IP address. More...
 
static int efi_pxe_ip_filter (struct efi_pxe *pxe, EFI_IP_ADDRESS *ip)
 Check if IP address matches filter. More...
 
static void efi_pxe_tftp_close (struct efi_pxe *pxe, int rc)
 Close PXE (M)TFTP download interface. More...
 
static size_t efi_pxe_tftp_window (struct efi_pxe *pxe)
 Check PXE (M)TFTP download flow control window. More...
 
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. More...
 
static int efi_pxe_tftp_open (struct efi_pxe *pxe, EFI_IP_ADDRESS *ip, const char *filename)
 Open (M)TFTP download interface. More...
 
static void efi_pxe_udp_close (struct efi_pxe *pxe, int rc)
 Close UDP interface. More...
 
static int efi_pxe_udp_deliver (struct efi_pxe *pxe, struct io_buffer *iobuf, struct xfer_metadata *meta)
 Receive UDP packet. More...
 
static int efi_pxe_udp_open (struct efi_pxe *pxe)
 Open UDP interface. More...
 
static void efi_pxe_udp_schedule_close (struct efi_pxe *pxe)
 Schedule close of UDP interface. More...
 
static void efi_pxe_udp_scheduled_close (struct efi_pxe *pxe)
 Scheduled close of UDP interface. More...
 
static const char * efi_pxe_fake_name (struct efi_pxe *pxe, EFI_PXE_BASE_CODE_PACKET *packet)
 Name fake DHCP packet. More...
 
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. More...
 
static void efi_pxe_fake_all (struct efi_pxe *pxe)
 Construct fake DHCP packets. More...
 
static EFI_STATUS EFIAPI efi_pxe_start (EFI_PXE_BASE_CODE_PROTOCOL *base, BOOLEAN use_ipv6)
 Start PXE base code. More...
 
static EFI_STATUS EFIAPI efi_pxe_stop (EFI_PXE_BASE_CODE_PROTOCOL *base)
 Stop PXE base code. More...
 
static EFI_STATUS EFIAPI efi_pxe_dhcp (EFI_PXE_BASE_CODE_PROTOCOL *base, BOOLEAN sort)
 Perform DHCP. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
static EFI_STATUS EFIAPI efi_pxe_arp (EFI_PXE_BASE_CODE_PROTOCOL *base, EFI_IP_ADDRESS *ip, EFI_MAC_ADDRESS *mac)
 Resolve MAC address. More...
 
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. More...
 
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. More...
 
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. More...
 
static EFI_STATUS EFIAPI efi_apple_get_response (EFI_PXE_BASE_CODE_PACKET *packet, UINTN *len, VOID *data)
 Get DHCP/BSDP response. More...
 
static EFI_STATUS EFIAPI efi_apple_get_dhcp_response (EFI_APPLE_NET_BOOT_PROTOCOL *apple, UINTN *len, VOID *data)
 Get DHCP response. More...
 
static EFI_STATUS EFIAPI efi_apple_get_bsdp_response (EFI_APPLE_NET_BOOT_PROTOCOL *apple, UINTN *len, VOID *data)
 Get BSDP response. More...
 
int efi_pxe_install (EFI_HANDLE handle, struct net_device *netdev)
 Install PXE base code protocol. More...
 
void efi_pxe_uninstall (EFI_HANDLE handle)
 Uninstall PXE base code protocol. More...
 

Variables

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

Detailed Description

EFI PXE base code protocol.

Definition in file efi_pxe.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ efi_pxe_free()

static void efi_pxe_free ( struct refcnt refcnt)
static

Free PXE base code.

Parameters
refcntReference count

Definition at line 116 of file efi_pxe.c.

116  {
117  struct efi_pxe *pxe = container_of ( refcnt, struct efi_pxe, refcnt );
118 
119  netdev_put ( pxe->netdev );
120  free ( pxe );
121 }
A PXE base code.
Definition: efi_pxe.c:69
A reference counter.
Definition: refcnt.h:26
struct net_device * netdev
Underlying network device.
Definition: efi_pxe.c:73
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:575
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54

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

Referenced by efi_pxe_install().

◆ LIST_HEAD()

static LIST_HEAD ( efi_pxes  )
static

List of PXE base codes.

◆ efi_pxe_find()

static 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 132 of file efi_pxe.c.

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

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

Referenced by efi_pxe_uninstall().

◆ efi_pxe_ip_sockaddr()

static 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 191 of file efi_pxe.c.

192  {
193  union {
194  struct sockaddr sa;
195  struct sockaddr_efi se;
196  } *sockaddr = container_of ( sa, typeof ( *sockaddr ), sa );
197 
198  /* Initialise socket address */
199  memset ( sockaddr, 0, sizeof ( *sockaddr ) );
200  sockaddr->sa.sa_family = pxe->tcpip->sa_family;
201  memcpy ( &sockaddr->se.se_addr, ip, pxe->net->net_addr_len );
202  sockaddr->se.se_scope_id = pxe->netdev->scope_id;
203 }
An EFI socket address.
Definition: efi_pxe.c:155
sa_family_t sa_family
Socket address family.
Definition: socket.h:101
unsigned int scope_id
Scope ID.
Definition: netdevice.h:360
void * memcpy(void *dest, const void *src, size_t len) __nonnull
struct net_device * netdev
Underlying network device.
Definition: efi_pxe.c:73
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
struct sockaddr sa
Definition: syslog.c:56
Generalized socket address structure.
Definition: socket.h:96
sa_family_t sa_family
Network address family.
Definition: tcpip.h:144
struct net_protocol * net
Network-layer protocol.
Definition: efi_pxe.c:91
IP4_t ip
Destination IP address.
Definition: pxe_api.h:58
struct tcpip_net_protocol * tcpip
TCP/IP network-layer protocol.
Definition: efi_pxe.c:89
uint8_t net_addr_len
Network-layer address length.
Definition: netdevice.h:101
typeof(acpi_finder=acpi_find)
ACPI table finder.
Definition: acpi.c:47
void * memset(void *dest, int character, size_t len) __nonnull

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()

static 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 212 of file efi_pxe.c.

213  {
214 
215  return pxe->net->ntoa ( ip );
216 }
const char *(* ntoa)(const void *net_addr)
Transcribe network-layer address.
Definition: netdevice.h:94
struct net_protocol * net
Network-layer protocol.
Definition: efi_pxe.c:91
IP4_t ip
Destination IP address.
Definition: pxe_api.h:58

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()

static 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 224 of file efi_pxe.c.

224  {
226  struct in_addr address;
227  struct in_addr netmask;
228 
229  /* It's unclear which of the potentially many IPv6 addresses
230  * is supposed to be used.
231  */
232  if ( mode->UsingIpv6 )
233  return -ENOTSUP;
234 
235  /* Fetch IP address and subnet mask */
236  fetch_ipv4_setting ( netdev_settings ( pxe->netdev ), &ip_setting,
237  &address );
238  fetch_ipv4_setting ( netdev_settings ( pxe->netdev ), &netmask_setting,
239  &netmask );
240 
241  /* Populate IP address and subnet mask */
242  memset ( &mode->StationIp, 0, sizeof ( mode->StationIp ) );
243  memcpy ( &mode->StationIp, &address, sizeof ( address ) );
244  memset ( &mode->SubnetMask, 0, sizeof ( mode->SubnetMask ) );
245  memcpy ( &mode->SubnetMask, &netmask, sizeof ( netmask ) );
246 
247  return 0;
248 }
EFI_PXE_BASE_CODE_MODE.
Definition: PxeBaseCode.h:269
EFI_PXE_BASE_CODE_MODE mode
PXE base code mode.
Definition: efi_pxe.c:84
int fetch_ipv4_setting(struct settings *settings, const struct setting *setting, struct in_addr *inp)
Fetch value of IPv4 address setting.
Definition: settings.c:912
uint16_t mode
Acceleration mode.
Definition: ena.h:26
uint64_t address
Base address.
Definition: ena.h:24
static struct settings * netdev_settings(struct net_device *netdev)
Get per-netdevice configuration settings block.
Definition: netdevice.h:586
#define ENOTSUP
Operation not supported.
Definition: errno.h:589
void * memcpy(void *dest, const void *src, size_t len) __nonnull
struct net_device * netdev
Underlying network device.
Definition: efi_pxe.c:73
IP address structure.
Definition: in.h:41
void * memset(void *dest, int character, size_t len) __nonnull

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

Referenced by efi_pxe_dhcp(), and efi_pxe_start().

◆ efi_pxe_ip_filter()

static 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 257 of file efi_pxe.c.

257  {
260  uint8_t filters = filter->Filters;
261  union {
263  struct in_addr in;
264  struct in6_addr in6;
265  } *u = container_of ( ip, typeof ( *u ), ip );
266  size_t addr_len = pxe->net->net_addr_len;
267  unsigned int i;
268 
269  /* Match everything, if applicable */
271  return 1;
272 
273  /* Match all multicasts, if applicable */
275  if ( mode->UsingIpv6 ) {
276  if ( IN6_IS_ADDR_MULTICAST ( &u->in6 ) )
277  return 1;
278  } else {
279  if ( IN_IS_MULTICAST ( u->in.s_addr ) )
280  return 1;
281  }
282  }
283 
284  /* Match IPv4 broadcasts, if applicable */
285  if ( filters & EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST ) {
286  if ( ( ! mode->UsingIpv6 ) &&
287  ( u->in.s_addr == INADDR_BROADCAST ) )
288  return 1;
289  }
290 
291  /* Match station address, if applicable */
292  if ( filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP ) {
293  if ( memcmp ( ip, &mode->StationIp, addr_len ) == 0 )
294  return 1;
295  }
296 
297  /* Match explicit addresses, if applicable */
298  for ( i = 0 ; i < filter->IpCnt ; i++ ) {
299  if ( memcmp ( ip, &filter->IpList[i], addr_len ) == 0 )
300  return 1;
301  }
302 
303  return 0;
304 }
EFI_PXE_BASE_CODE_MODE.
Definition: PxeBaseCode.h:269
#define EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST
Definition: PxeBaseCode.h:85
EFI_PXE_BASE_CODE_MODE mode
PXE base code mode.
Definition: efi_pxe.c:84
__be32 in[4]
Definition: CIB_PRM.h:35
UINT8_t filter
Receive packet filter.
Definition: pxe_api.h:68
uint16_t mode
Acceleration mode.
Definition: ena.h:26
#define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST
Definition: PxeBaseCode.h:87
union @18 u
#define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS
Definition: PxeBaseCode.h:86
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
16-byte buffer aligned on a 4-byte boundary.
Definition: UefiBaseType.h:105
#define INADDR_BROADCAST
Definition: in.h:21
IP6 address structure.
Definition: in.h:50
IP address structure.
Definition: in.h:41
struct net_protocol * net
Network-layer protocol.
Definition: efi_pxe.c:91
IP4_t ip
Destination IP address.
Definition: pxe_api.h:58
unsigned char uint8_t
Definition: stdint.h:10
IP Receive Filter structure.
Definition: PxeBaseCode.h:77
#define EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP
Definition: PxeBaseCode.h:84
uint8_t net_addr_len
Network-layer address length.
Definition: netdevice.h:101
#define IN6_IS_ADDR_MULTICAST(addr)
Definition: in.h:67
#define IN_IS_MULTICAST(addr)
Definition: in.h:33
typeof(acpi_finder=acpi_find)
ACPI table finder.
Definition: acpi.c:47
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition: string.c:114

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(), mode, efi_pxe::mode, efi_pxe::net, net_protocol::net_addr_len, typeof(), and u.

Referenced by efi_pxe_udp_read().

◆ efi_pxe_tftp_close()

static 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 319 of file efi_pxe.c.

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

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()

static 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 334 of file efi_pxe.c.

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

References efi_pxe::blksize.

◆ efi_pxe_tftp_deliver()

static 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 348 of file efi_pxe.c.

350  {
351  int rc;
352 
353  /* Deliver to data transfer buffer */
354  if ( ( rc = xferbuf_deliver ( &pxe->buf, iob_disown ( iobuf ),
355  meta ) ) != 0 )
356  goto err_deliver;
357 
358  return 0;
359 
360  err_deliver:
361  efi_pxe_tftp_close ( pxe, rc );
362  return rc;
363 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
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:174
struct xfer_buffer buf
Data transfer buffer.
Definition: efi_pxe.c:94
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:216
static void efi_pxe_tftp_close(struct efi_pxe *pxe, int rc)
Close PXE (M)TFTP download interface.
Definition: efi_pxe.c:319
uint8_t meta
Metadata flags.
Definition: ena.h:14

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

◆ efi_pxe_tftp_open()

static 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 384 of file efi_pxe.c.

385  {
386  struct sockaddr server;
387  struct uri *uri;
388  int rc;
389 
390  /* Parse server address and filename */
391  efi_pxe_ip_sockaddr ( pxe, ip, &server );
392  uri = pxe_uri ( &server, filename );
393  if ( ! uri ) {
394  DBGC ( pxe, "PXE %s could not parse %s:%s\n", pxe->name,
395  efi_pxe_ip_ntoa ( pxe, ip ), filename );
396  rc = -ENOTSUP;
397  goto err_parse;
398  }
399 
400  /* Open URI */
401  if ( ( rc = xfer_open_uri ( &pxe->tftp, uri ) ) != 0 ) {
402  DBGC ( pxe, "PXE %s could not open: %s\n",
403  pxe->name, strerror ( rc ) );
404  goto err_open;
405  }
406 
407  err_open:
408  uri_put ( uri );
409  err_parse:
410  return rc;
411 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
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:191
static void uri_put(struct uri *uri)
Decrement URI reference count.
Definition: uri.h:205
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:212
struct uri * pxe_uri(struct sockaddr *sa_server, const char *filename)
Construct URI from server address and filename.
Definition: uri.c:808
int xfer_open_uri(struct interface *intf, struct uri *uri)
Open URI.
Definition: open.c:67
#define DBGC(...)
Definition: compiler.h:505
#define ENOTSUP
Operation not supported.
Definition: errno.h:589
const char * name
Name.
Definition: efi_pxe.c:75
Generalized socket address structure.
Definition: socket.h:96
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
IP4_t ip
Destination IP address.
Definition: pxe_api.h:58
struct interface tftp
(M)TFTP download interface
Definition: efi_pxe.c:97
A Uniform Resource Identifier.
Definition: uri.h:64

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()

static 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 436 of file efi_pxe.c.

436  {
437  struct io_buffer *iobuf;
438  struct io_buffer *tmp;
439 
440  /* Release our claim on SNP devices, if applicable */
441  if ( process_running ( &pxe->process ) )
442  efi_snp_release();
443 
444  /* Stop process */
445  process_del ( &pxe->process );
446 
447  /* Restart UDP interface */
448  intf_restart ( &pxe->udp, rc );
449 
450  /* Flush any received UDP packets */
451  list_for_each_entry_safe ( iobuf, tmp, &pxe->queue, list ) {
452  list_del ( &iobuf->list );
453  free_iob ( iobuf );
454  }
455 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void intf_restart(struct interface *intf, int rc)
Shut down and restart an object interface.
Definition: interface.c:343
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:152
struct interface udp
UDP interface.
Definition: efi_pxe.c:104
void process_del(struct process *process)
Remove process from process list.
Definition: process.c:79
unsigned long tmp
Definition: linux_pci.h:64
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
#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:458
static void efi_snp_release(void)
Release network devices for use via SNP.
Definition: efi_snp.h:99
static int process_running(struct process *process)
Check if process is running.
Definition: process.h:175
struct list_head list
List of which this buffer is a member.
Definition: iobuf.h:44
struct process process
UDP interface closer process.
Definition: efi_pxe.c:108
struct list_head queue
List of received UDP packets.
Definition: efi_pxe.c:106
A persistent I/O buffer.
Definition: iobuf.h:37

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()

static 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 465 of file efi_pxe.c.

466  {
467  struct sockaddr_efi *se_src;
468  struct sockaddr_efi *se_dest;
469  struct tcpip_net_protocol *tcpip;
470  struct net_protocol *net;
471  struct efi_pxe_udp_pseudo_header *pshdr;
472  size_t addr_len;
473  size_t pshdr_len;
474  int rc;
475 
476  /* Sanity checks */
477  assert ( meta != NULL );
478  se_src = ( ( struct sockaddr_efi * ) meta->src );
479  assert ( se_src != NULL );
480  se_dest = ( ( struct sockaddr_efi * ) meta->dest );
481  assert ( se_dest != NULL );
482  assert ( se_src->se_family == se_dest->se_family );
483 
484  /* Determine protocol */
485  tcpip = tcpip_net_protocol ( se_src->se_family );
486  if ( ! tcpip ) {
487  rc = -ENOTSUP;
488  goto err_unsupported;
489  }
490  net = tcpip->net_protocol;
491  addr_len = net->net_addr_len;
492 
493  /* Construct pseudo-header */
494  pshdr_len = ( sizeof ( *pshdr ) + ( 2 * addr_len ) );
495  if ( ( rc = iob_ensure_headroom ( iobuf, pshdr_len ) ) != 0 )
496  goto err_headroom;
497  memcpy ( iob_push ( iobuf, addr_len ), &se_src->se_addr, addr_len );
498  memcpy ( iob_push ( iobuf, addr_len ), &se_dest->se_addr, addr_len );
499  pshdr = iob_push ( iobuf, sizeof ( *pshdr ) );
500  pshdr->net = net;
501  pshdr->dest_port = ntohs ( se_dest->se_port );
502  pshdr->src_port = ntohs ( se_src->se_port );
503 
504  /* Add to queue */
505  list_add_tail ( &iobuf->list, &pxe->queue );
506 
507  return 0;
508 
509  err_unsupported:
510  err_headroom:
511  free_iob ( iobuf );
512  return rc;
513 }
EFI UDP pseudo-header.
Definition: efi_pxe.c:421
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
uint16_t dest_port
Destination port.
Definition: efi_pxe.c:425
An EFI socket address.
Definition: efi_pxe.c:155
#define iob_push(iobuf, len)
Definition: iobuf.h:88
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:152
EFI_IP_ADDRESS se_addr
IP address.
Definition: efi_pxe.c:169
#define ntohs(value)
Definition: byteswap.h:136
struct net_protocol * net
Network-layer protocol.
Definition: efi_pxe.c:423
#define ENOTSUP
Operation not supported.
Definition: errno.h:589
void * memcpy(void *dest, const void *src, size_t len) __nonnull
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition: list.h:93
struct tcpip_net_protocol * tcpip_net_protocol(sa_family_t sa_family)
Find TCP/IP network-layer protocol.
Definition: tcpip.c:68
uint16_t se_port
TCP/IP port (part of struct sockaddr_tcpip)
Definition: efi_pxe.c:161
struct net_protocol * net_protocol
Network-layer protocol.
Definition: tcpip.h:148
uint16_t src_port
Source port.
Definition: efi_pxe.c:427
A network-layer protocol.
Definition: netdevice.h:64
struct list_head list
List of which this buffer is a member.
Definition: iobuf.h:44
uint8_t net_addr_len
Network-layer address length.
Definition: netdevice.h:101
struct list_head queue
List of received UDP packets.
Definition: efi_pxe.c:106
A network-layer protocol of the TCP/IP stack (eg.
Definition: tcpip.h:140
uint8_t meta
Metadata flags.
Definition: ena.h:14
int iob_ensure_headroom(struct io_buffer *iobuf, size_t len)
Ensure I/O buffer has sufficient headroom.
Definition: iobuf.c:234
sa_family_t se_family
Socket address family (part of struct sockaddr)
Definition: efi_pxe.c:157
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

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()

static 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 531 of file efi_pxe.c.

531  {
532  int rc;
533 
534  /* If interface is already open, then cancel the scheduled close */
535  if ( process_running ( &pxe->process ) ) {
536  process_del ( &pxe->process );
537  return 0;
538  }
539 
540  /* Open promiscuous UDP interface */
541  if ( ( rc = udp_open_promisc ( &pxe->udp ) ) != 0 ) {
542  DBGC ( pxe, "PXE %s could not open UDP connection: %s\n",
543  pxe->name, strerror ( rc ) );
544  return rc;
545  }
546 
547  /* Claim network devices */
548  efi_snp_claim();
549 
550  return 0;
551 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define DBGC(...)
Definition: compiler.h:505
struct interface udp
UDP interface.
Definition: efi_pxe.c:104
static void efi_snp_claim(void)
Claim network devices for use by iPXE.
Definition: efi_snp.h:91
void process_del(struct process *process)
Remove process from process list.
Definition: process.c:79
const char * name
Name.
Definition: efi_pxe.c:75
int udp_open_promisc(struct interface *xfer)
Open a promiscuous UDP connection.
Definition: udp.c:144
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static int process_running(struct process *process)
Check if process is running.
Definition: process.h:175
struct process process
UDP interface closer process.
Definition: efi_pxe.c:108

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()

static void efi_pxe_udp_schedule_close ( struct efi_pxe pxe)
static

Schedule close of UDP interface.

Parameters
pxePXE base code

Definition at line 558 of file efi_pxe.c.

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

References efi_pxe::process, and process_add().

Referenced by efi_pxe_udp_read(), and efi_pxe_udp_write().

◆ efi_pxe_udp_scheduled_close()

static void efi_pxe_udp_scheduled_close ( struct efi_pxe pxe)
static

Scheduled close of UDP interface.

Parameters
pxePXE base code

Definition at line 575 of file efi_pxe.c.

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

References efi_pxe_udp_close().

◆ efi_pxe_fake_name()

static 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 599 of file efi_pxe.c.

600  {
602 
603  if ( packet == &mode->DhcpDiscover ) {
604  return "DhcpDiscover";
605  } else if ( packet == &mode->DhcpAck ) {
606  return "DhcpAck";
607  } else if ( packet == &mode->ProxyOffer ) {
608  return "ProxyOffer";
609  } else if ( packet == &mode->PxeDiscover ) {
610  return "PxeDiscover";
611  } else if ( packet == &mode->PxeReply ) {
612  return "PxeReply";
613  } else if ( packet == &mode->PxeBisReply ) {
614  return "PxeBisReply";
615  } else {
616  return "<UNKNOWN>";
617  }
618 }
EFI_PXE_BASE_CODE_MODE.
Definition: PxeBaseCode.h:269
EFI_PXE_BASE_CODE_MODE mode
PXE base code mode.
Definition: efi_pxe.c:84
uint16_t mode
Acceleration mode.
Definition: ena.h:26

References mode, and efi_pxe::mode.

Referenced by efi_pxe_fake().

◆ efi_pxe_fake()

static BOOLEAN efi_pxe_fake ( struct efi_pxe pxe,
int(*)(struct net_device *netdev, void *data, size_t len fake,
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 628 of file efi_pxe.c.

631  {
633  struct dhcp_packet dhcppkt;
634  struct dhcphdr *dhcphdr;
635  unsigned int len;
636  int rc;
637 
638  /* The fake packet constructors do not support IPv6 */
639  if ( mode->UsingIpv6 )
640  return FALSE;
641 
642  /* Attempt to construct packet */
643  if ( ( rc = fake ( pxe->netdev, packet, sizeof ( *packet ) ) != 0 ) ) {
644  DBGC ( pxe, "PXE %s could not fake %s: %s\n", pxe->name,
645  efi_pxe_fake_name ( pxe, packet ), strerror ( rc ) );
646  return FALSE;
647  }
648 
649  /* The WDS bootstrap wdsmgfw.efi has a buggy DHCPv4 packet
650  * parser which does not correctly handle DHCP padding bytes.
651  * Specifically, if a padding byte (i.e. a zero) is
652  * encountered, the parse will first increment the pointer by
653  * one to skip over the padding byte but will then drop into
654  * the code path for handling normal options, which increments
655  * the pointer by two to skip over the (already-skipped) type
656  * field and the (non-existent) length field.
657  *
658  * The upshot of this bug in WDS is that the parser will fail
659  * with an error 0xc0000023 if the number of spare bytes after
660  * the end of the options is not an exact multiple of three.
661  *
662  * Work around this buggy parser by adding an explicit
663  * DHCP_END tag.
664  */
665  dhcphdr = container_of ( &packet->Dhcpv4.BootpOpcode,
666  struct dhcphdr, op );
667  dhcppkt_init ( &dhcppkt, dhcphdr, sizeof ( *packet ) );
668  len = dhcppkt_len ( &dhcppkt );
669  if ( len < sizeof ( *packet ) )
670  packet->Raw[len] = DHCP_END;
671 
672  return TRUE;
673 }
EFI_PXE_BASE_CODE_MODE.
Definition: PxeBaseCode.h:269
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
EFI_PXE_BASE_CODE_MODE mode
PXE base code mode.
Definition: efi_pxe.c:84
A DHCP packet.
Definition: dhcppkt.h:20
uint16_t mode
Acceleration mode.
Definition: ena.h:26
#define DBGC(...)
Definition: compiler.h:505
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:599
EFI_PXE_BASE_CODE_DHCPV4_PACKET Dhcpv4
Definition: PxeBaseCode.h:253
const char * name
Name.
Definition: efi_pxe.c:75
struct net_device * netdev
Underlying network device.
Definition: efi_pxe.c:73
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
ring len
Length.
Definition: dwmac.h:231
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
#define TRUE
Definition: tlan.h:46
A DHCP header.
Definition: dhcp.h:615
void dhcppkt_init(struct dhcp_packet *dhcppkt, struct dhcphdr *data, size_t len)
Initialise DHCP packet.
Definition: dhcppkt.c:300
static uint16_t struct vmbus_xfer_pages_operations * op
Definition: netvsc.h:327
static size_t dhcppkt_len(struct dhcp_packet *dhcppkt)
Get used length of DHCP packet.
Definition: dhcppkt.h:59
#define FALSE
Definition: tlan.h:45
#define DHCP_END
End of options.
Definition: dhcp.h:548

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

Referenced by efi_pxe_fake_all().

◆ efi_pxe_fake_all()

static void efi_pxe_fake_all ( struct efi_pxe pxe)
static

Construct fake DHCP packets.

Parameters
pxePXE base code

Definition at line 680 of file efi_pxe.c.

680  {
682 
683  /* Construct fake packets */
684  mode->DhcpDiscoverValid =
686  &mode->DhcpDiscover );
687  mode->DhcpAckReceived =
689  &mode->DhcpAck );
690  mode->PxeReplyReceived =
692  &mode->PxeReply );
693 }
EFI_PXE_BASE_CODE_MODE.
Definition: PxeBaseCode.h:269
EFI_PXE_BASE_CODE_MODE mode
PXE base code mode.
Definition: efi_pxe.c:84
uint16_t mode
Acceleration mode.
Definition: ena.h:26
int create_fakedhcpack(struct net_device *netdev, void *data, size_t max_len)
Create fake DHCPACK packet.
Definition: fakedhcp.c:136
int create_fakedhcpdiscover(struct net_device *netdev, void *data, size_t max_len)
Create fake DHCPDISCOVER packet.
Definition: fakedhcp.c:109
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:628
int create_fakepxebsack(struct net_device *netdev, void *data, size_t max_len)
Create fake PXE Boot Server ACK packet.
Definition: fakedhcp.c:178

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

Referenced by efi_pxe_dhcp(), and efi_pxe_start().

◆ efi_pxe_start()

static 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 709 of file efi_pxe.c.

710  {
711  struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
714  sa_family_t family = ( use_ipv6 ? AF_INET6 : AF_INET );
715  int rc;
716 
717  DBGC ( pxe, "PXE %s START %s\n",
718  pxe->name, ( use_ipv6 ? "IPv6" : "IPv4" ) );
719 
720  /* Initialise mode structure */
721  memset ( mode, 0, sizeof ( *mode ) );
722  mode->AutoArp = TRUE;
723  mode->TTL = DEFAULT_TTL;
724  mode->ToS = DEFAULT_ToS;
725  mode->IpFilter.Filters =
730 
731  /* Check for IPv4/IPv6 support */
732  mode->Ipv6Supported = ( ipv6 != NULL );
733  mode->Ipv6Available = ( ipv6 != NULL );
734  pxe->tcpip = tcpip_net_protocol ( family );
735  if ( ! pxe->tcpip ) {
736  DBGC ( pxe, "PXE %s has no support for %s\n",
737  pxe->name, socket_family_name ( family ) );
738  return EFI_UNSUPPORTED;
739  }
740  pxe->net = pxe->tcpip->net_protocol;
741  mode->UsingIpv6 = use_ipv6;
742 
743  /* Populate station IP address */
744  if ( ( rc = efi_pxe_ip ( pxe ) ) != 0 )
745  return rc;
746 
747  /* Construct fake DHCP packets */
748  efi_pxe_fake_all ( pxe );
749 
750  /* Record that base code is started */
751  mode->Started = TRUE;
752  DBGC ( pxe, "PXE %s using %s\n",
753  pxe->name, pxe->net->ntoa ( &mode->StationIp ) );
754 
755  return 0;
756 }
EFI_PXE_BASE_CODE_MODE.
Definition: PxeBaseCode.h:269
uint32_t base
Base.
Definition: librm.h:138
#define EFI_UNSUPPORTED
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:117
#define EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST
Definition: PxeBaseCode.h:85
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
EFI_PXE_BASE_CODE_MODE mode
PXE base code mode.
Definition: efi_pxe.c:84
#define AF_INET6
IPv6 Internet addresses.
Definition: socket.h:64
A PXE base code.
Definition: efi_pxe.c:69
uint16_t mode
Acceleration mode.
Definition: ena.h:26
#define DBGC(...)
Definition: compiler.h:505
#define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST
Definition: PxeBaseCode.h:87
const char * name
Name.
Definition: efi_pxe.c:75
static int efi_pxe_ip(struct efi_pxe *pxe)
Populate local IP address.
Definition: efi_pxe.c:224
#define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS
Definition: PxeBaseCode.h:86
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
const char *(* ntoa)(const void *net_addr)
Transcribe network-layer address.
Definition: netdevice.h:94
struct tcpip_net_protocol * tcpip_net_protocol(sa_family_t sa_family)
Find TCP/IP network-layer protocol.
Definition: tcpip.c:68
uint16_t sa_family_t
A socket address family.
Definition: socket.h:85
struct net_protocol * net_protocol
Network-layer protocol.
Definition: tcpip.h:148
struct net_protocol * net
Network-layer protocol.
Definition: efi_pxe.c:91
#define DEFAULT_TTL
Default IP TTL and ToS.
Definition: PxeBaseCode.h:39
#define DEFAULT_ToS
Definition: PxeBaseCode.h:40
static const char * socket_family_name(int family)
Name address family.
Definition: socket.h:75
static void efi_pxe_fake_all(struct efi_pxe *pxe)
Construct fake DHCP packets.
Definition: efi_pxe.c:680
#define TRUE
Definition: tlan.h:46
struct tcpip_net_protocol * tcpip
TCP/IP network-layer protocol.
Definition: efi_pxe.c:89
#define EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP
Definition: PxeBaseCode.h:84
A network-layer protocol of the TCP/IP stack (eg.
Definition: tcpip.h:140
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
#define AF_INET
IPv4 Internet addresses.
Definition: socket.h:63
void * memset(void *dest, int character, size_t len) __nonnull

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, memset(), mode, efi_pxe::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()

static 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 764 of file efi_pxe.c.

764  {
765  struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
767 
768  DBGC ( pxe, "PXE %s STOP\n", pxe->name );
769 
770  /* Record that base code is stopped */
771  mode->Started = FALSE;
772 
773  /* Close TFTP */
774  efi_pxe_tftp_close ( pxe, 0 );
775 
776  /* Close UDP */
777  efi_pxe_udp_close ( pxe, 0 );
778 
779  return 0;
780 }
EFI_PXE_BASE_CODE_MODE.
Definition: PxeBaseCode.h:269
uint32_t base
Base.
Definition: librm.h:138
EFI_PXE_BASE_CODE_MODE mode
PXE base code mode.
Definition: efi_pxe.c:84
A PXE base code.
Definition: efi_pxe.c:69
uint16_t mode
Acceleration mode.
Definition: ena.h:26
#define DBGC(...)
Definition: compiler.h:505
const char * name
Name.
Definition: efi_pxe.c:75
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
static void efi_pxe_tftp_close(struct efi_pxe *pxe, int rc)
Close PXE (M)TFTP download interface.
Definition: efi_pxe.c:319
#define FALSE
Definition: tlan.h:45
static void efi_pxe_udp_close(struct efi_pxe *pxe, int rc)
Close UDP interface.
Definition: efi_pxe.c:436

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

Referenced by efi_pxe_uninstall().

◆ efi_pxe_dhcp()

static 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 789 of file efi_pxe.c.

790  {
791  struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
792  struct net_device *netdev = pxe->netdev;
793  int rc;
794 
795  DBGC ( pxe, "PXE %s DHCP %s\n",
796  pxe->name, ( sort ? "sorted" : "unsorted" ) );
797 
798  /* Claim network devices */
799  efi_snp_claim();
800 
801  /* Initiate configuration */
802  if ( ( rc = netdev_configure_all ( netdev ) ) != 0 ) {
803  DBGC ( pxe, "PXE %s could not initiate configuration: %s\n",
804  pxe->name, strerror ( rc ) );
805  goto err_configure;
806  }
807 
808  /* Wait for configuration to complete (or time out) */
810  step();
811 
812  /* Report timeout if configuration failed */
813  if ( ! netdev_configuration_ok ( netdev ) ) {
814  rc = -ETIMEDOUT;
815  goto err_timeout;
816  }
817 
818  /* Update station IP address */
819  if ( ( rc = efi_pxe_ip ( pxe ) ) != 0 )
820  goto err_ip;
821 
822  /* Update faked DHCP packets */
823  efi_pxe_fake_all ( pxe );
824 
825  err_ip:
826  err_timeout:
827  err_configure:
828  efi_snp_release();
829  return EFIRC ( rc );
830 }
uint32_t base
Base.
Definition: librm.h:138
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
int netdev_configuration_in_progress(struct net_device *netdev)
Check if network device configuration is in progress.
Definition: netdevice.c:1379
A PXE base code.
Definition: efi_pxe.c:69
#define DBGC(...)
Definition: compiler.h:505
static void efi_snp_claim(void)
Claim network devices for use by iPXE.
Definition: efi_snp.h:91
const char * name
Name.
Definition: efi_pxe.c:75
int netdev_configure_all(struct net_device *netdev)
Start network device configuration via all supported configurators.
Definition: netdevice.c:1335
static int efi_pxe_ip(struct efi_pxe *pxe)
Populate local IP address.
Definition: efi_pxe.c:224
struct net_device * netdev
Underlying network device.
Definition: efi_pxe.c:73
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
static struct net_device * netdev
Definition: gdbudp.c:52
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
A network device.
Definition: netdevice.h:352
static void efi_snp_release(void)
Release network devices for use via SNP.
Definition: efi_snp.h:99
static void efi_pxe_fake_all(struct efi_pxe *pxe)
Construct fake DHCP packets.
Definition: efi_pxe.c:680
void step(void)
Single-step a single process.
Definition: process.c:98
int netdev_configuration_ok(struct net_device *netdev)
Check if network device has at least one successful configuration.
Definition: netdevice.c:1391
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669
#define EFIRC(rc)
Convert an iPXE status code to an EFI status code.
Definition: efi.h:166

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

◆ efi_pxe_discover()

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 
)
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 843 of file efi_pxe.c.

844  {
845  struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
847  unsigned int i;
848 
849  DBGC ( pxe, "PXE %s DISCOVER type %d layer %d%s\n",
850  pxe->name, type, *layer, ( bis ? " bis" : "" ) );
851  if ( info ) {
852  DBGC ( pxe, "%s%s%s%s %s",
853  ( info->UseMCast ? " mcast" : "" ),
854  ( info->UseBCast ? " bcast" : "" ),
855  ( info->UseUCast ? " ucast" : "" ),
856  ( info->MustUseList ? " list" : "" ),
857  efi_pxe_ip_ntoa ( pxe, &info->ServerMCastIp ) );
858  for ( i = 0 ; i < info->IpCnt ; i++ ) {
859  ip = &info->SrvList[i].IpAddr;
860  DBGC ( pxe, " %d%s:%s", info->SrvList[i].Type,
861  ( info->SrvList[i].AcceptAnyResponse ?
862  ":any" : "" ), efi_pxe_ip_ntoa ( pxe, ip ) );
863  }
864  }
865  DBGC ( pxe, "\n" );
866 
867  /* Not used by any bootstrap I can find to test with */
868  return EFI_UNSUPPORTED;
869 }
uint32_t base
Base.
Definition: librm.h:138
#define EFI_UNSUPPORTED
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:117
u32 info
Definition: ar9003_mac.h:67
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:212
A PXE base code.
Definition: efi_pxe.c:69
uint32_t type
Operating system type.
Definition: ena.h:12
#define DBGC(...)
Definition: compiler.h:505
const char * name
Name.
Definition: efi_pxe.c:75
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
16-byte buffer aligned on a 4-byte boundary.
Definition: UefiBaseType.h:105
IP4_t ip
Destination IP address.
Definition: pxe_api.h:58

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

◆ efi_pxe_mtftp()

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 
)
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 887 of file efi_pxe.c.

891  {
892  struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
893  int rc;
894 
895  DBGC ( pxe, "PXE %s MTFTP %d%s %p+%llx", pxe->name, opcode,
896  ( overwrite ? " overwrite" : "" ), data, *len );
897  if ( blksize )
898  DBGC ( pxe, " blksize %zd", ( ( size_t ) *blksize ) );
899  DBGC ( pxe, " %s:%s", efi_pxe_ip_ntoa ( pxe, ip ), filename );
900  if ( info ) {
901  DBGC ( pxe, " %s:%d:%d:%d:%d",
902  efi_pxe_ip_ntoa ( pxe, &info->MCastIp ),
903  info->CPort, info->SPort, info->ListenTimeout,
904  info->TransmitTimeout );
905  }
906  DBGC ( pxe, "%s\n", ( callback ? " callback" : "" ) );
907 
908  /* Fail unless operation is supported */
909  if ( ! ( ( opcode == EFI_PXE_BASE_CODE_TFTP_READ_FILE ) ||
911  DBGC ( pxe, "PXE %s unsupported MTFTP opcode %d\n",
912  pxe->name, opcode );
913  rc = -ENOTSUP;
914  goto err_opcode;
915  }
916 
917  /* Claim network devices */
918  efi_snp_claim();
919 
920  /* Determine block size. Ignore the requested block size
921  * unless we are using callbacks, since limiting HTTP to a
922  * 512-byte TCP window is not sensible.
923  */
924  pxe->blksize = ( ( callback && blksize ) ? *blksize : -1UL );
925 
926  /* Initialise data transfer buffer */
927  xferbuf_fixed_init ( &pxe->buf, data, *len );
928 
929  /* Open download */
930  if ( ( rc = efi_pxe_tftp_open ( pxe, ip,
931  ( ( const char * ) filename ) ) ) != 0 )
932  goto err_open;
933 
934  /* Wait for download to complete */
935  pxe->rc = -EINPROGRESS;
936  while ( pxe->rc == -EINPROGRESS )
937  step();
938  if ( ( rc = pxe->rc ) != 0 ) {
939  DBGC ( pxe, "PXE %s download failed: %s\n",
940  pxe->name, strerror ( rc ) );
941  goto err_download;
942  }
943 
944  err_download:
945  efi_pxe_tftp_close ( pxe, rc );
946  err_open:
947  xferbuf_fixed_init ( &pxe->buf, NULL, 0 );
948  efi_snp_release();
949  err_opcode:
950  return EFIRC ( rc );
951 }
uint32_t base
Base.
Definition: librm.h:138
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
u32 info
Definition: ar9003_mac.h:67
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:212
uint8_t opcode
Opcode.
Definition: ena.h:16
A PXE base code.
Definition: efi_pxe.c:69
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:384
#define DBGC(...)
Definition: compiler.h:505
struct xfer_buffer buf
Data transfer buffer.
Definition: efi_pxe.c:94
static void efi_snp_claim(void)
Claim network devices for use by iPXE.
Definition: efi_snp.h:91
#define ENOTSUP
Operation not supported.
Definition: errno.h:589
const char * name
Name.
Definition: efi_pxe.c:75
size_t blksize
Block size (for TFTP)
Definition: efi_pxe.c:99
int rc
Overall return status.
Definition: efi_pxe.c:101
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
ring len
Length.
Definition: dwmac.h:231
#define EINPROGRESS
Operation in progress.
Definition: errno.h:418
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static void efi_snp_release(void)
Release network devices for use via SNP.
Definition: efi_snp.h:99
IP4_t ip
Destination IP address.
Definition: pxe_api.h:58
static void efi_pxe_tftp_close(struct efi_pxe *pxe, int rc)
Close PXE (M)TFTP download interface.
Definition: efi_pxe.c:319
void step(void)
Single-step a single process.
Definition: process.c:98
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint32_t blksize
Cipher block size.
Definition: pccrr.h:14
int overwrite(const WINDOW *, WINDOW *)
static void xferbuf_fixed_init(struct xfer_buffer *xferbuf, void *data, size_t len)
Initialise fixed-size data transfer buffer.
Definition: xferbuf.h:80
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
#define EFIRC(rc)
Convert an iPXE status code to an EFI status code.
Definition: efi.h:166

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(), and xferbuf_fixed_init().

◆ efi_pxe_udp_write()

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 
)
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 970 of file efi_pxe.c.

975  {
976  struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
978  struct io_buffer *iobuf;
979  struct xfer_metadata meta;
980  union {
981  struct sockaddr_tcpip st;
982  struct sockaddr sa;
983  } dest;
984  union {
985  struct sockaddr_tcpip st;
986  struct sockaddr sa;
987  } src;
988  int rc;
989 
990  DBGC2 ( pxe, "PXE %s UDP WRITE ", pxe->name );
991  if ( src_ip )
992  DBGC2 ( pxe, "%s", efi_pxe_ip_ntoa ( pxe, src_ip ) );
993  DBGC2 ( pxe, ":" );
994  if ( src_port &&
996  DBGC2 ( pxe, "%d", *src_port );
997  } else {
998  DBGC2 ( pxe, "*" );
999  }
1000  DBGC2 ( pxe, "->%s:%d", efi_pxe_ip_ntoa ( pxe, dest_ip ), *dest_port );
1001  if ( gateway )
1002  DBGC2 ( pxe, " via %s", efi_pxe_ip_ntoa ( pxe, gateway ) );
1003  if ( hdr_len )
1004  DBGC2 ( pxe, " %p+%zx", hdr, ( ( size_t ) *hdr_len ) );
1005  DBGC2 ( pxe, " %p+%zx", data, ( ( size_t ) *len ) );
1007  DBGC2 ( pxe, " frag" );
1008  DBGC2 ( pxe, "\n" );
1009 
1010  /* Open UDP connection (if applicable) */
1011  if ( ( rc = efi_pxe_udp_open ( pxe ) ) != 0 )
1012  goto err_open;
1013 
1014  /* Construct destination address */
1015  efi_pxe_ip_sockaddr ( pxe, dest_ip, &dest.sa );
1016  dest.st.st_port = htons ( *dest_port );
1017 
1018  /* Construct source address */
1019  efi_pxe_ip_sockaddr ( pxe, ( src_ip ? src_ip : &mode->StationIp ),
1020  &src.sa );
1021  if ( src_port &&
1023  src.st.st_port = htons ( *src_port );
1024  } else {
1025  /* The API does not allow for a sensible concept of
1026  * binding to a local port, so just use a random value.
1027  */
1028  src.st.st_port = ( random() | htons ( 1024 ) );
1029  if ( src_port )
1030  *src_port = ntohs ( src.st.st_port );
1031  }
1032 
1033  /* Allocate I/O buffer */
1034  iobuf = xfer_alloc_iob ( &pxe->udp,
1035  ( *len + ( hdr_len ? *hdr_len : 0 ) ) );
1036  if ( ! iobuf ) {
1037  rc = -ENOMEM;
1038  goto err_alloc;
1039  }
1040 
1041  /* Populate I/O buffer */
1042  if ( hdr_len )
1043  memcpy ( iob_put ( iobuf, *hdr_len ), hdr, *hdr_len );
1044  memcpy ( iob_put ( iobuf, *len ), data, *len );
1045 
1046  /* Construct metadata */
1047  memset ( &meta, 0, sizeof ( meta ) );
1048  meta.src = &src.sa;
1049  meta.dest = &dest.sa;
1050  meta.netdev = pxe->netdev;
1051 
1052  /* Deliver I/O buffer */
1053  if ( ( rc = xfer_deliver ( &pxe->udp, iob_disown ( iobuf ),
1054  &meta ) ) != 0 ) {
1055  DBGC ( pxe, "PXE %s could not transmit: %s\n",
1056  pxe->name, strerror ( rc ) );
1057  goto err_deliver;
1058  }
1059 
1060  err_deliver:
1061  free_iob ( iobuf );
1062  err_alloc:
1064  err_open:
1065  return EFIRC ( rc );
1066 }
EFI_PXE_BASE_CODE_MODE.
Definition: PxeBaseCode.h:269
uint32_t base
Base.
Definition: librm.h:138
TCP/IP socket address.
Definition: tcpip.h:75
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
EFI_PXE_BASE_CODE_MODE mode
PXE base code mode.
Definition: efi_pxe.c:84
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:191
#define iob_put(iobuf, len)
Definition: iobuf.h:124
Data transfer metadata.
Definition: xfer.h:22
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:212
A PXE base code.
Definition: efi_pxe.c:69
struct golan_inbox_hdr hdr
Message header.
Definition: CIB_PRM.h:28
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:152
uint16_t mode
Acceleration mode.
Definition: ena.h:26
#define DBGC(...)
Definition: compiler.h:505
struct interface udp
UDP interface.
Definition: efi_pxe.c:104
struct io_buffer * xfer_alloc_iob(struct interface *intf, size_t len)
Allocate I/O buffer.
Definition: xfer.c:158
#define ntohs(value)
Definition: byteswap.h:136
IP4_t src_ip
IP address of this station.
Definition: pxe_api.h:58
const char * name
Name.
Definition: efi_pxe.c:75
struct sockaddr_tcpip st
Definition: syslog.c:57
#define ENOMEM
Not enough space.
Definition: errno.h:534
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:216
void * memcpy(void *dest, const void *src, size_t len) __nonnull
struct net_device * netdev
Underlying network device.
Definition: efi_pxe.c:73
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
static const void * src
Definition: string.h:47
UDP_PORT_t src_port
Source UDP port.
Definition: pxe_api.h:60
ring len
Length.
Definition: dwmac.h:231
struct sockaddr sa
Definition: syslog.c:56
Generalized socket address structure.
Definition: socket.h:96
uint8_t flags
Flags.
Definition: ena.h:18
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static void efi_pxe_udp_schedule_close(struct efi_pxe *pxe)
Schedule close of UDP interface.
Definition: efi_pxe.c:558
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT
Definition: PxeBaseCode.h:112
IP4_t dest_ip
Destination IP address.
Definition: pxe_api.h:59
long int random(void)
Generate a pseudo-random number between 0 and 2147483647L or 2147483562?
Definition: random.c:31
int xfer_deliver(struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver datagram.
Definition: xfer.c:194
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_MAY_FRAGMENT
Definition: PxeBaseCode.h:116
#define DBGC2(...)
Definition: compiler.h:522
static int efi_pxe_udp_open(struct efi_pxe *pxe)
Open UDP interface.
Definition: efi_pxe.c:531
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" return dest
Definition: string.h:150
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint8_t meta
Metadata flags.
Definition: ena.h:14
#define htons(value)
Definition: byteswap.h:135
#define EFIRC(rc)
Convert an iPXE status code to an EFI status code.
Definition: efi.h:166
void * memset(void *dest, int character, size_t len) __nonnull
A persistent I/O buffer.
Definition: iobuf.h:37

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, mode, efi_pxe::mode, efi_pxe::name, efi_pxe::netdev, ntohs, random(), rc, sa, src, src_ip, src_port, st, strerror(), efi_pxe::udp, xfer_alloc_iob(), and xfer_deliver().

◆ efi_pxe_udp_read()

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 
)
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 1084 of file efi_pxe.c.

1089  {
1090  struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
1091  struct io_buffer *iobuf;
1092  struct efi_pxe_udp_pseudo_header *pshdr;
1093  EFI_IP_ADDRESS *actual_dest_ip;
1094  EFI_IP_ADDRESS *actual_src_ip;
1095  size_t addr_len;
1096  size_t frag_len;
1097  int rc;
1098 
1099  DBGC2 ( pxe, "PXE %s UDP READ ", pxe->name );
1101  DBGC2 ( pxe, "(filter)" );
1103  DBGC2 ( pxe, "*" );
1104  } else if ( dest_ip ) {
1105  DBGC2 ( pxe, "%s", efi_pxe_ip_ntoa ( pxe, dest_ip ) );
1106  }
1107  DBGC2 ( pxe, ":" );
1109  DBGC2 ( pxe, "*" );
1110  } else if ( dest_port ) {
1111  DBGC2 ( pxe, "%d", *dest_port );
1112  } else {
1113  DBGC2 ( pxe, "<NULL>" );
1114  }
1115  DBGC2 ( pxe, "<-" );
1117  DBGC2 ( pxe, "*" );
1118  } else if ( src_ip ) {
1119  DBGC2 ( pxe, "%s", efi_pxe_ip_ntoa ( pxe, src_ip ) );
1120  } else {
1121  DBGC2 ( pxe, "<NULL>" );
1122  }
1123  DBGC2 ( pxe, ":" );
1125  DBGC2 ( pxe, "*" );
1126  } else if ( src_port ) {
1127  DBGC2 ( pxe, "%d", *src_port );
1128  } else {
1129  DBGC2 ( pxe, "<NULL>" );
1130  }
1131  if ( hdr_len )
1132  DBGC2 ( pxe, " %p+%zx", hdr, ( ( size_t ) *hdr_len ) );
1133  DBGC2 ( pxe, " %p+%zx\n", data, ( ( size_t ) *len ) );
1134 
1135  /* Open UDP connection (if applicable) */
1136  if ( ( rc = efi_pxe_udp_open ( pxe ) ) != 0 )
1137  goto err_open;
1138 
1139  /* Try receiving a packet, if the queue is empty */
1140  if ( list_empty ( &pxe->queue ) )
1141  step();
1142 
1143  /* Remove first packet from the queue */
1144  iobuf = list_first_entry ( &pxe->queue, struct io_buffer, list );
1145  if ( ! iobuf ) {
1146  rc = -ETIMEDOUT; /* "no packet" */
1147  goto err_empty;
1148  }
1149  list_del ( &iobuf->list );
1150 
1151  /* Strip pseudo-header */
1152  pshdr = iobuf->data;
1153  addr_len = ( pshdr->net->net_addr_len );
1154  iob_pull ( iobuf, sizeof ( *pshdr ) );
1155  actual_dest_ip = iobuf->data;
1156  iob_pull ( iobuf, addr_len );
1157  actual_src_ip = iobuf->data;
1158  iob_pull ( iobuf, addr_len );
1159  DBGC2 ( pxe, "PXE %s UDP RX %s:%d", pxe->name,
1160  pshdr->net->ntoa ( actual_dest_ip ), pshdr->dest_port );
1161  DBGC2 ( pxe, "<-%s:%d len %#zx\n", pshdr->net->ntoa ( actual_src_ip ),
1162  pshdr->src_port, iob_len ( iobuf ) );
1163 
1164  /* Filter based on network-layer protocol */
1165  if ( pshdr->net != pxe->net ) {
1166  DBGC2 ( pxe, "PXE %s filtered out %s packet\n",
1167  pxe->name, pshdr->net->name );
1168  rc = -ETIMEDOUT; /* "no packet" */
1169  goto err_filter;
1170  }
1171 
1172  /* Filter based on port numbers */
1174  ( dest_port && ( *dest_port == pshdr->dest_port ) ) ) ) {
1175  DBGC2 ( pxe, "PXE %s filtered out destination port %d\n",
1176  pxe->name, pshdr->dest_port );
1177  rc = -ETIMEDOUT; /* "no packet" */
1178  goto err_filter;
1179  }
1181  ( src_port && ( *src_port == pshdr->src_port ) ) ) ) {
1182  DBGC2 ( pxe, "PXE %s filtered out source port %d\n",
1183  pxe->name, pshdr->src_port );
1184  rc = -ETIMEDOUT; /* "no packet" */
1185  goto err_filter;
1186  }
1187 
1188  /* Filter based on source IP address */
1190  ( src_ip &&
1191  ( memcmp ( src_ip, actual_src_ip, addr_len ) == 0 ) ) ) ) {
1192  DBGC2 ( pxe, "PXE %s filtered out source IP %s\n",
1193  pxe->name, pshdr->net->ntoa ( actual_src_ip ) );
1194  rc = -ETIMEDOUT; /* "no packet" */
1195  goto err_filter;
1196  }
1197 
1198  /* Filter based on destination IP address */
1200  efi_pxe_ip_filter ( pxe, actual_dest_ip ) ) ||
1203  ( dest_ip && ( memcmp ( dest_ip, actual_dest_ip,
1204  addr_len ) == 0 ) ) ) ) ) ) {
1205  DBGC2 ( pxe, "PXE %s filtered out destination IP %s\n",
1206  pxe->name, pshdr->net->ntoa ( actual_dest_ip ) );
1207  rc = -ETIMEDOUT; /* "no packet" */
1208  goto err_filter;
1209  }
1210 
1211  /* Fill in addresses and port numbers */
1212  if ( dest_ip )
1213  memcpy ( dest_ip, actual_dest_ip, addr_len );
1214  if ( dest_port )
1215  *dest_port = pshdr->dest_port;
1216  if ( src_ip )
1217  memcpy ( src_ip, actual_src_ip, addr_len );
1218  if ( src_port )
1219  *src_port = pshdr->src_port;
1220 
1221  /* Fill in header, if applicable */
1222  if ( hdr_len ) {
1223  frag_len = iob_len ( iobuf );
1224  if ( frag_len > *hdr_len )
1225  frag_len = *hdr_len;
1226  memcpy ( hdr, iobuf->data, frag_len );
1227  iob_pull ( iobuf, frag_len );
1228  *hdr_len = frag_len;
1229  }
1230 
1231  /* Fill in data buffer */
1232  frag_len = iob_len ( iobuf );
1233  if ( frag_len > *len )
1234  frag_len = *len;
1235  memcpy ( data, iobuf->data, frag_len );
1236  iob_pull ( iobuf, frag_len );
1237  *len = frag_len;
1238 
1239  /* Check for overflow */
1240  if ( iob_len ( iobuf ) ) {
1241  rc = -ERANGE;
1242  goto err_too_short;
1243  }
1244 
1245  /* Success */
1246  rc = 0;
1247 
1248  err_too_short:
1249  err_filter:
1250  free_iob ( iobuf );
1251  err_empty:
1253  err_open:
1254  return EFIRC ( rc );
1255 }
#define iob_pull(iobuf, len)
Definition: iobuf.h:106
uint32_t base
Base.
Definition: librm.h:138
EFI UDP pseudo-header.
Definition: efi_pxe.c:421
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
uint16_t dest_port
Destination port.
Definition: efi_pxe.c:425
const char * name
Protocol name.
Definition: netdevice.h:66
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:212
A PXE base code.
Definition: efi_pxe.c:69
struct golan_inbox_hdr hdr
Message header.
Definition: CIB_PRM.h:28
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:152
static int efi_pxe_ip_filter(struct efi_pxe *pxe, EFI_IP_ADDRESS *ip)
Check if IP address matches filter.
Definition: efi_pxe.c:257
struct net_protocol * net
Network-layer protocol.
Definition: efi_pxe.c:423
IP4_t src_ip
IP address of this station.
Definition: pxe_api.h:58
const char * name
Name.
Definition: efi_pxe.c:75
#define list_empty(list)
Test whether a list is empty.
Definition: list.h:136
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT
Definition: PxeBaseCode.h:114
#define list_first_entry(list, type, member)
Get the container of the first entry in a list.
Definition: list.h:333
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER
Definition: PxeBaseCode.h:115
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
16-byte buffer aligned on a 4-byte boundary.
Definition: UefiBaseType.h:105
const char *(* ntoa)(const void *net_addr)
Transcribe network-layer address.
Definition: netdevice.h:94
UDP_PORT_t src_port
Source UDP port.
Definition: pxe_api.h:60
ring len
Length.
Definition: dwmac.h:231
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP
Definition: PxeBaseCode.h:113
uint8_t flags
Flags.
Definition: ena.h:18
#define ERANGE
Result too large.
Definition: errno.h:639
static void efi_pxe_udp_schedule_close(struct efi_pxe *pxe)
Schedule close of UDP interface.
Definition: efi_pxe.c:558
struct net_protocol * net
Network-layer protocol.
Definition: efi_pxe.c:91
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:159
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT
Definition: PxeBaseCode.h:112
IP4_t dest_ip
Destination IP address.
Definition: pxe_api.h:59
uint16_t src_port
Source port.
Definition: efi_pxe.c:427
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP
Definition: PxeBaseCode.h:111
struct list_head list
List of which this buffer is a member.
Definition: iobuf.h:44
#define DBGC2(...)
Definition: compiler.h:522
uint8_t net_addr_len
Network-layer address length.
Definition: netdevice.h:101
void * data
Start of data.
Definition: iobuf.h:52
void step(void)
Single-step a single process.
Definition: process.c:98
struct list_head queue
List of received UDP packets.
Definition: efi_pxe.c:106
static int efi_pxe_udp_open(struct efi_pxe *pxe)
Open UDP interface.
Definition: efi_pxe.c:531
uint8_t data[48]
Additional event data.
Definition: ena.h:22
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition: string.c:114
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669
#define EFIRC(rc)
Convert an iPXE status code to an EFI status code.
Definition: efi.h:166
A persistent I/O buffer.
Definition: iobuf.h:37

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(), net_protocol::name, efi_pxe::name, efi_pxe::net, efi_pxe_udp_pseudo_header::net, net_protocol::net_addr_len, net_protocol::ntoa, efi_pxe::queue, rc, src_ip, src_port, efi_pxe_udp_pseudo_header::src_port, and step().

◆ efi_pxe_set_ip_filter()

static 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 1265 of file efi_pxe.c.

1266  {
1267  struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
1268  EFI_PXE_BASE_CODE_MODE *mode = &pxe->mode;
1269  unsigned int i;
1270 
1271  DBGC ( pxe, "PXE %s SET IP FILTER %02x",
1272  pxe->name, filter->Filters );
1273  for ( i = 0 ; i < filter->IpCnt ; i++ ) {
1274  DBGC ( pxe, " %s",
1275  efi_pxe_ip_ntoa ( pxe, &filter->IpList[i] ) );
1276  }
1277  DBGC ( pxe, "\n" );
1278 
1279  /* Update filter */
1280  memcpy ( &mode->IpFilter, filter, sizeof ( mode->IpFilter ) );
1281 
1282  return 0;
1283 }
EFI_PXE_BASE_CODE_MODE.
Definition: PxeBaseCode.h:269
uint32_t base
Base.
Definition: librm.h:138
EFI_PXE_BASE_CODE_MODE mode
PXE base code mode.
Definition: efi_pxe.c:84
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:212
UINT8_t filter
Receive packet filter.
Definition: pxe_api.h:68
A PXE base code.
Definition: efi_pxe.c:69
uint16_t mode
Acceleration mode.
Definition: ena.h:26
#define DBGC(...)
Definition: compiler.h:505
const char * name
Name.
Definition: efi_pxe.c:75
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35

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

◆ efi_pxe_arp()

static 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 1293 of file efi_pxe.c.

1295  {
1296  struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
1297 
1298  DBGC ( pxe, "PXE %s ARP %s %p\n",
1299  pxe->name, efi_pxe_ip_ntoa ( pxe, ip ), mac );
1300 
1301  /* Not used by any bootstrap I can find to test with */
1302  return EFI_UNSUPPORTED;
1303 }
uint32_t base
Base.
Definition: librm.h:138
#define EFI_UNSUPPORTED
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:117
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:212
A PXE base code.
Definition: efi_pxe.c:69
#define DBGC(...)
Definition: compiler.h:505
uint8_t mac[ETH_ALEN]
MAC address.
Definition: ena.h:24
const char * name
Name.
Definition: efi_pxe.c:75
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
IP4_t ip
Destination IP address.
Definition: pxe_api.h:58

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

◆ efi_pxe_set_parameters()

static 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 1317 of file efi_pxe.c.

1319  {
1320  struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
1321  EFI_PXE_BASE_CODE_MODE *mode = &pxe->mode;
1322 
1323  DBGC ( pxe, "PXE %s SET PARAMETERS", pxe->name );
1324  if ( autoarp )
1325  DBGC ( pxe, " %s", ( *autoarp ? "autoarp" : "noautoarp" ) );
1326  if ( sendguid )
1327  DBGC ( pxe, " %s", ( *sendguid ? "sendguid" : "sendmac" ) );
1328  if ( ttl )
1329  DBGC ( pxe, " ttl %d", *ttl );
1330  if ( tos )
1331  DBGC ( pxe, " tos %d", *tos );
1332  if ( callback ) {
1333  DBGC ( pxe, " %s",
1334  ( *callback ? "callback" : "nocallback" ) );
1335  }
1336  DBGC ( pxe, "\n" );
1337 
1338  /* Update parameters */
1339  if ( autoarp )
1340  mode->AutoArp = *autoarp;
1341  if ( sendguid )
1342  mode->SendGUID = *sendguid;
1343  if ( ttl )
1344  mode->TTL = *ttl;
1345  if ( tos )
1346  mode->ToS = *tos;
1347  if ( callback )
1348  mode->MakeCallbacks = *callback;
1349 
1350  return 0;
1351 }
EFI_PXE_BASE_CODE_MODE.
Definition: PxeBaseCode.h:269
uint32_t base
Base.
Definition: librm.h:138
EFI_PXE_BASE_CODE_MODE mode
PXE base code mode.
Definition: efi_pxe.c:84
A PXE base code.
Definition: efi_pxe.c:69
uint16_t mode
Acceleration mode.
Definition: ena.h:26
#define DBGC(...)
Definition: compiler.h:505
const char * name
Name.
Definition: efi_pxe.c:75
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35

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

◆ efi_pxe_set_station_ip()

static 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 1362 of file efi_pxe.c.

1363  {
1364  struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
1365  EFI_PXE_BASE_CODE_MODE *mode = &pxe->mode;
1366 
1367  DBGC ( pxe, "PXE %s SET STATION IP ", pxe->name );
1368  if ( ip )
1369  DBGC ( pxe, "%s", efi_pxe_ip_ntoa ( pxe, ip ) );
1370  if ( netmask )
1371  DBGC ( pxe, "/%s", efi_pxe_ip_ntoa ( pxe, netmask ) );
1372  DBGC ( pxe, "\n" );
1373 
1374  /* Update IP address and netmask */
1375  if ( ip )
1376  memcpy ( &mode->StationIp, ip, sizeof ( mode->StationIp ) );
1377  if ( netmask )
1378  memcpy ( &mode->SubnetMask, netmask, sizeof (mode->SubnetMask));
1379 
1380  return 0;
1381 }
EFI_PXE_BASE_CODE_MODE.
Definition: PxeBaseCode.h:269
uint32_t base
Base.
Definition: librm.h:138
EFI_PXE_BASE_CODE_MODE mode
PXE base code mode.
Definition: efi_pxe.c:84
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:212
A PXE base code.
Definition: efi_pxe.c:69
uint16_t mode
Acceleration mode.
Definition: ena.h:26
#define DBGC(...)
Definition: compiler.h:505
const char * name
Name.
Definition: efi_pxe.c:75
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
IP4_t ip
Destination IP address.
Definition: pxe_api.h:58

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

◆ efi_pxe_set_packets()

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 
)
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 1402 of file efi_pxe.c.

1410  {
1411  struct efi_pxe *pxe = container_of ( base, struct efi_pxe, base );
1412  EFI_PXE_BASE_CODE_MODE *mode = &pxe->mode;
1413 
1414  DBGC ( pxe, "PXE %s SET PACKETS\n", pxe->name );
1415 
1416  /* Update fake packet flags */
1417  if ( dhcpdisc_ok )
1418  mode->DhcpDiscoverValid = *dhcpdisc_ok;
1419  if ( dhcpack_ok )
1420  mode->DhcpAckReceived = *dhcpack_ok;
1421  if ( proxyoffer_ok )
1422  mode->ProxyOfferReceived = *proxyoffer_ok;
1423  if ( pxebsdisc_ok )
1424  mode->PxeDiscoverValid = *pxebsdisc_ok;
1425  if ( pxebsack_ok )
1426  mode->PxeReplyReceived = *pxebsack_ok;
1427  if ( pxebsbis_ok )
1428  mode->PxeBisReplyReceived = *pxebsbis_ok;
1429 
1430  /* Update fake packet contents */
1431  if ( dhcpdisc )
1432  memcpy ( &mode->DhcpDiscover, dhcpdisc, sizeof ( *dhcpdisc ) );
1433  if ( dhcpack )
1434  memcpy ( &mode->DhcpAck, dhcpack, sizeof ( *dhcpack ) );
1435  if ( proxyoffer )
1436  memcpy ( &mode->ProxyOffer, proxyoffer, sizeof ( *proxyoffer ));
1437  if ( pxebsdisc )
1438  memcpy ( &mode->PxeDiscover, pxebsdisc, sizeof ( *pxebsdisc ) );
1439  if ( pxebsack )
1440  memcpy ( &mode->PxeReply, pxebsack, sizeof ( *pxebsack ) );
1441  if ( pxebsbis )
1442  memcpy ( &mode->PxeBisReply, pxebsbis, sizeof ( *pxebsbis ) );
1443 
1444  return 0;
1445 }
EFI_PXE_BASE_CODE_MODE.
Definition: PxeBaseCode.h:269
uint32_t base
Base.
Definition: librm.h:138
EFI_PXE_BASE_CODE_MODE mode
PXE base code mode.
Definition: efi_pxe.c:84
A PXE base code.
Definition: efi_pxe.c:69
uint16_t mode
Acceleration mode.
Definition: ena.h:26
#define DBGC(...)
Definition: compiler.h:505
const char * name
Name.
Definition: efi_pxe.c:75
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35

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

◆ efi_apple_get_response()

static 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 1480 of file efi_pxe.c.

1481  {
1482 
1483  /* Check length */
1484  if ( *len < sizeof ( *packet ) ) {
1485  *len = sizeof ( *packet );
1486  return EFI_BUFFER_TOO_SMALL;
1487  }
1488 
1489  /* Copy packet */
1490  memcpy ( data, packet, sizeof ( *packet ) );
1491  *len = sizeof ( *packet );
1492 
1493  return EFI_SUCCESS;
1494 }
#define EFI_BUFFER_TOO_SMALL
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:119
void * memcpy(void *dest, const void *src, size_t len) __nonnull
ring len
Length.
Definition: dwmac.h:231
#define EFI_SUCCESS
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:114
uint8_t data[48]
Additional event data.
Definition: ena.h:22

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

Referenced by efi_apple_get_bsdp_response(), and efi_apple_get_dhcp_response().

◆ efi_apple_get_dhcp_response()

static 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 1505 of file efi_pxe.c.

1506  {
1507  struct efi_pxe *pxe = container_of ( apple, struct efi_pxe, apple );
1508 
1509  return efi_apple_get_response ( &pxe->mode.DhcpAck, len, data );
1510 }
EFI_PXE_BASE_CODE_MODE mode
PXE base code mode.
Definition: efi_pxe.c:84
A PXE base code.
Definition: efi_pxe.c:69
EFI_APPLE_NET_BOOT_PROTOCOL apple
Apple NetBoot protocol.
Definition: efi_pxe.c:86
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
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:1480
ring len
Length.
Definition: dwmac.h:231
EFI_PXE_BASE_CODE_PACKET DhcpAck
Definition: PxeBaseCode.h:292
uint8_t data[48]
Additional event data.
Definition: ena.h:22

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

◆ efi_apple_get_bsdp_response()

static 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 1521 of file efi_pxe.c.

1522  {
1523  struct efi_pxe *pxe = container_of ( apple, struct efi_pxe, apple );
1524 
1525  return efi_apple_get_response ( &pxe->mode.PxeReply, len, data );
1526 }
EFI_PXE_BASE_CODE_MODE mode
PXE base code mode.
Definition: efi_pxe.c:84
A PXE base code.
Definition: efi_pxe.c:69
EFI_APPLE_NET_BOOT_PROTOCOL apple
Apple NetBoot protocol.
Definition: efi_pxe.c:86
EFI_PXE_BASE_CODE_PACKET PxeReply
Definition: PxeBaseCode.h:295
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
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:1480
ring len
Length.
Definition: dwmac.h:231
uint8_t data[48]
Additional event data.
Definition: ena.h:22

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

◆ 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 1548 of file efi_pxe.c.

1548  {
1550  struct tcpip_net_protocol *ipv6 = tcpip_net_protocol ( AF_INET6 );
1551  struct efi_pxe *pxe;
1552  struct in_addr ip;
1553  BOOLEAN use_ipv6;
1554  int leak = 0;
1555  EFI_STATUS efirc;
1556  int rc;
1557 
1558  /* Allocate and initialise structure */
1559  pxe = zalloc ( sizeof ( *pxe ) );
1560  if ( ! pxe ) {
1561  rc = -ENOMEM;
1562  goto err_alloc;
1563  }
1564  ref_init ( &pxe->refcnt, efi_pxe_free );
1565  pxe->netdev = netdev_get ( netdev );
1566  pxe->name = netdev->name;
1567  pxe->handle = handle;
1568  memcpy ( &pxe->base, &efi_pxe_base_code_protocol, sizeof ( pxe->base ));
1569  pxe->base.Mode = &pxe->mode;
1571  sizeof ( pxe->apple ) );
1572  intf_init ( &pxe->tftp, &efi_pxe_tftp_desc, &pxe->refcnt );
1573  intf_init ( &pxe->udp, &efi_pxe_udp_desc, &pxe->refcnt );
1574  INIT_LIST_HEAD ( &pxe->queue );
1576  &pxe->refcnt );
1577 
1578  /* Crude heuristic: assume that we prefer to use IPv4 if we
1579  * have an IPv4 address for the network device, otherwise
1580  * prefer IPv6 (if available).
1581  */
1582  fetch_ipv4_setting ( netdev_settings ( netdev ), &ip_setting, &ip );
1583  use_ipv6 = ( ip.s_addr ? FALSE : ( ipv6 != NULL ) );
1584 
1585  /* Start base code */
1586  efi_pxe_start ( &pxe->base, use_ipv6 );
1587 
1588  /* Install PXE base code protocol */
1589  if ( ( efirc = bs->InstallMultipleProtocolInterfaces (
1590  &handle,
1593  NULL ) ) != 0 ) {
1594  rc = -EEFI ( efirc );
1595  DBGC ( pxe, "PXE %s could not install base code protocol: %s\n",
1596  pxe->name, strerror ( rc ) );
1597  goto err_install_protocol;
1598  }
1599 
1600  /* Transfer reference to list and return */
1601  list_add_tail ( &pxe->list, &efi_pxes );
1602  DBGC ( pxe, "PXE %s installed for %s\n",
1603  pxe->name, efi_handle_name ( handle ) );
1604  return 0;
1605 
1606  if ( ( efirc = bs->UninstallMultipleProtocolInterfaces (
1607  handle,
1610  NULL ) ) != 0 ) {
1611  DBGC ( pxe, "PXE %s could not uninstall: %s\n",
1612  pxe->name, strerror ( -EEFI ( efirc ) ) );
1613  leak = 1;
1614  }
1615  efi_nullify_pxe ( &pxe->base );
1616  efi_nullify_apple ( &pxe->apple );
1617  err_install_protocol:
1618  if ( ! leak )
1619  ref_put ( &pxe->refcnt );
1620  err_alloc:
1621  if ( leak )
1622  DBGC ( pxe, "PXE %s nullified and leaked\n", pxe->name );
1623  return rc;
1624 }
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2098
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
EFI_PXE_BASE_CODE_MODE mode
PXE base code mode.
Definition: efi_pxe.c:84
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:174
#define AF_INET6
IPv6 Internet addresses.
Definition: socket.h:64
struct list_head list
List of PXE base codes.
Definition: efi_pxe.c:77
static EFI_STATUS EFIAPI efi_pxe_start(EFI_PXE_BASE_CODE_PROTOCOL *base, BOOLEAN use_ipv6)
Start PXE base code.
Definition: efi_pxe.c:709
struct refcnt refcnt
Reference count.
Definition: efi_pxe.c:71
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition: refcnt.h:64
A PXE base code.
Definition: efi_pxe.c:69
int fetch_ipv4_setting(struct settings *settings, const struct setting *setting, struct in_addr *inp)
Fetch value of IPv4 address setting.
Definition: settings.c:912
unsigned char BOOLEAN
static struct interface_descriptor efi_pxe_tftp_desc
PXE file data transfer interface descriptor.
Definition: efi_pxe.c:373
EFI_PXE_BASE_CODE_PROTOCOL base
PXE base code protocol.
Definition: efi_pxe.c:82
#define DBGC(...)
Definition: compiler.h:505
struct interface udp
UDP interface.
Definition: efi_pxe.c:104
EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES InstallMultipleProtocolInterfaces
Definition: UefiSpec.h:2009
EFI_APPLE_NET_BOOT_PROTOCOL apple
Apple NetBoot protocol.
Definition: efi_pxe.c:86
EFI_GUID efi_pxe_base_code_protocol_guid
PXE base code protocol GUID.
Definition: efi_guid.c:320
static struct process_descriptor efi_pxe_process_desc
UDP close process descriptor.
Definition: efi_pxe.c:582
static struct settings * netdev_settings(struct net_device *netdev)
Get per-netdevice configuration settings block.
Definition: netdevice.h:586
const char * name
Name.
Definition: efi_pxe.c:75
EFI_HANDLE handle
Installed handle.
Definition: efi_pxe.c:80
#define ENOMEM
Not enough space.
Definition: errno.h:534
void * memcpy(void *dest, const void *src, size_t len) __nonnull
struct net_device * netdev
Underlying network device.
Definition: efi_pxe.c:73
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition: list.h:93
struct tcpip_net_protocol * tcpip_net_protocol(sa_family_t sa_family)
Find TCP/IP network-layer protocol.
Definition: tcpip.c:68
void efi_nullify_pxe(EFI_PXE_BASE_CODE_PROTOCOL *pxe)
Nullify PXE base code protocol.
Definition: efi_null.c:536
static struct net_device * netdev
Definition: gdbudp.c:52
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition: efi_debug.c:652
static EFI_APPLE_NET_BOOT_PROTOCOL efi_apple_net_boot_protocol
Apple NetBoot protocol.
Definition: efi_pxe.c:1529
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:661
EFI Boot Services Table.
Definition: UefiSpec.h:1930
IP address structure.
Definition: in.h:41
EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES UninstallMultipleProtocolInterfaces
Definition: UefiSpec.h:2010
IP4_t ip
Destination IP address.
Definition: pxe_api.h:58
static struct interface_descriptor efi_pxe_udp_desc
PXE UDP interface descriptor.
Definition: efi_pxe.c:522
static struct net_device * netdev_get(struct net_device *netdev)
Get reference to network device.
Definition: netdevice.h:564
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:145
struct interface tftp
(M)TFTP download interface
Definition: efi_pxe.c:97
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition: list.h:45
EFI_GUID efi_apple_net_boot_protocol_guid
Apple NetBoot protocol GUID.
Definition: efi_guid.c:132
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
struct process process
UDP interface closer process.
Definition: efi_pxe.c:108
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
struct list_head queue
List of received UDP packets.
Definition: efi_pxe.c:106
#define FALSE
Definition: tlan.h:45
A network-layer protocol of the TCP/IP stack (eg.
Definition: tcpip.h:140
EFI_SYSTEM_TABLE * efi_systab
void efi_nullify_apple(EFI_APPLE_NET_BOOT_PROTOCOL *apple)
Nullify Apple Net Boot protocol.
Definition: efi_null.c:571
EFI_PXE_BASE_CODE_MODE * Mode
The pointer to the EFI_PXE_BASE_CODE_MODE data for this device.
Definition: PxeBaseCode.h:928
static void intf_init(struct interface *intf, struct interface_descriptor *desc, struct refcnt *refcnt)
Initialise an object interface.
Definition: interface.h:203
static void efi_pxe_free(struct refcnt *refcnt)
Free PXE base code.
Definition: efi_pxe.c:116
uint16_t handle
Handle.
Definition: smbios.h:16
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
static EFI_PXE_BASE_CODE_PROTOCOL efi_pxe_base_code_protocol
PXE base code protocol.
Definition: efi_pxe.c:1448
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:106

References AF_INET6, efi_pxe::apple, efi_pxe::base, EFI_SYSTEM_TABLE::BootServices, DBGC, EEFI, efi_apple_net_boot_protocol, efi_apple_net_boot_protocol_guid, 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(), handle, efi_pxe::handle, INIT_LIST_HEAD, EFI_BOOT_SERVICES::InstallMultipleProtocolInterfaces, intf_init(), ip, efi_pxe::list, list_add_tail, memcpy(), efi_pxe::mode, _EFI_PXE_BASE_CODE_PROTOCOL::Mode, efi_pxe::name, net_device::name, netdev, efi_pxe::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 1631 of file efi_pxe.c.

1631  {
1633  struct efi_pxe *pxe;
1634  int leak = efi_shutdown_in_progress;
1635  EFI_STATUS efirc;
1636 
1637  /* Locate PXE base code */
1638  pxe = efi_pxe_find ( handle );
1639  if ( ! pxe ) {
1640  DBG ( "PXE could not find base code for %s\n",
1641  efi_handle_name ( handle ) );
1642  return;
1643  }
1644 
1645  /* Stop base code */
1646  efi_pxe_stop ( &pxe->base );
1647 
1648  /* Uninstall PXE base code protocol */
1649  if ( ( ! efi_shutdown_in_progress ) &&
1650  ( ( efirc = bs->UninstallMultipleProtocolInterfaces (
1651  handle,
1654  NULL ) ) != 0 ) ) {
1655  DBGC ( pxe, "PXE %s could not uninstall: %s\n",
1656  pxe->name, strerror ( -EEFI ( efirc ) ) );
1657  leak = 1;
1658  }
1659  efi_nullify_pxe ( &pxe->base );
1660  efi_nullify_apple ( &pxe->apple );
1661 
1662  /* Remove from list and drop list's reference */
1663  list_del ( &pxe->list );
1664  if ( ! leak )
1665  ref_put ( &pxe->refcnt );
1666 
1667  /* Report leakage, if applicable */
1668  if ( leak && ( ! efi_shutdown_in_progress ) )
1669  DBGC ( pxe, "PXE %s nullified and leaked\n", pxe->name );
1670 }
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2098
static struct efi_pxe * efi_pxe_find(EFI_HANDLE handle)
Locate PXE base code.
Definition: efi_pxe.c:132
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:174
struct list_head list
List of PXE base codes.
Definition: efi_pxe.c:77
struct refcnt refcnt
Reference count.
Definition: efi_pxe.c:71
A PXE base code.
Definition: efi_pxe.c:69
EFI_PXE_BASE_CODE_PROTOCOL base
PXE base code protocol.
Definition: efi_pxe.c:82
#define DBGC(...)
Definition: compiler.h:505
EFI_APPLE_NET_BOOT_PROTOCOL apple
Apple NetBoot protocol.
Definition: efi_pxe.c:86
EFI_GUID efi_pxe_base_code_protocol_guid
PXE base code protocol GUID.
Definition: efi_guid.c:320
const char * name
Name.
Definition: efi_pxe.c:75
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
void efi_nullify_pxe(EFI_PXE_BASE_CODE_PROTOCOL *pxe)
Nullify PXE base code protocol.
Definition: efi_null.c:536
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition: efi_debug.c:652
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
EFI Boot Services Table.
Definition: UefiSpec.h:1930
EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES UninstallMultipleProtocolInterfaces
Definition: UefiSpec.h:2010
EFI_GUID efi_apple_net_boot_protocol_guid
Apple NetBoot protocol GUID.
Definition: efi_guid.c:132
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
EFI_SYSTEM_TABLE * efi_systab
void efi_nullify_apple(EFI_APPLE_NET_BOOT_PROTOCOL *apple)
Nullify Apple Net Boot protocol.
Definition: efi_null.c:571
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
static EFI_STATUS EFIAPI efi_pxe_stop(EFI_PXE_BASE_CODE_PROTOCOL *base)
Stop PXE base code.
Definition: efi_pxe.c:764
uint16_t handle
Handle.
Definition: smbios.h:16
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:106
int efi_shutdown_in_progress
EFI shutdown is in progress.
Definition: efi_init.c:59

References efi_pxe::apple, efi_pxe::base, EFI_SYSTEM_TABLE::BootServices, DBG, DBGC, EEFI, efi_apple_net_boot_protocol_guid, 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:334
void intf_close(struct interface *intf, int rc)
Close an object interface.
Definition: interface.c:249
A PXE base code.
Definition: efi_pxe.c:69
size_t xfer_window(struct interface *intf)
Check flow control window.
Definition: xfer.c:116
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:348
#define INTF_OP(op_type, object_type, op_func)
Define an object interface operation.
Definition: interface.h:32
int xfer_deliver(struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver datagram.
Definition: xfer.c:194
static void efi_pxe_tftp_close(struct efi_pxe *pxe, int rc)
Close PXE (M)TFTP download interface.
Definition: efi_pxe.c:319

PXE file data transfer interface operations.

Definition at line 366 of file efi_pxe.c.

◆ efi_pxe_tftp_desc

struct interface_descriptor efi_pxe_tftp_desc
static
Initial value:
=
A PXE base code.
Definition: efi_pxe.c:69
static struct interface_operation efi_pxe_tftp_operations[]
PXE file data transfer interface operations.
Definition: efi_pxe.c:366
struct interface tftp
(M)TFTP download interface
Definition: efi_pxe.c:97
#define INTF_DESC(object_type, intf, operations)
Define an object interface descriptor.
Definition: interface.h:80

PXE file data transfer interface descriptor.

Definition at line 373 of file efi_pxe.c.

Referenced by efi_pxe_install().

◆ efi_pxe_udp_operations

struct interface_operation efi_pxe_udp_operations[]
static
Initial value:
= {
}
void intf_close(struct interface *intf, int rc)
Close an object interface.
Definition: interface.c:249
A PXE base code.
Definition: efi_pxe.c:69
#define INTF_OP(op_type, object_type, op_func)
Define an object interface operation.
Definition: interface.h:32
int xfer_deliver(struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver datagram.
Definition: xfer.c:194
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:465
static void efi_pxe_udp_close(struct efi_pxe *pxe, int rc)
Close UDP interface.
Definition: efi_pxe.c:436

PXE UDP interface operations.

Definition at line 516 of file efi_pxe.c.

◆ efi_pxe_udp_desc

struct interface_descriptor efi_pxe_udp_desc
static
Initial value:
=
A PXE base code.
Definition: efi_pxe.c:69
struct interface udp
UDP interface.
Definition: efi_pxe.c:104
static struct interface_operation efi_pxe_udp_operations[]
PXE UDP interface operations.
Definition: efi_pxe.c:516
#define INTF_DESC(object_type, intf, operations)
Define an object interface descriptor.
Definition: interface.h:80

PXE UDP interface descriptor.

Definition at line 522 of file efi_pxe.c.

Referenced by efi_pxe_install().

◆ efi_pxe_process_desc

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

UDP close process descriptor.

Definition at line 582 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,
}
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:1293
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:1402
static EFI_STATUS EFIAPI efi_pxe_dhcp(EFI_PXE_BASE_CODE_PROTOCOL *base, BOOLEAN sort)
Perform DHCP.
Definition: efi_pxe.c:789
static EFI_STATUS EFIAPI efi_pxe_start(EFI_PXE_BASE_CODE_PROTOCOL *base, BOOLEAN use_ipv6)
Start PXE base code.
Definition: efi_pxe.c:709
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:1265
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:1317
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:1084
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:1362
#define EFI_PXE_BASE_CODE_PROTOCOL_REVISION
Definition: PxeBaseCode.h:891
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:843
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:970
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:887
static EFI_STATUS EFIAPI efi_pxe_stop(EFI_PXE_BASE_CODE_PROTOCOL *base)
Stop PXE base code.
Definition: efi_pxe.c:764

PXE base code protocol.

Definition at line 1448 of file efi_pxe.c.

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:1521
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:1505

Apple NetBoot protocol.

Definition at line 1529 of file efi_pxe.c.

Referenced by efi_pxe_install().