From: Tom Herbert <t...@herbertland.com> Date: Tue, 14 Jun 2016 16:29:15 -0700
> The algorithm for checksum neutral mapping is incorrect. This problem > was being hidden since we were previously always performing checksum > offload on the translated addresses and only with IPv6 HW csum. > Enabling an ILA router shows the issue. > > Corrected algorithm: > > old_loc is the original locator in the packet, new_loc is the value > to overwrite with and is found in the lookup table. old_flag is > the old flag value (zero of CSUM_NEUTRAL_FLAG) and new_flag is > then (old_flag ^ CSUM_NEUTRAL_FLAG) & CSUM_NEUTRAL_FLAG. > > Need SUM(new_id + new_flag + diff) == SUM(old_id + old_flag) for > checksum neutral translation. > > Solving for diff gives: > > diff = (old_id - new_id) + (old_flag - new_flag) > > compute_csum_diff8(new_id, old_id) gives old_id - new_id > > If old_flag is set > old_flag - new_flag = old_flag = CSUM_NEUTRAL_FLAG > Else > old_flag - new_flag = -new_flag = ~CSUM_NEUTRAL_FLAG > > Tested: > - Implemented a user space program that creates random addresses > and random locators to overwrite. Compares the checksum over > the address before and after translation (must always be equal) > - Enabled ILA router and showed proper operation. > > Signed-off-by: Tom Herbert <t...@herbertland.com> Applied.