I mainly used today to do some “maintenance” coding.
The most important fix of the day was to rework NDP Neighbour Advertisement handling to properly parse the option list in the packet, instead of assuming the packet is laid out in a particular way. I also reworked router advertisement handling to use the iobuf manipulation functions (eg, iob_pull) to take data from the iobuf rather than keeping an offset integer around and doing pointer math.
Whilst I was at it, I also added strings to the monojob_wait calls in ip6mgmt.c, so that a user can identify which stage of IPv6-enabling gPXE is at.
Next up - renaming the “ipv6” command to something more useful, and IPv6 extension headers!
Reworked extension header parsing today for receiving IPv6 packets. This will only really be useful for networks that gPXE runs on where extension headers are in use; in all my testing so far I haven't seen any yet.
This is also the key to getting IPv6 fragmentation working, which I will do tomorrow.
Began implementing IPv6 fragmentation. This is relatively simple as it just involves copying IPv4's fragment reassembly code and adjusting it as necessary to handle the unique requirements of IPv6. In particular, we'll need to pass the Next Header.
I've also found that checksum calculation is broken for fragmentation, as the payload length in the psuedo-header is wrong. I'll see what I can do to fix this.
Implemented an alternative method to calculate IPv6 checksums, in addition to the existing method, that takes specific values instead of an iobuf containing an IPv6 packet header. By integrating this with fragment reassembly I have managed to get fragmented packets passed to the correct upper layer protocol, where they pass checksum checks.
This is essentially the last feature that I explicitly labelled on my project plan.
What remains now is:
I didn't manage to get much coding done today, but I did look into the potential endian issues - in particular, looking at code in gPXE and noting the architectures which it supports.