Skip to content
  • David S. Miller's avatar
    net: Generic XDP · b5cdae32
    David S. Miller authored
    
    
    This provides a generic SKB based non-optimized XDP path which is used
    if either the driver lacks a specific XDP implementation, or the user
    requests it via a new IFLA_XDP_FLAGS value named XDP_FLAGS_SKB_MODE.
    
    It is arguable that perhaps I should have required something like
    this as part of the initial XDP feature merge.
    
    I believe this is critical for two reasons:
    
    1) Accessibility.  More people can play with XDP with less
       dependencies.  Yes I know we have XDP support in virtio_net, but
       that just creates another depedency for learning how to use this
       facility.
    
       I wrote this to make life easier for the XDP newbies.
    
    2) As a model for what the expected semantics are.  If there is a pure
       generic core implementation, it serves as a semantic example for
       driver folks adding XDP support.
    
    One thing I have not tried to address here is the issue of
    XDP_PACKET_HEADROOM, thanks to Daniel for spotting that.  It seems
    incredibly expensive to do a skb_cow(skb, XDP_PACKET_HEADROOM) or
    whatever even if the XDP program doesn't try to push headers at all.
    I think we really need the verifier to somehow propagate whether
    certain XDP helpers are used or not.
    
    v5:
     - Handle both negative and positive offset after running prog
     - Fix mac length in XDP_TX case (Alexei)
     - Use rcu_dereference_protected() in free_netdev (kbuild test robot)
    
    v4:
     - Fix MAC header adjustmnet before calling prog (David Ahern)
     - Disable LRO when generic XDP is installed (Michael Chan)
     - Bypass qdisc et al. on XDP_TX and record the event (Alexei)
     - Do not perform generic XDP on reinjected packets (DaveM)
    
    v3:
     - Make sure XDP program sees packet at MAC header, push back MAC
       header if we do XDP_TX.  (Alexei)
     - Elide GRO when generic XDP is in use.  (Alexei)
     - Add XDP_FLAG_SKB_MODE flag which the user can use to request generic
       XDP even if the driver has an XDP implementation.  (Alexei)
     - Report whether SKB mode is in use in rtnl_xdp_fill() via XDP_FLAGS
       attribute.  (Daniel)
    
    v2:
     - Add some "fall through" comments in switch statements based
       upon feedback from Andrew Lunn
     - Use RCU for generic xdp_prog, thanks to Johannes Berg.
    
    Tested-by: default avatarAndy Gospodarek <andy@greyhouse.net>
    Tested-by: default avatarJesper Dangaard Brouer <brouer@redhat.com>
    Tested-by: default avatarDavid Ahern <dsa@cumulusnetworks.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    b5cdae32