Skip to content
  • Eyal Birger's avatar
    d5496990
    net/packet: fix packet receive on L3 devices without visible hard header · d5496990
    Eyal Birger authored
    
    
    In the patchset merged by commit b9fcf0a0
    ("Merge branch 'support-AF_PACKET-for-layer-3-devices'") L3 devices which
    did not have header_ops were given one for the purpose of protocol parsing
    on af_packet transmit path.
    
    That change made af_packet receive path regard these devices as having a
    visible L3 header and therefore aligned incoming skb->data to point to the
    skb's mac_header. Some devices, such as ipip, xfrmi, and others, do not
    reset their mac_header prior to ingress and therefore their incoming
    packets became malformed.
    
    Ideally these devices would reset their mac headers, or af_packet would be
    able to rely on dev->hard_header_len being 0 for such cases, but it seems
    this is not the case.
    
    Fix by changing af_packet RX ll visibility criteria to include the
    existence of a '.create()' header operation, which is used when creating
    a device hard header - via dev_hard_header() - by upper layers, and does
    not exist in these L3 devices.
    
    As this predicate may be useful in other situations, add it as a common
    dev_has_header() helper in netdevice.h.
    
    Fixes: b9fcf0a0 ("Merge branch 'support-AF_PACKET-for-layer-3-devices'")
    Signed-off-by: default avatarEyal Birger <eyal.birger@gmail.com>
    Acked-by: default avatarJason A. Donenfeld <Jason@zx2c4.com>
    Acked-by: default avatarWillem de Bruijn <willemb@google.com>
    Link: https://lore.kernel.org/r/20201121062817.3178900-1-eyal.birger@gmail.com
    
    
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    d5496990
    net/packet: fix packet receive on L3 devices without visible hard header
    Eyal Birger authored
    
    
    In the patchset merged by commit b9fcf0a0
    ("Merge branch 'support-AF_PACKET-for-layer-3-devices'") L3 devices which
    did not have header_ops were given one for the purpose of protocol parsing
    on af_packet transmit path.
    
    That change made af_packet receive path regard these devices as having a
    visible L3 header and therefore aligned incoming skb->data to point to the
    skb's mac_header. Some devices, such as ipip, xfrmi, and others, do not
    reset their mac_header prior to ingress and therefore their incoming
    packets became malformed.
    
    Ideally these devices would reset their mac headers, or af_packet would be
    able to rely on dev->hard_header_len being 0 for such cases, but it seems
    this is not the case.
    
    Fix by changing af_packet RX ll visibility criteria to include the
    existence of a '.create()' header operation, which is used when creating
    a device hard header - via dev_hard_header() - by upper layers, and does
    not exist in these L3 devices.
    
    As this predicate may be useful in other situations, add it as a common
    dev_has_header() helper in netdevice.h.
    
    Fixes: b9fcf0a0 ("Merge branch 'support-AF_PACKET-for-layer-3-devices'")
    Signed-off-by: default avatarEyal Birger <eyal.birger@gmail.com>
    Acked-by: default avatarJason A. Donenfeld <Jason@zx2c4.com>
    Acked-by: default avatarWillem de Bruijn <willemb@google.com>
    Link: https://lore.kernel.org/r/20201121062817.3178900-1-eyal.birger@gmail.com
    
    
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Loading