mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-01 18:53:30 +00:00
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>
This commit is contained in:
parent
00d066a4d4
commit
05c1280a2b
@ -166,6 +166,7 @@ unsigned:1 wol_enabled
|
|||||||
unsigned:1 threaded - - napi_poll(napi_enable,dev_set_threaded)
|
unsigned:1 threaded - - napi_poll(napi_enable,dev_set_threaded)
|
||||||
unsigned_long:1 see_all_hwtstamp_requests
|
unsigned_long:1 see_all_hwtstamp_requests
|
||||||
unsigned_long:1 change_proto_down
|
unsigned_long:1 change_proto_down
|
||||||
|
unsigned_long:1 netns_local
|
||||||
struct_list_head net_notifier_list
|
struct_list_head net_notifier_list
|
||||||
struct_macsec_ops* macsec_ops
|
struct_macsec_ops* macsec_ops
|
||||||
struct_udp_tunnel_nic_info* udp_tunnel_nic_info
|
struct_udp_tunnel_nic_info* udp_tunnel_nic_info
|
||||||
|
@ -139,13 +139,6 @@ chained skbs (skb->next/prev list).
|
|||||||
Features contained in NETIF_F_SOFT_FEATURES are features of networking
|
Features contained in NETIF_F_SOFT_FEATURES are features of networking
|
||||||
stack. Driver should not change behaviour based on them.
|
stack. Driver should not change behaviour based on them.
|
||||||
|
|
||||||
* netns-local device
|
|
||||||
|
|
||||||
NETIF_F_NETNS_LOCAL is set for devices that are not allowed to move between
|
|
||||||
network namespaces (e.g. loopback).
|
|
||||||
|
|
||||||
Don't use it in drivers.
|
|
||||||
|
|
||||||
* VLAN challenged
|
* VLAN challenged
|
||||||
|
|
||||||
NETIF_F_VLAN_CHALLENGED should be set for devices which can't cope with VLAN
|
NETIF_F_VLAN_CHALLENGED should be set for devices which can't cope with VLAN
|
||||||
|
@ -137,10 +137,10 @@ would be sub-port 0 on port 1 on switch 1.
|
|||||||
Port Features
|
Port Features
|
||||||
^^^^^^^^^^^^^
|
^^^^^^^^^^^^^
|
||||||
|
|
||||||
NETIF_F_NETNS_LOCAL
|
dev->netns_local
|
||||||
|
|
||||||
If the switchdev driver (and device) only supports offloading of the default
|
If the switchdev driver (and device) only supports offloading of the default
|
||||||
network namespace (netns), the driver should set this feature flag to prevent
|
network namespace (netns), the driver should set this private flag to prevent
|
||||||
the port netdev from being moved out of the default netns. A netns-aware
|
the port netdev from being moved out of the default netns. A netns-aware
|
||||||
driver/device would not set this flag and be responsible for partitioning
|
driver/device would not set this flag and be responsible for partitioning
|
||||||
hardware to preserve netns containment. This means hardware cannot forward
|
hardware to preserve netns containment. This means hardware cannot forward
|
||||||
|
@ -3099,8 +3099,8 @@ static void amt_link_setup(struct net_device *dev)
|
|||||||
dev->addr_len = 0;
|
dev->addr_len = 0;
|
||||||
dev->priv_flags |= IFF_NO_QUEUE;
|
dev->priv_flags |= IFF_NO_QUEUE;
|
||||||
dev->lltx = true;
|
dev->lltx = true;
|
||||||
|
dev->netns_local = true;
|
||||||
dev->features |= NETIF_F_GSO_SOFTWARE;
|
dev->features |= NETIF_F_GSO_SOFTWARE;
|
||||||
dev->features |= NETIF_F_NETNS_LOCAL;
|
|
||||||
dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM;
|
dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM;
|
||||||
dev->hw_features |= NETIF_F_FRAGLIST | NETIF_F_RXCSUM;
|
dev->hw_features |= NETIF_F_FRAGLIST | NETIF_F_RXCSUM;
|
||||||
dev->hw_features |= NETIF_F_GSO_SOFTWARE;
|
dev->hw_features |= NETIF_F_GSO_SOFTWARE;
|
||||||
|
@ -5930,6 +5930,9 @@ void bond_setup(struct net_device *bond_dev)
|
|||||||
/* don't acquire bond device's netif_tx_lock when transmitting */
|
/* don't acquire bond device's netif_tx_lock when transmitting */
|
||||||
bond_dev->lltx = true;
|
bond_dev->lltx = true;
|
||||||
|
|
||||||
|
/* Don't allow bond devices to change network namespaces. */
|
||||||
|
bond_dev->netns_local = true;
|
||||||
|
|
||||||
/* By default, we declare the bond to be fully
|
/* By default, we declare the bond to be fully
|
||||||
* VLAN hardware accelerated capable. Special
|
* VLAN hardware accelerated capable. Special
|
||||||
* care is taken in the various xmit functions
|
* care is taken in the various xmit functions
|
||||||
@ -5937,9 +5940,6 @@ void bond_setup(struct net_device *bond_dev)
|
|||||||
* capable
|
* capable
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Don't allow bond devices to change network namespaces. */
|
|
||||||
bond_dev->features |= NETIF_F_NETNS_LOCAL;
|
|
||||||
|
|
||||||
bond_dev->hw_features = BOND_VLAN_FEATURES |
|
bond_dev->hw_features = BOND_VLAN_FEATURES |
|
||||||
NETIF_F_HW_VLAN_CTAG_RX |
|
NETIF_F_HW_VLAN_CTAG_RX |
|
||||||
NETIF_F_HW_VLAN_CTAG_FILTER |
|
NETIF_F_HW_VLAN_CTAG_FILTER |
|
||||||
|
@ -1599,7 +1599,7 @@ static int adin1110_probe_netdevs(struct adin1110_priv *priv)
|
|||||||
netdev->netdev_ops = &adin1110_netdev_ops;
|
netdev->netdev_ops = &adin1110_netdev_ops;
|
||||||
netdev->ethtool_ops = &adin1110_ethtool_ops;
|
netdev->ethtool_ops = &adin1110_ethtool_ops;
|
||||||
netdev->priv_flags |= IFF_UNICAST_FLT;
|
netdev->priv_flags |= IFF_UNICAST_FLT;
|
||||||
netdev->features |= NETIF_F_NETNS_LOCAL;
|
netdev->netns_local = true;
|
||||||
|
|
||||||
port_priv->phydev = get_phy_device(priv->mii_bus, i + 1, false);
|
port_priv->phydev = get_phy_device(priv->mii_bus, i + 1, false);
|
||||||
if (IS_ERR(port_priv->phydev)) {
|
if (IS_ERR(port_priv->phydev)) {
|
||||||
|
@ -633,7 +633,8 @@ static int prestera_port_create(struct prestera_switch *sw, u32 id)
|
|||||||
if (err)
|
if (err)
|
||||||
goto err_dl_port_register;
|
goto err_dl_port_register;
|
||||||
|
|
||||||
dev->features |= NETIF_F_NETNS_LOCAL | NETIF_F_HW_TC;
|
dev->features |= NETIF_F_HW_TC;
|
||||||
|
dev->netns_local = true;
|
||||||
dev->netdev_ops = &prestera_netdev_ops;
|
dev->netdev_ops = &prestera_netdev_ops;
|
||||||
dev->ethtool_ops = &prestera_ethtool_ops;
|
dev->ethtool_ops = &prestera_ethtool_ops;
|
||||||
SET_NETDEV_DEV(dev, sw->dev->dev);
|
SET_NETDEV_DEV(dev, sw->dev->dev);
|
||||||
|
@ -4414,9 +4414,9 @@ static netdev_features_t mlx5e_fix_features(struct net_device *netdev,
|
|||||||
|
|
||||||
if (mlx5e_is_uplink_rep(priv)) {
|
if (mlx5e_is_uplink_rep(priv)) {
|
||||||
features = mlx5e_fix_uplink_rep_features(netdev, features);
|
features = mlx5e_fix_uplink_rep_features(netdev, features);
|
||||||
features |= NETIF_F_NETNS_LOCAL;
|
netdev->netns_local = true;
|
||||||
} else {
|
} else {
|
||||||
features &= ~NETIF_F_NETNS_LOCAL;
|
netdev->netns_local = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&priv->state_lock);
|
mutex_unlock(&priv->state_lock);
|
||||||
|
@ -898,7 +898,8 @@ static void mlx5e_build_rep_netdev(struct net_device *netdev,
|
|||||||
netdev->hw_features |= NETIF_F_RXCSUM;
|
netdev->hw_features |= NETIF_F_RXCSUM;
|
||||||
|
|
||||||
netdev->features |= netdev->hw_features;
|
netdev->features |= netdev->hw_features;
|
||||||
netdev->features |= NETIF_F_NETNS_LOCAL;
|
|
||||||
|
netdev->netns_local = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mlx5e_init_rep(struct mlx5_core_dev *mdev,
|
static int mlx5e_init_rep(struct mlx5_core_dev *mdev,
|
||||||
|
@ -1676,10 +1676,11 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u16 local_port,
|
|||||||
|
|
||||||
netif_carrier_off(dev);
|
netif_carrier_off(dev);
|
||||||
|
|
||||||
dev->features |= NETIF_F_NETNS_LOCAL | NETIF_F_SG |
|
dev->features |= NETIF_F_SG | NETIF_F_HW_VLAN_CTAG_FILTER |
|
||||||
NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_TC;
|
NETIF_F_HW_TC;
|
||||||
dev->hw_features |= NETIF_F_HW_TC | NETIF_F_LOOPBACK;
|
dev->hw_features |= NETIF_F_HW_TC | NETIF_F_LOOPBACK;
|
||||||
dev->lltx = true;
|
dev->lltx = true;
|
||||||
|
dev->netns_local = true;
|
||||||
|
|
||||||
dev->min_mtu = ETH_MIN_MTU;
|
dev->min_mtu = ETH_MIN_MTU;
|
||||||
dev->max_mtu = MLXSW_PORT_MAX_MTU - MLXSW_PORT_ETH_FRAME_HDR;
|
dev->max_mtu = MLXSW_PORT_MAX_MTU - MLXSW_PORT_ETH_FRAME_HDR;
|
||||||
|
@ -2575,7 +2575,8 @@ static int rocker_probe_port(struct rocker *rocker, unsigned int port_number)
|
|||||||
netif_napi_add(dev, &rocker_port->napi_rx, rocker_port_poll_rx);
|
netif_napi_add(dev, &rocker_port->napi_rx, rocker_port_poll_rx);
|
||||||
rocker_carrier_init(rocker_port);
|
rocker_carrier_init(rocker_port);
|
||||||
|
|
||||||
dev->features |= NETIF_F_NETNS_LOCAL | NETIF_F_SG;
|
dev->features |= NETIF_F_SG;
|
||||||
|
dev->netns_local = true;
|
||||||
|
|
||||||
/* MTU range: 68 - 9000 */
|
/* MTU range: 68 - 9000 */
|
||||||
dev->min_mtu = ROCKER_PORT_MIN_MTU;
|
dev->min_mtu = ROCKER_PORT_MIN_MTU;
|
||||||
|
@ -1407,7 +1407,8 @@ static int cpsw_create_ports(struct cpsw_common *cpsw)
|
|||||||
cpsw->slaves[i].ndev = ndev;
|
cpsw->slaves[i].ndev = ndev;
|
||||||
|
|
||||||
ndev->features |= NETIF_F_HW_VLAN_CTAG_FILTER |
|
ndev->features |= NETIF_F_HW_VLAN_CTAG_FILTER |
|
||||||
NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_NETNS_LOCAL | NETIF_F_HW_TC;
|
NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_HW_TC;
|
||||||
|
ndev->netns_local = true;
|
||||||
|
|
||||||
ndev->xdp_features = NETDEV_XDP_ACT_BASIC |
|
ndev->xdp_features = NETDEV_XDP_ACT_BASIC |
|
||||||
NETDEV_XDP_ACT_REDIRECT |
|
NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
@ -172,6 +172,7 @@ static void gen_lo_setup(struct net_device *dev,
|
|||||||
dev->flags = IFF_LOOPBACK;
|
dev->flags = IFF_LOOPBACK;
|
||||||
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE;
|
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE;
|
||||||
dev->lltx = true;
|
dev->lltx = true;
|
||||||
|
dev->netns_local = true;
|
||||||
netif_keep_dst(dev);
|
netif_keep_dst(dev);
|
||||||
dev->hw_features = NETIF_F_GSO_SOFTWARE;
|
dev->hw_features = NETIF_F_GSO_SOFTWARE;
|
||||||
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST
|
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST
|
||||||
@ -180,7 +181,6 @@ static void gen_lo_setup(struct net_device *dev,
|
|||||||
| NETIF_F_RXCSUM
|
| NETIF_F_RXCSUM
|
||||||
| NETIF_F_SCTP_CRC
|
| NETIF_F_SCTP_CRC
|
||||||
| NETIF_F_HIGHDMA
|
| NETIF_F_HIGHDMA
|
||||||
| NETIF_F_NETNS_LOCAL
|
|
||||||
| NETIF_F_VLAN_CHALLENGED
|
| NETIF_F_VLAN_CHALLENGED
|
||||||
| NETIF_F_LOOPBACK;
|
| NETIF_F_LOOPBACK;
|
||||||
dev->ethtool_ops = eth_ops;
|
dev->ethtool_ops = eth_ops;
|
||||||
|
@ -734,7 +734,7 @@ struct failover *net_failover_create(struct net_device *standby_dev)
|
|||||||
failover_dev->lltx = true;
|
failover_dev->lltx = true;
|
||||||
|
|
||||||
/* Don't allow failover devices to change network namespaces. */
|
/* Don't allow failover devices to change network namespaces. */
|
||||||
failover_dev->features |= NETIF_F_NETNS_LOCAL;
|
failover_dev->netns_local = true;
|
||||||
|
|
||||||
failover_dev->hw_features = FAILOVER_VLAN_FEATURES |
|
failover_dev->hw_features = FAILOVER_VLAN_FEATURES |
|
||||||
NETIF_F_HW_VLAN_CTAG_TX |
|
NETIF_F_HW_VLAN_CTAG_TX |
|
||||||
|
@ -2191,10 +2191,10 @@ static void team_setup(struct net_device *dev)
|
|||||||
dev->priv_flags |= IFF_UNICAST_FLT | IFF_LIVE_ADDR_CHANGE;
|
dev->priv_flags |= IFF_UNICAST_FLT | IFF_LIVE_ADDR_CHANGE;
|
||||||
dev->lltx = true;
|
dev->lltx = true;
|
||||||
|
|
||||||
dev->features |= NETIF_F_GRO;
|
|
||||||
|
|
||||||
/* Don't allow team devices to change network namespaces. */
|
/* Don't allow team devices to change network namespaces. */
|
||||||
dev->features |= NETIF_F_NETNS_LOCAL;
|
dev->netns_local = true;
|
||||||
|
|
||||||
|
dev->features |= NETIF_F_GRO;
|
||||||
|
|
||||||
dev->hw_features = TEAM_VLAN_FEATURES |
|
dev->hw_features = TEAM_VLAN_FEATURES |
|
||||||
NETIF_F_HW_VLAN_CTAG_RX |
|
NETIF_F_HW_VLAN_CTAG_RX |
|
||||||
|
@ -1638,7 +1638,7 @@ static void vrf_setup(struct net_device *dev)
|
|||||||
dev->lltx = true;
|
dev->lltx = true;
|
||||||
|
|
||||||
/* don't allow vrf devices to change network namespaces. */
|
/* don't allow vrf devices to change network namespaces. */
|
||||||
dev->features |= NETIF_F_NETNS_LOCAL;
|
dev->netns_local = true;
|
||||||
|
|
||||||
/* does not make sense for a VLAN to be added to a vrf device */
|
/* does not make sense for a VLAN to be added to a vrf device */
|
||||||
dev->features |= NETIF_F_VLAN_CHALLENGED;
|
dev->features |= NETIF_F_VLAN_CHALLENGED;
|
||||||
|
@ -25,7 +25,7 @@ enum {
|
|||||||
NETIF_F_VLAN_CHALLENGED_BIT, /* Device cannot handle VLAN packets */
|
NETIF_F_VLAN_CHALLENGED_BIT, /* Device cannot handle VLAN packets */
|
||||||
NETIF_F_GSO_BIT, /* Enable software GSO. */
|
NETIF_F_GSO_BIT, /* Enable software GSO. */
|
||||||
__UNUSED_NETIF_F_12,
|
__UNUSED_NETIF_F_12,
|
||||||
NETIF_F_NETNS_LOCAL_BIT, /* Does not change network namespaces */
|
__UNUSED_NETIF_F_13,
|
||||||
NETIF_F_GRO_BIT, /* Generic receive offload */
|
NETIF_F_GRO_BIT, /* Generic receive offload */
|
||||||
NETIF_F_LRO_BIT, /* large receive offload */
|
NETIF_F_LRO_BIT, /* large receive offload */
|
||||||
|
|
||||||
@ -121,7 +121,6 @@ enum {
|
|||||||
#define NETIF_F_IPV6_CSUM __NETIF_F(IPV6_CSUM)
|
#define NETIF_F_IPV6_CSUM __NETIF_F(IPV6_CSUM)
|
||||||
#define NETIF_F_LOOPBACK __NETIF_F(LOOPBACK)
|
#define NETIF_F_LOOPBACK __NETIF_F(LOOPBACK)
|
||||||
#define NETIF_F_LRO __NETIF_F(LRO)
|
#define NETIF_F_LRO __NETIF_F(LRO)
|
||||||
#define NETIF_F_NETNS_LOCAL __NETIF_F(NETNS_LOCAL)
|
|
||||||
#define NETIF_F_NOCACHE_COPY __NETIF_F(NOCACHE_COPY)
|
#define NETIF_F_NOCACHE_COPY __NETIF_F(NOCACHE_COPY)
|
||||||
#define NETIF_F_NTUPLE __NETIF_F(NTUPLE)
|
#define NETIF_F_NTUPLE __NETIF_F(NTUPLE)
|
||||||
#define NETIF_F_RXCSUM __NETIF_F(RXCSUM)
|
#define NETIF_F_RXCSUM __NETIF_F(RXCSUM)
|
||||||
@ -190,8 +189,7 @@ static inline int find_next_netdev_feature(u64 feature, unsigned long start)
|
|||||||
|
|
||||||
/* Features valid for ethtool to change */
|
/* Features valid for ethtool to change */
|
||||||
/* = all defined minus driver/device-class-related */
|
/* = all defined minus driver/device-class-related */
|
||||||
#define NETIF_F_NEVER_CHANGE (NETIF_F_VLAN_CHALLENGED | \
|
#define NETIF_F_NEVER_CHANGE NETIF_F_VLAN_CHALLENGED
|
||||||
NETIF_F_NETNS_LOCAL)
|
|
||||||
|
|
||||||
/* remember that ((t)1 << t_BITS) is undefined in C99 */
|
/* remember that ((t)1 << t_BITS) is undefined in C99 */
|
||||||
#define NETIF_F_ETHTOOL_BITS ((__NETIF_F_BIT(NETDEV_FEATURE_COUNT - 1) | \
|
#define NETIF_F_ETHTOOL_BITS ((__NETIF_F_BIT(NETDEV_FEATURE_COUNT - 1) | \
|
||||||
|
@ -1968,6 +1968,7 @@ enum netdev_reg_state {
|
|||||||
* regardless of source, even if those aren't
|
* regardless of source, even if those aren't
|
||||||
* HWTSTAMP_SOURCE_NETDEV
|
* HWTSTAMP_SOURCE_NETDEV
|
||||||
* @change_proto_down: device supports setting carrier via IFLA_PROTO_DOWN
|
* @change_proto_down: device supports setting carrier via IFLA_PROTO_DOWN
|
||||||
|
* @netns_local: interface can't change network namespaces
|
||||||
*
|
*
|
||||||
* @net_notifier_list: List of per-net netdev notifier block
|
* @net_notifier_list: List of per-net netdev notifier block
|
||||||
* that follow this device when it is moved
|
* that follow this device when it is moved
|
||||||
@ -2361,6 +2362,7 @@ struct net_device {
|
|||||||
/* priv_flags_slow, ungrouped to save space */
|
/* priv_flags_slow, ungrouped to save space */
|
||||||
unsigned long see_all_hwtstamp_requests:1;
|
unsigned long see_all_hwtstamp_requests:1;
|
||||||
unsigned long change_proto_down:1;
|
unsigned long change_proto_down:1;
|
||||||
|
unsigned long netns_local:1;
|
||||||
|
|
||||||
struct list_head net_notifier_list;
|
struct list_head net_notifier_list;
|
||||||
|
|
||||||
|
@ -1020,9 +1020,10 @@ static void batadv_softif_init_early(struct net_device *dev)
|
|||||||
dev->netdev_ops = &batadv_netdev_ops;
|
dev->netdev_ops = &batadv_netdev_ops;
|
||||||
dev->needs_free_netdev = true;
|
dev->needs_free_netdev = true;
|
||||||
dev->priv_destructor = batadv_softif_free;
|
dev->priv_destructor = batadv_softif_free;
|
||||||
dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_NETNS_LOCAL;
|
dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
|
||||||
dev->priv_flags |= IFF_NO_QUEUE;
|
dev->priv_flags |= IFF_NO_QUEUE;
|
||||||
dev->lltx = true;
|
dev->lltx = true;
|
||||||
|
dev->netns_local = true;
|
||||||
|
|
||||||
/* can't call min_mtu, because the needed variables
|
/* can't call min_mtu, because the needed variables
|
||||||
* have not been initialized yet
|
* have not been initialized yet
|
||||||
|
@ -488,9 +488,10 @@ void br_dev_setup(struct net_device *dev)
|
|||||||
SET_NETDEV_DEVTYPE(dev, &br_type);
|
SET_NETDEV_DEVTYPE(dev, &br_type);
|
||||||
dev->priv_flags = IFF_EBRIDGE | IFF_NO_QUEUE;
|
dev->priv_flags = IFF_EBRIDGE | IFF_NO_QUEUE;
|
||||||
dev->lltx = true;
|
dev->lltx = true;
|
||||||
|
dev->netns_local = true;
|
||||||
|
|
||||||
dev->features = COMMON_FEATURES | NETIF_F_NETNS_LOCAL |
|
dev->features = COMMON_FEATURES | NETIF_F_HW_VLAN_CTAG_TX |
|
||||||
NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX;
|
NETIF_F_HW_VLAN_STAG_TX;
|
||||||
dev->hw_features = COMMON_FEATURES | NETIF_F_HW_VLAN_CTAG_TX |
|
dev->hw_features = COMMON_FEATURES | NETIF_F_HW_VLAN_CTAG_TX |
|
||||||
NETIF_F_HW_VLAN_STAG_TX;
|
NETIF_F_HW_VLAN_STAG_TX;
|
||||||
dev->vlan_features = COMMON_FEATURES;
|
dev->vlan_features = COMMON_FEATURES;
|
||||||
|
@ -11487,7 +11487,7 @@ int __dev_change_net_namespace(struct net_device *dev, struct net *net,
|
|||||||
|
|
||||||
/* Don't allow namespace local devices to be moved. */
|
/* Don't allow namespace local devices to be moved. */
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
if (dev->features & NETIF_F_NETNS_LOCAL)
|
if (dev->netns_local)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* Ensure the device has been registered */
|
/* Ensure the device has been registered */
|
||||||
@ -11869,7 +11869,7 @@ static void __net_exit default_device_exit_net(struct net *net)
|
|||||||
char fb_name[IFNAMSIZ];
|
char fb_name[IFNAMSIZ];
|
||||||
|
|
||||||
/* Ignore unmoveable devices (i.e. loopback) */
|
/* Ignore unmoveable devices (i.e. loopback) */
|
||||||
if (dev->features & NETIF_F_NETNS_LOCAL)
|
if (dev->netns_local)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Leave virtual devices for the generic cleanup */
|
/* Leave virtual devices for the generic cleanup */
|
||||||
|
@ -25,7 +25,6 @@ const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] = {
|
|||||||
[NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter",
|
[NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter",
|
||||||
[NETIF_F_VLAN_CHALLENGED_BIT] = "vlan-challenged",
|
[NETIF_F_VLAN_CHALLENGED_BIT] = "vlan-challenged",
|
||||||
[NETIF_F_GSO_BIT] = "tx-generic-segmentation",
|
[NETIF_F_GSO_BIT] = "tx-generic-segmentation",
|
||||||
[NETIF_F_NETNS_LOCAL_BIT] = "netns-local",
|
|
||||||
[NETIF_F_GRO_BIT] = "rx-gro",
|
[NETIF_F_GRO_BIT] = "rx-gro",
|
||||||
[NETIF_F_GRO_HW_BIT] = "rx-gro-hw",
|
[NETIF_F_GRO_HW_BIT] = "rx-gro-hw",
|
||||||
[NETIF_F_LRO_BIT] = "rx-lro",
|
[NETIF_F_LRO_BIT] = "rx-lro",
|
||||||
|
@ -556,6 +556,10 @@ void hsr_dev_setup(struct net_device *dev)
|
|||||||
dev->priv_flags |= IFF_NO_QUEUE | IFF_DISABLE_NETPOLL;
|
dev->priv_flags |= IFF_NO_QUEUE | IFF_DISABLE_NETPOLL;
|
||||||
/* Prevent recursive tx locking */
|
/* Prevent recursive tx locking */
|
||||||
dev->lltx = true;
|
dev->lltx = true;
|
||||||
|
/* Not sure about this. Taken from bridge code. netdevice.h says
|
||||||
|
* it means "Does not change network namespaces".
|
||||||
|
*/
|
||||||
|
dev->netns_local = true;
|
||||||
|
|
||||||
dev->needs_free_netdev = true;
|
dev->needs_free_netdev = true;
|
||||||
|
|
||||||
@ -569,10 +573,6 @@ void hsr_dev_setup(struct net_device *dev)
|
|||||||
* hsr_header_create() etc.
|
* hsr_header_create() etc.
|
||||||
*/
|
*/
|
||||||
dev->features |= NETIF_F_VLAN_CHALLENGED;
|
dev->features |= NETIF_F_VLAN_CHALLENGED;
|
||||||
/* Not sure about this. Taken from bridge code. netdev_features.h says
|
|
||||||
* it means "Does not change network namespaces".
|
|
||||||
*/
|
|
||||||
dev->features |= NETIF_F_NETNS_LOCAL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return true if dev is a HSR master; return false otherwise.
|
/* Return true if dev is a HSR master; return false otherwise.
|
||||||
|
@ -116,7 +116,7 @@ static void lowpan_setup(struct net_device *ldev)
|
|||||||
ldev->netdev_ops = &lowpan_netdev_ops;
|
ldev->netdev_ops = &lowpan_netdev_ops;
|
||||||
ldev->header_ops = &lowpan_header_ops;
|
ldev->header_ops = &lowpan_header_ops;
|
||||||
ldev->needs_free_netdev = true;
|
ldev->needs_free_netdev = true;
|
||||||
ldev->features |= NETIF_F_NETNS_LOCAL;
|
ldev->netns_local = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int lowpan_validate(struct nlattr *tb[], struct nlattr *data[],
|
static int lowpan_validate(struct nlattr *tb[], struct nlattr *data[],
|
||||||
|
@ -226,11 +226,11 @@ int cfg802154_switch_netns(struct cfg802154_registered_device *rdev,
|
|||||||
list_for_each_entry(wpan_dev, &rdev->wpan_dev_list, list) {
|
list_for_each_entry(wpan_dev, &rdev->wpan_dev_list, list) {
|
||||||
if (!wpan_dev->netdev)
|
if (!wpan_dev->netdev)
|
||||||
continue;
|
continue;
|
||||||
wpan_dev->netdev->features &= ~NETIF_F_NETNS_LOCAL;
|
wpan_dev->netdev->netns_local = false;
|
||||||
err = dev_change_net_namespace(wpan_dev->netdev, net, "wpan%d");
|
err = dev_change_net_namespace(wpan_dev->netdev, net, "wpan%d");
|
||||||
if (err)
|
if (err)
|
||||||
break;
|
break;
|
||||||
wpan_dev->netdev->features |= NETIF_F_NETNS_LOCAL;
|
wpan_dev->netdev->netns_local = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
@ -242,11 +242,11 @@ int cfg802154_switch_netns(struct cfg802154_registered_device *rdev,
|
|||||||
list) {
|
list) {
|
||||||
if (!wpan_dev->netdev)
|
if (!wpan_dev->netdev)
|
||||||
continue;
|
continue;
|
||||||
wpan_dev->netdev->features &= ~NETIF_F_NETNS_LOCAL;
|
wpan_dev->netdev->netns_local = false;
|
||||||
err = dev_change_net_namespace(wpan_dev->netdev, net,
|
err = dev_change_net_namespace(wpan_dev->netdev, net,
|
||||||
"wpan%d");
|
"wpan%d");
|
||||||
WARN_ON(err);
|
WARN_ON(err);
|
||||||
wpan_dev->netdev->features |= NETIF_F_NETNS_LOCAL;
|
wpan_dev->netdev->netns_local = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
@ -291,7 +291,7 @@ static int cfg802154_netdev_notifier_call(struct notifier_block *nb,
|
|||||||
switch (state) {
|
switch (state) {
|
||||||
/* TODO NETDEV_DEVTYPE */
|
/* TODO NETDEV_DEVTYPE */
|
||||||
case NETDEV_REGISTER:
|
case NETDEV_REGISTER:
|
||||||
dev->features |= NETIF_F_NETNS_LOCAL;
|
dev->netns_local = true;
|
||||||
wpan_dev->identifier = ++rdev->wpan_dev_id;
|
wpan_dev->identifier = ++rdev->wpan_dev_id;
|
||||||
list_add_rcu(&wpan_dev->list, &rdev->wpan_dev_list);
|
list_add_rcu(&wpan_dev->list, &rdev->wpan_dev_list);
|
||||||
rdev->devlist_generation++;
|
rdev->devlist_generation++;
|
||||||
|
@ -1161,7 +1161,7 @@ int ip_tunnel_init_net(struct net *net, unsigned int ip_tnl_net_id,
|
|||||||
* Allowing to move it to another netns is clearly unsafe.
|
* Allowing to move it to another netns is clearly unsafe.
|
||||||
*/
|
*/
|
||||||
if (!IS_ERR(itn->fb_tunnel_dev)) {
|
if (!IS_ERR(itn->fb_tunnel_dev)) {
|
||||||
itn->fb_tunnel_dev->features |= NETIF_F_NETNS_LOCAL;
|
itn->fb_tunnel_dev->netns_local = true;
|
||||||
itn->fb_tunnel_dev->mtu = ip_tunnel_bind_dev(itn->fb_tunnel_dev);
|
itn->fb_tunnel_dev->mtu = ip_tunnel_bind_dev(itn->fb_tunnel_dev);
|
||||||
ip_tunnel_add(itn, netdev_priv(itn->fb_tunnel_dev));
|
ip_tunnel_add(itn, netdev_priv(itn->fb_tunnel_dev));
|
||||||
itn->type = itn->fb_tunnel_dev->type;
|
itn->type = itn->fb_tunnel_dev->type;
|
||||||
|
@ -537,7 +537,7 @@ static void reg_vif_setup(struct net_device *dev)
|
|||||||
dev->flags = IFF_NOARP;
|
dev->flags = IFF_NOARP;
|
||||||
dev->netdev_ops = ®_vif_netdev_ops;
|
dev->netdev_ops = ®_vif_netdev_ops;
|
||||||
dev->needs_free_netdev = true;
|
dev->needs_free_netdev = true;
|
||||||
dev->features |= NETIF_F_NETNS_LOCAL;
|
dev->netns_local = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct net_device *ipmr_reg_vif(struct net *net, struct mr_table *mrt)
|
static struct net_device *ipmr_reg_vif(struct net *net, struct mr_table *mrt)
|
||||||
|
@ -1621,8 +1621,7 @@ static int __net_init ip6gre_init_net(struct net *net)
|
|||||||
/* FB netdevice is special: we have one, and only one per netns.
|
/* FB netdevice is special: we have one, and only one per netns.
|
||||||
* Allowing to move it to another netns is clearly unsafe.
|
* Allowing to move it to another netns is clearly unsafe.
|
||||||
*/
|
*/
|
||||||
ign->fb_tunnel_dev->features |= NETIF_F_NETNS_LOCAL;
|
ign->fb_tunnel_dev->netns_local = true;
|
||||||
|
|
||||||
|
|
||||||
ip6gre_fb_tunnel_init(ign->fb_tunnel_dev);
|
ip6gre_fb_tunnel_init(ign->fb_tunnel_dev);
|
||||||
ign->fb_tunnel_dev->rtnl_link_ops = &ip6gre_link_ops;
|
ign->fb_tunnel_dev->rtnl_link_ops = &ip6gre_link_ops;
|
||||||
|
@ -2258,7 +2258,7 @@ static int __net_init ip6_tnl_init_net(struct net *net)
|
|||||||
/* FB netdevice is special: we have one, and only one per netns.
|
/* FB netdevice is special: we have one, and only one per netns.
|
||||||
* Allowing to move it to another netns is clearly unsafe.
|
* Allowing to move it to another netns is clearly unsafe.
|
||||||
*/
|
*/
|
||||||
ip6n->fb_tnl_dev->features |= NETIF_F_NETNS_LOCAL;
|
ip6n->fb_tnl_dev->netns_local = true;
|
||||||
|
|
||||||
err = ip6_fb_tnl_dev_init(ip6n->fb_tnl_dev);
|
err = ip6_fb_tnl_dev_init(ip6n->fb_tnl_dev);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
|
@ -640,7 +640,7 @@ static void reg_vif_setup(struct net_device *dev)
|
|||||||
dev->flags = IFF_NOARP;
|
dev->flags = IFF_NOARP;
|
||||||
dev->netdev_ops = ®_vif_netdev_ops;
|
dev->netdev_ops = ®_vif_netdev_ops;
|
||||||
dev->needs_free_netdev = true;
|
dev->needs_free_netdev = true;
|
||||||
dev->features |= NETIF_F_NETNS_LOCAL;
|
dev->netns_local = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct net_device *ip6mr_reg_vif(struct net *net, struct mr_table *mrt)
|
static struct net_device *ip6mr_reg_vif(struct net *net, struct mr_table *mrt)
|
||||||
|
@ -1856,7 +1856,7 @@ static int __net_init sit_init_net(struct net *net)
|
|||||||
/* FB netdevice is special: we have one, and only one per netns.
|
/* FB netdevice is special: we have one, and only one per netns.
|
||||||
* Allowing to move it to another netns is clearly unsafe.
|
* Allowing to move it to another netns is clearly unsafe.
|
||||||
*/
|
*/
|
||||||
sitn->fb_tunnel_dev->features |= NETIF_F_NETNS_LOCAL;
|
sitn->fb_tunnel_dev->netns_local = true;
|
||||||
|
|
||||||
err = register_netdev(sitn->fb_tunnel_dev);
|
err = register_netdev(sitn->fb_tunnel_dev);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -149,7 +149,7 @@ static struct vport *internal_dev_create(const struct vport_parms *parms)
|
|||||||
|
|
||||||
/* Restrict bridge port to current netns. */
|
/* Restrict bridge port to current netns. */
|
||||||
if (vport->port_no == OVSP_LOCAL)
|
if (vport->port_no == OVSP_LOCAL)
|
||||||
vport->dev->features |= NETIF_F_NETNS_LOCAL;
|
vport->dev->netns_local = true;
|
||||||
|
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
err = register_netdevice(vport->dev);
|
err = register_netdevice(vport->dev);
|
||||||
|
@ -165,11 +165,11 @@ int cfg80211_switch_netns(struct cfg80211_registered_device *rdev,
|
|||||||
list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
|
list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
|
||||||
if (!wdev->netdev)
|
if (!wdev->netdev)
|
||||||
continue;
|
continue;
|
||||||
wdev->netdev->features &= ~NETIF_F_NETNS_LOCAL;
|
wdev->netdev->netns_local = false;
|
||||||
err = dev_change_net_namespace(wdev->netdev, net, "wlan%d");
|
err = dev_change_net_namespace(wdev->netdev, net, "wlan%d");
|
||||||
if (err)
|
if (err)
|
||||||
break;
|
break;
|
||||||
wdev->netdev->features |= NETIF_F_NETNS_LOCAL;
|
wdev->netdev->netns_local = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
@ -181,11 +181,11 @@ int cfg80211_switch_netns(struct cfg80211_registered_device *rdev,
|
|||||||
list) {
|
list) {
|
||||||
if (!wdev->netdev)
|
if (!wdev->netdev)
|
||||||
continue;
|
continue;
|
||||||
wdev->netdev->features &= ~NETIF_F_NETNS_LOCAL;
|
wdev->netdev->netns_local = false;
|
||||||
err = dev_change_net_namespace(wdev->netdev, net,
|
err = dev_change_net_namespace(wdev->netdev, net,
|
||||||
"wlan%d");
|
"wlan%d");
|
||||||
WARN_ON(err);
|
WARN_ON(err);
|
||||||
wdev->netdev->features |= NETIF_F_NETNS_LOCAL;
|
wdev->netdev->netns_local = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
@ -1473,7 +1473,7 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
|
|||||||
SET_NETDEV_DEVTYPE(dev, &wiphy_type);
|
SET_NETDEV_DEVTYPE(dev, &wiphy_type);
|
||||||
wdev->netdev = dev;
|
wdev->netdev = dev;
|
||||||
/* can only change netns with wiphy */
|
/* can only change netns with wiphy */
|
||||||
dev->features |= NETIF_F_NETNS_LOCAL;
|
dev->netns_local = true;
|
||||||
|
|
||||||
cfg80211_init_wdev(wdev);
|
cfg80211_init_wdev(wdev);
|
||||||
break;
|
break;
|
||||||
|
@ -6,7 +6,7 @@ to easily create and test complex environments.
|
|||||||
|
|
||||||
Unfortunately, these namespaces can not be used with actual switching
|
Unfortunately, these namespaces can not be used with actual switching
|
||||||
ASICs, as their ports can not be migrated to other network namespaces
|
ASICs, as their ports can not be migrated to other network namespaces
|
||||||
(NETIF_F_NETNS_LOCAL) and most of them probably do not support the
|
(dev->netns_local) and most of them probably do not support the
|
||||||
L1-separation provided by namespaces.
|
L1-separation provided by namespaces.
|
||||||
|
|
||||||
However, a similar kind of flexibility can be achieved by using VRFs and
|
However, a similar kind of flexibility can be achieved by using VRFs and
|
||||||
|
Loading…
Reference in New Issue
Block a user