aboutsummaryrefslogtreecommitdiffstats
path: root/net/socket.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/socket.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/socket.c')
-rw-r--r--net/socket.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/net/socket.c b/net/socket.c
index a714c6d4e4a1..bc16eee4dc80 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -791,9 +791,9 @@ static ssize_t sock_aio_write(struct kiocb *iocb, const struct iovec *iov,
791 */ 791 */
792 792
793static DEFINE_MUTEX(br_ioctl_mutex); 793static DEFINE_MUTEX(br_ioctl_mutex);
794static int (*br_ioctl_hook) (unsigned int cmd, void __user *arg) = NULL; 794static int (*br_ioctl_hook) (struct net *, unsigned int cmd, void __user *arg) = NULL;
795 795
796void brioctl_set(int (*hook) (unsigned int, void __user *)) 796void brioctl_set(int (*hook) (struct net *, unsigned int, void __user *))
797{ 797{
798 mutex_lock(&br_ioctl_mutex); 798 mutex_lock(&br_ioctl_mutex);
799 br_ioctl_hook = hook; 799 br_ioctl_hook = hook;
@@ -803,9 +803,9 @@ void brioctl_set(int (*hook) (unsigned int, void __user *))
803EXPORT_SYMBOL(brioctl_set); 803EXPORT_SYMBOL(brioctl_set);
804 804
805static DEFINE_MUTEX(vlan_ioctl_mutex); 805static DEFINE_MUTEX(vlan_ioctl_mutex);
806static int (*vlan_ioctl_hook) (void __user *arg); 806static int (*vlan_ioctl_hook) (struct net *, void __user *arg);
807 807
808void vlan_ioctl_set(int (*hook) (void __user *)) 808void vlan_ioctl_set(int (*hook) (struct net *, void __user *))
809{ 809{
810 mutex_lock(&vlan_ioctl_mutex); 810 mutex_lock(&vlan_ioctl_mutex);
811 vlan_ioctl_hook = hook; 811 vlan_ioctl_hook = hook;
@@ -834,16 +834,20 @@ EXPORT_SYMBOL(dlci_ioctl_set);
834static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg) 834static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
835{ 835{
836 struct socket *sock; 836 struct socket *sock;
837 struct sock *sk;
837 void __user *argp = (void __user *)arg; 838 void __user *argp = (void __user *)arg;
838 int pid, err; 839 int pid, err;
840 struct net *net;
839 841
840 sock = file->private_data; 842 sock = file->private_data;
843 sk = sock->sk;
844 net = sk->sk_net;
841 if (cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15)) { 845 if (cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15)) {
842 err = dev_ioctl(cmd, argp); 846 err = dev_ioctl(net, cmd, argp);
843 } else 847 } else
844#ifdef CONFIG_WIRELESS_EXT 848#ifdef CONFIG_WIRELESS_EXT
845 if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) { 849 if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) {
846 err = dev_ioctl(cmd, argp); 850 err = dev_ioctl(net, cmd, argp);
847 } else 851 } else
848#endif /* CONFIG_WIRELESS_EXT */ 852#endif /* CONFIG_WIRELESS_EXT */
849 switch (cmd) { 853 switch (cmd) {
@@ -869,7 +873,7 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
869 873
870 mutex_lock(&br_ioctl_mutex); 874 mutex_lock(&br_ioctl_mutex);
871 if (br_ioctl_hook) 875 if (br_ioctl_hook)
872 err = br_ioctl_hook(cmd, argp); 876 err = br_ioctl_hook(net, cmd, argp);
873 mutex_unlock(&br_ioctl_mutex); 877 mutex_unlock(&br_ioctl_mutex);
874 break; 878 break;
875 case SIOCGIFVLAN: 879 case SIOCGIFVLAN:
@@ -880,7 +884,7 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
880 884
881 mutex_lock(&vlan_ioctl_mutex); 885 mutex_lock(&vlan_ioctl_mutex);
882 if (vlan_ioctl_hook) 886 if (vlan_ioctl_hook)
883 err = vlan_ioctl_hook(argp); 887 err = vlan_ioctl_hook(net, argp);
884 mutex_unlock(&vlan_ioctl_mutex); 888 mutex_unlock(&vlan_ioctl_mutex);
885 break; 889 break;
886 case SIOCADDDLCI: 890 case SIOCADDDLCI:
@@ -903,7 +907,7 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
903 * to the NIC driver. 907 * to the NIC driver.
904 */ 908 */
905 if (err == -ENOIOCTLCMD) 909 if (err == -ENOIOCTLCMD)
906 err = dev_ioctl(cmd, argp); 910 err = dev_ioctl(net, cmd, argp);
907 break; 911 break;
908 } 912 }
909 return err; 913 return err;