| .. | .. |
|---|
| 285 | 285 | { |
|---|
| 286 | 286 | struct veth_priv *rcv_priv, *priv = netdev_priv(dev); |
|---|
| 287 | 287 | struct veth_rq *rq = NULL; |
|---|
| 288 | + int ret = NETDEV_TX_OK; |
|---|
| 288 | 289 | struct net_device *rcv; |
|---|
| 289 | 290 | int length = skb->len; |
|---|
| 290 | 291 | bool rcv_xdp = false; |
|---|
| .. | .. |
|---|
| 311 | 312 | } else { |
|---|
| 312 | 313 | drop: |
|---|
| 313 | 314 | atomic64_inc(&priv->dropped); |
|---|
| 315 | + ret = NET_XMIT_DROP; |
|---|
| 314 | 316 | } |
|---|
| 315 | 317 | |
|---|
| 316 | 318 | if (rcv_xdp) |
|---|
| .. | .. |
|---|
| 318 | 320 | |
|---|
| 319 | 321 | rcu_read_unlock(); |
|---|
| 320 | 322 | |
|---|
| 321 | | - return NETDEV_TX_OK; |
|---|
| 323 | + return ret; |
|---|
| 322 | 324 | } |
|---|
| 323 | 325 | |
|---|
| 324 | 326 | static u64 veth_stats_tx(struct net_device *dev, u64 *packets, u64 *bytes) |
|---|
| .. | .. |
|---|
| 849 | 851 | xdp_set_return_frame_no_direct(); |
|---|
| 850 | 852 | done = veth_xdp_rcv(rq, budget, &bq, &stats); |
|---|
| 851 | 853 | |
|---|
| 854 | + if (stats.xdp_redirect > 0) |
|---|
| 855 | + xdp_do_flush(); |
|---|
| 856 | + |
|---|
| 852 | 857 | if (done < budget && napi_complete_done(napi, done)) { |
|---|
| 853 | 858 | /* Write rx_notify_masked before reading ptr_ring */ |
|---|
| 854 | 859 | smp_store_mb(rq->rx_notify_masked, false); |
|---|
| .. | .. |
|---|
| 862 | 867 | |
|---|
| 863 | 868 | if (stats.xdp_tx > 0) |
|---|
| 864 | 869 | veth_xdp_flush(rq, &bq); |
|---|
| 865 | | - if (stats.xdp_redirect > 0) |
|---|
| 866 | | - xdp_do_flush(); |
|---|
| 867 | 870 | xdp_clear_return_frame_no_direct(); |
|---|
| 868 | 871 | |
|---|
| 869 | 872 | return done; |
|---|
| .. | .. |
|---|
| 1312 | 1315 | |
|---|
| 1313 | 1316 | nla_peer = data[VETH_INFO_PEER]; |
|---|
| 1314 | 1317 | 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); |
|---|
| 1319 | 1319 | if (err < 0) |
|---|
| 1320 | 1320 | return err; |
|---|
| 1321 | 1321 | |
|---|