aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/neighbour.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/core/neighbour.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/core/neighbour.c')
-rw-r--r--net/core/neighbour.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index 5f25f4f79b8c..2c6577c1eedd 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -1441,6 +1441,7 @@ int neigh_table_clear(struct neigh_table *tbl)
1441 1441
1442static int neigh_delete(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) 1442static int neigh_delete(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
1443{ 1443{
1444 struct net *net = skb->sk->sk_net;
1444 struct ndmsg *ndm; 1445 struct ndmsg *ndm;
1445 struct nlattr *dst_attr; 1446 struct nlattr *dst_attr;
1446 struct neigh_table *tbl; 1447 struct neigh_table *tbl;
@@ -1456,7 +1457,7 @@ static int neigh_delete(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
1456 1457
1457 ndm = nlmsg_data(nlh); 1458 ndm = nlmsg_data(nlh);
1458 if (ndm->ndm_ifindex) { 1459 if (ndm->ndm_ifindex) {
1459 dev = dev_get_by_index(ndm->ndm_ifindex); 1460 dev = dev_get_by_index(net, ndm->ndm_ifindex);
1460 if (dev == NULL) { 1461 if (dev == NULL) {
1461 err = -ENODEV; 1462 err = -ENODEV;
1462 goto out; 1463 goto out;
@@ -1506,6 +1507,7 @@ out:
1506 1507
1507static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) 1508static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
1508{ 1509{
1510 struct net *net = skb->sk->sk_net;
1509 struct ndmsg *ndm; 1511 struct ndmsg *ndm;
1510 struct nlattr *tb[NDA_MAX+1]; 1512 struct nlattr *tb[NDA_MAX+1];
1511 struct neigh_table *tbl; 1513 struct neigh_table *tbl;
@@ -1522,7 +1524,7 @@ static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
1522 1524
1523 ndm = nlmsg_data(nlh); 1525 ndm = nlmsg_data(nlh);
1524 if (ndm->ndm_ifindex) { 1526 if (ndm->ndm_ifindex) {
1525 dev = dev_get_by_index(ndm->ndm_ifindex); 1527 dev = dev_get_by_index(net, ndm->ndm_ifindex);
1526 if (dev == NULL) { 1528 if (dev == NULL) {
1527 err = -ENODEV; 1529 err = -ENODEV;
1528 goto out; 1530 goto out;