ieee802154: fix netns settings

6LoWPAN currently doesn't supports x-netns and works only in init_net.

With this patch, we ensure that:
 - the wpan interface cannot be moved to another netns;
 - the 6lowpan interface cannot be moved to another netns;
 - the wpan interface is in the same netns than the 6lowpan interface;
 - the 6lowpan interface is in init_net.

Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Acked-by: Alexander Aring <alex.aring@gmail.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
Nicolas Dichtel 2015-02-05 18:21:30 +01:00 committed by Marcel Holtmann
parent a715d11e45
commit f9d1ce8f81
2 changed files with 5 additions and 2 deletions

View File

@ -126,6 +126,7 @@ static void lowpan_setup(struct net_device *dev)
dev->header_ops = &lowpan_header_ops; dev->header_ops = &lowpan_header_ops;
dev->ml_priv = &lowpan_mlme; dev->ml_priv = &lowpan_mlme;
dev->destructor = free_netdev; dev->destructor = free_netdev;
dev->features |= NETIF_F_NETNS_LOCAL;
} }
static int lowpan_validate(struct nlattr *tb[], struct nlattr *data[]) static int lowpan_validate(struct nlattr *tb[], struct nlattr *data[])
@ -148,10 +149,11 @@ static int lowpan_newlink(struct net *src_net, struct net_device *dev,
pr_debug("adding new link\n"); pr_debug("adding new link\n");
if (!tb[IFLA_LINK]) if (!tb[IFLA_LINK] ||
!net_eq(dev_net(dev), &init_net))
return -EINVAL; return -EINVAL;
/* find and hold real wpan device */ /* find and hold real wpan device */
real_dev = dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK])); real_dev = dev_get_by_index(dev_net(dev), nla_get_u32(tb[IFLA_LINK]));
if (!real_dev) if (!real_dev)
return -ENODEV; return -ENODEV;
if (real_dev->type != ARPHRD_IEEE802154) { if (real_dev->type != ARPHRD_IEEE802154) {

View File

@ -225,6 +225,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;
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++;