@@ -2214,7 +2214,7 @@ static struct sk_buff *ixgbe_run_xdp(struct ixgbe_adapter *adapter,
2214
2214
struct ixgbe_ring * rx_ring ,
2215
2215
struct xdp_buff * xdp )
2216
2216
{
2217
- int result = IXGBE_XDP_PASS ;
2217
+ int err , result = IXGBE_XDP_PASS ;
2218
2218
struct bpf_prog * xdp_prog ;
2219
2219
u32 act ;
2220
2220
@@ -2231,6 +2231,13 @@ static struct sk_buff *ixgbe_run_xdp(struct ixgbe_adapter *adapter,
2231
2231
case XDP_TX :
2232
2232
result = ixgbe_xmit_xdp_ring (adapter , xdp );
2233
2233
break ;
2234
+ case XDP_REDIRECT :
2235
+ err = xdp_do_redirect (adapter -> netdev , xdp );
2236
+ if (!err )
2237
+ result = IXGBE_XDP_TX ;
2238
+ else
2239
+ result = IXGBE_XDP_CONSUMED ;
2240
+ break ;
2234
2241
default :
2235
2242
bpf_warn_invalid_xdp_action (act );
2236
2243
/* fallthrough */
@@ -9823,6 +9830,37 @@ static int ixgbe_xdp(struct net_device *dev, struct netdev_xdp *xdp)
9823
9830
}
9824
9831
}
9825
9832
9833
+ static int ixgbe_xdp_xmit (struct net_device * dev , struct xdp_buff * xdp )
9834
+ {
9835
+ struct ixgbe_adapter * adapter = netdev_priv (dev );
9836
+ struct ixgbe_ring * ring ;
9837
+ int err ;
9838
+
9839
+ if (unlikely (test_bit (__IXGBE_DOWN , & adapter -> state )))
9840
+ return - EINVAL ;
9841
+
9842
+ /* During program transitions its possible adapter->xdp_prog is assigned
9843
+ * but ring has not been configured yet. In this case simply abort xmit.
9844
+ */
9845
+ ring = adapter -> xdp_prog ? adapter -> xdp_ring [smp_processor_id ()] : NULL ;
9846
+ if (unlikely (!ring ))
9847
+ return - EINVAL ;
9848
+
9849
+ err = ixgbe_xmit_xdp_ring (adapter , xdp );
9850
+ if (err != IXGBE_XDP_TX )
9851
+ return - ENOMEM ;
9852
+
9853
+ /* Force memory writes to complete before letting h/w know there
9854
+ * are new descriptors to fetch.
9855
+ */
9856
+ wmb ();
9857
+
9858
+ ring = adapter -> xdp_ring [smp_processor_id ()];
9859
+ writel (ring -> next_to_use , ring -> tail );
9860
+
9861
+ return 0 ;
9862
+ }
9863
+
9826
9864
static const struct net_device_ops ixgbe_netdev_ops = {
9827
9865
.ndo_open = ixgbe_open ,
9828
9866
.ndo_stop = ixgbe_close ,
@@ -9869,6 +9907,7 @@ static const struct net_device_ops ixgbe_netdev_ops = {
9869
9907
.ndo_udp_tunnel_del = ixgbe_del_udp_tunnel_port ,
9870
9908
.ndo_features_check = ixgbe_features_check ,
9871
9909
.ndo_xdp = ixgbe_xdp ,
9910
+ .ndo_xdp_xmit = ixgbe_xdp_xmit ,
9872
9911
};
9873
9912
9874
9913
/**
0 commit comments