Skip to content

DHCPv6 PXE boot fails: dnsmasq template uses option:client-arch (DHCPv4) instead of option6:client-arch (DHCPv6) #916

@holmboe

Description

@holmboe

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 pxe6 is set but amd64 is not: no bootfile-url is sent at all (the EFI rule requires both tag:pxe6,tag:amd64, and the BIOS fallback only fires on tag:!pxe6)
  • If pxe6 is 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 without efi-virtio.rom iPXE 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:!pxe6undionly.kpxe) is arguably unnecessary in the IPv6 path since legacy BIOS does not support IPv6 PXE.

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind/featureCategorizes issue or PR as related to a new feature.triage/acceptedIndicates an issue is ready to be actively worked on.

    Projects

    Status

    Done / Closed

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions