mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 23:22:31 +02:00
Merge branch 'net-notify-users-when-an-iface-cannot-change-its-netns'
Nicolas Dichtel says: ==================== net: notify users when an iface cannot change its netns This series adds a way to see if an interface cannot be moved to another netns. Documentation/netlink/specs/rt_link.yaml | 3 ++ .../networking/net_cachelines/net_device.rst | 2 +- Documentation/networking/switchdev.rst | 2 +- drivers/net/amt.c | 2 +- drivers/net/bonding/bond_main.c | 2 +- drivers/net/ethernet/adi/adin1110.c | 2 +- .../net/ethernet/marvell/prestera/prestera_main.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 4 +- drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | 2 +- drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 2 +- drivers/net/ethernet/rocker/rocker_main.c | 2 +- drivers/net/ethernet/ti/cpsw_new.c | 2 +- drivers/net/loopback.c | 2 +- drivers/net/net_failover.c | 2 +- drivers/net/team/team_core.c | 2 +- drivers/net/vrf.c | 2 +- include/linux/netdevice.h | 9 +++-- include/uapi/linux/if_link.h | 1 + net/batman-adv/soft-interface.c | 2 +- net/bridge/br_device.c | 2 +- net/core/dev.c | 45 +++++++++++++++++----- net/core/rtnetlink.c | 5 ++- net/hsr/hsr_device.c | 2 +- net/ieee802154/6lowpan/core.c | 2 +- net/ieee802154/core.c | 10 ++--- net/ipv4/ip_tunnel.c | 2 +- net/ipv4/ipmr.c | 2 +- net/ipv6/ip6_gre.c | 2 +- net/ipv6/ip6_tunnel.c | 2 +- net/ipv6/ip6mr.c | 2 +- net/ipv6/sit.c | 2 +- net/openvswitch/vport-internal_dev.c | 2 +- net/wireless/core.c | 10 ++--- tools/testing/selftests/net/forwarding/README | 2 +- 34 files changed, 86 insertions(+), 53 deletions(-) Comments are welcome. Regards, Nicolas ==================== Link: https://patch.msgid.link/20250228102144.154802-1-nicolas.dichtel@6wind.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
commit
265e352b6c
|
|
@ -1160,6 +1160,9 @@ attribute-sets:
|
|||
name: max-pacing-offload-horizon
|
||||
type: uint
|
||||
doc: EDT offload horizon supported by the device (in nsec).
|
||||
-
|
||||
name: netns-immutable
|
||||
type: u8
|
||||
-
|
||||
name: af-spec-attrs
|
||||
attributes:
|
||||
|
|
|
|||
|
|
@ -167,7 +167,7 @@ unsigned:1 wol_enabled
|
|||
unsigned:1 threaded napi_poll(napi_enable,dev_set_threaded)
|
||||
unsigned_long:1 see_all_hwtstamp_requests
|
||||
unsigned_long:1 change_proto_down
|
||||
unsigned_long:1 netns_local
|
||||
unsigned_long:1 netns_immutable
|
||||
unsigned_long:1 fcoe_mtu
|
||||
struct list_head net_notifier_list
|
||||
struct macsec_ops* macsec_ops
|
||||
|
|
|
|||
|
|
@ -137,7 +137,7 @@ would be sub-port 0 on port 1 on switch 1.
|
|||
Port Features
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
dev->netns_local
|
||||
dev->netns_immutable
|
||||
|
||||
If the switchdev driver (and device) only supports offloading of the default
|
||||
network namespace (netns), the driver should set this private flag to prevent
|
||||
|
|
|
|||
|
|
@ -3099,7 +3099,7 @@ static void amt_link_setup(struct net_device *dev)
|
|||
dev->addr_len = 0;
|
||||
dev->priv_flags |= IFF_NO_QUEUE;
|
||||
dev->lltx = true;
|
||||
dev->netns_local = true;
|
||||
dev->netns_immutable = true;
|
||||
dev->features |= NETIF_F_GSO_SOFTWARE;
|
||||
dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM;
|
||||
dev->hw_features |= NETIF_F_FRAGLIST | NETIF_F_RXCSUM;
|
||||
|
|
|
|||
|
|
@ -6025,7 +6025,7 @@ void bond_setup(struct net_device *bond_dev)
|
|||
bond_dev->lltx = true;
|
||||
|
||||
/* Don't allow bond devices to change network namespaces. */
|
||||
bond_dev->netns_local = true;
|
||||
bond_dev->netns_immutable = true;
|
||||
|
||||
/* By default, we declare the bond to be fully
|
||||
* VLAN hardware accelerated capable. Special
|
||||
|
|
|
|||
|
|
@ -1599,7 +1599,7 @@ static int adin1110_probe_netdevs(struct adin1110_priv *priv)
|
|||
netdev->netdev_ops = &adin1110_netdev_ops;
|
||||
netdev->ethtool_ops = &adin1110_ethtool_ops;
|
||||
netdev->priv_flags |= IFF_UNICAST_FLT;
|
||||
netdev->netns_local = true;
|
||||
netdev->netns_immutable = true;
|
||||
|
||||
port_priv->phydev = get_phy_device(priv->mii_bus, i + 1, false);
|
||||
if (IS_ERR(port_priv->phydev)) {
|
||||
|
|
|
|||
|
|
@ -634,7 +634,7 @@ static int prestera_port_create(struct prestera_switch *sw, u32 id)
|
|||
goto err_dl_port_register;
|
||||
|
||||
dev->features |= NETIF_F_HW_TC;
|
||||
dev->netns_local = true;
|
||||
dev->netns_immutable = true;
|
||||
dev->netdev_ops = &prestera_netdev_ops;
|
||||
dev->ethtool_ops = &prestera_ethtool_ops;
|
||||
SET_NETDEV_DEV(dev, sw->dev->dev);
|
||||
|
|
|
|||
|
|
@ -4423,9 +4423,9 @@ static netdev_features_t mlx5e_fix_features(struct net_device *netdev,
|
|||
|
||||
if (mlx5e_is_uplink_rep(priv)) {
|
||||
features = mlx5e_fix_uplink_rep_features(netdev, features);
|
||||
netdev->netns_local = true;
|
||||
netdev->netns_immutable = true;
|
||||
} else {
|
||||
netdev->netns_local = false;
|
||||
netdev->netns_immutable = false;
|
||||
}
|
||||
|
||||
mutex_unlock(&priv->state_lock);
|
||||
|
|
|
|||
|
|
@ -905,7 +905,7 @@ static void mlx5e_build_rep_netdev(struct net_device *netdev,
|
|||
|
||||
netdev->features |= netdev->hw_features;
|
||||
|
||||
netdev->netns_local = true;
|
||||
netdev->netns_immutable = true;
|
||||
}
|
||||
|
||||
static int mlx5e_init_rep(struct mlx5_core_dev *mdev,
|
||||
|
|
|
|||
|
|
@ -1579,7 +1579,7 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u16 local_port,
|
|||
NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
|
||||
dev->vlan_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
|
||||
dev->lltx = true;
|
||||
dev->netns_local = true;
|
||||
dev->netns_immutable = true;
|
||||
|
||||
dev->min_mtu = ETH_MIN_MTU;
|
||||
dev->max_mtu = MLXSW_PORT_MAX_MTU - MLXSW_PORT_ETH_FRAME_HDR;
|
||||
|
|
|
|||
|
|
@ -2576,7 +2576,7 @@ static int rocker_probe_port(struct rocker *rocker, unsigned int port_number)
|
|||
rocker_carrier_init(rocker_port);
|
||||
|
||||
dev->features |= NETIF_F_SG;
|
||||
dev->netns_local = true;
|
||||
dev->netns_immutable = true;
|
||||
|
||||
/* MTU range: 68 - 9000 */
|
||||
dev->min_mtu = ROCKER_PORT_MIN_MTU;
|
||||
|
|
|
|||
|
|
@ -1409,7 +1409,7 @@ static int cpsw_create_ports(struct cpsw_common *cpsw)
|
|||
|
||||
ndev->features |= NETIF_F_HW_VLAN_CTAG_FILTER |
|
||||
NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_HW_TC;
|
||||
ndev->netns_local = true;
|
||||
ndev->netns_immutable = true;
|
||||
|
||||
ndev->xdp_features = NETDEV_XDP_ACT_BASIC |
|
||||
NETDEV_XDP_ACT_REDIRECT |
|
||||
|
|
|
|||
|
|
@ -172,7 +172,7 @@ static void gen_lo_setup(struct net_device *dev,
|
|||
dev->flags = IFF_LOOPBACK;
|
||||
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE;
|
||||
dev->lltx = true;
|
||||
dev->netns_local = true;
|
||||
dev->netns_immutable = true;
|
||||
netif_keep_dst(dev);
|
||||
dev->hw_features = NETIF_F_GSO_SOFTWARE;
|
||||
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST
|
||||
|
|
|
|||
|
|
@ -734,7 +734,7 @@ struct failover *net_failover_create(struct net_device *standby_dev)
|
|||
failover_dev->lltx = true;
|
||||
|
||||
/* Don't allow failover devices to change network namespaces. */
|
||||
failover_dev->netns_local = true;
|
||||
failover_dev->netns_immutable = true;
|
||||
|
||||
failover_dev->hw_features = FAILOVER_VLAN_FEATURES |
|
||||
NETIF_F_HW_VLAN_CTAG_TX |
|
||||
|
|
|
|||
|
|
@ -2203,7 +2203,7 @@ static void team_setup(struct net_device *dev)
|
|||
dev->lltx = true;
|
||||
|
||||
/* Don't allow team devices to change network namespaces. */
|
||||
dev->netns_local = true;
|
||||
dev->netns_immutable = true;
|
||||
|
||||
dev->features |= NETIF_F_GRO;
|
||||
|
||||
|
|
|
|||
|
|
@ -1617,7 +1617,7 @@ static void vrf_setup(struct net_device *dev)
|
|||
dev->lltx = true;
|
||||
|
||||
/* don't allow vrf devices to change network namespaces. */
|
||||
dev->netns_local = true;
|
||||
dev->netns_immutable = true;
|
||||
|
||||
/* does not make sense for a VLAN to be added to a vrf device */
|
||||
dev->features |= NETIF_F_VLAN_CHALLENGED;
|
||||
|
|
|
|||
|
|
@ -2021,7 +2021,7 @@ enum netdev_reg_state {
|
|||
* regardless of source, even if those aren't
|
||||
* HWTSTAMP_SOURCE_NETDEV
|
||||
* @change_proto_down: device supports setting carrier via IFLA_PROTO_DOWN
|
||||
* @netns_local: interface can't change network namespaces
|
||||
* @netns_immutable: interface can't change network namespaces
|
||||
* @fcoe_mtu: device supports maximum FCoE MTU, 2158 bytes
|
||||
*
|
||||
* @net_notifier_list: List of per-net netdev notifier block
|
||||
|
|
@ -2429,7 +2429,7 @@ struct net_device {
|
|||
/* priv_flags_slow, ungrouped to save space */
|
||||
unsigned long see_all_hwtstamp_requests:1;
|
||||
unsigned long change_proto_down:1;
|
||||
unsigned long netns_local:1;
|
||||
unsigned long netns_immutable:1;
|
||||
unsigned long fcoe_mtu:1;
|
||||
|
||||
struct list_head net_notifier_list;
|
||||
|
|
@ -4191,12 +4191,13 @@ int dev_change_flags(struct net_device *dev, unsigned int flags,
|
|||
int dev_set_alias(struct net_device *, const char *, size_t);
|
||||
int dev_get_alias(const struct net_device *, char *, size_t);
|
||||
int __dev_change_net_namespace(struct net_device *dev, struct net *net,
|
||||
const char *pat, int new_ifindex);
|
||||
const char *pat, int new_ifindex,
|
||||
struct netlink_ext_ack *extack);
|
||||
static inline
|
||||
int dev_change_net_namespace(struct net_device *dev, struct net *net,
|
||||
const char *pat)
|
||||
{
|
||||
return __dev_change_net_namespace(dev, net, pat, 0);
|
||||
return __dev_change_net_namespace(dev, net, pat, 0, NULL);
|
||||
}
|
||||
int __dev_set_mtu(struct net_device *, int);
|
||||
int dev_set_mtu(struct net_device *, int);
|
||||
|
|
|
|||
|
|
@ -378,6 +378,7 @@ enum {
|
|||
IFLA_GRO_IPV4_MAX_SIZE,
|
||||
IFLA_DPLL_PIN,
|
||||
IFLA_MAX_PACING_OFFLOAD_HORIZON,
|
||||
IFLA_NETNS_IMMUTABLE,
|
||||
__IFLA_MAX
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1037,7 +1037,7 @@ static void batadv_softif_init_early(struct net_device *dev)
|
|||
dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
|
||||
dev->priv_flags |= IFF_NO_QUEUE;
|
||||
dev->lltx = true;
|
||||
dev->netns_local = true;
|
||||
dev->netns_immutable = true;
|
||||
|
||||
/* can't call min_mtu, because the needed variables
|
||||
* have not been initialized yet
|
||||
|
|
|
|||
|
|
@ -488,7 +488,7 @@ void br_dev_setup(struct net_device *dev)
|
|||
SET_NETDEV_DEVTYPE(dev, &br_type);
|
||||
dev->priv_flags = IFF_EBRIDGE | IFF_NO_QUEUE;
|
||||
dev->lltx = true;
|
||||
dev->netns_local = true;
|
||||
dev->netns_immutable = true;
|
||||
|
||||
dev->features = COMMON_FEATURES | NETIF_F_HW_VLAN_CTAG_TX |
|
||||
NETIF_F_HW_VLAN_STAG_TX;
|
||||
|
|
|
|||
|
|
@ -12131,6 +12131,7 @@ EXPORT_SYMBOL(unregister_netdev);
|
|||
* is already taken in the destination network namespace.
|
||||
* @new_ifindex: If not zero, specifies device index in the target
|
||||
* namespace.
|
||||
* @extack: netlink extended ack
|
||||
*
|
||||
* This function shuts down a device interface and moves it
|
||||
* to a new network namespace. On success 0 is returned, on
|
||||
|
|
@ -12140,7 +12141,8 @@ EXPORT_SYMBOL(unregister_netdev);
|
|||
*/
|
||||
|
||||
int __dev_change_net_namespace(struct net_device *dev, struct net *net,
|
||||
const char *pat, int new_ifindex)
|
||||
const char *pat, int new_ifindex,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct netdev_name_node *name_node;
|
||||
struct net *net_old = dev_net(dev);
|
||||
|
|
@ -12151,12 +12153,16 @@ int __dev_change_net_namespace(struct net_device *dev, struct net *net,
|
|||
|
||||
/* Don't allow namespace local devices to be moved. */
|
||||
err = -EINVAL;
|
||||
if (dev->netns_local)
|
||||
if (dev->netns_immutable) {
|
||||
NL_SET_ERR_MSG(extack, "The interface netns is immutable");
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Ensure the device has been registered */
|
||||
if (dev->reg_state != NETREG_REGISTERED)
|
||||
if (dev->reg_state != NETREG_REGISTERED) {
|
||||
NL_SET_ERR_MSG(extack, "The interface isn't registered");
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Get out if there is nothing todo */
|
||||
err = 0;
|
||||
|
|
@ -12169,30 +12175,49 @@ int __dev_change_net_namespace(struct net_device *dev, struct net *net,
|
|||
err = -EEXIST;
|
||||
if (netdev_name_in_use(net, dev->name)) {
|
||||
/* We get here if we can't use the current device name */
|
||||
if (!pat)
|
||||
if (!pat) {
|
||||
NL_SET_ERR_MSG(extack,
|
||||
"An interface with the same name exists in the target netns");
|
||||
goto out;
|
||||
}
|
||||
err = dev_prep_valid_name(net, dev, pat, new_name, EEXIST);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
NL_SET_ERR_MSG_FMT(extack,
|
||||
"Unable to use '%s' for the new interface name in the target netns",
|
||||
pat);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
/* Check that none of the altnames conflicts. */
|
||||
err = -EEXIST;
|
||||
netdev_for_each_altname(dev, name_node)
|
||||
if (netdev_name_in_use(net, name_node->name))
|
||||
netdev_for_each_altname(dev, name_node) {
|
||||
if (netdev_name_in_use(net, name_node->name)) {
|
||||
NL_SET_ERR_MSG_FMT(extack,
|
||||
"An interface with the altname %s exists in the target netns",
|
||||
name_node->name);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check that new_ifindex isn't used yet. */
|
||||
if (new_ifindex) {
|
||||
err = dev_index_reserve(net, new_ifindex);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
NL_SET_ERR_MSG_FMT(extack,
|
||||
"The ifindex %d is not available in the target netns",
|
||||
new_ifindex);
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
/* If there is an ifindex conflict assign a new one */
|
||||
err = dev_index_reserve(net, dev->ifindex);
|
||||
if (err == -EBUSY)
|
||||
err = dev_index_reserve(net, 0);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
NL_SET_ERR_MSG(extack,
|
||||
"Unable to allocate a new ifindex in the target netns");
|
||||
goto out;
|
||||
}
|
||||
new_ifindex = err;
|
||||
}
|
||||
|
||||
|
|
@ -12533,7 +12558,7 @@ static void __net_exit default_device_exit_net(struct net *net)
|
|||
char fb_name[IFNAMSIZ];
|
||||
|
||||
/* Ignore unmoveable devices (i.e. loopback) */
|
||||
if (dev->netns_local)
|
||||
if (dev->netns_immutable)
|
||||
continue;
|
||||
|
||||
/* Leave virtual devices for the generic cleanup */
|
||||
|
|
|
|||
|
|
@ -1292,6 +1292,7 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev,
|
|||
+ nla_total_size(4) /* IFLA_TSO_MAX_SEGS */
|
||||
+ nla_total_size(1) /* IFLA_OPERSTATE */
|
||||
+ nla_total_size(1) /* IFLA_LINKMODE */
|
||||
+ nla_total_size(1) /* IFLA_NETNS_IMMUTABLE */
|
||||
+ nla_total_size(4) /* IFLA_CARRIER_CHANGES */
|
||||
+ nla_total_size(4) /* IFLA_LINK_NETNSID */
|
||||
+ nla_total_size(4) /* IFLA_GROUP */
|
||||
|
|
@ -2046,6 +2047,7 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb,
|
|||
netif_running(dev) ? READ_ONCE(dev->operstate) :
|
||||
IF_OPER_DOWN) ||
|
||||
nla_put_u8(skb, IFLA_LINKMODE, READ_ONCE(dev->link_mode)) ||
|
||||
nla_put_u8(skb, IFLA_NETNS_IMMUTABLE, dev->netns_immutable) ||
|
||||
nla_put_u32(skb, IFLA_MTU, READ_ONCE(dev->mtu)) ||
|
||||
nla_put_u32(skb, IFLA_MIN_MTU, READ_ONCE(dev->min_mtu)) ||
|
||||
nla_put_u32(skb, IFLA_MAX_MTU, READ_ONCE(dev->max_mtu)) ||
|
||||
|
|
@ -2234,6 +2236,7 @@ static const struct nla_policy ifla_policy[IFLA_MAX+1] = {
|
|||
[IFLA_ALLMULTI] = { .type = NLA_REJECT },
|
||||
[IFLA_GSO_IPV4_MAX_SIZE] = NLA_POLICY_MIN(NLA_U32, MAX_TCP_HEADER + 1),
|
||||
[IFLA_GRO_IPV4_MAX_SIZE] = { .type = NLA_U32 },
|
||||
[IFLA_NETNS_IMMUTABLE] = { .type = NLA_REJECT },
|
||||
};
|
||||
|
||||
static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = {
|
||||
|
|
@ -3025,7 +3028,7 @@ static int do_setlink(const struct sk_buff *skb, struct net_device *dev,
|
|||
|
||||
new_ifindex = nla_get_s32_default(tb[IFLA_NEW_IFINDEX], 0);
|
||||
|
||||
err = __dev_change_net_namespace(dev, tgt_net, pat, new_ifindex);
|
||||
err = __dev_change_net_namespace(dev, tgt_net, pat, new_ifindex, extack);
|
||||
if (err)
|
||||
goto errout;
|
||||
|
||||
|
|
|
|||
|
|
@ -643,7 +643,7 @@ void hsr_dev_setup(struct net_device *dev)
|
|||
/* Not sure about this. Taken from bridge code. netdevice.h says
|
||||
* it means "Does not change network namespaces".
|
||||
*/
|
||||
dev->netns_local = true;
|
||||
dev->netns_immutable = true;
|
||||
|
||||
dev->needs_free_netdev = true;
|
||||
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ static void lowpan_setup(struct net_device *ldev)
|
|||
ldev->netdev_ops = &lowpan_netdev_ops;
|
||||
ldev->header_ops = &lowpan_header_ops;
|
||||
ldev->needs_free_netdev = true;
|
||||
ldev->netns_local = true;
|
||||
ldev->netns_immutable = true;
|
||||
}
|
||||
|
||||
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) {
|
||||
if (!wpan_dev->netdev)
|
||||
continue;
|
||||
wpan_dev->netdev->netns_local = false;
|
||||
wpan_dev->netdev->netns_immutable = false;
|
||||
err = dev_change_net_namespace(wpan_dev->netdev, net, "wpan%d");
|
||||
if (err)
|
||||
break;
|
||||
wpan_dev->netdev->netns_local = true;
|
||||
wpan_dev->netdev->netns_immutable = true;
|
||||
}
|
||||
|
||||
if (err) {
|
||||
|
|
@ -242,11 +242,11 @@ int cfg802154_switch_netns(struct cfg802154_registered_device *rdev,
|
|||
list) {
|
||||
if (!wpan_dev->netdev)
|
||||
continue;
|
||||
wpan_dev->netdev->netns_local = false;
|
||||
wpan_dev->netdev->netns_immutable = false;
|
||||
err = dev_change_net_namespace(wpan_dev->netdev, net,
|
||||
"wpan%d");
|
||||
WARN_ON(err);
|
||||
wpan_dev->netdev->netns_local = true;
|
||||
wpan_dev->netdev->netns_immutable = true;
|
||||
}
|
||||
|
||||
return err;
|
||||
|
|
@ -291,7 +291,7 @@ static int cfg802154_netdev_notifier_call(struct notifier_block *nb,
|
|||
switch (state) {
|
||||
/* TODO NETDEV_DEVTYPE */
|
||||
case NETDEV_REGISTER:
|
||||
dev->netns_local = true;
|
||||
dev->netns_immutable = true;
|
||||
wpan_dev->identifier = ++rdev->wpan_dev_id;
|
||||
list_add_rcu(&wpan_dev->list, &rdev->wpan_dev_list);
|
||||
rdev->devlist_generation++;
|
||||
|
|
|
|||
|
|
@ -1162,7 +1162,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.
|
||||
*/
|
||||
if (!IS_ERR(itn->fb_tunnel_dev)) {
|
||||
itn->fb_tunnel_dev->netns_local = true;
|
||||
itn->fb_tunnel_dev->netns_immutable = true;
|
||||
itn->fb_tunnel_dev->mtu = ip_tunnel_bind_dev(itn->fb_tunnel_dev);
|
||||
ip_tunnel_add(itn, netdev_priv(itn->fb_tunnel_dev));
|
||||
itn->type = itn->fb_tunnel_dev->type;
|
||||
|
|
|
|||
|
|
@ -563,7 +563,7 @@ static void reg_vif_setup(struct net_device *dev)
|
|||
dev->flags = IFF_NOARP;
|
||||
dev->netdev_ops = ®_vif_netdev_ops;
|
||||
dev->needs_free_netdev = true;
|
||||
dev->netns_local = true;
|
||||
dev->netns_immutable = true;
|
||||
}
|
||||
|
||||
static struct net_device *ipmr_reg_vif(struct net *net, struct mr_table *mrt)
|
||||
|
|
|
|||
|
|
@ -1620,7 +1620,7 @@ static int __net_init ip6gre_init_net(struct net *net)
|
|||
/* FB netdevice is special: we have one, and only one per netns.
|
||||
* Allowing to move it to another netns is clearly unsafe.
|
||||
*/
|
||||
ign->fb_tunnel_dev->netns_local = true;
|
||||
ign->fb_tunnel_dev->netns_immutable = true;
|
||||
|
||||
ip6gre_fb_tunnel_init(ign->fb_tunnel_dev);
|
||||
ign->fb_tunnel_dev->rtnl_link_ops = &ip6gre_link_ops;
|
||||
|
|
|
|||
|
|
@ -2265,7 +2265,7 @@ static int __net_init ip6_tnl_init_net(struct net *net)
|
|||
/* FB netdevice is special: we have one, and only one per netns.
|
||||
* Allowing to move it to another netns is clearly unsafe.
|
||||
*/
|
||||
ip6n->fb_tnl_dev->netns_local = true;
|
||||
ip6n->fb_tnl_dev->netns_immutable = true;
|
||||
|
||||
err = ip6_fb_tnl_dev_init(ip6n->fb_tnl_dev);
|
||||
if (err < 0)
|
||||
|
|
|
|||
|
|
@ -668,7 +668,7 @@ static void reg_vif_setup(struct net_device *dev)
|
|||
dev->flags = IFF_NOARP;
|
||||
dev->netdev_ops = ®_vif_netdev_ops;
|
||||
dev->needs_free_netdev = true;
|
||||
dev->netns_local = true;
|
||||
dev->netns_immutable = true;
|
||||
}
|
||||
|
||||
static struct net_device *ip6mr_reg_vif(struct net *net, struct mr_table *mrt)
|
||||
|
|
|
|||
|
|
@ -1859,7 +1859,7 @@ static int __net_init sit_init_net(struct net *net)
|
|||
/* FB netdevice is special: we have one, and only one per netns.
|
||||
* Allowing to move it to another netns is clearly unsafe.
|
||||
*/
|
||||
sitn->fb_tunnel_dev->netns_local = true;
|
||||
sitn->fb_tunnel_dev->netns_immutable = true;
|
||||
|
||||
t = netdev_priv(sitn->fb_tunnel_dev);
|
||||
t->net = net;
|
||||
|
|
|
|||
|
|
@ -149,7 +149,7 @@ static struct vport *internal_dev_create(const struct vport_parms *parms)
|
|||
|
||||
/* Restrict bridge port to current netns. */
|
||||
if (vport->port_no == OVSP_LOCAL)
|
||||
vport->dev->netns_local = true;
|
||||
vport->dev->netns_immutable = true;
|
||||
|
||||
rtnl_lock();
|
||||
err = register_netdevice(vport->dev);
|
||||
|
|
|
|||
|
|
@ -162,11 +162,11 @@ int cfg80211_switch_netns(struct cfg80211_registered_device *rdev,
|
|||
list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
|
||||
if (!wdev->netdev)
|
||||
continue;
|
||||
wdev->netdev->netns_local = false;
|
||||
wdev->netdev->netns_immutable = false;
|
||||
err = dev_change_net_namespace(wdev->netdev, net, "wlan%d");
|
||||
if (err)
|
||||
break;
|
||||
wdev->netdev->netns_local = true;
|
||||
wdev->netdev->netns_immutable = true;
|
||||
}
|
||||
|
||||
if (err) {
|
||||
|
|
@ -178,11 +178,11 @@ int cfg80211_switch_netns(struct cfg80211_registered_device *rdev,
|
|||
list) {
|
||||
if (!wdev->netdev)
|
||||
continue;
|
||||
wdev->netdev->netns_local = false;
|
||||
wdev->netdev->netns_immutable = false;
|
||||
err = dev_change_net_namespace(wdev->netdev, net,
|
||||
"wlan%d");
|
||||
WARN_ON(err);
|
||||
wdev->netdev->netns_local = true;
|
||||
wdev->netdev->netns_immutable = true;
|
||||
}
|
||||
|
||||
return err;
|
||||
|
|
@ -1513,7 +1513,7 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
|
|||
SET_NETDEV_DEVTYPE(dev, &wiphy_type);
|
||||
wdev->netdev = dev;
|
||||
/* can only change netns with wiphy */
|
||||
dev->netns_local = true;
|
||||
dev->netns_immutable = true;
|
||||
|
||||
cfg80211_init_wdev(wdev);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ to easily create and test complex environments.
|
|||
|
||||
Unfortunately, these namespaces can not be used with actual switching
|
||||
ASICs, as their ports can not be migrated to other network namespaces
|
||||
(dev->netns_local) and most of them probably do not support the
|
||||
(dev->netns_immutable) and most of them probably do not support the
|
||||
L1-separation provided by namespaces.
|
||||
|
||||
However, a similar kind of flexibility can be achieved by using VRFs and
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user