Margaret,

Better late than never, comments below.

Regards,

RD

Margaret Wasserman  -  le (m/j/a) 9/14/31 11:59 AM:

Hi Remi,

I ran some numbers this morning, and you are right.

If the _original_ value of the 16-bit checksum correction field is 0x0000, it will be restored to 0xFFFF, which is wrong. The checksum correction works fine (as Fred's tests have proven), but the restoration of the value doesn't work properly. It can be made to work properly for either 0x0000 or 0xFFFF, but I haven' t figured out a way to make it work right for both values as the information to distinguish between them is lost.

There are three approaches we can take to fix this

1) As you have proposed, we could changing NAT66 so that it modifies the transport header checksum.

This would involve every NAT66 box knowing how to traverse the IPv6 extension header chain,
Yes, but IMHO this is not very complex, even in limit cases, and very fast in typical cases.
and might effectively limit IPv6 NAT to transporting ICMPv6, TCP and UDP-based protocols, because we wouldn't know how to correct the checksum in other protocols.
Could you explain?
I don't see this limit:
- If there is no transport, then no checksum adjustment is not needed.
- For other transport protocols than TCP and UDP, the problem seems to be the same with your proposal (it assumes one's complement checksum in the transport protocol.)

2) The NAT66 device can store one-bit-per-host of state for any host that has 0xFFFF or 0x0000 in the field that is used for the checksum correction.
Finding the tra&nsport next header seems simpler, and in any case stateless, which is important for scalability.
Although we would be required to implement this, we could explain to network administrators how to avoid it, at least in the case where the bits used for checksum correction are the subnet bits.
IMHO, a terrible perspective, to be avoided by all means.
I'm not sure if this would be better or worse than updating the transport layer checksum, though, as it would result in inferior service for a small set of hosts, but would provide better service to most hosts.

2) We can do the checksum correction in a 16-bit field that we _know_ will never contain one of the two one's complement 0 values (0x0000 or 0xFFFF). There are two different cases here, but I think there are choices for both that would work:
I don't see this working. The problem seems more an intrinsic characteristic of One's complement, but looking at detailed cases could be necessary to reach a common understanding.

2a) For the case of /48 or shorter prefixes, we could still do the checksum correction in the lowest order 16 subnet bits and document that subnet values containing 0xFFFF in their lowest order 16 bits should not be used with NAT66. This has the advantage of retaining the IID value unchanged, but might result in some misconfigurations and support calls.
Same concern.

2b) For longer prefixes, we could perform the checksum correction in the highest order 16 bits of the IID.

I've looked into this in the IEEE specs, and we should never have an IID with both the "g" bit and the "u" bit set.
True for full 64 bit IIDs, but subnet prefixes longer than /64 are already considered for some cases. They should not be made impossible just because a one's complement problem has not been solved as it should, i.e. without interfering with IPv6 address formats.
The "g" (individual/group) bit should always be '0' in EUI 64s that are assigned to specific interfaces (a "1" indicates that this is a "group" address, similar to an Ethernet multicast address), and if a host uses an IID that was generated some other way, it is expected to clear the "u" bit to indicate that the value isn't a universally scoped EUI-64. So, we should be able to safely assume that the first 2 bits of an IID will never be "11". Therefore, the first 16 bits can never contain 0xFFFF. The issues here is that we would end-up generating IIDs that have the "universal" bit set that are not universally scoped. I am not sure how big of an issue that is, as we don't have any documents that use the fact that a universally scoped IID contains an EUI-64, at least not to my knowledge.

Thoughts?
See above.


Margaret



On Nov 26, 2008, at 4:39 AM, Rémi Després wrote:

Fred Baker   (1-12/1-31/200x) 11/24/08 10:23 PM:

Not sure I buy that. In UDP and TCP, the value stored in the header is set of 0xFFFF if the sum adds to 0x0000, but I don't see any reason that has to be the case in the modification of the IP address.
No reason, you are right, but the point I was making is different.

It concerns the 16 bits in which the prefix checksum difference is subtracted, in outgoing packets, when these 16 bits happen to be 0000 (i.e. +0 in one's complement). After the subtraction, which in general gives a non-zero result, it will no longer be possible to determine whether the original value was -0 or +0.

If the checksum difference to be subtracted from 0000 is for example 0001, the result is FFFE (i.e. - 1).

When trying to reverse the mapping, adding 0001 to FFFE gives FFFF (i.e. -0), while the original value in the outbound packet was 0000 (i.e. +0) :-(.

I'll let you look at the code I put up to test this if you like. You can tell me what I missed.
    ftp://ftpeng.cisco.com/fred/gse/checksum.c
What had been missed is not in the code, which seems perfectly fine, but in the specification.

Regards,

RD
On Nov 25, 2008, at 10:15 AM, Rémi Després wrote:

Margaret, Fred,

In section 5.1 of your draft, you propose a technique for Checksum-Neutral Mapping.

Due to the two ways to represent 0 in one's complement, it doesn't work in all cases:

In 16 bits, +0 is 0x0000 and -0 is 0xFFFF.

If the field which is modified contains -0 or +0, adding to it, or subtracting from it, any non zero value wipes out the difference between the two zeros.

For example, in one's complement:
.  0x0000 - 0x0001 = 0xFFFE
.  0xFFFF - 0x0001 = 0xFFFE

I therefore believe that it is unavoidable to modify the UDP or TCP checksum if we want a reversible mapping between a local and a global address (which I believe is a good approach to avoid classical NATs in IPv6). This modification can be done incrementally. Finding the UDP/TCP header may require in IPv6 to parse a few headers, but this seems quite acceptable.

Regards,

RD
_______________________________________________
Behave mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/behave







_______________________________________________
nat66 mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/nat66

Reply via email to