aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/mcast.c
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2007-09-17 14:56:21 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-10-10 19:49:10 -0400
commit881d966b48b035ab3f3aeaae0f3d3f9b584f45b2 (patch)
treec579d59a4107cbbe9e2b85939bc0d496b815c887 /net/ipv6/mcast.c
parentb4b510290b056b86611757ce1175a230f1080f53 (diff)
[NET]: Make the device list and device lookups per namespace.
This patch makes most of the generic device layer network namespace safe. This patch makes dev_base_head a network namespace variable, and then it picks up a few associated variables. The functions: dev_getbyhwaddr dev_getfirsthwbytype dev_get_by_flags dev_get_by_name __dev_get_by_name dev_get_by_index __dev_get_by_index dev_ioctl dev_ethtool dev_load wireless_process_ioctl were modified to take a network namespace argument, and deal with it. vlan_ioctl_set and brioctl_set were modified so their hooks will receive a network namespace argument. So basically anthing in the core of the network stack that was affected to by the change of dev_base was modified to handle multiple network namespaces. The rest of the network stack was simply modified to explicitly use &init_net the initial network namespace. This can be fixed when those components of the network stack are modified to handle multiple network namespaces. For now the ifindex generator is left global. Fundametally ifindex numbers are per namespace, or else we will have corner case problems with migration when we get that far. At the same time there are assumptions in the network stack that the ifindex of a network device won't change. Making the ifindex number global seems a good compromise until the network stack can cope with ifindex changes when you change namespaces, and the like. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/mcast.c')
-rw-r--r--net/ipv6/mcast.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c
index a41d5a0b50cc..e2ab43c989d4 100644
--- a/net/ipv6/mcast.c
+++ b/net/ipv6/mcast.c
@@ -215,7 +215,7 @@ int ipv6_sock_mc_join(struct sock *sk, int ifindex, struct in6_addr *addr)
215 dst_release(&rt->u.dst); 215 dst_release(&rt->u.dst);
216 } 216 }
217 } else 217 } else
218 dev = dev_get_by_index(ifindex); 218 dev = dev_get_by_index(&init_net, ifindex);
219 219
220 if (dev == NULL) { 220 if (dev == NULL) {
221 sock_kfree_s(sk, mc_lst, sizeof(*mc_lst)); 221 sock_kfree_s(sk, mc_lst, sizeof(*mc_lst));
@@ -266,7 +266,7 @@ int ipv6_sock_mc_drop(struct sock *sk, int ifindex, struct in6_addr *addr)
266 *lnk = mc_lst->next; 266 *lnk = mc_lst->next;
267 write_unlock_bh(&ipv6_sk_mc_lock); 267 write_unlock_bh(&ipv6_sk_mc_lock);
268 268
269 if ((dev = dev_get_by_index(mc_lst->ifindex)) != NULL) { 269 if ((dev = dev_get_by_index(&init_net, mc_lst->ifindex)) != NULL) {
270 struct inet6_dev *idev = in6_dev_get(dev); 270 struct inet6_dev *idev = in6_dev_get(dev);
271 271
272 (void) ip6_mc_leave_src(sk, mc_lst, idev); 272 (void) ip6_mc_leave_src(sk, mc_lst, idev);
@@ -301,7 +301,7 @@ static struct inet6_dev *ip6_mc_find_dev(struct in6_addr *group, int ifindex)
301 dst_release(&rt->u.dst); 301 dst_release(&rt->u.dst);
302 } 302 }
303 } else 303 } else
304 dev = dev_get_by_index(ifindex); 304 dev = dev_get_by_index(&init_net, ifindex);
305 305
306 if (!dev) 306 if (!dev)
307 return NULL; 307 return NULL;
@@ -332,7 +332,7 @@ void ipv6_sock_mc_close(struct sock *sk)
332 np->ipv6_mc_list = mc_lst->next; 332 np->ipv6_mc_list = mc_lst->next;
333 write_unlock_bh(&ipv6_sk_mc_lock); 333 write_unlock_bh(&ipv6_sk_mc_lock);
334 334
335 dev = dev_get_by_index(mc_lst->ifindex); 335 dev = dev_get_by_index(&init_net, mc_lst->ifindex);
336 if (dev) { 336 if (dev) {
337 struct inet6_dev *idev = in6_dev_get(dev); 337 struct inet6_dev *idev = in6_dev_get(dev);
338 338
@@ -2333,7 +2333,7 @@ static inline struct ifmcaddr6 *igmp6_mc_get_first(struct seq_file *seq)
2333 struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); 2333 struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq);
2334 2334
2335 state->idev = NULL; 2335 state->idev = NULL;
2336 for_each_netdev(state->dev) { 2336 for_each_netdev(&init_net, state->dev) {
2337 struct inet6_dev *idev; 2337 struct inet6_dev *idev;
2338 idev = in6_dev_get(state->dev); 2338 idev = in6_dev_get(state->dev);
2339 if (!idev) 2339 if (!idev)
@@ -2477,7 +2477,7 @@ static inline struct ip6_sf_list *igmp6_mcf_get_first(struct seq_file *seq)
2477 2477
2478 state->idev = NULL; 2478 state->idev = NULL;
2479 state->im = NULL; 2479 state->im = NULL;
2480 for_each_netdev(state->dev) { 2480 for_each_netdev(&init_net, state->dev) {
2481 struct inet6_dev *idev; 2481 struct inet6_dev *idev;
2482 idev = in6_dev_get(state->dev); 2482 idev = in6_dev_get(state->dev);
2483 if (unlikely(idev == NULL)) 2483 if (unlikely(idev == NULL))