• Tom Herbert's avatar
    ila: Fix checksum neutral mapping · 0b797c85
    Tom Herbert authored
    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: default avatarTom Herbert <tom@herbertland.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    0b797c85
ila_common.c 4.1 KB