diff options
Diffstat (limited to 'kernel/bpf/devmap.c')
| -rw-r--r-- | kernel/bpf/devmap.c | 16 | 
1 files changed, 13 insertions, 3 deletions
diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c index d01e4c55b376..2675fefc6cb6 100644 --- a/kernel/bpf/devmap.c +++ b/kernel/bpf/devmap.c @@ -474,7 +474,11 @@ static inline int __xdp_enqueue(struct net_device *dev, struct xdp_frame *xdpf,  {  	int err; -	if (!dev->netdev_ops->ndo_xdp_xmit) +	if (!(dev->xdp_features & NETDEV_XDP_ACT_NDO_XMIT)) +		return -EOPNOTSUPP; + +	if (unlikely(!(dev->xdp_features & NETDEV_XDP_ACT_NDO_XMIT_SG) && +		     xdp_frame_has_frags(xdpf)))  		return -EOPNOTSUPP;  	err = xdp_ok_fwd_dev(dev, xdp_get_frame_len(xdpf)); @@ -532,8 +536,14 @@ int dev_map_enqueue(struct bpf_dtab_netdev *dst, struct xdp_frame *xdpf,  static bool is_valid_dst(struct bpf_dtab_netdev *obj, struct xdp_frame *xdpf)  { -	if (!obj || -	    !obj->dev->netdev_ops->ndo_xdp_xmit) +	if (!obj) +		return false; + +	if (!(obj->dev->xdp_features & NETDEV_XDP_ACT_NDO_XMIT)) +		return false; + +	if (unlikely(!(obj->dev->xdp_features & NETDEV_XDP_ACT_NDO_XMIT_SG) && +		     xdp_frame_has_frags(xdpf)))  		return false;  	if (xdp_ok_fwd_dev(obj->dev, xdp_get_frame_len(xdpf)))  | 
