mirror of
https://github.com/danderson/netboot.git
synced 2025-10-15 17:41:38 +02:00
Add a braindump for PXE-over-ipv6 support.
This commit is contained in:
parent
7e671a0899
commit
7576c023fc
115
pixiecore/README.ipv6.md
Normal file
115
pixiecore/README.ipv6.md
Normal file
@ -0,0 +1,115 @@
|
||||
# PXE over IPv6 (WORK IN PROGRESS)
|
||||
|
||||
This is currently just a braindump of exploratory notes for supporting
|
||||
PXE over IPv6, as supported by recent UEFI firmwares.
|
||||
|
||||
I'm using an Intel NUC to explore firmware behavior to fill in the
|
||||
gaps not covered by specs. Claims made are made under the assumption
|
||||
that other PXEv6 firmware behaves like the NUC's, which may not be
|
||||
true. But it's all I have to go on right now.
|
||||
|
||||
Relevant RFCs:
|
||||
|
||||
- [DHCPv6](https://tools.ietf.org/html/rfc3315)
|
||||
- [DHCPv6 Options for Network Boot](https://tools.ietf.org/html/rfc5970)
|
||||
- [DHCPv4 Options for Intel PXE](https://tools.ietf.org/html/rfc4578) (some enums carried over to DHCPv6)
|
||||
- [Preboot eXecution Environment](http://www.pix.net/software/pxeboot/archive/pxespec.pdf), our old friend the monster spec.
|
||||
|
||||
None of these specs describe the revised PXE booting process for
|
||||
IPv6. All we know is that it's likely similar to the original PXE
|
||||
process, and that we're using DHCPv6 rather than stateless
|
||||
autoconfiguration messages (router solicitation, router advertisement,
|
||||
etc.).
|
||||
|
||||
## Overall boot process
|
||||
|
||||
Typical DHCPv6 configuration process:
|
||||
- Client self-configures a link local address.
|
||||
- Client sends Router Solicitation to ff02::2 (all-routers), receives
|
||||
back Router Advertisements.
|
||||
- If told to do so by RAs, client does stateless autoconfiguration
|
||||
for a number of prefixes.
|
||||
- If told to do so by RAs, client sends DHCPv6 solicit to ff02::1:2,
|
||||
requesting Identity Associations (roughly, addresses and related
|
||||
config). Receives back DHCPv6 advertisements.
|
||||
- Client applies DHCPv6 algorithms for picking which IAs to commit
|
||||
to, sends DHCPv6 request(s) to finalize configuration. Receives
|
||||
DHCPv6 reply(s) back.
|
||||
|
||||
PXEv6 on NUC deviates from this. It will _always_ start DHCPv6
|
||||
configuration after attempting stateless configuration. If it receives
|
||||
Router Advertisements, it will apply any stateless autoconf indicated
|
||||
by those RAs, but will _ignore_ the stateful configuration bits
|
||||
(i.e. it will attempt DHCPv6 even if the RA says that no stateful
|
||||
configuration is available). If it receives no RAs, it will happily
|
||||
proceed to DHCPv6 regardless.
|
||||
|
||||
This is great! It means Pixiecore doesn't have to implement or care
|
||||
about router soliciation/advertisement, because the firmware will
|
||||
DHCPv6 regardless of what the RAs tell it about available network
|
||||
services.
|
||||
|
||||
It also means we can make things Just Work even on completely
|
||||
unconfigured networks (where only link-local addresses are available).
|
||||
|
||||
Within the DHCPv6 solicit, things are beautifully clean and free from
|
||||
the historical baggage of DHCPv4. A client that requests option 59
|
||||
(Boot File URL) is a PXE client, and if you send it that option, it
|
||||
should do stuff. It's so simple I could cry.
|
||||
|
||||
The client architecture option from PXEv4 is carried over, so we can
|
||||
differentiate various CPU architectures. In practice, I only expect to
|
||||
see 0x7 (64-bit x86 EFI), given that PXEv6 support only exists in UEFI
|
||||
so far, afaik.
|
||||
|
||||
## What addresses to use for DHCPv6?
|
||||
|
||||
The catch is that, contrary to IPv4, in an IPv6 world we should assume
|
||||
that the majority of networks will _not_ have an incumbent DHCPv6
|
||||
server, so providing ProxyDHCP responses only will not be sufficient
|
||||
to achieve zero-ish config.
|
||||
|
||||
So, we'll have to hand out addresses, meaning Pixiecore will need to
|
||||
be a full (albeit basic) DHCPv6 server. For addresses, we can use a
|
||||
ULA prefix to both avoid collisions with globally routable prefixes,
|
||||
and to avoid having to coordinate with other network services to
|
||||
discover usable global prefixes.
|
||||
|
||||
ULAs are not globally routable. We don't care, we're only configuring
|
||||
it so the client can talk to Pixiecore, which is sitting on the same
|
||||
L2 segment. If a Router Advertisement has provided the booting client
|
||||
with a globally routable address as well, then great, that client can
|
||||
also talk to the internet if it feels like it. If not, not our
|
||||
problem.
|
||||
|
||||
ULAs are defined as being /48s within the fd00::/8 supernet. It is
|
||||
recommended to generate a 40-bit random integer and use that to form
|
||||
the ULA prefix. In our case we'll probably use 60 bits to end up with
|
||||
a /64, since we don't need the full /48, and /64 is enough that we can
|
||||
statelessly map client DUIDs to a full /128 address without having to
|
||||
carry a state DB around with us.
|
||||
|
||||
In later versions, we might want to provide some kind of override to
|
||||
let administrators tell Pixiecore what IP range to manage, but that's
|
||||
a slippery slope that leads to building a fully featured DHCPv6
|
||||
server. Ick.
|
||||
|
||||
## What happens after DHCPv6?
|
||||
|
||||
The Boot File URL provided by the DHCPv6 server tells the client where
|
||||
to grab the file to chainload. Supported protocols are TFTP and, in
|
||||
theory, HTTP. However, HTTP is a relatively recent addition to the
|
||||
TianoCore UEFI reference implementation, so support is unlikely to be
|
||||
universal. Sadly, the client provides no indication of what protocols
|
||||
it supports.
|
||||
|
||||
So, for maximum compatibility, we're probably going to
|
||||
stick to TFTP for the first stage bootloader. That's fine, we already
|
||||
have TFTP support implemented and tested.
|
||||
|
||||
## After that?
|
||||
|
||||
The process should be identical to PXEv4: TFTP serves a copy of iPXE
|
||||
suitable for the client architecture, and the ipxe has an embedded
|
||||
script that drives the rest of the boot process: configure networking
|
||||
again, grab the actual boot files with HTTP, and chainload into them.
|
Loading…
x
Reference in New Issue
Block a user