Skip to content

Commit

Permalink
netns: Teach network device kobjects which namespace they are in.
Browse files Browse the repository at this point in the history
The problem.  Network devices show up in sysfs and with the network
namespace active multiple devices with the same name can show up in
the same directory, ouch!

To avoid that problem and allow existing applications in network namespaces
to see the same interface that is currently presented in sysfs, this
patch enables the tagging directory support in sysfs.

By using the network namespace pointers as tags to separate out the
the sysfs directory entries we ensure that we don't have conflicts
in the directories and applications only see a limited set of
the network devices.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Eric W. Biederman authored and Greg Kroah-Hartman committed May 21, 2010
1 parent 07e9896 commit 608b4b9
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 0 deletions.
1 change: 1 addition & 0 deletions include/linux/kobject.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ extern const struct sysfs_ops kobj_sysfs_ops;
*/
enum kobj_ns_type {
KOBJ_NS_TYPE_NONE = 0,
KOBJ_NS_TYPE_NET,
KOBJ_NS_TYPES
};

Expand Down
8 changes: 8 additions & 0 deletions net/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,14 @@ config COMPAT_NETLINK_MESSAGES

menu "Networking options"

config NET_NS
bool "Network namespace support"
default n
depends on EXPERIMENTAL && NAMESPACES
help
Allow user space to create what appear to be multiple instances
of the network stack.

source "net/packet/Kconfig"
source "net/unix/Kconfig"
source "net/xfrm/Kconfig"
Expand Down
47 changes: 47 additions & 0 deletions net/core/net-sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@
#include <linux/netdevice.h>
#include <linux/if_arp.h>
#include <linux/slab.h>
#include <linux/nsproxy.h>
#include <net/sock.h>
#include <net/net_namespace.h>
#include <linux/rtnetlink.h>
#include <linux/wireless.h>
#include <linux/vmalloc.h>
Expand Down Expand Up @@ -766,6 +768,38 @@ static void rx_queue_remove_kobjects(struct net_device *net)
kset_unregister(net->queues_kset);
}
#endif /* CONFIG_RPS */

static const void *net_current_ns(void)
{
return current->nsproxy->net_ns;
}

static const void *net_initial_ns(void)
{
return &init_net;
}

static const void *net_netlink_ns(struct sock *sk)
{
return sock_net(sk);
}

static struct kobj_ns_type_operations net_ns_type_operations = {
.type = KOBJ_NS_TYPE_NET,
.current_ns = net_current_ns,
.netlink_ns = net_netlink_ns,
.initial_ns = net_initial_ns,
};

static void net_kobj_ns_exit(struct net *net)
{
kobj_ns_exit(KOBJ_NS_TYPE_NET, net);
}

static struct pernet_operations sysfs_net_ops = {
.exit = net_kobj_ns_exit,
};

#endif /* CONFIG_SYSFS */

#ifdef CONFIG_HOTPLUG
Expand Down Expand Up @@ -806,6 +840,13 @@ static void netdev_release(struct device *d)
kfree((char *)dev - dev->padded);
}

static const void *net_namespace(struct device *d)
{
struct net_device *dev;
dev = container_of(d, struct net_device, dev);
return dev_net(dev);
}

static struct class net_class = {
.name = "net",
.dev_release = netdev_release,
Expand All @@ -815,6 +856,8 @@ static struct class net_class = {
#ifdef CONFIG_HOTPLUG
.dev_uevent = netdev_uevent,
#endif
.ns_type = &net_ns_type_operations,
.namespace = net_namespace,
};

/* Delete sysfs entries but hold kobject reference until after all
Expand Down Expand Up @@ -904,5 +947,9 @@ void netdev_initialize_kobject(struct net_device *net)

int netdev_kobject_init(void)
{
kobj_ns_type_register(&net_ns_type_operations);
#ifdef CONFIG_SYSFS
register_pernet_subsys(&sysfs_net_ops);
#endif
return class_register(&net_class);
}

0 comments on commit 608b4b9

Please sign in to comment.