22 hours ago[tests] Verify ability to sleep the CPU coverity_scan master naptest
Michael Brown [Tue, 31 Jan 2023 10:17:57 +0000 (10:17 +0000)] 
[tests] Verify ability to sleep the CPU

The self-test suite does not currently ever attempt to sleep the CPU.
This is an operation that may fail (e.g. by attempting to execute a
privileged instruction while running as a Linux userspace binary, or
by halting the CPU with all interrupts disabled).

Add a trivial self-test to exercise the ability to sleep the CPU
without crashing or halting forever.

Inspired-by: Xiaotian Wu <wuxiaotian@loongson.cn>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
30 hours ago[dhcp] Add IANA-defined values for all current EFI client architectures
Michael Brown [Tue, 31 Jan 2023 01:56:56 +0000 (01:56 +0000)] 
[dhcp] Add IANA-defined values for all current EFI client architectures

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 days ago[efi] Accept a command line passed to an iPXE image via LoadOptions eficmdline
Michael Brown [Sun, 29 Jan 2023 18:48:08 +0000 (18:48 +0000)] 
[efi] Accept a command line passed to an iPXE image via LoadOptions

Treat a command line passed to iPXE via UEFI LoadOptions as an image
to be registered at startup, as is already done for the .lkrn, .pxe,
and .exe BIOS images.

Originally-implemented-by: Ladi Prosek <lprosek@redhat.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 days ago[la64] Import LoongArch64 ProcessorBind.h from EDK2 headers
Michael Brown [Sat, 28 Jan 2023 19:09:46 +0000 (19:09 +0000)] 
[la64] Import LoongArch64 ProcessorBind.h from EDK2 headers

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 days ago[efi] Update to current EDK2 headers
Michael Brown [Sat, 28 Jan 2023 15:32:26 +0000 (15:32 +0000)] 
[efi] Update to current EDK2 headers

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 days ago[efi] Mark ConsoleControl.h as a non-imported header
Michael Brown [Sat, 28 Jan 2023 15:22:22 +0000 (15:22 +0000)] 
[efi] Mark ConsoleControl.h as a non-imported header

The obsolete ConsoleControl.h header is no longer present in the
current EDK2 codebase, but is still required for interoperability with
old iMacs.

Add an iPXE include guard to this file so that the EDK2 header import
script will no longer attempt to import it from the EDK2 tree.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 days ago[efi] Remove deleted directories from EDK2 header import script
Michael Brown [Sat, 28 Jan 2023 15:24:54 +0000 (15:24 +0000)] 
[efi] Remove deleted directories from EDK2 header import script

The IntelFrameworkPkg and EdkCompatibilityPkg directories have been
removed from the EDK2 codebase.  Remove these directories from the
EDK2 header import script.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 days ago[efi] Allow for whitespace before #include in imported EDK2 header files
Michael Brown [Sat, 28 Jan 2023 15:36:23 +0000 (15:36 +0000)] 
[efi] Allow for whitespace before #include in imported EDK2 header files

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 days ago[efi] Detect SPDX licence identifiers in imported EDK2 headers
Michael Brown [Sat, 28 Jan 2023 15:31:28 +0000 (15:31 +0000)] 
[efi] Detect SPDX licence identifiers in imported EDK2 headers

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 days ago[legal] Add missing FILE_LICENCE declaration to efi_path.c
Michael Brown [Sat, 28 Jan 2023 17:15:16 +0000 (17:15 +0000)] 
[legal] Add missing FILE_LICENCE declaration to efi_path.c

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 days ago[legal] Add support for the BSD-2-Clause-Patent licence
Michael Brown [Sat, 28 Jan 2023 15:30:11 +0000 (15:30 +0000)] 
[legal] Add support for the BSD-2-Clause-Patent licence

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 days ago[efi] Build util/efirom as a host-only binary
Michael Brown [Sat, 28 Jan 2023 16:24:05 +0000 (16:24 +0000)] 
[efi] Build util/efirom as a host-only binary

