v0.6.1: latest iPXE + automatic NIC driver fallback (more devices, zero toggle)

Mirrors the worthwhile device-support wins from iVentoy 1.0.24→1.0.35 onto our
(very different) proxy-DHCP + iPXE-chainload architecture. iVentoy's other
changes are inapplicable (arm64-server / distro-display fixes live in its
injected Linux, which we don't have), niche (iSCSI), or closed-source
(Matrix Boot).

iPXE refreshed (mirrors 1.0.35 "Update iPXE")
- Pin the from-source build to ipxe/ipxe master @ 2026-06-09
  (95ffbf4745553e8a207922389929e1943c0237c0) — newer NIC drivers + EFI fixes.
  The pin also busts the cached ipxe-build Docker layer so the release
  actually recompiles iPXE; build-ipxe.sh now shallow-fetches an exact SHA.

Automatic NIC driver fallback (mirrors 1.0.34 "driver/boot-file mode" — but
no operator toggle, per request)
- New DriverMode {Firmware, Builtin} in core; ClientArch::ipxe_bootfile_mode
  maps each arch to either the firmware-net build (snponly/undionly, default)
  or the all-drivers build (ipxe.efi/ipxe.pxe/ipxe-i386.efi/ipxe-arm64.efi).
- The DHCP proxy serves Firmware by default — byte-for-byte unchanged, so
  hardware that boots today never regresses. A new DriverEscalation state
  machine watches for the tell-tale failure: a MAC re-PXE-boots (fresh
  firmware DISCOVER) without ever completing the iPXE-user-class handoff that
  proves the firmware NIC stack worked. That MAC is automatically escalated to
  iPXE's own NIC drivers, and the choice is sticky after a confirmed handoff
  (debounced for the :67/:4011 same-boot pair, TTL-pruned, capped). It just
  works — no settings, no UI.
- All-drivers binaries fetched per arch (ipxe.pxe + i386/arm64 native EFI;
  x86_64 ipxe.efi already built from source with PNG); ipxe-assets embeds
  *.pxe and logs availability per (arch, mode).

Core principles intact: DHCP-proxy-only, container-first, Rust-focused (the
logic is all Rust; only the iPXE fetch/build stays shell), Windows hard-rules
untouched (this never goes near Windows boot).

Validation: clippy clean; full workspace test suite green (core 99 incl. new
DriverMode tests, dhcp-proxy +4 escalation tests, http-api 31+68, iso-store
61, tftp 6, bin 2); fmt-clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
This commit is contained in:
Miles Ward
2026-06-09 11:18:07 -04:00
co-authored by Claude Opus 4.8
parent 24879fcc90
commit 4f193cac05
12 changed files with 444 additions and 55 deletions
Generated
+9 -8
View File
@@ -2669,7 +2669,7 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
[[package]]
name = "openpxe"
version = "0.6.0"
version = "0.6.1"
dependencies = [
"anyhow",
"axum",
@@ -2691,7 +2691,7 @@ dependencies = [
[[package]]
name = "openpxe-core"
version = "0.6.0"
version = "0.6.1"
dependencies = [
"anyhow",
"base64",
@@ -2718,12 +2718,13 @@ dependencies = [
[[package]]
name = "openpxe-dhcp-proxy"
version = "0.6.0"
version = "0.6.1"
dependencies = [
"anyhow",
"bytes",
"dhcproto",
"openpxe-core",
"parking_lot",
"socket2 0.5.10",
"thiserror 2.0.18",
"tokio",
@@ -2732,7 +2733,7 @@ dependencies = [
[[package]]
name = "openpxe-http-api"
version = "0.6.0"
version = "0.6.1"
dependencies = [
"anyhow",
"axum",
@@ -2768,7 +2769,7 @@ dependencies = [
[[package]]
name = "openpxe-ipxe-assets"
version = "0.6.0"
version = "0.6.1"
dependencies = [
"openpxe-core",
"rust-embed",
@@ -2778,7 +2779,7 @@ dependencies = [
[[package]]
name = "openpxe-iso-store"
version = "0.6.0"
version = "0.6.1"
dependencies = [
"anyhow",
"bcrypt",
@@ -2807,7 +2808,7 @@ dependencies = [
[[package]]
name = "openpxe-tftp"
version = "0.6.0"
version = "0.6.1"
dependencies = [
"anyhow",
"bytes",
@@ -2821,7 +2822,7 @@ dependencies = [
[[package]]
name = "openpxe-webui"
version = "0.6.0"
version = "0.6.1"
[[package]]
name = "p256"