aboutsummaryrefslogtreecommitdiffstats
path: root/net/sched
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/sched
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/sched')
-rw-r--r--net/sched/act_mirred.c3
-rw-r--r--net/sched/cls_api.c4
-rw-r--r--net/sched/em_meta.c2
-rw-r--r--net/sched/sch_api.c10
4 files changed, 10 insertions, 9 deletions
diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c
index 579578944ae7..fd7bca4d5c20 100644
--- a/net/sched/act_mirred.c
+++ b/net/sched/act_mirred.c
@@ -20,6 +20,7 @@
20#include <linux/rtnetlink.h> 20#include <linux/rtnetlink.h>
21#include <linux/module.h> 21#include <linux/module.h>
22#include <linux/init.h> 22#include <linux/init.h>
23#include <net/net_namespace.h>
23#include <net/netlink.h> 24#include <net/netlink.h>
24#include <net/pkt_sched.h> 25#include <net/pkt_sched.h>
25#include <linux/tc_act/tc_mirred.h> 26#include <linux/tc_act/tc_mirred.h>
@@ -73,7 +74,7 @@ static int tcf_mirred_init(struct rtattr *rta, struct rtattr *est,
73 parm = RTA_DATA(tb[TCA_MIRRED_PARMS-1]); 74 parm = RTA_DATA(tb[TCA_MIRRED_PARMS-1]);
74 75
75 if (parm->ifindex) { 76 if (parm->ifindex) {
76 dev = __dev_get_by_index(parm->ifindex); 77 dev = __dev_get_by_index(&init_net, parm->ifindex);
77 if (dev == NULL) 78 if (dev == NULL)
78 return -ENODEV; 79 return -ENODEV;
79 switch (dev->type) { 80 switch (dev->type) {
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
index 5f0fbca7393f..03657976fd50 100644
--- a/net/sched/cls_api.c
+++ b/net/sched/cls_api.c
@@ -154,7 +154,7 @@ replay:
154 /* Find head of filter chain. */ 154 /* Find head of filter chain. */
155 155
156 /* Find link */ 156 /* Find link */
157 if ((dev = __dev_get_by_index(t->tcm_ifindex)) == NULL) 157 if ((dev = __dev_get_by_index(&init_net, t->tcm_ifindex)) == NULL)
158 return -ENODEV; 158 return -ENODEV;
159 159
160 /* Find qdisc */ 160 /* Find qdisc */
@@ -387,7 +387,7 @@ static int tc_dump_tfilter(struct sk_buff *skb, struct netlink_callback *cb)
387 387
388 if (cb->nlh->nlmsg_len < NLMSG_LENGTH(sizeof(*tcm))) 388 if (cb->nlh->nlmsg_len < NLMSG_LENGTH(sizeof(*tcm)))
389 return skb->len; 389 return skb->len;
390 if ((dev = dev_get_by_index(tcm->tcm_ifindex)) == NULL) 390 if ((dev = dev_get_by_index(&init_net, tcm->tcm_ifindex)) == NULL)
391 return skb->len; 391 return skb->len;
392 392
393 if (!tcm->tcm_parent) 393 if (!tcm->tcm_parent)
diff --git a/net/sched/em_meta.c b/net/sched/em_meta.c
index 650f09c8bd6a..e9989610712c 100644
--- a/net/sched/em_meta.c
+++ b/net/sched/em_meta.c
@@ -291,7 +291,7 @@ META_COLLECTOR(var_sk_bound_if)
291 } else { 291 } else {
292 struct net_device *dev; 292 struct net_device *dev;
293 293
294 dev = dev_get_by_index(skb->sk->sk_bound_dev_if); 294 dev = dev_get_by_index(&init_net, skb->sk->sk_bound_dev_if);
295 *err = var_dev(dev, dst); 295 *err = var_dev(dev, dst);
296 if (dev) 296 if (dev)
297 dev_put(dev); 297 dev_put(dev);
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
index efc383c58f1e..39d32780c80b 100644
--- a/net/sched/sch_api.c
+++ b/net/sched/sch_api.c
@@ -607,7 +607,7 @@ static int tc_get_qdisc(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
607 struct Qdisc *p = NULL; 607 struct Qdisc *p = NULL;
608 int err; 608 int err;
609 609
610 if ((dev = __dev_get_by_index(tcm->tcm_ifindex)) == NULL) 610 if ((dev = __dev_get_by_index(&init_net, tcm->tcm_ifindex)) == NULL)
611 return -ENODEV; 611 return -ENODEV;
612 612
613 if (clid) { 613 if (clid) {
@@ -674,7 +674,7 @@ replay:
674 clid = tcm->tcm_parent; 674 clid = tcm->tcm_parent;
675 q = p = NULL; 675 q = p = NULL;
676 676
677 if ((dev = __dev_get_by_index(tcm->tcm_ifindex)) == NULL) 677 if ((dev = __dev_get_by_index(&init_net, tcm->tcm_ifindex)) == NULL)
678 return -ENODEV; 678 return -ENODEV;
679 679
680 if (clid) { 680 if (clid) {
@@ -881,7 +881,7 @@ static int tc_dump_qdisc(struct sk_buff *skb, struct netlink_callback *cb)
881 s_q_idx = q_idx = cb->args[1]; 881 s_q_idx = q_idx = cb->args[1];
882 read_lock(&dev_base_lock); 882 read_lock(&dev_base_lock);
883 idx = 0; 883 idx = 0;
884 for_each_netdev(dev) { 884 for_each_netdev(&init_net, dev) {
885 if (idx < s_idx) 885 if (idx < s_idx)
886 goto cont; 886 goto cont;
887 if (idx > s_idx) 887 if (idx > s_idx)
@@ -932,7 +932,7 @@ static int tc_ctl_tclass(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
932 u32 qid = TC_H_MAJ(clid); 932 u32 qid = TC_H_MAJ(clid);
933 int err; 933 int err;
934 934
935 if ((dev = __dev_get_by_index(tcm->tcm_ifindex)) == NULL) 935 if ((dev = __dev_get_by_index(&init_net, tcm->tcm_ifindex)) == NULL)
936 return -ENODEV; 936 return -ENODEV;
937 937
938 /* 938 /*
@@ -1115,7 +1115,7 @@ static int tc_dump_tclass(struct sk_buff *skb, struct netlink_callback *cb)
1115 1115
1116 if (cb->nlh->nlmsg_len < NLMSG_LENGTH(sizeof(*tcm))) 1116 if (cb->nlh->nlmsg_len < NLMSG_LENGTH(sizeof(*tcm)))
1117 return 0; 1117 return 0;
1118 if ((dev = dev_get_by_index(tcm->tcm_ifindex)) == NULL) 1118 if ((dev = dev_get_by_index(&init_net, tcm->tcm_ifindex)) == NULL)
1119 return 0; 1119 return 0;
1120 1120
1121 s_t = cb->args[0]; 1121 s_t = cb->args[0];