

 fs/debugfs/Makefile       |    2 
 include/linux/init_task.h |    2 

Index: 2.6-mm/fs/debugfs/Makefile
===================================================================

Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
---

 lxc-dave/fs/debugfs/Makefile       |    2 
 lxc-dave/fs/debugfs/net_ns.c       |  232 +++++++++++++++++++++++++++++++++++++
 lxc-dave/include/linux/init_task.h |    2 
 3 files changed, 235 insertions(+), 1 deletion(-)

diff -puN fs/debugfs/Makefile~C0-netns-introduction fs/debugfs/Makefile
--- lxc/fs/debugfs/Makefile~C0-netns-introduction	2006-05-26 08:31:51.000000000 -0700
+++ lxc-dave/fs/debugfs/Makefile	2006-05-26 08:31:51.000000000 -0700
@@ -1,4 +1,4 @@
-debugfs-objs	:= inode.o file.o
+debugfs-objs	:= inode.o file.o net_ns.o
 
 obj-$(CONFIG_DEBUG_FS)	+= debugfs.o
 
diff -puN /dev/null fs/debugfs/net_ns.c
--- /dev/null	2005-03-30 22:36:15.000000000 -0800
+++ lxc-dave/fs/debugfs/net_ns.c	2006-05-26 08:31:51.000000000 -0700
@@ -0,0 +1,232 @@
+/*
+ *  net_ns.c - adds a net_ns/ directory to debug NET namespaces
+ *
+ *  Copyright (C) 2006 IBM
+ *
+ *  Author: Daniel Lezcano <dlezcano@fr.ibm.com>
+ *
+ *     This program is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU General Public License as
+ *     published by the Free Software Foundation, version 2 of the
+ *     License.
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/pagemap.h>
+#include <linux/debugfs.h>
+#include <linux/sched.h>
+#include <linux/nsproxy.h>
+#include <linux/net_ns.h>
+
+static struct dentry *net_ns_dentry;
+static struct dentry *net_ns_dentry_net_ns;
+static struct dentry *net_ns_dentry_lo;
+static struct dentry *net_ns_dentry_eth0;
+static struct dentry *net_ns_dentry_eth1;
+static struct dentry *net_ns_dentry_eth2;
+static struct dentry *net_ns_dentry_dev;
+
+static void net_ns_unshare_set(void *data, u64 val)
+{
+	struct net_namespace *new_ns;
+	if (unshare_network(CLONE_NEWNET, &new_ns))
+		return;
+
+	current->nsproxy->net_ns = new_ns;
+}
+
+static u64 net_ns_unshare_get(void *data)
+{
+	return (u64)(net_ns());
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(net_ns_fops, net_ns_unshare_get, net_ns_unshare_set, "%llu\n");
+
+static ssize_t net_ns_read_file(struct file *file, char __user *user_buf,
+				size_t count, loff_t *ppos)
+{
+	struct net_device *dev;
+	struct net_ns_dev_list* dev_list = &net_ns()->dev_list;
+	struct dentry* d = file->f_dentry;
+	char *devname = NULL;
+	char c;
+	size_t len = sizeof(c);
+
+	if (*ppos < 0)
+		return -EINVAL;
+
+	if (*ppos >= len)
+		return 0;
+
+	if (count < 1)
+		return -EINVAL;
+
+	if (d == net_ns_dentry_lo)
+		devname = "lo";
+	else if (d == net_ns_dentry_eth0)
+		devname = "eth0";
+	else if (d == net_ns_dentry_eth1)
+		devname = "eth1";
+	else if (d == net_ns_dentry_eth2)
+		devname = "eth2";
+
+	dev = net_ns_find_dev_by_name(devname, dev_list);
+
+	c = dev?'1':'0';
+	if (dev)
+		dev_put(dev);
+
+	if (copy_to_user(user_buf, &c, len))
+		return -EFAULT;
+
+	*ppos += len;
+	return len;
+}
+
+static ssize_t net_ns_write_file(struct file *file, const char __user *user_buf,
+				 size_t count, loff_t *ppos)
+{
+	struct net_device *dev;
+	struct net_ns_dev_list* dev_list = &net_ns()->dev_list;
+	struct dentry* d = file->f_dentry;
+	char *devname = NULL;
+	char c;
+	int ret;
+
+	if (count < 1)
+		return -EINVAL;
+
+	if (copy_from_user(&c,user_buf, 1))
+		return -EFAULT;
+
+	if (c != '1' && c!= '0')
+		return -EINVAL;
+
+	if (d == net_ns_dentry_lo)
+		devname = "lo";
+	else if (d == net_ns_dentry_eth0)
+		devname = "eth0";
+	else if (d == net_ns_dentry_eth1)
+		devname = "eth1";
+	else if (d == net_ns_dentry_eth2)
+		devname = "eth2";
+
+	dev = net_ns_find_dev_by_name(devname, dev_list);
+
+	if (c == '0') {
+
+		if (!dev)
+			return -EINVAL;
+
+		ret = net_ns_remove_dev(devname, dev_list);
+		if (ret)
+			return ret;
+
+		dev_put(dev);
+
+	} else {
+
+		if (dev) {
+			dev_put(dev);
+			return -EINVAL;
+		}
+
+		ret = net_ns_add_dev(devname, dev_list);
+		if (ret)
+			return ret;
+	}
+
+	*ppos += 1;
+	return 1;
+}
+
+static int net_ns_open_file(struct inode *inode, struct file *file)
+{
+	return 0;
+}
+
+static ssize_t net_ns_dev_read_file(struct file *file, char __user *user_buf,
+				size_t count, loff_t *ppos)
+{
+	return 0;
+}
+
+static ssize_t net_ns_dev_write_file(struct file *file, const char __user *user_buf,
+				 size_t count, loff_t *ppos)
+{
+	return -ENOSYS;
+}
+
+static int net_ns_dev_open_file(struct inode *inode, struct file *file)
+{
+	return 0;
+}
+
+static struct file_operations net_ns_dev_fops = {
+       .read =         net_ns_read_file,
+       .write =        net_ns_write_file,
+       .open =         net_ns_open_file,
+};
+
+static struct file_operations net_ns_dev_list_fops = {
+       .read =         net_ns_dev_read_file,
+       .write =        net_ns_dev_write_file,
+       .open =         net_ns_dev_open_file,
+};
+
+
+static int __init net_ns_init(void)
+{
+	net_ns_dentry = debugfs_create_dir("net_ns", NULL);
+
+	net_ns_dentry_net_ns = debugfs_create_file("net_ns", 0666,
+						   net_ns_dentry,
+						   NULL,
+						   &net_ns_fops);
+
+	net_ns_dentry_lo = debugfs_create_file("lo", 0666,
+						net_ns_dentry,
+						NULL,
+						&net_ns_dev_fops);
+
+	net_ns_dentry_eth0 = debugfs_create_file("eth0", 0666,
+						 net_ns_dentry,
+						 NULL,
+						 &net_ns_dev_fops);
+
+	net_ns_dentry_eth1 = debugfs_create_file("eth1", 0666,
+						 net_ns_dentry,
+						 NULL,
+						 &net_ns_dev_fops);
+
+	net_ns_dentry_eth2 = debugfs_create_file("eth2", 0666,
+					       net_ns_dentry,
+					       NULL,
+					       &net_ns_dev_fops);
+
+	net_ns_dentry_dev = debugfs_create_file("dev", 0666,
+						net_ns_dentry,
+						NULL,
+						&net_ns_dev_list_fops);
+
+	return 0;
+}
+
+static void __exit net_ns_exit(void)
+{
+	debugfs_remove(net_ns_dentry_dev);
+	debugfs_remove(net_ns_dentry_lo);
+	debugfs_remove(net_ns_dentry_eth0);
+	debugfs_remove(net_ns_dentry_eth1);
+	debugfs_remove(net_ns_dentry_eth2);
+	debugfs_remove(net_ns_dentry_net_ns);
+	debugfs_remove(net_ns_dentry);
+}
+
+module_init(net_ns_init);
+module_exit(net_ns_exit);
+
+MODULE_DESCRIPTION("NET namespace debugfs");
+MODULE_AUTHOR("Daniel Lezcano <dlezcano@fr.ibm.com>");
+MODULE_LICENSE("GPL");
diff -puN include/linux/init_task.h~C0-netns-introduction include/linux/init_task.h
--- lxc/include/linux/init_task.h~C0-netns-introduction	2006-05-26 08:31:51.000000000 -0700
+++ lxc-dave/include/linux/init_task.h	2006-05-26 08:31:51.000000000 -0700
@@ -4,6 +4,7 @@
 #include <linux/file.h>
 #include <linux/rcupdate.h>
 #include <linux/utsname.h>
+#include <linux/net_ns.h>
 
 #define INIT_FDTABLE \
 {							\
@@ -72,6 +73,7 @@ extern struct nsproxy init_nsproxy;
 	.count		= ATOMIC_INIT(1),				\
 	.nslock		= SPIN_LOCK_UNLOCKED,				\
 	.uts_ns		= &init_uts_ns,					\
+	.net_ns         = &init_net_ns,                                 \
 	.namespace	= NULL,						\
 }
 
diff -L .c -puN /dev/null /dev/null
_
