Equal Cost Multi-path Routing
fujiapple852 opened this issue · comments
Tracking issue for all Equal Cost Multi-path Routing work items.
We wish to support the following multi-path strategies:
- Classic (traceroute and MTR)
- Set the sequence number in either the src or dest port number
- Paris (see here)
- Use the IPv4
checksum
field to store the sequence and manipulate the UDP payload to ensure a valid packet
- Use the IPv4
- Dublin (see here)
- Use the IPv4
identifier
field to store the sequence number - Manipulate the IPv6
Payload Length
to store the sequence number
- Use the IPv4
We wish to support these for IPv4 & IPv6 for both UDP and TCP protocols.
Current support:
Strategy | Family | Protocol | Status |
---|---|---|---|
Classic | IPv4 / IPv6 | UDP / TCP | ✅ |
Paris | IPv4 | UDP | ✅ |
Paris | IPv6 | UDP | ✅ |
Dublin | IPv4 | UDP | ✅ |
Dublin | IPv6 | UDP | ✅ |
Paris | IPv4 | TCP | ❌ |
Paris | IPv6 | TCP | ❌ |
Dublin | IPv4 | TCP | ❌ |
Dublin | IPv6 | TCP | ❌ |
Tasks
In this tracking issue there is no mention of supporting Paris for IPv6. Is it something planned by any chance?
@crisidev I'd certainly like for Trippy to be able to support the Paris ECMP strategy for IPv6/UDP.
I'm struggling to recall the details now but I know that when I initially added IPv6/UDP support to Trippy I hit some issues with IPv6/UDP checksum on Linux (may have been related to hardware offloading).
As a reminder: the Paris ECMP strategy works by manipulating the UDP checksum (and payload) to encode the sequence number in the checksum. In order to do this we need to be able to specify (or manipulate) the IPv6/UDP header.
It might be possible to set IP_HDRINCL
(or perhaps IPV6_HDRINCL
?) on the IPv6/UDP raw socket such that the correct checksum could be set, I'd have to try it again to see as a lot has changed since then. At the time I opened this GH issue I likely believed it was not possible. Digging into the libparistraceroute src code may also help point at the right solution.
Is using the Paris ECMP strategy for IPv6/UDP something you have experience with? I'm curious as to your use case for it.
Thanks a lot for the detailed answer. I unfortunately do not have a lot of experience with Paris ECMP for IPv6/UDP. I have a pretty complex IPv6 home network I am currently experimenting using the official Paris traceroute, but I am well versed and love Rust, hence I would like to rewrite my probe code and base it on Trippy.
I just started scratching the surface of your amazing project, but when I have a little bit of time, I could try to reintroduce this support, after properly understanding how Paris traceroute does it in their library.
Oh wow, that was fast! I'll try this out today!