[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