diff options
Diffstat (limited to 'net/core/xdp.c')
| -rw-r--r-- | net/core/xdp.c | 28 | 
1 files changed, 21 insertions, 7 deletions
diff --git a/net/core/xdp.c b/net/core/xdp.c index 8c92fc553317..b5737e47ec41 100644 --- a/net/core/xdp.c +++ b/net/core/xdp.c @@ -774,20 +774,34 @@ static int __init xdp_metadata_init(void)  }  late_initcall(xdp_metadata_init); +void xdp_set_features_flag(struct net_device *dev, xdp_features_t val) +{ +	val &= NETDEV_XDP_ACT_MASK; +	if (dev->xdp_features == val) +		return; + +	dev->xdp_features = val; + +	if (dev->reg_state == NETREG_REGISTERED) +		call_netdevice_notifiers(NETDEV_XDP_FEAT_CHANGE, dev); +} +EXPORT_SYMBOL_GPL(xdp_set_features_flag); +  void xdp_features_set_redirect_target(struct net_device *dev, bool support_sg)  { -	dev->xdp_features |= NETDEV_XDP_ACT_NDO_XMIT; -	if (support_sg) -		dev->xdp_features |= NETDEV_XDP_ACT_NDO_XMIT_SG; +	xdp_features_t val = (dev->xdp_features | NETDEV_XDP_ACT_NDO_XMIT); -	call_netdevice_notifiers(NETDEV_XDP_FEAT_CHANGE, dev); +	if (support_sg) +		val |= NETDEV_XDP_ACT_NDO_XMIT_SG; +	xdp_set_features_flag(dev, val);  }  EXPORT_SYMBOL_GPL(xdp_features_set_redirect_target);  void xdp_features_clear_redirect_target(struct net_device *dev)  { -	dev->xdp_features &= ~(NETDEV_XDP_ACT_NDO_XMIT | -			       NETDEV_XDP_ACT_NDO_XMIT_SG); -	call_netdevice_notifiers(NETDEV_XDP_FEAT_CHANGE, dev); +	xdp_features_t val = dev->xdp_features; + +	val &= ~(NETDEV_XDP_ACT_NDO_XMIT | NETDEV_XDP_ACT_NDO_XMIT_SG); +	xdp_set_features_flag(dev, val);  }  EXPORT_SYMBOL_GPL(xdp_features_clear_redirect_target);  | 
