hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/net/veth.c
....@@ -285,6 +285,7 @@
285285 {
286286 struct veth_priv *rcv_priv, *priv = netdev_priv(dev);
287287 struct veth_rq *rq = NULL;
288
+ int ret = NETDEV_TX_OK;
288289 struct net_device *rcv;
289290 int length = skb->len;
290291 bool rcv_xdp = false;
....@@ -311,6 +312,7 @@
311312 } else {
312313 drop:
313314 atomic64_inc(&priv->dropped);
315
+ ret = NET_XMIT_DROP;
314316 }
315317
316318 if (rcv_xdp)
....@@ -318,7 +320,7 @@
318320
319321 rcu_read_unlock();
320322
321
- return NETDEV_TX_OK;
323
+ return ret;
322324 }
323325
324326 static u64 veth_stats_tx(struct net_device *dev, u64 *packets, u64 *bytes)
....@@ -849,6 +851,9 @@
849851 xdp_set_return_frame_no_direct();
850852 done = veth_xdp_rcv(rq, budget, &bq, &stats);
851853
854
+ if (stats.xdp_redirect > 0)
855
+ xdp_do_flush();
856
+
852857 if (done < budget && napi_complete_done(napi, done)) {
853858 /* Write rx_notify_masked before reading ptr_ring */
854859 smp_store_mb(rq->rx_notify_masked, false);
....@@ -862,8 +867,6 @@
862867
863868 if (stats.xdp_tx > 0)
864869 veth_xdp_flush(rq, &bq);
865
- if (stats.xdp_redirect > 0)
866
- xdp_do_flush();
867870 xdp_clear_return_frame_no_direct();
868871
869872 return done;
....@@ -1312,10 +1315,7 @@
13121315
13131316 nla_peer = data[VETH_INFO_PEER];
13141317 ifmp = nla_data(nla_peer);
1315
- err = rtnl_nla_parse_ifla(peer_tb,
1316
- nla_data(nla_peer) + sizeof(struct ifinfomsg),
1317
- nla_len(nla_peer) - sizeof(struct ifinfomsg),
1318
- NULL);
1318
+ err = rtnl_nla_parse_ifinfomsg(peer_tb, nla_peer, extack);
13191319 if (err < 0)
13201320 return err;
13211321