Matthew Iselin: IPv6 Implementation


I'll update this with notes and links to websites I find as I'm working on the project that might be handy later on. The notes here may also be the foundation for the IPv6 documentation later on.

Useful RFCs


Repo Notes

  • Developing on branch 'develop'
  • Will bring commits into master when they are ready for upstream merging. This way I can rebase them and merge several related commits into one larger commit for submission upstream (or mix several “oops” commits into the commit that originally contained the mistake).
  • Can bring upstream changes into develop branch via master

Notes to Self

  • Can't get network interface's MAC address within a TCPIP protocol (eg ICMP, UDP). Will need to have a user begin the process of autoconfiguration for a link-local address manually!
  • Link-local address must always be present, globally routed address can be obtained via router advertisements or DHCPv6 (and may not exist). How do we manage this for potential users?
  • Probably worth fixing DNS to use AAAA records earlier rather than later.
  • Packet Dumps and relevant notes.


Building gPXE with IPv6 Enabled

By default, IPv6 is disabled in gPXE. You must explicitly build IPv6 support into gPXE in order to use it.

The easiest way to do this is to use ROM-o-matic ( with the “current-top-of-git-tree” and make sure NET_PROTO_IPV6 and IPV6_CMD are both ticked before you finish creating your image. However, if you do not want to use ROM-o-matic, you can uncomment/define NET_PROTO_IPV6 and IPV6_CMD in src/config/general.h. These should both already exist in the file (in a disabled state).

The following are valid DEBUG entries if you wish to enable debugging:

  • ipv6 - the IPv6 protocol itself. Use to see errors in traffic coming in and out, and to see address assignment and other routing information.
  • ip6mgmt - the IPv6 commands. This will output extra information during the process of configuring IPv6 at runtime.
  • icmpv6 - ICMPv6. Mostly just errors.
  • ndp - Neighbour Discovery Protocol. A lot of debugging here related to router and neighbour discovery. Recommended if you are having trouble enabling IPv6 in your environment.
  • dhcp6 - DHCPv6. Debugging related to DHCPv6. Only really worth using if you actually have a DHCPv6 server, and if you are having trouble with it.

Setting up IPv6 on your network

To work with IPv6 in gPXE on your network, you will need both an IPv6 prefix and a router advertisement daemon. If you like, you can set up DHCPv6 for your network for address assignment. A router advertisement daemon will still be required for routing, but in the future DHCPv6 will offer boot filenames and other boot-related options.

The best place to get an IPv6 is your ISP, but if your ISP does not offer IPv6, Hurricane Electric offers a fairly stable and easy-to-use tunnel. HE also provides configuration commands for a wide range of operating systems. These should be able to be copied and pasted into a terminal on your workstation to set up IPv6 connectivity quickly and easily. There are a variety of tutorials on the internet that will cover adding router advertisements and/or DHCPv6 to an IPv6 tunnel.

Booting over IPv6 in gPXE is quite simple: instead of using the 'dhcp' command (ala IPv4), you use the 'ipv6' command. This obtains an address and sets up routing for IPv6 so that you can use IPv6 servers.

You can use the following script to test gPXE's HTTP boot over IPv6:

ipv6 any
kernel root=100

(note: flash6 may need these image files uploaded - TODO!)

This should boot a Linux kernel.

If you don't have a DNS name for an IPv6 host, you can boot from an IPv6 address using the following syntax:


Note that zero compression ("Compressing Zeroes" section) can be used for all IPv6 addresses.

QR Code
QR Code soc:2011:pcmattman:notes:start (generated for current page)