• Yadu Kishore's avatar
    net: Make skb_segment not to compute checksum if network controller supports checksumming · 1454c9fa
    Yadu Kishore authored
    Problem:
    TCP checksum in the output path is not being offloaded during GSO
    in the following case:
    The network driver does not support scatter-gather but supports
    checksum offload with NETIF_F_HW_CSUM.
    
    Cause:
    skb_segment calls skb_copy_and_csum_bits if the network driver
    does not announce NETIF_F_SG. It does not check if the driver
    supports NETIF_F_HW_CSUM.
    So for devices which might want to offload checksum but do not support SG
    there is currently no way to do so if GSO is enabled.
    
    Solution:
    In skb_segment check if the network controller does checksum and if so
    call skb_copy_bits instead of skb_copy_and_csum_bits.
    
    Testing:
    Without the patch, ran iperf TCP traffic with NETIF_F_HW_CSUM enabled
    in the network driver. Observed the TCP checksum offload is not happening
    since the skbs received by the driver in the output path have
    skb->ip_summed set to CHECKSUM_NONE.
    
    With the patch ran iperf TCP traffic and observed that TCP checksum
    is being offloaded with skb->ip_summed set to CHECKSUM_PARTIAL.
    Also tested with the patch by disabling NETIF_F_HW_CSUM in the driver
    to cover the newly introduced if-else code path in skb_segment.
    
    Link: https://lore.kernel.org/netdev/CA+FuTSeYGYr3Umij+Mezk9CUcaxYwqEe5sPSuXF8jPE2yMFJAw@mail.gmail.comSigned-off-by: default avatarYadu Kishore <kyk.segfault@gmail.com>
    Acked-by: default avatarWillem de Bruijn <willemb@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    1454c9fa
skbuff.c 154 KB