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.
Showing the changes to include/uapi/linux (1 of 5 files). Show all
Unified · Split
| @@ -887,7 +887,9 @@ enum { · 886 unmodified lines | |||
| 887 | /* XDP section */ | 887 | /* XDP section */ |
| 888 | 888 | ||
| 889 | #define XDP_FLAGS_UPDATE_IF_NOEXIST (1U << 0) | 889 | #define XDP_FLAGS_UPDATE_IF_NOEXIST (1U << 0) |
| 890 | #define XDP_FLAGS_MASK (XDP_FLAGS_UPDATE_IF_NOEXIST) | 890 | #define XDP_FLAGS_SKB_MODE (2U << 0) |
| 891 | #define XDP_FLAGS_MASK (XDP_FLAGS_UPDATE_IF_NOEXIST | \ | ||
| 892 | XDP_FLAGS_SKB_MODE) | ||
| 891 | 893 | ||
| 892 | enum { | 894 | enum { |
| 893 | IFLA_XDP_UNSPEC, | 895 | IFLA_XDP_UNSPEC, |