• Alex Elder's avatar
    net: qualcomm: rmnet: avoid unnecessary byte-swapping · a2918a16
    Alex Elder authored
    Internet checksums are used for IPv4 header checksum, as well as TCP
    segment and UDP datagram checksums.  Such a checksum represents the
    negated sum of adjacent pairs of bytes, using ones' complement
    arithmetic.
    
    One property of the Internet checkum is byte order independence [1].
    Specifically, the sum of byte-swapped pairs is equal to the result
    of byte swapping the sum of those same pairs when not byte-swapped.
    
    So for example if a, b, c, d, y, and z are hexadecimal digits, and
    PLUS represents ones' complement addition:
        If:		ab PLUS cd = yz
        Then:	ba PLUS dc = zy
    
    For this reason, there is no need to swap the order of bytes in the
    checksum value held in a message header, nor the one in the QMAPv4
    trailer, in order to operate on them.
    
    In other words, we can determine whether the hardware-computed
    checksum matches the one in the message header without any byte
    swaps.
    
    (This patch leaves in place all existing type casts.)
    
    [1] https://tools.ietf.org/html/rfc1071Signed-off-by: default avatarAlex Elder <elder@linaro.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    a2918a16
rmnet_map_data.c 14.9 KB