As with util/elf2efi32 and util/elf2efi64 in commit a99e435 ("[efi] Do
not rely on ProcessorBind.h when building host binaries"), build
util/efirom without using any architecture-specific EDK2 headers since
the build host's CPU architecture may not be supported by EDK2.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
6 days ago[tcp] Update maximum window size to 2MB
Michael Brown [Wed, 25 Jan 2023 00:02:11 +0000 (00:02 +0000)] 
[tcp] Update maximum window size to 2MB

The current maximum window size of 256kB was calculated based on rough
link bandwidth and RTT measurements taken in 2012, and is too small to
avoid filling the TCP window on some modern links.

Update the list of typical link bandwidth and RTT figures to reflect
the modern world, and increase the maximum window size accordingly.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
6 days ago[pxe] Discard queued PXE UDP packets when under memory pressure
Michael Brown [Mon, 23 Jan 2023 22:20:36 +0000 (22:20 +0000)] 
[pxe] Discard queued PXE UDP packets when under memory pressure

The PXE UDP receive queue may grow without limit if the PXE NBP does
not call PXENV_UDP_READ sufficiently frequently.

Fix by implementing a cache discarder for received PXE UDP packets
(similar to the TCP cache discarder).

Reported-by: Tal Shorer <shorer@amazon.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
8 days ago[golan] Add new PCI ID for NVIDIA BlueField-3 network device
Mohammed Taha [Mon, 23 Jan 2023 22:52:30 +0000 (22:52 +0000)] 
[golan] Add new PCI ID for NVIDIA BlueField-3 network device

Signed-off-by: Michael Brown <mcb30@ipxe.org>
8 days ago[pxe] Avoid drawing menu items on bottom row of screen
Michael Brown [Mon, 23 Jan 2023 14:35:57 +0000 (14:35 +0000)] 
[pxe] Avoid drawing menu items on bottom row of screen

Many consoles will scroll immediately upon drawing a character in the
rightmost column of the bottom row of the display, in order to be able
to advance the cursor to the next character (even if the cursor is

This causes PXE menus to display incorrectly.  Specifically, pressing
the down arrow key while already on the last menu item may cause the
whole screen to scroll and the line to be duplicated.

Fix by moving the PXE menu one row up from the bottom of the screen.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
8 days ago[efi] Bind to only the topmost instance of the SNP or NII protocols snploop
Michael Brown [Mon, 23 Jan 2023 19:18:21 +0000 (19:18 +0000)] 
[efi] Bind to only the topmost instance of the SNP or NII protocols

UEFI has the mildly annoying habit of installing copies of the
EFI_SIMPLE_NETWORK_PROTOCOL instance on the IPv4 and IPv6 child device
handles.  This can cause iPXE's SNP driver to attempt to bind to a
copy of the EFI_SIMPLE_NETWORK_PROTOCOL that iPXE itself provided on a
different handle.

Fix by refusing to bind to an SNP (or NII) handle if there exists
another instance of the same protocol further up the device path (on
the basis that we always want to bind to the highest possible device).

Signed-off-by: Michael Brown <mcb30@ipxe.org>
8 days ago[efi] Extend efi_locate_device() to allow searching up the device path
Michael Brown [Mon, 23 Jan 2023 19:15:45 +0000 (19:15 +0000)] 
[efi] Extend efi_locate_device() to allow searching up the device path

Extend the functionality of efi_locate_device() to allow callers to
find instances of the protocol that may exist further up the device

Signed-off-by: Michael Brown <mcb30@ipxe.org>
8 days ago[efi] Add efi_path_prev() utility function
Michael Brown [Mon, 23 Jan 2023 19:12:49 +0000 (19:12 +0000)] 
[efi] Add efi_path_prev() utility function

Signed-off-by: Michael Brown <mcb30@ipxe.org>
8 days ago[efi] Add efi_path_terminate() utility function
Michael Brown [Mon, 23 Jan 2023 19:07:35 +0000 (19:07 +0000)] 
[efi] Add efi_path_terminate() utility function

Signed-off-by: Michael Brown <mcb30@ipxe.org>
8 days ago[arm] Inhibit linker warnings about an implied executable stack
Michael Brown [Mon, 23 Jan 2023 12:30:41 +0000 (12:30 +0000)] 
[arm] Inhibit linker warnings about an implied executable stack

Some versions of the 32-bit ARM linker seem to treat the absence of a
.note.GNU-stack section as implying an executable stack, and will
print a warning that this is deprecated behaviour.

Silence the warning by adding a .note.GNU-stack section to each
assembly file and retaining the sections in the Linux linker script.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
9 days ago[arm] Use -mfloat-abi=soft only for EFI builds
Michael Brown [Mon, 23 Jan 2023 01:32:14 +0000 (01:32 +0000)] 
[arm] Use -mfloat-abi=soft only for EFI builds

The EFI ABI requires the use of -mfloat-abi=soft, but other platforms
may require -mfloat-abi=hard.

Allow for this by using -mfloat-abi=soft only for EFI builds.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
9 days ago[arm] Use -fno-short-enums for all 32-bit ARM builds
Michael Brown [Mon, 23 Jan 2023 01:26:46 +0000 (01:26 +0000)] 
[arm] Use -fno-short-enums for all 32-bit ARM builds

The EFI ABI requires the use of -fno-short-enums, and the EDK2 headers
will perform a compile-time check that enums are 32 bits.

The EDK2 headers may be included even in builds for non-EFI platforms,
and so the -fno-short-enums flag must be used in all 32-bit ARM
builds.  Fortunately, nothing else currently cares about enum sizes.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
9 days ago[arm] Support building as a Linux userspace binary for AArch64
Michael Brown [Sun, 22 Jan 2023 20:31:30 +0000 (20:31 +0000)] 
[arm] Support building as a Linux userspace binary for AArch64

Add support for building as a Linux userspace binary for AArch64.
This allows the self-test suite to be more easily run for the 64-bit
ARM code.  For example:

  # On a native AArch64 system:
  make bin-arm64-efi/tests.linux && ./bin-arm64-efi/tests.linux

  # On a non-AArch64 system (e.g. x86_64) via cross-compilation,
  # assuming that kernel and glibc headers are present within
  # /usr/aarch64-linux-gnu/sys-root/:
  make bin-arm64-linux/tests.linux CROSS=aarch64-linux-gnu- && \
  qemu-aarch64 -L /usr/aarch64-linux-gnu/sys-root/ \

Signed-off-by: Michael Brown <mcb30@ipxe.org>
9 days ago[dhcp] Simplify platform-specific client architecture definitions
Michael Brown [Sun, 22 Jan 2023 16:54:20 +0000 (16:54 +0000)] 
[dhcp] Simplify platform-specific client architecture definitions

Move the platform-specific DHCP client architecture definitions to
header files of the form <ipxe/$(PLATFORM)/dhcparch.h>.  This
simplifies the directory structure and allows the otherwise unused
arch/$(ARCH)/include/$(PLATFORM) to be removed from the include
directory search path, which avoids the confusing situation in which a
header file may potentially be accessed through more than one path.

For Linux userspace binaries on any architecture, use the EFI values
for that architecture by delegating to the EFI header file.  This
avoids the need to explicitly select values for Linux userspace
binaries for each architecture.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
9 days ago[build] Move -Ulinux to common Makefile
Michael Brown [Sun, 22 Jan 2023 16:15:55 +0000 (16:15 +0000)] 
[build] Move -Ulinux to common Makefile

The requirement to undo the implicit "-Dlinux" is not specific to the
x86 architecture.  Move this out of the x86-specific Makefile.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
9 days ago[linux] Centralise the linker script for Linux binaries
Michael Brown [Sun, 22 Jan 2023 12:05:14 +0000 (12:05 +0000)] 
[linux] Centralise the linker script for Linux binaries

Reduce duplication between i386 and x86_64 by providing a single
shared linker script that both architectures can include.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
12 days ago[efi] Do not rely on ProcessorBind.h when building host binaries processorbind
Michael Brown [Fri, 20 Jan 2023 00:13:04 +0000 (00:13 +0000)] 
[efi] Do not rely on ProcessorBind.h when building host binaries

We cannot rely on the EDK2 ProcessorBind.h headers when compiling a
binary for execution on the build host itself (e.g. elf2efi), since
the host's CPU architecture may not even be supported by EDK2.

Fix by skipping ProcessorBind.h when building a host binary, and
defining the bare minimum required to allow other EDK2 headers to
compile cleanly.

Reported-by: Michal Suchánek <msuchanek@suse.de>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
13 days ago[ena] Allocate an unused Asynchronous Event Notification Queue (AENQ) aenq
Alexander Graf [Mon, 16 Jan 2023 21:56:53 +0000 (21:56 +0000)] 
[ena] Allocate an unused Asynchronous Event Notification Queue (AENQ)

We currently don't allocate an Asynchronous Event Notification Queue
(AENQ) because we don't actually care about any of the events that may
come in.

The ENA firmware found on Graviton instances requires the AENQ to
exist, otherwise all admin queue commands will fail.

Fix by allocating an AENQ and disabling all events (so that we do not
need to include code to acknowledge any events that may arrive).

Signed-off-by: Alexander Graf <graf@amazon.com>
2 weeks ago[netdevice] Ensure consistent interpretation of "netX" device name
Michael Brown [Tue, 17 Jan 2023 12:42:46 +0000 (12:42 +0000)] 
[netdevice] Ensure consistent interpretation of "netX" device name

Ensure that the "${netX/...}" settings mechanism always uses the same
interpretation of the network device corresponding to "netX" as any
other mechanism that performs a name-based lookup of a network device.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 weeks ago[efi] Create VLAN autoboot device automatically autovlan
Michael Brown [Sun, 15 Jan 2023 22:42:30 +0000 (22:42 +0000)] 
[efi] Create VLAN autoboot device automatically

When chainloading iPXE from an EFI VLAN device, configure the
corresponding iPXE VLAN device to be created automatically.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 weeks ago[vlan] Support automatic VLAN device creation
Michael Brown [Sun, 15 Jan 2023 22:35:44 +0000 (22:35 +0000)] 
[vlan] Support automatic VLAN device creation

Add the ability to automatically create a VLAN device for a specified
trunk device link-layer address and VLAN tag.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 weeks ago[autoboot] Include VLAN tag in filter for identifying autoboot device
Michael Brown [Sun, 15 Jan 2023 21:36:08 +0000 (21:36 +0000)] 
[autoboot] Include VLAN tag in filter for identifying autoboot device

When chainloading iPXE from a VLAN device, the MAC address of the
loaded image's device handle will match the MAC address of the trunk
device created by iPXE, and the autoboot process will then erroneously
consider the trunk device to be an autoboot device.

Fix by recording the VLAN tag along with the MAC address, and treating
the VLAN tag as part of the filter used to match the MAC address
against candidate network devices.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 weeks ago[netdevice] Allow duplicate MAC addresses
Michael Brown [Sat, 14 Jan 2023 00:31:54 +0000 (00:31 +0000)] 
[netdevice] Allow duplicate MAC addresses

Many laptops now include the ability to specify a "system-specific MAC
address" (also known as "pass-through MAC"), which is supposed to be
used for both the onboard NIC and for any attached docking station or
other USB NIC.  This is intended to simplify interoperability with
software or hardware that relies on a MAC address to recognise an
individual machine: for example, a deployment server may associate the
MAC address with a particular operating system image to be deployed.
This therefore creates legitimate situations in which duplicate MAC
addresses may exist within the same system.

As described in commit 98d09a1 ("[netdevice] Avoid registering
duplicate network devices"), the Xen netfront driver relies on the
rejection of duplicate MAC addresses in order to inhibit registration
of the emulated PCI devices that a Xen PV-HVM guest will create to
shadow each of the paravirtual network devices.

Move the code that rejects duplicate MAC addresses from the network
device core to the Xen netfront driver, to allow for the existence of
duplicate MAC addresses in non-Xen setups.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 weeks ago[netdevice] Separate concept of scope ID from network device name index
Michael Brown [Sat, 14 Jan 2023 00:09:20 +0000 (00:09 +0000)] 
[netdevice] Separate concept of scope ID from network device name index

The network device index currently serves two purposes: acting as a
sequential index for network device names ("net0", "net1", etc), and
acting as an opaque unique integer identifier used in socket address
scope IDs.

There is no particular need for these usages to be linked, and it can
lead to situations in which devices are named unexpectedly.  For
example: if a system has two network devices "net0" and "net1", a VLAN
is created as "net1-42", and then a USB NIC is connected, then the USB
NIC will be named "net3" rather than the expected "net2" since the
VLAN device "net1-42" will have consumed an index.

Separate the usages: rename the "index" field to "scope_id" (matching
its one and only use case), and assign the name without reference to
the scope ID by finding the first unused name.  For consistency,
assign the scope ID by similarly finding the first unused scope ID.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 weeks ago[efi] Disable receive filters to work around buggy UNDI drivers
Michael Brown [Wed, 11 Jan 2023 00:18:18 +0000 (00:18 +0000)] 
[efi] Disable receive filters to work around buggy UNDI drivers

Some UNDI drivers (such as the AMI UsbNetworkPkg currently in the
process of being upstreamed into EDK2) have a bug that will prevent
any packets from being received unless at least one attempt has been
made to disable some receive filters.

Work around these buggy drivers by attempting to disable receive
filters before enabling them.  Ignore any errors, since we genuinely
do not care whether or not the disabling succeeds.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 weeks ago[cachedhcp] Retain cached DHCPACK after startup if not already consumed
Michael Brown [Thu, 22 Dec 2022 15:12:34 +0000 (15:12 +0000)] 
[cachedhcp] Retain cached DHCPACK after startup if not already consumed

We currently free an unclaimed cached DHCPACK immediately after
startup, in order to free up memory.  This prevents the cached DHCPACK
from being applied to a device that is created after startup, such as
a VLAN device created via the "vcreate" command.

Retain any unclaimed DHCPACK after startup to allow it to be matched
against (and applied to) any device that gets created at runtime.
Free the DHCPACK during shutdown if it still remains unclaimed, in
order to exit with memory cleanly freed.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 weeks ago[cachedhcp] Include VLAN tag in filter for applying cached DHCPACK
Michael Brown [Thu, 22 Dec 2022 14:59:29 +0000 (14:59 +0000)] 
[cachedhcp] Include VLAN tag in filter for applying cached DHCPACK

When chainloading iPXE from a VLAN device, the MAC address within the
cached DHCPACK will match the MAC address of the trunk device created
by iPXE, and the cached DHCPACK will then end up being erroneously
applied to the trunk device.  This tends to break outbound IPv4
routing, since both the trunk and VLAN devices will have the same
assigned IPv4 address.

Fix by recording the VLAN tag along with the cached DHCPACK, and
treating the VLAN tag as part of the filter used to match the cached
DHCPACK against candidate network devices.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 weeks ago[efi] Add efi_path_vlan() utility function
Michael Brown [Thu, 22 Dec 2022 14:27:56 +0000 (14:27 +0000)] 
[efi] Add efi_path_vlan() utility function

EFI provides no API for determining the VLAN tag (if any) for a
specified device handle.  There is the EFI_VLAN_CONFIG_PROTOCOL, but
that exists only on the trunk device handle (not on the VLAN device
handle), and provides no way to match VLAN tags against the trunk
device's child device handles.

The EDK2 codebase seems to rely solely on the device path to determine
the VLAN tag for a specified device handle: both NetLibGetVlanId() and
BmGetNetworkDescription() will parse the device path to search for a

Add efi_path_vlan() which uses the same device path parsing logic to
determine the VLAN tag.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 weeks ago[efi] Expose efi_path_next() utility function
Michael Brown [Thu, 22 Dec 2022 13:33:38 +0000 (13:33 +0000)] 
[efi] Expose efi_path_next() utility function

Provide a single central implementation of the logic for stepping
through elements of an EFI device path.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 weeks ago[efi] Allow passing a NULL device path to path utility functions
Michael Brown [Thu, 22 Dec 2022 13:28:06 +0000 (13:28 +0000)] 
[efi] Allow passing a NULL device path to path utility functions

Signed-off-by: Michael Brown <mcb30@ipxe.org>
6 weeks ago[efi] Provide VLAN configuration protocol
Michael Brown [Tue, 13 Dec 2022 14:45:44 +0000 (14:45 +0000)] 
[efi] Provide VLAN configuration protocol

UEFI implements VLAN support within the Managed Network Protocol (MNP)
driver, which may create child VLAN devices automatically based on
stored UEFI variables.  These child devices do not themselves provide
a raw-packet interface via EFI_SIMPLE_NETWORK_PROTOCOL, and may be
consumed only via the EFI_MANAGED_NETWORK_PROTOCOL interface.

The device paths constructed for these child devices may conflict with
those for the EFI_SIMPLE_NETWORK_PROTOCOL instances that iPXE attempts
to install for its own VLAN devices.  The upshot is that creating an
iPXE VLAN device (e.g. via the "vcreate" command) will fail if the
UEFI Managed Network Protocol has already created a device for the
same VLAN tag.

Fix by providing our own EFI_VLAN_CONFIG_PROTOCOL instance on the same
device handle as EFI_SIMPLE_NETWORK_PROTOCOL.  This causes the MNP
driver to treat iPXE's device as supporting hardware VLAN offload, and
it will therefore not attempt to install its own instance of the

Signed-off-by: Michael Brown <mcb30@ipxe.org>
6 weeks ago[vlan] Allow external code to identify VLAN priority as well as tag
Michael Brown [Fri, 9 Dec 2022 14:40:54 +0000 (14:40 +0000)] 
[vlan] Allow external code to identify VLAN priority as well as tag

Signed-off-by: Michael Brown <mcb30@ipxe.org>
7 weeks ago[build] Disable dangling pointer checking for GCC gcc12
Michael Brown [Wed, 14 Dec 2022 01:26:03 +0000 (01:26 +0000)] 
[build] Disable dangling pointer checking for GCC

The dangling pointer warning introduced in GCC 12 reports false
positives that result in build failures.  In particular, storing the
address of a local code label used to record the current state of a
state machine (as done in crypto/deflate.c) is reported as an error.

There seems to be no way to mark the pointer type as being permitted
to hold such a value, so unconditionally disable the warning.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
7 weeks ago[build] Disable array bounds checking for GCC
Michael Brown [Wed, 14 Dec 2022 00:51:00 +0000 (00:51 +0000)] 
[build] Disable array bounds checking for GCC

The array bounds checker on GCC 12 and newer reports a very large
number of false positives that result in build failures.  In
particular, accesses through pointers to zero-length arrays (such as
those used by the linker table mechanism in include/ipxe/tables.h) are
reported as errors, contrary to the GCC documentation.

Work around this GCC issue by unconditionally disabling the warning.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[intel] Add PCI ID for I219-V and -LM 16,17
Christian I. Nilsson [Tue, 15 Nov 2022 13:05:28 +0000 (13:05 +0000)] 
[intel] Add PCI ID for I219-V and -LM 16,17

Signed-off-by: Christian I. Nilsson <nikize@gmail.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[pci] Backup and restore standard config space across PCIe FLR
Michael Brown [Sun, 13 Nov 2022 20:45:38 +0000 (20:45 +0000)] 
[pci] Backup and restore standard config space across PCIe FLR

The behaviour of PCI devices across a function-level reset seems to be
inconsistent in practice: some devices will preserve PCI BARs, some
will not.

Fix the behaviour of FLR on devices that do not preserve PCI BARs by
backing up and restoring PCI configuration space across the reset.
Preserve only the standard portion of the configuration space, since
there may be registers with unexpected side effects in the remaining
non-standardised space.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[pci] Allow PCI config space backup to be limited by maximum offset
Michael Brown [Sun, 13 Nov 2022 20:42:09 +0000 (20:42 +0000)] 
[pci] Allow PCI config space backup to be limited by maximum offset

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[tls] Add GCM cipher suites
Michael Brown [Mon, 7 Nov 2022 18:09:09 +0000 (18:09 +0000)] 
[tls] Add GCM cipher suites

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[tests] Verify ability to perform in-place encryption and decryption
Michael Brown [Wed, 9 Nov 2022 16:50:01 +0000 (16:50 +0000)] 
[tests] Verify ability to perform in-place encryption and decryption

TLS relies upon the ability of ciphers to perform in-place decryption,
in order to avoid allocating additional I/O buffers for received data.

Add verification of in-place encryption and decryption to the cipher

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[crypto] Support in-place decryption for GCM ciphers
Michael Brown [Wed, 9 Nov 2022 16:48:04 +0000 (16:48 +0000)] 
[crypto] Support in-place decryption for GCM ciphers

The hash calculation is currently performed incorrectly when
decrypting in place, since the ciphertext will have been overwritten
with the plaintext before being used to update the hash value.

Restructure the code to allow for in-place encryption and decryption.
Choose to optimise for the decryption case, since we are likely to
decrypt much more data than we encrypt.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[tests] Verify ability to reset cipher initialisation vector
Michael Brown [Wed, 9 Nov 2022 16:14:42 +0000 (16:14 +0000)] 
[tests] Verify ability to reset cipher initialisation vector

TLS relies upon the ability to reuse a cipher by resetting only the
initialisation vector while reusing the existing key.

Add verification of resetting the initialisation vector to the cipher

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[crypto] Ensure relevant GCM cipher state is cleared by cipher_setiv()
Michael Brown [Wed, 9 Nov 2022 16:45:54 +0000 (16:45 +0000)] 
[crypto] Ensure relevant GCM cipher state is cleared by cipher_setiv()

Reset the accumulated authentication state when cipher_setiv() is
called, to allow the cipher to be reused without resetting the key.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[tls] Allow handshake digest algorithm to be specified by cipher suite
Michael Brown [Wed, 9 Nov 2022 14:04:43 +0000 (14:04 +0000)] 
[tls] Allow handshake digest algorithm to be specified by cipher suite

All existing cipher suites use SHA-256 as the TLSv1.2 and above
handshake digest algorithm (even when using SHA-1 as the MAC digest
algorithm).  Some GCM cipher suites use SHA-384 as the handshake
digest algorithm.

Allow the cipher suite to specify the handshake (and PRF) digest
algorithm to be used for TLSv1.2 and above.

This requires some restructuring to allow for the fact that the
ClientHello message must be included within the handshake digest, even
though the relevant digest algorithm is not yet known at the point
that the ClientHello is sent.  Fortunately, the ClientHello may be
reproduced verbatim at the point of receiving the ServerHello, so we
rely on reconstructing (rather than storing) this message.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[tls] Always send maximum supported version in ClientHello
Michael Brown [Wed, 9 Nov 2022 14:01:15 +0000 (14:01 +0000)] 
[tls] Always send maximum supported version in ClientHello

Always send the maximum supported version in our ClientHello message,
even when performing renegotiation (in which case the current version
may already be lower than the maximum supported version).

This is permitted by the specification, and allows the ClientHello to
be reconstructed verbatim at the point of selecting the handshake
digest algorithm in tls_new_server_hello().

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[tls] Add support for AEAD ciphers
Michael Brown [Tue, 8 Nov 2022 14:29:08 +0000 (14:29 +0000)] 
[tls] Add support for AEAD ciphers

Allow for AEAD cipher suites where the MAC length may be zero and the
authentication is instead provided by an authenticating cipher, with
the plaintext authentication tag appended to the ciphertext.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[tls] Treat invalid block padding as zero length padding
Michael Brown [Tue, 8 Nov 2022 15:10:25 +0000 (15:10 +0000)] 
[tls] Treat invalid block padding as zero length padding

Harden against padding oracle attacks by treating invalid block
padding as zero length padding, thereby deferring the failure until
after computing the (incorrect) MAC.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[tls] Allow for arbitrary-length initialisation vectors
Michael Brown [Mon, 7 Nov 2022 23:42:02 +0000 (23:42 +0000)] 
[tls] Allow for arbitrary-length initialisation vectors

Restructure the encryption and decryption operations to allow for the
use of ciphers where the initialisation vector is constructed by
concatenating the fixed IV (derived as part of key expansion) with a
record IV (prepended to the ciphertext).

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[tls] Add MAC length as a cipher suite parameter
Michael Brown [Mon, 7 Nov 2022 18:11:36 +0000 (18:11 +0000)] 
[tls] Add MAC length as a cipher suite parameter

TLS stream and block ciphers use a MAC with a length equal to the
output length of the digest algorithm in use.  For AEAD ciphers there
is no MAC, with the equivalent functionality provided by the cipher
algorithm's authentication tag.

Allow for the existence of AEAD cipher suites by making the MAC length
a parameter of the cipher suite.

Assume that the MAC key length is equal to the MAC length, since this
is true for all currently supported cipher suites.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[tls] Abstract out concept of a TLS authentication header
Michael Brown [Mon, 7 Nov 2022 18:34:37 +0000 (18:34 +0000)] 
[tls] Abstract out concept of a TLS authentication header

All TLS cipher types use a common structure for the per-record data
that is authenticated in addition to the plaintext itself.  This data
is used as a prefix in the HMAC calculation for stream and block
ciphers, or as additional authenticated data for AEAD ciphers.

Define a "TLS authentication header" structure to hold this data as a
contiguous block, in order to meet the alignment requirement for AEAD
ciphers such as GCM.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[tls] Ensure cipher alignment size is respected
Michael Brown [Sun, 30 Oct 2022 13:05:01 +0000 (13:05 +0000)] 
[tls] Ensure cipher alignment size is respected

Adjust the length of the first received ciphertext data buffer to
ensure that all decryption operations respect the cipher's alignment

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[crypto] Add concept of cipher alignment size
Michael Brown [Fri, 28 Oct 2022 15:27:10 +0000 (16:27 +0100)] 
[crypto] Add concept of cipher alignment size

The GCM cipher mode of operation (in common with other counter-based
modes of operation) has a notion of blocksize that does not neatly
fall into our current abstraction: it does operate in 16-byte blocks
but allows for an arbitrary overall data length (i.e. the final block
may be incomplete).

Model this by adding a concept of alignment size.  Each call to
encrypt() or decrypt() must begin at a multiple of the alignment size
from the start of the data stream.  This allows us to model GCM by
using a block size of 1 byte and an alignment size of 16 bytes.

As a side benefit, this same concept allows us to neatly model the
fact that raw AES can encrypt only a single 16-byte block, by
specifying an alignment size of zero on this cipher.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[tls] Formalise notions of fixed and record initialisation vectors
Michael Brown [Fri, 28 Oct 2022 12:06:11 +0000 (13:06 +0100)] 
[tls] Formalise notions of fixed and record initialisation vectors

TLS block ciphers always use CBC (as per RFC 5246 section
with a record initialisation vector length that is equal to the cipher
block size, and no fixed initialisation vector.

The initialisation vector for AEAD ciphers such as GCM is less
straightforward, and requires both a fixed and per-record component.

Extend the definition of a cipher suite to include fixed and record
initialisation vector lengths, and generate the fixed portion (if any)
as part of key expansion.

Do not add explicit calls to cipher_setiv() in tls_assemble_block()
and tls_split_block(), since the constraints imposed by RFC 5246 are
specifically chosen to allow implementations to avoid doing so.
(Instead, add a sanity check that the record initialisation vector
length is equal to the cipher block size.)

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[tls] Remove support for TLSv1.0
Michael Brown [Fri, 28 Oct 2022 10:06:26 +0000 (11:06 +0100)] 
[tls] Remove support for TLSv1.0

The TLSv1.0 protocol was deprecated by RFC 8996 (along with TLSv1.1),
and has been disabled by default in iPXE since commit dc785b0fb
("[tls] Default to supporting only TLSv1.1 or above") in June 2020.

While there is value in continuing to support older protocols for
interoperability with older server appliances, the additional
complexity of supporting the implicit initialisation vector for
TLSv1.0 is not worth the cost.

Remove support for the obsolete TLSv1.0 protocol, to reduce complexity
of the implementation and simplify ongoing maintenance.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[efi] Clear DMA-coherent buffers before mapping ioactive
Michael Brown [Fri, 4 Nov 2022 20:28:09 +0000 (20:28 +0000)] 
[efi] Clear DMA-coherent buffers before mapping

The DMA mapping is performed implicitly as part of the call to
dma_alloc().  The current implementation creates the IOMMU mapping for
the allocated and potentially uninitialised data before returning to
the caller (which will immediately zero out or otherwise initialise
the buffer).  This leaves a small window within which a malicious PCI
device could potentially attempt to retrieve firmware-owned secrets
present in the uninitialised buffer.  (Note that the hypothetically
malicious PCI device has no viable way to know the address of the
buffer from which to attempt a DMA read, rendering the attack
extremely implausible.)

Guard against any such hypothetical attacks by zeroing out the
allocated buffer prior to creating the coherent DMA mapping.

Suggested-by: Mateusz Siwiec <Mateusz.Siwiec@ioactive.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[bzimage] Fix parsing of "vga=..." when not at end of command line vgafix
Michael Brown [Thu, 27 Oct 2022 11:58:33 +0000 (12:58 +0100)] 
[bzimage] Fix parsing of "vga=..." when not at end of command line

bzimage_parse_cmdline() uses strcmp() to identify the named "vga=..."
kernel command line option values, which will give a false negative if
the option is not last on the command line.

Fix by temporarily changing the relevant command line separator (if
any) to a NUL terminator.

Debugged-by: Simon Rettberg <simon.rettberg@rz.uni-freiburg.de>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[crypto] Add block cipher Galois/Counter mode of operation
Michael Brown [Mon, 24 Oct 2022 17:52:21 +0000 (18:52 +0100)] 
[crypto] Add block cipher Galois/Counter mode of operation

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[crypto] Add concept of authentication tag to cipher algorithms
Michael Brown [Mon, 24 Oct 2022 18:20:41 +0000 (19:20 +0100)] 
[crypto] Add concept of authentication tag to cipher algorithms

Some ciphers (such as GCM) support the concept of a tag that can be
used to authenticate the encrypted data.  Add a cipher method for
generating an authentication tag.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[crypto] Add concept of additional data to cipher algorithms
Michael Brown [Mon, 24 Oct 2022 17:49:43 +0000 (18:49 +0100)] 
[crypto] Add concept of additional data to cipher algorithms

Some ciphers (such as GCM) support the concept of additional
authenticated data, which does not appear in the ciphertext but may
affect the operation of the cipher.

Allow cipher_encrypt() and cipher_decrypt() to be called with a NULL
destination buffer in order to pass additional data.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[crypto] Allow initialisation vector length to vary from cipher blocksize
Michael Brown [Mon, 24 Oct 2022 15:52:24 +0000 (16:52 +0100)] 
[crypto] Allow initialisation vector length to vary from cipher blocksize

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[crypto] Expose null crypto algorithm methods for reuse
Michael Brown [Tue, 25 Oct 2022 11:59:06 +0000 (12:59 +0100)] 
[crypto] Expose null crypto algorithm methods for reuse

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[tls] Add support for DHE variants of the existing cipher suites
Michael Brown [Tue, 11 Oct 2022 12:57:05 +0000 (13:57 +0100)] 
[tls] Add support for DHE variants of the existing cipher suites

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[tls] Add support for Ephemeral Diffie-Hellman key exchange HEAD
Michael Brown [Tue, 11 Oct 2022 12:55:56 +0000 (13:55 +0100)] 
[tls] Add support for Ephemeral Diffie-Hellman key exchange

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[tls] Add key exchange mechanism to definition of cipher suite
Michael Brown [Tue, 11 Oct 2022 12:54:34 +0000 (13:54 +0100)] 
[tls] Add key exchange mechanism to definition of cipher suite

Allow for the key exchange mechanism to vary depending upon the
selected cipher suite.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[tls] Record ServerKeyExchange record, if provided
Michael Brown [Tue, 11 Oct 2022 12:49:57 +0000 (13:49 +0100)] 
[tls] Record ServerKeyExchange record, if provided

Accept and record the ServerKeyExchange record, which is required for
key exchange mechanisms such as Ephemeral Diffie-Hellman (DHE).

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[tls] Generate pre-master secret at point of sending ClientKeyExchange
Michael Brown [Tue, 11 Oct 2022 12:47:06 +0000 (13:47 +0100)] 
[tls] Generate pre-master secret at point of sending ClientKeyExchange

The pre-master secret is currently constructed at the time of
instantiating the TLS connection.  This precludes the use of key
exchange mechanisms such as Ephemeral Diffie-Hellman (DHE), which
require a ServerKeyExchange message to exchange additional key
material before the pre-master secret can be constructed.

Allow for the use of such cipher suites by deferring generation of the
master secret until the point of sending the ClientKeyExchange

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[tls] Generate master secret at point of sending ClientKeyExchange
Michael Brown [Thu, 6 Oct 2022 15:06:44 +0000 (16:06 +0100)] 
[tls] Generate master secret at point of sending ClientKeyExchange

The master secret is currently constructed upon receiving the
ServerHello message.  This precludes the use of key exchange
mechanisms such as Ephemeral Diffie-Hellman (DHE), which require a
ServerKeyExchange message to exchange additional key material before
the pre-master secret and master secret can be constructed.

Allow for the use of such cipher suites by deferring generation of the
master secret until the point of sending the ClientKeyExchange

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[crypto] Add Ephemeral Diffie-Hellman key exchange algorithm
Michael Brown [Tue, 4 Oct 2022 14:03:28 +0000 (15:03 +0100)] 
[crypto] Add Ephemeral Diffie-Hellman key exchange algorithm

Add an implementation of the Ephemeral Diffie-Hellman key exchange
algorithm as defined in RFC2631, with test vectors taken from the NIST
Cryptographic Toolkit.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[crypto] Simplify internal HMAC API
Michael Brown [Sun, 9 Oct 2022 14:14:41 +0000 (15:14 +0100)] 
[crypto] Simplify internal HMAC API

Simplify the internal HMAC API so that the key is provided only at the
point of calling hmac_init(), and the (potentially reduced) key is
stored as part of the context for later use by hmac_final().

This simplifies the calling code, and avoids the need for callers such
as TLS to allocate a potentially variable length block in order to
retain a copy of the unmodified key.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[test] Add HMAC self-tests
Michael Brown [Mon, 10 Oct 2022 11:01:38 +0000 (12:01 +0100)] 
[test] Add HMAC self-tests

The HMAC code is already tested indirectly via several consuming
algorithms that themselves provide self-tests (e.g. HMAC-DRBG, NTLM
authentication, and PeerDist content identification), but lacks any
direct test vectors.

Add explicit HMAC tests and ensure that corner cases such as empty
keys, block-length keys, and over-length keys are all covered.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[ena] Assign memory BAR if left empty by BIOS
Michael Brown [Mon, 19 Sep 2022 16:49:25 +0000 (17:49 +0100)] 
[ena] Assign memory BAR if left empty by BIOS

Some BIOSes in AWS EC2 (observed with a c6i.metal instance in
eu-west-2) will fail to assign an MMIO address to the ENA device,
which causes ioremap() to fail.

Experiments show that the ENA device is the only device behind its
bridge, even when multiple ENA devices are present, and that the BIOS
does assign a memory window to the bridge.

We may therefore choose to assign the device an MMIO address at the
start of the bridge's memory window.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[pci] Add minimal PCI bridge driver
Michael Brown [Mon, 19 Sep 2022 16:47:57 +0000 (17:47 +0100)] 
[pci] Add minimal PCI bridge driver

Add a minimal driver for PCI bridges that can be used to locate the
bridge to which a PCI device is attached.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[pci] Select PCI I/O API at runtime for cloud images
Michael Brown [Sun, 18 Sep 2022 12:41:21 +0000 (13:41 +0100)] 
[pci] Select PCI I/O API at runtime for cloud images

Pretty much all physical machines and off-the-shelf virtual machines
will provide a functional PCI BIOS.  We therefore default to using
only the PCI BIOS, with no fallback to an alternative mechanism if the
PCI BIOS fails.

AWS EC2 provides the opportunity to experience some exceptions to this
rule.  For example, the t3a.nano instances in eu-west-1 have no
functional PCI BIOS at all.  As of commit 83516ba ("[cloud] Use
PCIAPI_DIRECT for cloud images") we therefore use direct Type 1
configuration space accesses in the images built and published for use
in the cloud.

Recent experience has discovered yet more variation in AWS EC2
instances.  For example, some of the metal instance types have
multiple PCI host bridges and the direct Type 1 accesses therefore
see only a subset of the PCI devices.

Attempt to accommodate future such variations by making the PCI I/O
API selectable at runtime and choosing ECAM (if available), falling
back to the PCI BIOS (if available), then finally falling back to
direct Type 1 accesses.

This is implemented as a dedicated PCIAPI_CLOUD API, rather than by
having the PCI core select a suitable API at runtime (as was done for
timers in commit 302f1ee ("[time] Allow timer to be selected at
runtime").  The common case will remain that only the PCI BIOS API is
required, and we would prefer to retain the optimisations that come
from inlining the configuration space accesses in this common case.
Cloud images are (at present) disk images rather than ROM images, and
so the increased code size required for this design approach in the
PCIAPI_CLOUD case is acceptable.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[bios] Allow pcibios_discover() to return an empty range
Michael Brown [Sun, 18 Sep 2022 12:35:58 +0000 (13:35 +0100)] 
[bios] Allow pcibios_discover() to return an empty range

Allow pcibios_discover() to return an empty range if the INT 1A,B101
PCI BIOS installation check call fails.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[pci] Add support for the Enhanced Configuration Access Mechanism (ECAM)
Michael Brown [Wed, 14 Sep 2022 13:29:52 +0000 (14:29 +0100)] 
[pci] Add support for the Enhanced Configuration Access Mechanism (ECAM)

The ACPI MCFG table describes a direct mapping of PCI configuration
space into MMIO space.  This mapping allows access to extended
configuration space (up to 4096 bytes) and also provides for the
existence of multiple host bridges.

Add support for the ECAM mechanism described by the ACPI MCFG table,
as a selectable PCI I/O API alongside the existing PCI BIOS and Type 1

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[pci] Generalise pci_num_bus() to pci_discover()
Michael Brown [Thu, 15 Sep 2022 15:47:04 +0000 (16:47 +0100)] 
[pci] Generalise pci_num_bus() to pci_discover()

Allow pci_find_next() to discover devices beyond the first PCI
segment, by generalising pci_num_bus() (which implicitly assumes that
there is only a single PCI segment) with pci_discover() (which has the
ability to return an arbitrary contiguous chunk of PCI bus:dev.fn
address space).

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[pci] Check for wraparound in callers of pci_find_next()
Michael Brown [Thu, 15 Sep 2022 14:04:01 +0000 (15:04 +0100)] 
[pci] Check for wraparound in callers of pci_find_next()

The semantics of the bus:dev.fn parameter passed to pci_find_next()
are "find the first existent PCI device at this address or higher",
with the caller expected to increment the address between finding
devices.  This does not allow the parameter to distinguish between the
two cases "start from address zero" and "wrapped after incrementing
maximal possible address", which could therefore lead to an infinite
loop in the degenerate case that a device with address ffff:ff:1f.7
really exists.

Fix by checking for wraparound in the caller (which is already
responsible for performing the increment).

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[pci] Allow pci_find_next() to return non-zero PCI segments
Michael Brown [Thu, 15 Sep 2022 13:55:26 +0000 (14:55 +0100)] 
[pci] Allow pci_find_next() to return non-zero PCI segments

Separate the return status code from the returned PCI bus:dev.fn
address, in order to allow pci_find_next() to be used to find devices
with a non-zero PCI segment number.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[linux] Add missing PROVIDE_PCIAPI_INLINE() macros
Michael Brown [Wed, 14 Sep 2022 22:10:25 +0000 (23:10 +0100)] 
[linux] Add missing PROVIDE_PCIAPI_INLINE() macros

Ensure type consistency of the PCI I/O API methods by adding the
missing PROVIDE_PCIAPI_INLINE() macros.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[ipv6] Ignore SLAAC on prefixes with an incompatible prefix length
Michael Brown [Tue, 13 Sep 2022 12:25:19 +0000 (13:25 +0100)] 
[ipv6] Ignore SLAAC on prefixes with an incompatible prefix length

Experience suggests that routers are often misconfigured to advertise
SLAAC even on prefixes that do not have a SLAAC-compatible prefix
length.  iPXE will currently treat this as an error, resulting in the
prefix being ignored completely.

Handle this misconfiguration by ignoring the autonomous address flag
when the prefix length is unsuitable for SLAAC.

Reported-by: Malte Janduda <mail@janduda.net>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[ipv6] Fix mask calculation when prefix length is not a multiple of 8
Michael Brown [Tue, 6 Sep 2022 12:02:17 +0000 (13:02 +0100)] 
[ipv6] Fix mask calculation when prefix length is not a multiple of 8

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[test] Validate constructed IPv6 routing table entries
Michael Brown [Tue, 6 Sep 2022 11:31:32 +0000 (12:31 +0100)] 
[test] Validate constructed IPv6 routing table entries

Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 months ago[ena] Increase receive ring size to 128 entries
Michael Brown [Fri, 26 Aug 2022 12:17:48 +0000 (13:17 +0100)] 
[ena] Increase receive ring size to 128 entries

Some versions of the ENA hardware (observed on a c6i.large instance in
eu-west-2) seem to require a receive ring containing at least 128
entries: any smaller ring will never see receive completions or will
stall after the first few completions.

Increase the receive ring size to 128 entries (determined empirically)
for compatibility with these hardware versions.  Limit the receive
ring fill level to 16 (as at present) to avoid consuming more memory
than will typically be available in the internal heap.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 months ago[ena] Provide a host information page
Michael Brown [Fri, 26 Aug 2022 12:37:23 +0000 (13:37 +0100)] 
[ena] Provide a host information page

Some versions of the ENA firmware (observed on a c6i.large instance in
eu-west-2) seem to require a host information page, without which the
CREATE_CQ command will fail with ENA_ADMIN_UNKNOWN_ERROR.

These firmware versions also seem to require us to claim that we are a
Linux kernel with a specific driver major version number.  This
appears to be a firmware bug, as revealed by Linux kernel commit
1a63443af ("net/amazon: Ensure that driver version is aligned to the
linux kernel"): this commit changed the value of the driver version
number field to be the Linux kernel version, and was hastily reverted
in commit 92040c6da ("net: ena: fix broken interface between ENA
driver and FW") which clarified that the version number field does
actually have some undocumented significance to some versions of the

Fix by providing a host information page via the SET_FEATURE command,
incorporating the apparently necessary lies about our identity.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 months ago[ena] Specify the unused completion queue MSI-X vector as 0xffffffff
Michael Brown [Fri, 26 Aug 2022 12:15:07 +0000 (13:15 +0100)] 
[ena] Specify the unused completion queue MSI-X vector as 0xffffffff

Some versions of the ENA firmware (observed on a c6i.large instance in
eu-west-2) will complain if the completion queue's MSI-X vector field
is left empty, even though the queue configuration specifies that
interrupts are not used.

Work around these firmware versions by passing in what appears to be
the magic "no MSI-X vector" value in this field.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 months ago[ena] Allow for out-of-order completions
Michael Brown [Fri, 26 Aug 2022 14:48:52 +0000 (15:48 +0100)] 
[ena] Allow for out-of-order completions

The ENA data path design has separate submission and completion
queues.  Submission queues must be refilled in strict order (since
there is only a single linear tail pointer used to communicate the
existence of new entries to the hardware), and completion queue
entries include a request identifier copied verbatim from the
submission queue entry.  Once the submission queue doorbell has been
rung, software never again reads from the submission queue entry and
nothing ever needs to write back to the submission queue entry since
completions are reported via the separate completion queue.

This design allows the hardware to complete submission queue entries
out of order, provided that it internally caches at least as many
entries as it leaves gaps.

Record and identify I/O buffers by request identifier (using a
circular ring buffer of unique request identifiers), and remove the
assumption that submission queue entries will be completed in order.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 months ago[ena] Limit submission queue fill level to completion queue size
Michael Brown [Fri, 26 Aug 2022 13:13:52 +0000 (14:13 +0100)] 
[ena] Limit submission queue fill level to completion queue size

The CREATE_CQ command is permitted to return a size smaller than
requested, which could leave us in a situation where the completion
queue could overflow.

Avoid overflow by limiting the submission queue fill level to the
actual size of the completion queue.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 months ago[intelxl] Explicitly request a single queue pair for virtual functions
Michael Brown [Tue, 16 Aug 2022 14:53:41 +0000 (15:53 +0100)] 
[intelxl] Explicitly request a single queue pair for virtual functions

Current versions of the E810 PF driver fail to set the number of
in-use queue pairs in response to the CONFIG_VSI_QUEUES message.  When
the number of in-use queue pairs is less than the number of available
queue pairs, this results in some packets being directed to
nonexistent receive queues and hence silently dropped.

Work around this PF driver bug by explicitly configuring the number of
available queue pairs via the REQUEST_QUEUES message.  This message
triggers a VF reset that, in turn, requires us to reopen the admin
queue and issue an additional GET_RESOURCES message to restore the VF
to a functional state.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 months ago[intelxl] Allow for admin commands that trigger a VF reset
Michael Brown [Tue, 16 Aug 2022 16:59:37 +0000 (17:59 +0100)] 
[intelxl] Allow for admin commands that trigger a VF reset

The RESET_VF admin queue command does not complete via the usual
mechanism, but instead requires us to poll registers to wait for the
reset to take effect and then reopen the admin queue.

Allow for the existence of other admin queue commands that also
trigger a VF reset, by separating out the logic that waits for the
reset to complete.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 months ago[intelxl] Negotiate virtual function API version 1.1
Michael Brown [Tue, 16 Aug 2022 14:48:24 +0000 (15:48 +0100)] 
[intelxl] Negotiate virtual function API version 1.1

Negotiate API version 1.1 in order to allow access to virtual function
opcodes that are disallowed by default on the E810.

Signed-off-by: Michael Brown <mcb30@ipxe.org>