@@ -1257,6 +1257,26 @@ static int veth_enable_range_safe(struct net_device *dev, int start, int end)
1257
1257
return 0 ;
1258
1258
}
1259
1259
1260
+ static void veth_set_xdp_features (struct net_device * dev )
1261
+ {
1262
+ struct veth_priv * priv = netdev_priv (dev );
1263
+ struct net_device * peer ;
1264
+
1265
+ peer = rcu_dereference (priv -> peer );
1266
+ if (peer && peer -> real_num_tx_queues <= dev -> real_num_rx_queues ) {
1267
+ xdp_features_t val = NETDEV_XDP_ACT_BASIC |
1268
+ NETDEV_XDP_ACT_REDIRECT |
1269
+ NETDEV_XDP_ACT_RX_SG ;
1270
+
1271
+ if (priv -> _xdp_prog || veth_gro_requested (dev ))
1272
+ val |= NETDEV_XDP_ACT_NDO_XMIT |
1273
+ NETDEV_XDP_ACT_NDO_XMIT_SG ;
1274
+ xdp_set_features_flag (dev , val );
1275
+ } else {
1276
+ xdp_clear_features_flag (dev );
1277
+ }
1278
+ }
1279
+
1260
1280
static int veth_set_channels (struct net_device * dev ,
1261
1281
struct ethtool_channels * ch )
1262
1282
{
@@ -1323,6 +1343,12 @@ static int veth_set_channels(struct net_device *dev,
1323
1343
if (peer )
1324
1344
netif_carrier_on (peer );
1325
1345
}
1346
+
1347
+ /* update XDP supported features */
1348
+ veth_set_xdp_features (dev );
1349
+ if (peer )
1350
+ veth_set_xdp_features (peer );
1351
+
1326
1352
return err ;
1327
1353
1328
1354
revert :
@@ -1489,7 +1515,10 @@ static int veth_set_features(struct net_device *dev,
1489
1515
err = veth_napi_enable (dev );
1490
1516
if (err )
1491
1517
return err ;
1518
+
1519
+ xdp_features_set_redirect_target (dev , true);
1492
1520
} else {
1521
+ xdp_features_clear_redirect_target (dev );
1493
1522
veth_napi_del (dev );
1494
1523
}
1495
1524
return 0 ;
@@ -1570,10 +1599,15 @@ static int veth_xdp_set(struct net_device *dev, struct bpf_prog *prog,
1570
1599
peer -> hw_features &= ~NETIF_F_GSO_SOFTWARE ;
1571
1600
peer -> max_mtu = max_mtu ;
1572
1601
}
1602
+
1603
+ xdp_features_set_redirect_target (dev , true);
1573
1604
}
1574
1605
1575
1606
if (old_prog ) {
1576
1607
if (!prog ) {
1608
+ if (!veth_gro_requested (dev ))
1609
+ xdp_features_clear_redirect_target (dev );
1610
+
1577
1611
if (dev -> flags & IFF_UP )
1578
1612
veth_disable_xdp (dev );
1579
1613
@@ -1686,10 +1720,6 @@ static void veth_setup(struct net_device *dev)
1686
1720
dev -> hw_enc_features = VETH_FEATURES ;
1687
1721
dev -> mpls_features = NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE ;
1688
1722
netif_set_tso_max_size (dev , GSO_MAX_SIZE );
1689
-
1690
- dev -> xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
1691
- NETDEV_XDP_ACT_NDO_XMIT | NETDEV_XDP_ACT_RX_SG |
1692
- NETDEV_XDP_ACT_NDO_XMIT_SG ;
1693
1723
}
1694
1724
1695
1725
/*
@@ -1857,6 +1887,10 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
1857
1887
goto err_queues ;
1858
1888
1859
1889
veth_disable_gro (dev );
1890
+ /* update XDP supported features */
1891
+ veth_set_xdp_features (dev );
1892
+ veth_set_xdp_features (peer );
1893
+
1860
1894
return 0 ;
1861
1895
1862
1896
err_queues :
0 commit comments