[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Wrap-up: TCP checksum calculation



Hi,

this has been an interesting discussion

Let me see if i can propose a way forward.

The problem is that shim6 payload packets that carry locators different than ULIDs, will have the checksum calculated based on the ULIDs and not on the actual addresses carried in the ipv6 header. This would imply that any device in the middle (from NIC to middle boxes (firewalls and TCP relays)) will fail the checksum verification (and drop the packet). It is possible that TCP checksum verification is more common, since there is no IP checksum in IPv6.

Proposed approach:

First: Add a new section titled "Middle-boxes considerations" with the following text.

It is recommended that firewalls and other middleboxes do not drop TCP, UDP and ICMP packets with apparently incorrect checksums based on that fact alone unless they implement (monitoring of) the full shim6 protocol and are able to determine the checksum that must be present in a packet with addresses rewritten by shim6."

Second: allow the possibility that shim6 nodes can use the locators for calculating the TCP/UDP checksum, in case they detect that there is a middle box that does not support the shim6 protocol and drops the packets that contain the checksum calculated using the ULIDs (which are not used a addresses in the IPv6 header). In order to do that, we need to use a bit in the shim6 payload header to signal whether the ULIDs or the locators are used for the pseudoheader. The bad news is that there are no more spare bits in the shim6 payload header. I think this was not the best choice, since we haven't finished the spec and we already are out of bits. My suggestion is that we reduce the context tag to 40 bits and the we reserve 8 bits for flags and other information. In the current spec we would define two bits. The P flag that is already defined and the L flag, which would be set if the Locators are used to calculate the tcp/UDP checksum.

Third: Define a mechanism for detecting the presence of these middle boxes. I think that this could be achieved by adding a TCP or UDP header in the I1/R1 exchange, but making sure that the tcp/udp checksum is calculated with other than the addresses contained in the ipv6 header. One simple option would be to use TCP header and leave the checksum filed to 0. If packets are dropped, then the peer should retry using a checksum calculated based on the addresses carried in the ipv6 header. If this works, then it should use the locators for the peusoheader and set the L bit in the shim6 payload header.

Makes sense?

Regards, marcelo