aboutsummaryrefslogtreecommitdiffstats
path: root/net/ieee802154
diff options
context:
space:
mode:
authorNicolas Dichtel <nicolas.dichtel@6wind.com>2015-02-05 12:21:30 -0500
committerMarcel Holtmann <marcel@holtmann.org>2015-02-13 23:19:58 -0500
commitf9d1ce8f81eb046626cfa1bb0f419f8dca04bcae (patch)
tree80ebdf697f1b07b301dd0887d697dd2dad8b7356 /net/ieee802154
parenta715d11e453c37822eca675a4445c1ce4ea7297e (diff)
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>
Diffstat (limited to 'net/ieee802154')
-rw-r--r--net/ieee802154/6lowpan/core.c6
-rw-r--r--net/ieee802154/core.c1
2 files changed, 5 insertions, 2 deletions
diff --git a/net/ieee802154/6lowpan/core.c b/net/ieee802154/6lowpan/core.c
index 055fbb71ba6f..dfd3c6007f60 100644
--- a/net/ieee802154/6lowpan/core.c
+++ b/net/ieee802154/6lowpan/core.c
@@ -126,6 +126,7 @@ static void lowpan_setup(struct net_device *dev)
126 dev->header_ops = &lowpan_header_ops; 126 dev->header_ops = &lowpan_header_ops;
127 dev->ml_priv = &lowpan_mlme; 127 dev->ml_priv = &lowpan_mlme;
128 dev->destructor = free_netdev; 128 dev->destructor = free_netdev;
129 dev->features |= NETIF_F_NETNS_LOCAL;
129} 130}
130 131
131static int lowpan_validate(struct nlattr *tb[], struct nlattr *data[]) 132static 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,
148 149
149 pr_debug("adding new link\n"); 150 pr_debug("adding new link\n");
150 151
151 if (!tb[IFLA_LINK]) 152 if (!tb[IFLA_LINK] ||
153 !net_eq(dev_net(dev), &init_net))
152 return -EINVAL; 154 return -EINVAL;
153 /* find and hold real wpan device */ 155 /* find and hold real wpan device */
154 real_dev = dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK])); 156 real_dev = dev_get_by_index(dev_net(dev), nla_get_u32(tb[IFLA_LINK]));
155 if (!real_dev) 157 if (!real_dev)
156 return -ENODEV; 158 return -ENODEV;
157 if (real_dev->type != ARPHRD_IEEE802154) { 159 if (real_dev->type != ARPHRD_IEEE802154) {
diff --git a/net/ieee802154/core.c b/net/ieee802154/core.c
index 18bc7e738507..888d0991c761 100644
--- a/net/ieee802154/core.c
+++ b/net/ieee802154/core.c
@@ -225,6 +225,7 @@ static int cfg802154_netdev_notifier_call(struct notifier_block *nb,
225 switch (state) { 225 switch (state) {
226 /* TODO NETDEV_DEVTYPE */ 226 /* TODO NETDEV_DEVTYPE */
227 case NETDEV_REGISTER: 227 case NETDEV_REGISTER:
228 dev->features |= NETIF_F_NETNS_LOCAL;
228 wpan_dev->identifier = ++rdev->wpan_dev_id; 229 wpan_dev->identifier = ++rdev->wpan_dev_id;
229 list_add_rcu(&wpan_dev->list, &rdev->wpan_dev_list); 230 list_add_rcu(&wpan_dev->list, &rdev->wpan_dev_list);
230 rdev->devlist_generation++; 231 rdev->devlist_generation++;