• Maria Pasechnik's avatar
    net: ipv6_gre: Fix GRO to work on IPv6 over GRE tap · eb95f52f
    Maria Pasechnik authored
    IPv6 GRO over GRE tap is not working while GRO is not set
    over the native interface.
    
    gro_list_prepare function updates the same_flow variable
    of existing sessions to 1 if their mac headers match the one
    of the incoming packet.
    same_flow is used to filter out non-matching sessions and keep
    potential ones for aggregation.
    
    The number of bytes to compare should be the number of bytes
    in the mac headers. In gro_list_prepare this number is set to
    be skb->dev->hard_header_len. For GRE interfaces this hard_header_len
    should be as it is set in the initialization process (when GRE is
    created), it should not be overridden. But currently it is being overridden
    by the value that is actually supposed to represent the needed_headroom.
    Therefore, the number of bytes compared in order to decide whether the
    the mac headers are the same is greater than the length of the headers.
    
    As it's documented in netdevice.h, hard_header_len is the maximum
    hardware header length, and needed_headroom is the extra headroom
    the hardware may need.
    hard_header_len is basically all the bytes received by the physical
    till layer 3 header of the packet received by the interface.
    For example, if the interface is a GRE tap then the needed_headroom
    should be the total length of the following headers:
    IP header of the physical, GRE header, mac header of GRE.
    It is often used to calculate the MTU of the created interface.
    
    This patch removes the override of the hard_header_len, and
    assigns the calculated value to needed_headroom.
    This way, the comparison in gro_list_prepare is really of
    the mac headers, and if the packets have the same mac headers
    the same_flow will be set to 1.
    
    Performance testing: 45% higher bandwidth.
    Measuring bandwidth of single-stream IPv4 TCP traffic over IPv6
    GRE tap while GRO is not set on the native.
    NIC: ConnectX-4LX
    Before (GRO not working) : 7.2 Gbits/sec
    After (GRO working): 10.5 Gbits/sec
    Signed-off-by: default avatarMaria Pasechnik <mariap@mellanox.com>
    Signed-off-by: default avatarTariq Toukan <tariqt@mellanox.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    eb95f52f
ip6_gre.c 57.8 KB