-
Notifications
You must be signed in to change notification settings - Fork 146
Description
Description
When using IPv6 for the provisioning network (IPV=6), UEFI nodes cannot PXE boot because the dnsmasq config relies on option:client-arch (DHCPv6 option 61) to select the correct bootfile — but neither OVMF nor iPXE sends this option in DHCPv6.
Affected file: ironic-config/dnsmasq.conf.j2 — the {% if env.IPV == "6" %} section
Expected behavior
UEFI nodes receive snponly-x86_64.efi (or snponly-arm64.efi) as the bootfile URL and successfully PXE boot IPA.
Actual behavior
Depending on whether the pxe6 vendor class tag matches:
- If
pxe6is set butamd64is not: no bootfile-url is sent at all (the EFI rule requires bothtag:pxe6,tag:amd64, and the BIOS fallback only fires ontag:!pxe6) - If
pxe6is not set:undionly.kpxe(BIOS bootloader) is served, which UEFI firmware cannot boot
In either case the node is stuck at the UEFI PXE screen and never boots IPA.
Root cause
The IPv6 section of the dnsmasq template matches client-arch using:
dhcp-match=set:amd64,option:client-arch,7
dhcp-match=set:amd64,option:client-arch,9
dhcp-option=tag:pxe6,tag:amd64,option6:bootfile-url,tftp://…/snponly-x86_64.efi
In DHCPv4, option:client-arch maps to option 93, which PXE firmware reliably sends. The IPv4 section of the template works correctly for this reason.
In DHCPv6, option:client-arch maps to option 61 — but neither OVMF (QEMU's UEFI firmware, both with built-in virtio PXE and with the iPXE efi-virtio.rom option ROM) nor iPXE sends this option in DHCPSOLICIT. This appears to be a gap in the UEFI/iPXE DHCPv6 implementations.
Evidence from dnsmasq logs
When client-arch is received (never, in practice for DHCPv6), the amd64 tag would be set. Instead we see:
dnsmasq-dhcp: vendor class: 343
dnsmasq-dhcp: DHCPSOLICIT(metal3) …
dnsmasq-dhcp: DHCPADVERTISE(metal3) 2001:db8:…::3699 …
dnsmasq-dhcp: requested options: 59:bootfile-url, 60:bootfile-param, 23:dns-server,
dnsmasq-dhcp: requested options: 16:vendor-class
dnsmasq-dhcp: tags: pxe6, dhcpv6, metal3
^^^^ ^^^^^ — no amd64 tag
The pxe6 tag is set (vendor class 343 matches) but amd64 is absent, so the EFI bootfile rule doesn't fire. In some requests even pxe6 isn't set, causing the BIOS fallback to send undionly.kpxe.
The IPv4 path does not have this problem — its dhcp-match=set:efi,option:client-arch,7 works because DHCPv4 clients reliably send option 93.
Environment
- Ironic image:
quay.io/metal3-io/ironic:release-34.0 - Provisioning network: IPv6
- Firmware: OVMF (
OVMF_CODE_4M.fd) with virtio NIC (tested both with and withoutefi-virtio.romiPXE ROM) - Nodes tested: QEMU/KVM virtual machines via VBMC
Possible fix
Since the pxe6 vendor class tag (enterprise 343, "PXEClient") already indicates a PXE client, and DHCPv6 PXE boot is exclusively UEFI (there is no BIOS PXE over IPv6), the IPv6 section could default to serving the EFI bootfile when pxe6 is set, without requiring client-arch:
dhcp-option=tag:pxe6,option6:bootfile-url,tftp://…/snponly-x86_64.efi
If arm64 differentiation is needed, it could use a separate signal or be configured explicitly. The BIOS fallback (tag:!pxe6 → undionly.kpxe) is arguably unnecessary in the IPv6 path since legacy BIOS does not support IPv6 PXE.
Metadata
Metadata
Assignees
Labels
Type
Projects
Status