aboutsummaryrefslogtreecommitdiffstats
path: root/net/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/socket.c')
-rw-r--r--net/socket.c309
1 files changed, 140 insertions, 169 deletions
diff --git a/net/socket.c b/net/socket.c
index 5e8d0af3c0e7..2270b941bcc7 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -94,6 +94,7 @@
94 94
95#include <net/compat.h> 95#include <net/compat.h>
96#include <net/wext.h> 96#include <net/wext.h>
97#include <net/cls_cgroup.h>
97 98
98#include <net/sock.h> 99#include <net/sock.h>
99#include <linux/netfilter.h> 100#include <linux/netfilter.h>
@@ -123,7 +124,7 @@ static int sock_fasync(int fd, struct file *filp, int on);
123static ssize_t sock_sendpage(struct file *file, struct page *page, 124static ssize_t sock_sendpage(struct file *file, struct page *page,
124 int offset, size_t size, loff_t *ppos, int more); 125 int offset, size_t size, loff_t *ppos, int more);
125static ssize_t sock_splice_read(struct file *file, loff_t *ppos, 126static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
126 struct pipe_inode_info *pipe, size_t len, 127 struct pipe_inode_info *pipe, size_t len,
127 unsigned int flags); 128 unsigned int flags);
128 129
129/* 130/*
@@ -161,7 +162,7 @@ static const struct net_proto_family *net_families[NPROTO] __read_mostly;
161 * Statistics counters of the socket lists 162 * Statistics counters of the socket lists
162 */ 163 */
163 164
164static DEFINE_PER_CPU(int, sockets_in_use) = 0; 165static DEFINE_PER_CPU(int, sockets_in_use);
165 166
166/* 167/*
167 * Support routines. 168 * Support routines.
@@ -169,15 +170,6 @@ static DEFINE_PER_CPU(int, sockets_in_use) = 0;
169 * divide and look after the messy bits. 170 * divide and look after the messy bits.
170 */ 171 */
171 172
172#define MAX_SOCK_ADDR 128 /* 108 for Unix domain -
173 16 for IP, 16 for IPX,
174 24 for IPv6,
175 about 80 for AX.25
176 must be at least one bigger than
177 the AF_UNIX size (see net/unix/af_unix.c
178 :unix_mkname()).
179 */
180
181/** 173/**
182 * move_addr_to_kernel - copy a socket address into kernel space 174 * move_addr_to_kernel - copy a socket address into kernel space
183 * @uaddr: Address in user space 175 * @uaddr: Address in user space
@@ -252,9 +244,14 @@ static struct inode *sock_alloc_inode(struct super_block *sb)
252 ei = kmem_cache_alloc(sock_inode_cachep, GFP_KERNEL); 244 ei = kmem_cache_alloc(sock_inode_cachep, GFP_KERNEL);
253 if (!ei) 245 if (!ei)
254 return NULL; 246 return NULL;
255 init_waitqueue_head(&ei->socket.wait); 247 ei->socket.wq = kmalloc(sizeof(struct socket_wq), GFP_KERNEL);
248 if (!ei->socket.wq) {
249 kmem_cache_free(sock_inode_cachep, ei);
250 return NULL;
251 }
252 init_waitqueue_head(&ei->socket.wq->wait);
253 ei->socket.wq->fasync_list = NULL;
256 254
257 ei->socket.fasync_list = NULL;
258 ei->socket.state = SS_UNCONNECTED; 255 ei->socket.state = SS_UNCONNECTED;
259 ei->socket.flags = 0; 256 ei->socket.flags = 0;
260 ei->socket.ops = NULL; 257 ei->socket.ops = NULL;
@@ -264,10 +261,21 @@ static struct inode *sock_alloc_inode(struct super_block *sb)
264 return &ei->vfs_inode; 261 return &ei->vfs_inode;
265} 262}
266 263
264
265static void wq_free_rcu(struct rcu_head *head)
266{
267 struct socket_wq *wq = container_of(head, struct socket_wq, rcu);
268
269 kfree(wq);
270}
271
267static void sock_destroy_inode(struct inode *inode) 272static void sock_destroy_inode(struct inode *inode)
268{ 273{
269 kmem_cache_free(sock_inode_cachep, 274 struct socket_alloc *ei;
270 container_of(inode, struct socket_alloc, vfs_inode)); 275
276 ei = container_of(inode, struct socket_alloc, vfs_inode);
277 call_rcu(&ei->socket.wq->rcu, wq_free_rcu);
278 kmem_cache_free(sock_inode_cachep, ei);
271} 279}
272 280
273static void init_once(void *foo) 281static void init_once(void *foo)
@@ -292,9 +300,9 @@ static int init_inodecache(void)
292} 300}
293 301
294static const struct super_operations sockfs_ops = { 302static const struct super_operations sockfs_ops = {
295 .alloc_inode = sock_alloc_inode, 303 .alloc_inode = sock_alloc_inode,
296 .destroy_inode =sock_destroy_inode, 304 .destroy_inode = sock_destroy_inode,
297 .statfs = simple_statfs, 305 .statfs = simple_statfs,
298}; 306};
299 307
300static int sockfs_get_sb(struct file_system_type *fs_type, 308static int sockfs_get_sb(struct file_system_type *fs_type,
@@ -394,6 +402,7 @@ int sock_map_fd(struct socket *sock, int flags)
394 402
395 return fd; 403 return fd;
396} 404}
405EXPORT_SYMBOL(sock_map_fd);
397 406
398static struct socket *sock_from_file(struct file *file, int *err) 407static struct socket *sock_from_file(struct file *file, int *err)
399{ 408{
@@ -405,7 +414,7 @@ static struct socket *sock_from_file(struct file *file, int *err)
405} 414}
406 415
407/** 416/**
408 * sockfd_lookup - Go from a file number to its socket slot 417 * sockfd_lookup - Go from a file number to its socket slot
409 * @fd: file handle 418 * @fd: file handle
410 * @err: pointer to an error code return 419 * @err: pointer to an error code return
411 * 420 *
@@ -433,6 +442,7 @@ struct socket *sockfd_lookup(int fd, int *err)
433 fput(file); 442 fput(file);
434 return sock; 443 return sock;
435} 444}
445EXPORT_SYMBOL(sockfd_lookup);
436 446
437static struct socket *sockfd_lookup_light(int fd, int *err, int *fput_needed) 447static struct socket *sockfd_lookup_light(int fd, int *err, int *fput_needed)
438{ 448{
@@ -513,7 +523,7 @@ void sock_release(struct socket *sock)
513 module_put(owner); 523 module_put(owner);
514 } 524 }
515 525
516 if (sock->fasync_list) 526 if (sock->wq->fasync_list)
517 printk(KERN_ERR "sock_release: fasync list not empty!\n"); 527 printk(KERN_ERR "sock_release: fasync list not empty!\n");
518 528
519 percpu_sub(sockets_in_use, 1); 529 percpu_sub(sockets_in_use, 1);
@@ -523,6 +533,7 @@ void sock_release(struct socket *sock)
523 } 533 }
524 sock->file = NULL; 534 sock->file = NULL;
525} 535}
536EXPORT_SYMBOL(sock_release);
526 537
527int sock_tx_timestamp(struct msghdr *msg, struct sock *sk, 538int sock_tx_timestamp(struct msghdr *msg, struct sock *sk,
528 union skb_shared_tx *shtx) 539 union skb_shared_tx *shtx)
@@ -542,6 +553,8 @@ static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock,
542 struct sock_iocb *si = kiocb_to_siocb(iocb); 553 struct sock_iocb *si = kiocb_to_siocb(iocb);
543 int err; 554 int err;
544 555
556 sock_update_classid(sock->sk);
557
545 si->sock = sock; 558 si->sock = sock;
546 si->scm = NULL; 559 si->scm = NULL;
547 si->msg = msg; 560 si->msg = msg;
@@ -567,6 +580,7 @@ int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
567 ret = wait_on_sync_kiocb(&iocb); 580 ret = wait_on_sync_kiocb(&iocb);
568 return ret; 581 return ret;
569} 582}
583EXPORT_SYMBOL(sock_sendmsg);
570 584
571int kernel_sendmsg(struct socket *sock, struct msghdr *msg, 585int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
572 struct kvec *vec, size_t num, size_t size) 586 struct kvec *vec, size_t num, size_t size)
@@ -585,6 +599,7 @@ int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
585 set_fs(oldfs); 599 set_fs(oldfs);
586 return result; 600 return result;
587} 601}
602EXPORT_SYMBOL(kernel_sendmsg);
588 603
589static int ktime2ts(ktime_t kt, struct timespec *ts) 604static int ktime2ts(ktime_t kt, struct timespec *ts)
590{ 605{
@@ -620,10 +635,9 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
620 put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMP, 635 put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMP,
621 sizeof(tv), &tv); 636 sizeof(tv), &tv);
622 } else { 637 } else {
623 struct timespec ts; 638 skb_get_timestampns(skb, &ts[0]);
624 skb_get_timestampns(skb, &ts);
625 put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMPNS, 639 put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMPNS,
626 sizeof(ts), &ts); 640 sizeof(ts[0]), &ts[0]);
627 } 641 }
628 } 642 }
629 643
@@ -646,7 +660,6 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
646 put_cmsg(msg, SOL_SOCKET, 660 put_cmsg(msg, SOL_SOCKET,
647 SCM_TIMESTAMPING, sizeof(ts), &ts); 661 SCM_TIMESTAMPING, sizeof(ts), &ts);
648} 662}
649
650EXPORT_SYMBOL_GPL(__sock_recv_timestamp); 663EXPORT_SYMBOL_GPL(__sock_recv_timestamp);
651 664
652inline void sock_recv_drops(struct msghdr *msg, struct sock *sk, struct sk_buff *skb) 665inline void sock_recv_drops(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
@@ -656,19 +669,21 @@ inline void sock_recv_drops(struct msghdr *msg, struct sock *sk, struct sk_buff
656 sizeof(__u32), &skb->dropcount); 669 sizeof(__u32), &skb->dropcount);
657} 670}
658 671
659void sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk, 672void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
660 struct sk_buff *skb) 673 struct sk_buff *skb)
661{ 674{
662 sock_recv_timestamp(msg, sk, skb); 675 sock_recv_timestamp(msg, sk, skb);
663 sock_recv_drops(msg, sk, skb); 676 sock_recv_drops(msg, sk, skb);
664} 677}
665EXPORT_SYMBOL_GPL(sock_recv_ts_and_drops); 678EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops);
666 679
667static inline int __sock_recvmsg_nosec(struct kiocb *iocb, struct socket *sock, 680static inline int __sock_recvmsg_nosec(struct kiocb *iocb, struct socket *sock,
668 struct msghdr *msg, size_t size, int flags) 681 struct msghdr *msg, size_t size, int flags)
669{ 682{
670 struct sock_iocb *si = kiocb_to_siocb(iocb); 683 struct sock_iocb *si = kiocb_to_siocb(iocb);
671 684
685 sock_update_classid(sock->sk);
686
672 si->sock = sock; 687 si->sock = sock;
673 si->scm = NULL; 688 si->scm = NULL;
674 si->msg = msg; 689 si->msg = msg;
@@ -700,6 +715,7 @@ int sock_recvmsg(struct socket *sock, struct msghdr *msg,
700 ret = wait_on_sync_kiocb(&iocb); 715 ret = wait_on_sync_kiocb(&iocb);
701 return ret; 716 return ret;
702} 717}
718EXPORT_SYMBOL(sock_recvmsg);
703 719
704static int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg, 720static int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg,
705 size_t size, int flags) 721 size_t size, int flags)
@@ -732,6 +748,7 @@ int kernel_recvmsg(struct socket *sock, struct msghdr *msg,
732 set_fs(oldfs); 748 set_fs(oldfs);
733 return result; 749 return result;
734} 750}
751EXPORT_SYMBOL(kernel_recvmsg);
735 752
736static void sock_aio_dtor(struct kiocb *iocb) 753static void sock_aio_dtor(struct kiocb *iocb)
737{ 754{
@@ -754,7 +771,7 @@ static ssize_t sock_sendpage(struct file *file, struct page *page,
754} 771}
755 772
756static ssize_t sock_splice_read(struct file *file, loff_t *ppos, 773static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
757 struct pipe_inode_info *pipe, size_t len, 774 struct pipe_inode_info *pipe, size_t len,
758 unsigned int flags) 775 unsigned int flags)
759{ 776{
760 struct socket *sock = file->private_data; 777 struct socket *sock = file->private_data;
@@ -762,6 +779,8 @@ static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
762 if (unlikely(!sock->ops->splice_read)) 779 if (unlikely(!sock->ops->splice_read))
763 return -EINVAL; 780 return -EINVAL;
764 781
782 sock_update_classid(sock->sk);
783
765 return sock->ops->splice_read(sock, ppos, pipe, len, flags); 784 return sock->ops->splice_read(sock, ppos, pipe, len, flags);
766} 785}
767 786
@@ -865,7 +884,7 @@ static ssize_t sock_aio_write(struct kiocb *iocb, const struct iovec *iov,
865 */ 884 */
866 885
867static DEFINE_MUTEX(br_ioctl_mutex); 886static DEFINE_MUTEX(br_ioctl_mutex);
868static int (*br_ioctl_hook) (struct net *, unsigned int cmd, void __user *arg) = NULL; 887static int (*br_ioctl_hook) (struct net *, unsigned int cmd, void __user *arg);
869 888
870void brioctl_set(int (*hook) (struct net *, unsigned int, void __user *)) 889void brioctl_set(int (*hook) (struct net *, unsigned int, void __user *))
871{ 890{
@@ -873,7 +892,6 @@ void brioctl_set(int (*hook) (struct net *, unsigned int, void __user *))
873 br_ioctl_hook = hook; 892 br_ioctl_hook = hook;
874 mutex_unlock(&br_ioctl_mutex); 893 mutex_unlock(&br_ioctl_mutex);
875} 894}
876
877EXPORT_SYMBOL(brioctl_set); 895EXPORT_SYMBOL(brioctl_set);
878 896
879static DEFINE_MUTEX(vlan_ioctl_mutex); 897static DEFINE_MUTEX(vlan_ioctl_mutex);
@@ -885,7 +903,6 @@ void vlan_ioctl_set(int (*hook) (struct net *, void __user *))
885 vlan_ioctl_hook = hook; 903 vlan_ioctl_hook = hook;
886 mutex_unlock(&vlan_ioctl_mutex); 904 mutex_unlock(&vlan_ioctl_mutex);
887} 905}
888
889EXPORT_SYMBOL(vlan_ioctl_set); 906EXPORT_SYMBOL(vlan_ioctl_set);
890 907
891static DEFINE_MUTEX(dlci_ioctl_mutex); 908static DEFINE_MUTEX(dlci_ioctl_mutex);
@@ -897,7 +914,6 @@ void dlci_ioctl_set(int (*hook) (unsigned int, void __user *))
897 dlci_ioctl_hook = hook; 914 dlci_ioctl_hook = hook;
898 mutex_unlock(&dlci_ioctl_mutex); 915 mutex_unlock(&dlci_ioctl_mutex);
899} 916}
900
901EXPORT_SYMBOL(dlci_ioctl_set); 917EXPORT_SYMBOL(dlci_ioctl_set);
902 918
903static long sock_do_ioctl(struct net *net, struct socket *sock, 919static long sock_do_ioctl(struct net *net, struct socket *sock,
@@ -1025,6 +1041,7 @@ out_release:
1025 sock = NULL; 1041 sock = NULL;
1026 goto out; 1042 goto out;
1027} 1043}
1044EXPORT_SYMBOL(sock_create_lite);
1028 1045
1029/* No kernel lock held - perfect */ 1046/* No kernel lock held - perfect */
1030static unsigned int sock_poll(struct file *file, poll_table *wait) 1047static unsigned int sock_poll(struct file *file, poll_table *wait)
@@ -1068,87 +1085,44 @@ static int sock_close(struct inode *inode, struct file *filp)
1068 * 1. fasync_list is modified only under process context socket lock 1085 * 1. fasync_list is modified only under process context socket lock
1069 * i.e. under semaphore. 1086 * i.e. under semaphore.
1070 * 2. fasync_list is used under read_lock(&sk->sk_callback_lock) 1087 * 2. fasync_list is used under read_lock(&sk->sk_callback_lock)
1071 * or under socket lock. 1088 * or under socket lock
1072 * 3. fasync_list can be used from softirq context, so that
1073 * modification under socket lock have to be enhanced with
1074 * write_lock_bh(&sk->sk_callback_lock).
1075 * --ANK (990710)
1076 */ 1089 */
1077 1090
1078static int sock_fasync(int fd, struct file *filp, int on) 1091static int sock_fasync(int fd, struct file *filp, int on)
1079{ 1092{
1080 struct fasync_struct *fa, *fna = NULL, **prev; 1093 struct socket *sock = filp->private_data;
1081 struct socket *sock; 1094 struct sock *sk = sock->sk;
1082 struct sock *sk;
1083
1084 if (on) {
1085 fna = kmalloc(sizeof(struct fasync_struct), GFP_KERNEL);
1086 if (fna == NULL)
1087 return -ENOMEM;
1088 }
1089
1090 sock = filp->private_data;
1091 1095
1092 sk = sock->sk; 1096 if (sk == NULL)
1093 if (sk == NULL) {
1094 kfree(fna);
1095 return -EINVAL; 1097 return -EINVAL;
1096 }
1097 1098
1098 lock_sock(sk); 1099 lock_sock(sk);
1099 1100
1100 spin_lock(&filp->f_lock); 1101 fasync_helper(fd, filp, on, &sock->wq->fasync_list);
1101 if (on)
1102 filp->f_flags |= FASYNC;
1103 else
1104 filp->f_flags &= ~FASYNC;
1105 spin_unlock(&filp->f_lock);
1106
1107 prev = &(sock->fasync_list);
1108
1109 for (fa = *prev; fa != NULL; prev = &fa->fa_next, fa = *prev)
1110 if (fa->fa_file == filp)
1111 break;
1112
1113 if (on) {
1114 if (fa != NULL) {
1115 write_lock_bh(&sk->sk_callback_lock);
1116 fa->fa_fd = fd;
1117 write_unlock_bh(&sk->sk_callback_lock);
1118 1102
1119 kfree(fna); 1103 if (!sock->wq->fasync_list)
1120 goto out; 1104 sock_reset_flag(sk, SOCK_FASYNC);
1121 } 1105 else
1122 fna->fa_file = filp;
1123 fna->fa_fd = fd;
1124 fna->magic = FASYNC_MAGIC;
1125 fna->fa_next = sock->fasync_list;
1126 write_lock_bh(&sk->sk_callback_lock);
1127 sock->fasync_list = fna;
1128 sock_set_flag(sk, SOCK_FASYNC); 1106 sock_set_flag(sk, SOCK_FASYNC);
1129 write_unlock_bh(&sk->sk_callback_lock);
1130 } else {
1131 if (fa != NULL) {
1132 write_lock_bh(&sk->sk_callback_lock);
1133 *prev = fa->fa_next;
1134 if (!sock->fasync_list)
1135 sock_reset_flag(sk, SOCK_FASYNC);
1136 write_unlock_bh(&sk->sk_callback_lock);
1137 kfree(fa);
1138 }
1139 }
1140 1107
1141out: 1108 release_sock(sk);
1142 release_sock(sock->sk);
1143 return 0; 1109 return 0;
1144} 1110}
1145 1111
1146/* This function may be called only under socket lock or callback_lock */ 1112/* This function may be called only under socket lock or callback_lock or rcu_lock */
1147 1113
1148int sock_wake_async(struct socket *sock, int how, int band) 1114int sock_wake_async(struct socket *sock, int how, int band)
1149{ 1115{
1150 if (!sock || !sock->fasync_list) 1116 struct socket_wq *wq;
1117
1118 if (!sock)
1119 return -1;
1120 rcu_read_lock();
1121 wq = rcu_dereference(sock->wq);
1122 if (!wq || !wq->fasync_list) {
1123 rcu_read_unlock();
1151 return -1; 1124 return -1;
1125 }
1152 switch (how) { 1126 switch (how) {
1153 case SOCK_WAKE_WAITD: 1127 case SOCK_WAKE_WAITD:
1154 if (test_bit(SOCK_ASYNC_WAITDATA, &sock->flags)) 1128 if (test_bit(SOCK_ASYNC_WAITDATA, &sock->flags))
@@ -1160,13 +1134,15 @@ int sock_wake_async(struct socket *sock, int how, int band)
1160 /* fall through */ 1134 /* fall through */
1161 case SOCK_WAKE_IO: 1135 case SOCK_WAKE_IO:
1162call_kill: 1136call_kill:
1163 __kill_fasync(sock->fasync_list, SIGIO, band); 1137 kill_fasync(&wq->fasync_list, SIGIO, band);
1164 break; 1138 break;
1165 case SOCK_WAKE_URG: 1139 case SOCK_WAKE_URG:
1166 __kill_fasync(sock->fasync_list, SIGURG, band); 1140 kill_fasync(&wq->fasync_list, SIGURG, band);
1167 } 1141 }
1142 rcu_read_unlock();
1168 return 0; 1143 return 0;
1169} 1144}
1145EXPORT_SYMBOL(sock_wake_async);
1170 1146
1171static int __sock_create(struct net *net, int family, int type, int protocol, 1147static int __sock_create(struct net *net, int family, int type, int protocol,
1172 struct socket **res, int kern) 1148 struct socket **res, int kern)
@@ -1285,11 +1261,13 @@ int sock_create(int family, int type, int protocol, struct socket **res)
1285{ 1261{
1286 return __sock_create(current->nsproxy->net_ns, family, type, protocol, res, 0); 1262 return __sock_create(current->nsproxy->net_ns, family, type, protocol, res, 0);
1287} 1263}
1264EXPORT_SYMBOL(sock_create);
1288 1265
1289int sock_create_kern(int family, int type, int protocol, struct socket **res) 1266int sock_create_kern(int family, int type, int protocol, struct socket **res)
1290{ 1267{
1291 return __sock_create(&init_net, family, type, protocol, res, 1); 1268 return __sock_create(&init_net, family, type, protocol, res, 1);
1292} 1269}
1270EXPORT_SYMBOL(sock_create_kern);
1293 1271
1294SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) 1272SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
1295{ 1273{
@@ -1494,7 +1472,8 @@ SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
1494 goto out; 1472 goto out;
1495 1473
1496 err = -ENFILE; 1474 err = -ENFILE;
1497 if (!(newsock = sock_alloc())) 1475 newsock = sock_alloc();
1476 if (!newsock)
1498 goto out_put; 1477 goto out_put;
1499 1478
1500 newsock->type = sock->type; 1479 newsock->type = sock->type;
@@ -1881,8 +1860,7 @@ SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned, flags)
1881 if (MSG_CMSG_COMPAT & flags) { 1860 if (MSG_CMSG_COMPAT & flags) {
1882 if (get_compat_msghdr(&msg_sys, msg_compat)) 1861 if (get_compat_msghdr(&msg_sys, msg_compat))
1883 return -EFAULT; 1862 return -EFAULT;
1884 } 1863 } else if (copy_from_user(&msg_sys, msg, sizeof(struct msghdr)))
1885 else if (copy_from_user(&msg_sys, msg, sizeof(struct msghdr)))
1886 return -EFAULT; 1864 return -EFAULT;
1887 1865
1888 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1866 sock = sockfd_lookup_light(fd, &err, &fput_needed);
@@ -1984,8 +1962,7 @@ static int __sys_recvmsg(struct socket *sock, struct msghdr __user *msg,
1984 if (MSG_CMSG_COMPAT & flags) { 1962 if (MSG_CMSG_COMPAT & flags) {
1985 if (get_compat_msghdr(msg_sys, msg_compat)) 1963 if (get_compat_msghdr(msg_sys, msg_compat))
1986 return -EFAULT; 1964 return -EFAULT;
1987 } 1965 } else if (copy_from_user(msg_sys, msg, sizeof(struct msghdr)))
1988 else if (copy_from_user(msg_sys, msg, sizeof(struct msghdr)))
1989 return -EFAULT; 1966 return -EFAULT;
1990 1967
1991 err = -EMSGSIZE; 1968 err = -EMSGSIZE;
@@ -2211,10 +2188,10 @@ SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg,
2211/* Argument list sizes for sys_socketcall */ 2188/* Argument list sizes for sys_socketcall */
2212#define AL(x) ((x) * sizeof(unsigned long)) 2189#define AL(x) ((x) * sizeof(unsigned long))
2213static const unsigned char nargs[20] = { 2190static const unsigned char nargs[20] = {
2214 AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), 2191 AL(0), AL(3), AL(3), AL(3), AL(2), AL(3),
2215 AL(3),AL(3),AL(4),AL(4),AL(4),AL(6), 2192 AL(3), AL(3), AL(4), AL(4), AL(4), AL(6),
2216 AL(6),AL(2),AL(5),AL(5),AL(3),AL(3), 2193 AL(6), AL(2), AL(5), AL(5), AL(3), AL(3),
2217 AL(4),AL(5) 2194 AL(4), AL(5)
2218}; 2195};
2219 2196
2220#undef AL 2197#undef AL
@@ -2360,6 +2337,7 @@ int sock_register(const struct net_proto_family *ops)
2360 printk(KERN_INFO "NET: Registered protocol family %d\n", ops->family); 2337 printk(KERN_INFO "NET: Registered protocol family %d\n", ops->family);
2361 return err; 2338 return err;
2362} 2339}
2340EXPORT_SYMBOL(sock_register);
2363 2341
2364/** 2342/**
2365 * sock_unregister - remove a protocol handler 2343 * sock_unregister - remove a protocol handler
@@ -2386,6 +2364,7 @@ void sock_unregister(int family)
2386 2364
2387 printk(KERN_INFO "NET: Unregistered protocol family %d\n", family); 2365 printk(KERN_INFO "NET: Unregistered protocol family %d\n", family);
2388} 2366}
2367EXPORT_SYMBOL(sock_unregister);
2389 2368
2390static int __init sock_init(void) 2369static int __init sock_init(void)
2391{ 2370{
@@ -2415,6 +2394,10 @@ static int __init sock_init(void)
2415 netfilter_init(); 2394 netfilter_init();
2416#endif 2395#endif
2417 2396
2397#ifdef CONFIG_NETWORK_PHY_TIMESTAMPING
2398 skb_timestamping_init();
2399#endif
2400
2418 return 0; 2401 return 0;
2419} 2402}
2420 2403
@@ -2510,13 +2493,13 @@ static int dev_ifconf(struct net *net, struct compat_ifconf __user *uifc32)
2510 ifc.ifc_req = NULL; 2493 ifc.ifc_req = NULL;
2511 uifc = compat_alloc_user_space(sizeof(struct ifconf)); 2494 uifc = compat_alloc_user_space(sizeof(struct ifconf));
2512 } else { 2495 } else {
2513 size_t len =((ifc32.ifc_len / sizeof (struct compat_ifreq)) + 1) * 2496 size_t len = ((ifc32.ifc_len / sizeof(struct compat_ifreq)) + 1) *
2514 sizeof (struct ifreq); 2497 sizeof(struct ifreq);
2515 uifc = compat_alloc_user_space(sizeof(struct ifconf) + len); 2498 uifc = compat_alloc_user_space(sizeof(struct ifconf) + len);
2516 ifc.ifc_len = len; 2499 ifc.ifc_len = len;
2517 ifr = ifc.ifc_req = (void __user *)(uifc + 1); 2500 ifr = ifc.ifc_req = (void __user *)(uifc + 1);
2518 ifr32 = compat_ptr(ifc32.ifcbuf); 2501 ifr32 = compat_ptr(ifc32.ifcbuf);
2519 for (i = 0; i < ifc32.ifc_len; i += sizeof (struct compat_ifreq)) { 2502 for (i = 0; i < ifc32.ifc_len; i += sizeof(struct compat_ifreq)) {
2520 if (copy_in_user(ifr, ifr32, sizeof(struct compat_ifreq))) 2503 if (copy_in_user(ifr, ifr32, sizeof(struct compat_ifreq)))
2521 return -EFAULT; 2504 return -EFAULT;
2522 ifr++; 2505 ifr++;
@@ -2536,9 +2519,9 @@ static int dev_ifconf(struct net *net, struct compat_ifconf __user *uifc32)
2536 ifr = ifc.ifc_req; 2519 ifr = ifc.ifc_req;
2537 ifr32 = compat_ptr(ifc32.ifcbuf); 2520 ifr32 = compat_ptr(ifc32.ifcbuf);
2538 for (i = 0, j = 0; 2521 for (i = 0, j = 0;
2539 i + sizeof (struct compat_ifreq) <= ifc32.ifc_len && j < ifc.ifc_len; 2522 i + sizeof(struct compat_ifreq) <= ifc32.ifc_len && j < ifc.ifc_len;
2540 i += sizeof (struct compat_ifreq), j += sizeof (struct ifreq)) { 2523 i += sizeof(struct compat_ifreq), j += sizeof(struct ifreq)) {
2541 if (copy_in_user(ifr32, ifr, sizeof (struct compat_ifreq))) 2524 if (copy_in_user(ifr32, ifr, sizeof(struct compat_ifreq)))
2542 return -EFAULT; 2525 return -EFAULT;
2543 ifr32++; 2526 ifr32++;
2544 ifr++; 2527 ifr++;
@@ -2587,7 +2570,7 @@ static int compat_siocwandev(struct net *net, struct compat_ifreq __user *uifr32
2587 compat_uptr_t uptr32; 2570 compat_uptr_t uptr32;
2588 struct ifreq __user *uifr; 2571 struct ifreq __user *uifr;
2589 2572
2590 uifr = compat_alloc_user_space(sizeof (*uifr)); 2573 uifr = compat_alloc_user_space(sizeof(*uifr));
2591 if (copy_in_user(uifr, uifr32, sizeof(struct compat_ifreq))) 2574 if (copy_in_user(uifr, uifr32, sizeof(struct compat_ifreq)))
2592 return -EFAULT; 2575 return -EFAULT;
2593 2576
@@ -2621,9 +2604,9 @@ static int bond_ioctl(struct net *net, unsigned int cmd,
2621 return -EFAULT; 2604 return -EFAULT;
2622 2605
2623 old_fs = get_fs(); 2606 old_fs = get_fs();
2624 set_fs (KERNEL_DS); 2607 set_fs(KERNEL_DS);
2625 err = dev_ioctl(net, cmd, &kifr); 2608 err = dev_ioctl(net, cmd, &kifr);
2626 set_fs (old_fs); 2609 set_fs(old_fs);
2627 2610
2628 return err; 2611 return err;
2629 case SIOCBONDSLAVEINFOQUERY: 2612 case SIOCBONDSLAVEINFOQUERY:
@@ -2642,7 +2625,7 @@ static int bond_ioctl(struct net *net, unsigned int cmd,
2642 return dev_ioctl(net, cmd, uifr); 2625 return dev_ioctl(net, cmd, uifr);
2643 default: 2626 default:
2644 return -EINVAL; 2627 return -EINVAL;
2645 }; 2628 }
2646} 2629}
2647 2630
2648static int siocdevprivate_ioctl(struct net *net, unsigned int cmd, 2631static int siocdevprivate_ioctl(struct net *net, unsigned int cmd,
@@ -2730,9 +2713,9 @@ static int compat_sioc_ifmap(struct net *net, unsigned int cmd,
2730 return -EFAULT; 2713 return -EFAULT;
2731 2714
2732 old_fs = get_fs(); 2715 old_fs = get_fs();
2733 set_fs (KERNEL_DS); 2716 set_fs(KERNEL_DS);
2734 err = dev_ioctl(net, cmd, (void __user *)&ifr); 2717 err = dev_ioctl(net, cmd, (void __user *)&ifr);
2735 set_fs (old_fs); 2718 set_fs(old_fs);
2736 2719
2737 if (cmd == SIOCGIFMAP && !err) { 2720 if (cmd == SIOCGIFMAP && !err) {
2738 err = copy_to_user(uifr32, &ifr, sizeof(ifr.ifr_name)); 2721 err = copy_to_user(uifr32, &ifr, sizeof(ifr.ifr_name));
@@ -2754,7 +2737,7 @@ static int compat_siocshwtstamp(struct net *net, struct compat_ifreq __user *uif
2754 compat_uptr_t uptr32; 2737 compat_uptr_t uptr32;
2755 struct ifreq __user *uifr; 2738 struct ifreq __user *uifr;
2756 2739
2757 uifr = compat_alloc_user_space(sizeof (*uifr)); 2740 uifr = compat_alloc_user_space(sizeof(*uifr));
2758 if (copy_in_user(uifr, uifr32, sizeof(struct compat_ifreq))) 2741 if (copy_in_user(uifr, uifr32, sizeof(struct compat_ifreq)))
2759 return -EFAULT; 2742 return -EFAULT;
2760 2743
@@ -2770,20 +2753,20 @@ static int compat_siocshwtstamp(struct net *net, struct compat_ifreq __user *uif
2770} 2753}
2771 2754
2772struct rtentry32 { 2755struct rtentry32 {
2773 u32 rt_pad1; 2756 u32 rt_pad1;
2774 struct sockaddr rt_dst; /* target address */ 2757 struct sockaddr rt_dst; /* target address */
2775 struct sockaddr rt_gateway; /* gateway addr (RTF_GATEWAY) */ 2758 struct sockaddr rt_gateway; /* gateway addr (RTF_GATEWAY) */
2776 struct sockaddr rt_genmask; /* target network mask (IP) */ 2759 struct sockaddr rt_genmask; /* target network mask (IP) */
2777 unsigned short rt_flags; 2760 unsigned short rt_flags;
2778 short rt_pad2; 2761 short rt_pad2;
2779 u32 rt_pad3; 2762 u32 rt_pad3;
2780 unsigned char rt_tos; 2763 unsigned char rt_tos;
2781 unsigned char rt_class; 2764 unsigned char rt_class;
2782 short rt_pad4; 2765 short rt_pad4;
2783 short rt_metric; /* +1 for binary compatibility! */ 2766 short rt_metric; /* +1 for binary compatibility! */
2784 /* char * */ u32 rt_dev; /* forcing the device at add */ 2767 /* char * */ u32 rt_dev; /* forcing the device at add */
2785 u32 rt_mtu; /* per route MTU/Window */ 2768 u32 rt_mtu; /* per route MTU/Window */
2786 u32 rt_window; /* Window clamping */ 2769 u32 rt_window; /* Window clamping */
2787 unsigned short rt_irtt; /* Initial RTT */ 2770 unsigned short rt_irtt; /* Initial RTT */
2788}; 2771};
2789 2772
@@ -2813,29 +2796,29 @@ static int routing_ioctl(struct net *net, struct socket *sock,
2813 2796
2814 if (sock && sock->sk && sock->sk->sk_family == AF_INET6) { /* ipv6 */ 2797 if (sock && sock->sk && sock->sk->sk_family == AF_INET6) { /* ipv6 */
2815 struct in6_rtmsg32 __user *ur6 = argp; 2798 struct in6_rtmsg32 __user *ur6 = argp;
2816 ret = copy_from_user (&r6.rtmsg_dst, &(ur6->rtmsg_dst), 2799 ret = copy_from_user(&r6.rtmsg_dst, &(ur6->rtmsg_dst),
2817 3 * sizeof(struct in6_addr)); 2800 3 * sizeof(struct in6_addr));
2818 ret |= __get_user (r6.rtmsg_type, &(ur6->rtmsg_type)); 2801 ret |= __get_user(r6.rtmsg_type, &(ur6->rtmsg_type));
2819 ret |= __get_user (r6.rtmsg_dst_len, &(ur6->rtmsg_dst_len)); 2802 ret |= __get_user(r6.rtmsg_dst_len, &(ur6->rtmsg_dst_len));
2820 ret |= __get_user (r6.rtmsg_src_len, &(ur6->rtmsg_src_len)); 2803 ret |= __get_user(r6.rtmsg_src_len, &(ur6->rtmsg_src_len));
2821 ret |= __get_user (r6.rtmsg_metric, &(ur6->rtmsg_metric)); 2804 ret |= __get_user(r6.rtmsg_metric, &(ur6->rtmsg_metric));
2822 ret |= __get_user (r6.rtmsg_info, &(ur6->rtmsg_info)); 2805 ret |= __get_user(r6.rtmsg_info, &(ur6->rtmsg_info));
2823 ret |= __get_user (r6.rtmsg_flags, &(ur6->rtmsg_flags)); 2806 ret |= __get_user(r6.rtmsg_flags, &(ur6->rtmsg_flags));
2824 ret |= __get_user (r6.rtmsg_ifindex, &(ur6->rtmsg_ifindex)); 2807 ret |= __get_user(r6.rtmsg_ifindex, &(ur6->rtmsg_ifindex));
2825 2808
2826 r = (void *) &r6; 2809 r = (void *) &r6;
2827 } else { /* ipv4 */ 2810 } else { /* ipv4 */
2828 struct rtentry32 __user *ur4 = argp; 2811 struct rtentry32 __user *ur4 = argp;
2829 ret = copy_from_user (&r4.rt_dst, &(ur4->rt_dst), 2812 ret = copy_from_user(&r4.rt_dst, &(ur4->rt_dst),
2830 3 * sizeof(struct sockaddr)); 2813 3 * sizeof(struct sockaddr));
2831 ret |= __get_user (r4.rt_flags, &(ur4->rt_flags)); 2814 ret |= __get_user(r4.rt_flags, &(ur4->rt_flags));
2832 ret |= __get_user (r4.rt_metric, &(ur4->rt_metric)); 2815 ret |= __get_user(r4.rt_metric, &(ur4->rt_metric));
2833 ret |= __get_user (r4.rt_mtu, &(ur4->rt_mtu)); 2816 ret |= __get_user(r4.rt_mtu, &(ur4->rt_mtu));
2834 ret |= __get_user (r4.rt_window, &(ur4->rt_window)); 2817 ret |= __get_user(r4.rt_window, &(ur4->rt_window));
2835 ret |= __get_user (r4.rt_irtt, &(ur4->rt_irtt)); 2818 ret |= __get_user(r4.rt_irtt, &(ur4->rt_irtt));
2836 ret |= __get_user (rtdev, &(ur4->rt_dev)); 2819 ret |= __get_user(rtdev, &(ur4->rt_dev));
2837 if (rtdev) { 2820 if (rtdev) {
2838 ret |= copy_from_user (devname, compat_ptr(rtdev), 15); 2821 ret |= copy_from_user(devname, compat_ptr(rtdev), 15);
2839 r4.rt_dev = devname; devname[15] = 0; 2822 r4.rt_dev = devname; devname[15] = 0;
2840 } else 2823 } else
2841 r4.rt_dev = NULL; 2824 r4.rt_dev = NULL;
@@ -2848,9 +2831,9 @@ static int routing_ioctl(struct net *net, struct socket *sock,
2848 goto out; 2831 goto out;
2849 } 2832 }
2850 2833
2851 set_fs (KERNEL_DS); 2834 set_fs(KERNEL_DS);
2852 ret = sock_do_ioctl(net, sock, cmd, (unsigned long) r); 2835 ret = sock_do_ioctl(net, sock, cmd, (unsigned long) r);
2853 set_fs (old_fs); 2836 set_fs(old_fs);
2854 2837
2855out: 2838out:
2856 return ret; 2839 return ret;
@@ -3013,11 +2996,13 @@ int kernel_bind(struct socket *sock, struct sockaddr *addr, int addrlen)
3013{ 2996{
3014 return sock->ops->bind(sock, addr, addrlen); 2997 return sock->ops->bind(sock, addr, addrlen);
3015} 2998}
2999EXPORT_SYMBOL(kernel_bind);
3016 3000
3017int kernel_listen(struct socket *sock, int backlog) 3001int kernel_listen(struct socket *sock, int backlog)
3018{ 3002{
3019 return sock->ops->listen(sock, backlog); 3003 return sock->ops->listen(sock, backlog);
3020} 3004}
3005EXPORT_SYMBOL(kernel_listen);
3021 3006
3022int kernel_accept(struct socket *sock, struct socket **newsock, int flags) 3007int kernel_accept(struct socket *sock, struct socket **newsock, int flags)
3023{ 3008{
@@ -3042,24 +3027,28 @@ int kernel_accept(struct socket *sock, struct socket **newsock, int flags)
3042done: 3027done:
3043 return err; 3028 return err;
3044} 3029}
3030EXPORT_SYMBOL(kernel_accept);
3045 3031
3046int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen, 3032int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
3047 int flags) 3033 int flags)
3048{ 3034{
3049 return sock->ops->connect(sock, addr, addrlen, flags); 3035 return sock->ops->connect(sock, addr, addrlen, flags);
3050} 3036}
3037EXPORT_SYMBOL(kernel_connect);
3051 3038
3052int kernel_getsockname(struct socket *sock, struct sockaddr *addr, 3039int kernel_getsockname(struct socket *sock, struct sockaddr *addr,
3053 int *addrlen) 3040 int *addrlen)
3054{ 3041{
3055 return sock->ops->getname(sock, addr, addrlen, 0); 3042 return sock->ops->getname(sock, addr, addrlen, 0);
3056} 3043}
3044EXPORT_SYMBOL(kernel_getsockname);
3057 3045
3058int kernel_getpeername(struct socket *sock, struct sockaddr *addr, 3046int kernel_getpeername(struct socket *sock, struct sockaddr *addr,
3059 int *addrlen) 3047 int *addrlen)
3060{ 3048{
3061 return sock->ops->getname(sock, addr, addrlen, 1); 3049 return sock->ops->getname(sock, addr, addrlen, 1);
3062} 3050}
3051EXPORT_SYMBOL(kernel_getpeername);
3063 3052
3064int kernel_getsockopt(struct socket *sock, int level, int optname, 3053int kernel_getsockopt(struct socket *sock, int level, int optname,
3065 char *optval, int *optlen) 3054 char *optval, int *optlen)
@@ -3076,6 +3065,7 @@ int kernel_getsockopt(struct socket *sock, int level, int optname,
3076 set_fs(oldfs); 3065 set_fs(oldfs);
3077 return err; 3066 return err;
3078} 3067}
3068EXPORT_SYMBOL(kernel_getsockopt);
3079 3069
3080int kernel_setsockopt(struct socket *sock, int level, int optname, 3070int kernel_setsockopt(struct socket *sock, int level, int optname,
3081 char *optval, unsigned int optlen) 3071 char *optval, unsigned int optlen)
@@ -3092,15 +3082,19 @@ int kernel_setsockopt(struct socket *sock, int level, int optname,
3092 set_fs(oldfs); 3082 set_fs(oldfs);
3093 return err; 3083 return err;
3094} 3084}
3085EXPORT_SYMBOL(kernel_setsockopt);
3095 3086
3096int kernel_sendpage(struct socket *sock, struct page *page, int offset, 3087int kernel_sendpage(struct socket *sock, struct page *page, int offset,
3097 size_t size, int flags) 3088 size_t size, int flags)
3098{ 3089{
3090 sock_update_classid(sock->sk);
3091
3099 if (sock->ops->sendpage) 3092 if (sock->ops->sendpage)
3100 return sock->ops->sendpage(sock, page, offset, size, flags); 3093 return sock->ops->sendpage(sock, page, offset, size, flags);
3101 3094
3102 return sock_no_sendpage(sock, page, offset, size, flags); 3095 return sock_no_sendpage(sock, page, offset, size, flags);
3103} 3096}
3097EXPORT_SYMBOL(kernel_sendpage);
3104 3098
3105int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg) 3099int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg)
3106{ 3100{
@@ -3113,33 +3107,10 @@ int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg)
3113 3107
3114 return err; 3108 return err;
3115} 3109}
3110EXPORT_SYMBOL(kernel_sock_ioctl);
3116 3111
3117int kernel_sock_shutdown(struct socket *sock, enum sock_shutdown_cmd how) 3112int kernel_sock_shutdown(struct socket *sock, enum sock_shutdown_cmd how)
3118{ 3113{
3119 return sock->ops->shutdown(sock, how); 3114 return sock->ops->shutdown(sock, how);
3120} 3115}
3121
3122EXPORT_SYMBOL(sock_create);
3123EXPORT_SYMBOL(sock_create_kern);
3124EXPORT_SYMBOL(sock_create_lite);
3125EXPORT_SYMBOL(sock_map_fd);
3126EXPORT_SYMBOL(sock_recvmsg);
3127EXPORT_SYMBOL(sock_register);
3128EXPORT_SYMBOL(sock_release);
3129EXPORT_SYMBOL(sock_sendmsg);
3130EXPORT_SYMBOL(sock_unregister);
3131EXPORT_SYMBOL(sock_wake_async);
3132EXPORT_SYMBOL(sockfd_lookup);
3133EXPORT_SYMBOL(kernel_sendmsg);
3134EXPORT_SYMBOL(kernel_recvmsg);
3135EXPORT_SYMBOL(kernel_bind);
3136EXPORT_SYMBOL(kernel_listen);
3137EXPORT_SYMBOL(kernel_accept);
3138EXPORT_SYMBOL(kernel_connect);
3139EXPORT_SYMBOL(kernel_getsockname);
3140EXPORT_SYMBOL(kernel_getpeername);
3141EXPORT_SYMBOL(kernel_getsockopt);
3142EXPORT_SYMBOL(kernel_setsockopt);
3143EXPORT_SYMBOL(kernel_sendpage);
3144EXPORT_SYMBOL(kernel_sock_ioctl);
3145EXPORT_SYMBOL(kernel_sock_shutdown); 3116EXPORT_SYMBOL(kernel_sock_shutdown);