Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

netdev_features: convert NETIF_F_NETNS_LOCAL to dev->netns_local

"Interface can't change network namespaces" is rather an attribute,
not a feature, and it can't be changed via Ethtool.
Make it a "cold" private flag instead of a netdev_feature and free
one more bit.

Signed-off-by: Alexander Lobakin <aleksander.lobakin@intel.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>

authored by

Alexander Lobakin and committed by
Paolo Abeni
05c1280a 00d066a4

+61 -62
+1
Documentation/networking/net_cachelines/net_device.rst
··· 166 166 unsigned:1 threaded - - napi_poll(napi_enable,dev_set_threaded) 167 167 unsigned_long:1 see_all_hwtstamp_requests 168 168 unsigned_long:1 change_proto_down 169 + unsigned_long:1 netns_local 169 170 struct_list_head net_notifier_list 170 171 struct_macsec_ops* macsec_ops 171 172 struct_udp_tunnel_nic_info* udp_tunnel_nic_info
-7
Documentation/networking/netdev-features.rst
··· 139 139 Features contained in NETIF_F_SOFT_FEATURES are features of networking 140 140 stack. Driver should not change behaviour based on them. 141 141 142 - * netns-local device 143 - 144 - NETIF_F_NETNS_LOCAL is set for devices that are not allowed to move between 145 - network namespaces (e.g. loopback). 146 - 147 - Don't use it in drivers. 148 - 149 142 * VLAN challenged 150 143 151 144 NETIF_F_VLAN_CHALLENGED should be set for devices which can't cope with VLAN
+2 -2
Documentation/networking/switchdev.rst
··· 137 137 Port Features 138 138 ^^^^^^^^^^^^^ 139 139 140 - NETIF_F_NETNS_LOCAL 140 + dev->netns_local 141 141 142 142 If the switchdev driver (and device) only supports offloading of the default 143 - network namespace (netns), the driver should set this feature flag to prevent 143 + network namespace (netns), the driver should set this private flag to prevent 144 144 the port netdev from being moved out of the default netns. A netns-aware 145 145 driver/device would not set this flag and be responsible for partitioning 146 146 hardware to preserve netns containment. This means hardware cannot forward
+1 -1
drivers/net/amt.c
··· 3099 3099 dev->addr_len = 0; 3100 3100 dev->priv_flags |= IFF_NO_QUEUE; 3101 3101 dev->lltx = true; 3102 + dev->netns_local = true; 3102 3103 dev->features |= NETIF_F_GSO_SOFTWARE; 3103 - dev->features |= NETIF_F_NETNS_LOCAL; 3104 3104 dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM; 3105 3105 dev->hw_features |= NETIF_F_FRAGLIST | NETIF_F_RXCSUM; 3106 3106 dev->hw_features |= NETIF_F_GSO_SOFTWARE;
+3 -3
drivers/net/bonding/bond_main.c
··· 5930 5930 /* don't acquire bond device's netif_tx_lock when transmitting */ 5931 5931 bond_dev->lltx = true; 5932 5932 5933 + /* Don't allow bond devices to change network namespaces. */ 5934 + bond_dev->netns_local = true; 5935 + 5933 5936 /* By default, we declare the bond to be fully 5934 5937 * VLAN hardware accelerated capable. Special 5935 5938 * care is taken in the various xmit functions 5936 5939 * when there are slaves that are not hw accel 5937 5940 * capable 5938 5941 */ 5939 - 5940 - /* Don't allow bond devices to change network namespaces. */ 5941 - bond_dev->features |= NETIF_F_NETNS_LOCAL; 5942 5942 5943 5943 bond_dev->hw_features = BOND_VLAN_FEATURES | 5944 5944 NETIF_F_HW_VLAN_CTAG_RX |
+1 -1
drivers/net/ethernet/adi/adin1110.c
··· 1599 1599 netdev->netdev_ops = &adin1110_netdev_ops; 1600 1600 netdev->ethtool_ops = &adin1110_ethtool_ops; 1601 1601 netdev->priv_flags |= IFF_UNICAST_FLT; 1602 - netdev->features |= NETIF_F_NETNS_LOCAL; 1602 + netdev->netns_local = true; 1603 1603 1604 1604 port_priv->phydev = get_phy_device(priv->mii_bus, i + 1, false); 1605 1605 if (IS_ERR(port_priv->phydev)) {
+2 -1
drivers/net/ethernet/marvell/prestera/prestera_main.c
··· 633 633 if (err) 634 634 goto err_dl_port_register; 635 635 636 - dev->features |= NETIF_F_NETNS_LOCAL | NETIF_F_HW_TC; 636 + dev->features |= NETIF_F_HW_TC; 637 + dev->netns_local = true; 637 638 dev->netdev_ops = &prestera_netdev_ops; 638 639 dev->ethtool_ops = &prestera_ethtool_ops; 639 640 SET_NETDEV_DEV(dev, sw->dev->dev);
+2 -2
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
··· 4414 4414 4415 4415 if (mlx5e_is_uplink_rep(priv)) { 4416 4416 features = mlx5e_fix_uplink_rep_features(netdev, features); 4417 - features |= NETIF_F_NETNS_LOCAL; 4417 + netdev->netns_local = true; 4418 4418 } else { 4419 - features &= ~NETIF_F_NETNS_LOCAL; 4419 + netdev->netns_local = false; 4420 4420 } 4421 4421 4422 4422 mutex_unlock(&priv->state_lock);
+2 -1
drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
··· 898 898 netdev->hw_features |= NETIF_F_RXCSUM; 899 899 900 900 netdev->features |= netdev->hw_features; 901 - netdev->features |= NETIF_F_NETNS_LOCAL; 901 + 902 + netdev->netns_local = true; 902 903 } 903 904 904 905 static int mlx5e_init_rep(struct mlx5_core_dev *mdev,
+3 -2
drivers/net/ethernet/mellanox/mlxsw/spectrum.c
··· 1676 1676 1677 1677 netif_carrier_off(dev); 1678 1678 1679 - dev->features |= NETIF_F_NETNS_LOCAL | NETIF_F_SG | 1680 - NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_TC; 1679 + dev->features |= NETIF_F_SG | NETIF_F_HW_VLAN_CTAG_FILTER | 1680 + NETIF_F_HW_TC; 1681 1681 dev->hw_features |= NETIF_F_HW_TC | NETIF_F_LOOPBACK; 1682 1682 dev->lltx = true; 1683 + dev->netns_local = true; 1683 1684 1684 1685 dev->min_mtu = ETH_MIN_MTU; 1685 1686 dev->max_mtu = MLXSW_PORT_MAX_MTU - MLXSW_PORT_ETH_FRAME_HDR;
+2 -1
drivers/net/ethernet/rocker/rocker_main.c
··· 2575 2575 netif_napi_add(dev, &rocker_port->napi_rx, rocker_port_poll_rx); 2576 2576 rocker_carrier_init(rocker_port); 2577 2577 2578 - dev->features |= NETIF_F_NETNS_LOCAL | NETIF_F_SG; 2578 + dev->features |= NETIF_F_SG; 2579 + dev->netns_local = true; 2579 2580 2580 2581 /* MTU range: 68 - 9000 */ 2581 2582 dev->min_mtu = ROCKER_PORT_MIN_MTU;
+2 -1
drivers/net/ethernet/ti/cpsw_new.c
··· 1407 1407 cpsw->slaves[i].ndev = ndev; 1408 1408 1409 1409 ndev->features |= NETIF_F_HW_VLAN_CTAG_FILTER | 1410 - NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_NETNS_LOCAL | NETIF_F_HW_TC; 1410 + NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_HW_TC; 1411 + ndev->netns_local = true; 1411 1412 1412 1413 ndev->xdp_features = NETDEV_XDP_ACT_BASIC | 1413 1414 NETDEV_XDP_ACT_REDIRECT |
+1 -1
drivers/net/loopback.c
··· 172 172 dev->flags = IFF_LOOPBACK; 173 173 dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE; 174 174 dev->lltx = true; 175 + dev->netns_local = true; 175 176 netif_keep_dst(dev); 176 177 dev->hw_features = NETIF_F_GSO_SOFTWARE; 177 178 dev->features = NETIF_F_SG | NETIF_F_FRAGLIST ··· 181 180 | NETIF_F_RXCSUM 182 181 | NETIF_F_SCTP_CRC 183 182 | NETIF_F_HIGHDMA 184 - | NETIF_F_NETNS_LOCAL 185 183 | NETIF_F_VLAN_CHALLENGED 186 184 | NETIF_F_LOOPBACK; 187 185 dev->ethtool_ops = eth_ops;
+1 -1
drivers/net/net_failover.c
··· 734 734 failover_dev->lltx = true; 735 735 736 736 /* Don't allow failover devices to change network namespaces. */ 737 - failover_dev->features |= NETIF_F_NETNS_LOCAL; 737 + failover_dev->netns_local = true; 738 738 739 739 failover_dev->hw_features = FAILOVER_VLAN_FEATURES | 740 740 NETIF_F_HW_VLAN_CTAG_TX |
+3 -3
drivers/net/team/team_core.c
··· 2191 2191 dev->priv_flags |= IFF_UNICAST_FLT | IFF_LIVE_ADDR_CHANGE; 2192 2192 dev->lltx = true; 2193 2193 2194 - dev->features |= NETIF_F_GRO; 2195 - 2196 2194 /* Don't allow team devices to change network namespaces. */ 2197 - dev->features |= NETIF_F_NETNS_LOCAL; 2195 + dev->netns_local = true; 2196 + 2197 + dev->features |= NETIF_F_GRO; 2198 2198 2199 2199 dev->hw_features = TEAM_VLAN_FEATURES | 2200 2200 NETIF_F_HW_VLAN_CTAG_RX |
+1 -1
drivers/net/vrf.c
··· 1638 1638 dev->lltx = true; 1639 1639 1640 1640 /* don't allow vrf devices to change network namespaces. */ 1641 - dev->features |= NETIF_F_NETNS_LOCAL; 1641 + dev->netns_local = true; 1642 1642 1643 1643 /* does not make sense for a VLAN to be added to a vrf device */ 1644 1644 dev->features |= NETIF_F_VLAN_CHALLENGED;
+2 -4
include/linux/netdev_features.h
··· 25 25 NETIF_F_VLAN_CHALLENGED_BIT, /* Device cannot handle VLAN packets */ 26 26 NETIF_F_GSO_BIT, /* Enable software GSO. */ 27 27 __UNUSED_NETIF_F_12, 28 - NETIF_F_NETNS_LOCAL_BIT, /* Does not change network namespaces */ 28 + __UNUSED_NETIF_F_13, 29 29 NETIF_F_GRO_BIT, /* Generic receive offload */ 30 30 NETIF_F_LRO_BIT, /* large receive offload */ 31 31 ··· 121 121 #define NETIF_F_IPV6_CSUM __NETIF_F(IPV6_CSUM) 122 122 #define NETIF_F_LOOPBACK __NETIF_F(LOOPBACK) 123 123 #define NETIF_F_LRO __NETIF_F(LRO) 124 - #define NETIF_F_NETNS_LOCAL __NETIF_F(NETNS_LOCAL) 125 124 #define NETIF_F_NOCACHE_COPY __NETIF_F(NOCACHE_COPY) 126 125 #define NETIF_F_NTUPLE __NETIF_F(NTUPLE) 127 126 #define NETIF_F_RXCSUM __NETIF_F(RXCSUM) ··· 189 190 190 191 /* Features valid for ethtool to change */ 191 192 /* = all defined minus driver/device-class-related */ 192 - #define NETIF_F_NEVER_CHANGE (NETIF_F_VLAN_CHALLENGED | \ 193 - NETIF_F_NETNS_LOCAL) 193 + #define NETIF_F_NEVER_CHANGE NETIF_F_VLAN_CHALLENGED 194 194 195 195 /* remember that ((t)1 << t_BITS) is undefined in C99 */ 196 196 #define NETIF_F_ETHTOOL_BITS ((__NETIF_F_BIT(NETDEV_FEATURE_COUNT - 1) | \
+2
include/linux/netdevice.h
··· 1968 1968 * regardless of source, even if those aren't 1969 1969 * HWTSTAMP_SOURCE_NETDEV 1970 1970 * @change_proto_down: device supports setting carrier via IFLA_PROTO_DOWN 1971 + * @netns_local: interface can't change network namespaces 1971 1972 * 1972 1973 * @net_notifier_list: List of per-net netdev notifier block 1973 1974 * that follow this device when it is moved ··· 2362 2361 /* priv_flags_slow, ungrouped to save space */ 2363 2362 unsigned long see_all_hwtstamp_requests:1; 2364 2363 unsigned long change_proto_down:1; 2364 + unsigned long netns_local:1; 2365 2365 2366 2366 struct list_head net_notifier_list; 2367 2367
+2 -1
net/batman-adv/soft-interface.c
··· 1020 1020 dev->netdev_ops = &batadv_netdev_ops; 1021 1021 dev->needs_free_netdev = true; 1022 1022 dev->priv_destructor = batadv_softif_free; 1023 - dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_NETNS_LOCAL; 1023 + dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER; 1024 1024 dev->priv_flags |= IFF_NO_QUEUE; 1025 1025 dev->lltx = true; 1026 + dev->netns_local = true; 1026 1027 1027 1028 /* can't call min_mtu, because the needed variables 1028 1029 * have not been initialized yet
+3 -2
net/bridge/br_device.c
··· 488 488 SET_NETDEV_DEVTYPE(dev, &br_type); 489 489 dev->priv_flags = IFF_EBRIDGE | IFF_NO_QUEUE; 490 490 dev->lltx = true; 491 + dev->netns_local = true; 491 492 492 - dev->features = COMMON_FEATURES | NETIF_F_NETNS_LOCAL | 493 - NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX; 493 + dev->features = COMMON_FEATURES | NETIF_F_HW_VLAN_CTAG_TX | 494 + NETIF_F_HW_VLAN_STAG_TX; 494 495 dev->hw_features = COMMON_FEATURES | NETIF_F_HW_VLAN_CTAG_TX | 495 496 NETIF_F_HW_VLAN_STAG_TX; 496 497 dev->vlan_features = COMMON_FEATURES;
+2 -2
net/core/dev.c
··· 11487 11487 11488 11488 /* Don't allow namespace local devices to be moved. */ 11489 11489 err = -EINVAL; 11490 - if (dev->features & NETIF_F_NETNS_LOCAL) 11490 + if (dev->netns_local) 11491 11491 goto out; 11492 11492 11493 11493 /* Ensure the device has been registered */ ··· 11869 11869 char fb_name[IFNAMSIZ]; 11870 11870 11871 11871 /* Ignore unmoveable devices (i.e. loopback) */ 11872 - if (dev->features & NETIF_F_NETNS_LOCAL) 11872 + if (dev->netns_local) 11873 11873 continue; 11874 11874 11875 11875 /* Leave virtual devices for the generic cleanup */
-1
net/ethtool/common.c
··· 25 25 [NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter", 26 26 [NETIF_F_VLAN_CHALLENGED_BIT] = "vlan-challenged", 27 27 [NETIF_F_GSO_BIT] = "tx-generic-segmentation", 28 - [NETIF_F_NETNS_LOCAL_BIT] = "netns-local", 29 28 [NETIF_F_GRO_BIT] = "rx-gro", 30 29 [NETIF_F_GRO_HW_BIT] = "rx-gro-hw", 31 30 [NETIF_F_LRO_BIT] = "rx-lro",
+4 -4
net/hsr/hsr_device.c
··· 556 556 dev->priv_flags |= IFF_NO_QUEUE | IFF_DISABLE_NETPOLL; 557 557 /* Prevent recursive tx locking */ 558 558 dev->lltx = true; 559 + /* Not sure about this. Taken from bridge code. netdevice.h says 560 + * it means "Does not change network namespaces". 561 + */ 562 + dev->netns_local = true; 559 563 560 564 dev->needs_free_netdev = true; 561 565 ··· 573 569 * hsr_header_create() etc. 574 570 */ 575 571 dev->features |= NETIF_F_VLAN_CHALLENGED; 576 - /* Not sure about this. Taken from bridge code. netdev_features.h says 577 - * it means "Does not change network namespaces". 578 - */ 579 - dev->features |= NETIF_F_NETNS_LOCAL; 580 572 } 581 573 582 574 /* Return true if dev is a HSR master; return false otherwise.
+1 -1
net/ieee802154/6lowpan/core.c
··· 116 116 ldev->netdev_ops = &lowpan_netdev_ops; 117 117 ldev->header_ops = &lowpan_header_ops; 118 118 ldev->needs_free_netdev = true; 119 - ldev->features |= NETIF_F_NETNS_LOCAL; 119 + ldev->netns_local = true; 120 120 } 121 121 122 122 static int lowpan_validate(struct nlattr *tb[], struct nlattr *data[],
+5 -5
net/ieee802154/core.c
··· 226 226 list_for_each_entry(wpan_dev, &rdev->wpan_dev_list, list) { 227 227 if (!wpan_dev->netdev) 228 228 continue; 229 - wpan_dev->netdev->features &= ~NETIF_F_NETNS_LOCAL; 229 + wpan_dev->netdev->netns_local = false; 230 230 err = dev_change_net_namespace(wpan_dev->netdev, net, "wpan%d"); 231 231 if (err) 232 232 break; 233 - wpan_dev->netdev->features |= NETIF_F_NETNS_LOCAL; 233 + wpan_dev->netdev->netns_local = true; 234 234 } 235 235 236 236 if (err) { ··· 242 242 list) { 243 243 if (!wpan_dev->netdev) 244 244 continue; 245 - wpan_dev->netdev->features &= ~NETIF_F_NETNS_LOCAL; 245 + wpan_dev->netdev->netns_local = false; 246 246 err = dev_change_net_namespace(wpan_dev->netdev, net, 247 247 "wpan%d"); 248 248 WARN_ON(err); 249 - wpan_dev->netdev->features |= NETIF_F_NETNS_LOCAL; 249 + wpan_dev->netdev->netns_local = true; 250 250 } 251 251 252 252 return err; ··· 291 291 switch (state) { 292 292 /* TODO NETDEV_DEVTYPE */ 293 293 case NETDEV_REGISTER: 294 - dev->features |= NETIF_F_NETNS_LOCAL; 294 + dev->netns_local = true; 295 295 wpan_dev->identifier = ++rdev->wpan_dev_id; 296 296 list_add_rcu(&wpan_dev->list, &rdev->wpan_dev_list); 297 297 rdev->devlist_generation++;
+1 -1
net/ipv4/ip_tunnel.c
··· 1161 1161 * Allowing to move it to another netns is clearly unsafe. 1162 1162 */ 1163 1163 if (!IS_ERR(itn->fb_tunnel_dev)) { 1164 - itn->fb_tunnel_dev->features |= NETIF_F_NETNS_LOCAL; 1164 + itn->fb_tunnel_dev->netns_local = true; 1165 1165 itn->fb_tunnel_dev->mtu = ip_tunnel_bind_dev(itn->fb_tunnel_dev); 1166 1166 ip_tunnel_add(itn, netdev_priv(itn->fb_tunnel_dev)); 1167 1167 itn->type = itn->fb_tunnel_dev->type;
+1 -1
net/ipv4/ipmr.c
··· 537 537 dev->flags = IFF_NOARP; 538 538 dev->netdev_ops = &reg_vif_netdev_ops; 539 539 dev->needs_free_netdev = true; 540 - dev->features |= NETIF_F_NETNS_LOCAL; 540 + dev->netns_local = true; 541 541 } 542 542 543 543 static struct net_device *ipmr_reg_vif(struct net *net, struct mr_table *mrt)
+1 -2
net/ipv6/ip6_gre.c
··· 1621 1621 /* FB netdevice is special: we have one, and only one per netns. 1622 1622 * Allowing to move it to another netns is clearly unsafe. 1623 1623 */ 1624 - ign->fb_tunnel_dev->features |= NETIF_F_NETNS_LOCAL; 1625 - 1624 + ign->fb_tunnel_dev->netns_local = true; 1626 1625 1627 1626 ip6gre_fb_tunnel_init(ign->fb_tunnel_dev); 1628 1627 ign->fb_tunnel_dev->rtnl_link_ops = &ip6gre_link_ops;
+1 -1
net/ipv6/ip6_tunnel.c
··· 2258 2258 /* FB netdevice is special: we have one, and only one per netns. 2259 2259 * Allowing to move it to another netns is clearly unsafe. 2260 2260 */ 2261 - ip6n->fb_tnl_dev->features |= NETIF_F_NETNS_LOCAL; 2261 + ip6n->fb_tnl_dev->netns_local = true; 2262 2262 2263 2263 err = ip6_fb_tnl_dev_init(ip6n->fb_tnl_dev); 2264 2264 if (err < 0)
+1 -1
net/ipv6/ip6mr.c
··· 640 640 dev->flags = IFF_NOARP; 641 641 dev->netdev_ops = &reg_vif_netdev_ops; 642 642 dev->needs_free_netdev = true; 643 - dev->features |= NETIF_F_NETNS_LOCAL; 643 + dev->netns_local = true; 644 644 } 645 645 646 646 static struct net_device *ip6mr_reg_vif(struct net *net, struct mr_table *mrt)
+1 -1
net/ipv6/sit.c
··· 1856 1856 /* FB netdevice is special: we have one, and only one per netns. 1857 1857 * Allowing to move it to another netns is clearly unsafe. 1858 1858 */ 1859 - sitn->fb_tunnel_dev->features |= NETIF_F_NETNS_LOCAL; 1859 + sitn->fb_tunnel_dev->netns_local = true; 1860 1860 1861 1861 err = register_netdev(sitn->fb_tunnel_dev); 1862 1862 if (err)
+1 -1
net/openvswitch/vport-internal_dev.c
··· 149 149 150 150 /* Restrict bridge port to current netns. */ 151 151 if (vport->port_no == OVSP_LOCAL) 152 - vport->dev->features |= NETIF_F_NETNS_LOCAL; 152 + vport->dev->netns_local = true; 153 153 154 154 rtnl_lock(); 155 155 err = register_netdevice(vport->dev);
+5 -5
net/wireless/core.c
··· 165 165 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 166 166 if (!wdev->netdev) 167 167 continue; 168 - wdev->netdev->features &= ~NETIF_F_NETNS_LOCAL; 168 + wdev->netdev->netns_local = false; 169 169 err = dev_change_net_namespace(wdev->netdev, net, "wlan%d"); 170 170 if (err) 171 171 break; 172 - wdev->netdev->features |= NETIF_F_NETNS_LOCAL; 172 + wdev->netdev->netns_local = true; 173 173 } 174 174 175 175 if (err) { ··· 181 181 list) { 182 182 if (!wdev->netdev) 183 183 continue; 184 - wdev->netdev->features &= ~NETIF_F_NETNS_LOCAL; 184 + wdev->netdev->netns_local = false; 185 185 err = dev_change_net_namespace(wdev->netdev, net, 186 186 "wlan%d"); 187 187 WARN_ON(err); 188 - wdev->netdev->features |= NETIF_F_NETNS_LOCAL; 188 + wdev->netdev->netns_local = true; 189 189 } 190 190 191 191 return err; ··· 1473 1473 SET_NETDEV_DEVTYPE(dev, &wiphy_type); 1474 1474 wdev->netdev = dev; 1475 1475 /* can only change netns with wiphy */ 1476 - dev->features |= NETIF_F_NETNS_LOCAL; 1476 + dev->netns_local = true; 1477 1477 1478 1478 cfg80211_init_wdev(wdev); 1479 1479 break;
+1 -1
tools/testing/selftests/net/forwarding/README
··· 6 6 7 7 Unfortunately, these namespaces can not be used with actual switching 8 8 ASICs, as their ports can not be migrated to other network namespaces 9 - (NETIF_F_NETNS_LOCAL) and most of them probably do not support the 9 + (dev->netns_local) and most of them probably do not support the 10 10 L1-separation provided by namespaces. 11 11 12 12 However, a similar kind of flexibility can be achieved by using VRFs and