aboutsummaryrefslogtreecommitdiffstats
path: root/net/socket.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-04-03 17:04:18 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-04-03 17:04:18 -0400
commit5bb053bef82523a8fd78d650bca81c9f114fa276 (patch)
tree58c2fe47f60bb69230bb05d57a6c9e3f47f7b1fe /net/socket.c
parentbb2407a7219760926760f0448fddf00d625e5aec (diff)
parent159f02977b2feb18a4bece5e586c838a6d26d44b (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
Pull networking updates from David Miller: 1) Support offloading wireless authentication to userspace via NL80211_CMD_EXTERNAL_AUTH, from Srinivas Dasari. 2) A lot of work on network namespace setup/teardown from Kirill Tkhai. Setup and cleanup of namespaces now all run asynchronously and thus performance is significantly increased. 3) Add rx/tx timestamping support to mv88e6xxx driver, from Brandon Streiff. 4) Support zerocopy on RDS sockets, from Sowmini Varadhan. 5) Use denser instruction encoding in x86 eBPF JIT, from Daniel Borkmann. 6) Support hw offload of vlan filtering in mvpp2 dreiver, from Maxime Chevallier. 7) Support grafting of child qdiscs in mlxsw driver, from Nogah Frankel. 8) Add packet forwarding tests to selftests, from Ido Schimmel. 9) Deal with sub-optimal GSO packets better in BBR congestion control, from Eric Dumazet. 10) Support 5-tuple hashing in ipv6 multipath routing, from David Ahern. 11) Add path MTU tests to selftests, from Stefano Brivio. 12) Various bits of IPSEC offloading support for mlx5, from Aviad Yehezkel, Yossi Kuperman, and Saeed Mahameed. 13) Support RSS spreading on ntuple filters in SFC driver, from Edward Cree. 14) Lots of sockmap work from John Fastabend. Applications can use eBPF to filter sendmsg and sendpage operations. 15) In-kernel receive TLS support, from Dave Watson. 16) Add XDP support to ixgbevf, this is significant because it should allow optimized XDP usage in various cloud environments. From Tony Nguyen. 17) Add new Intel E800 series "ice" ethernet driver, from Anirudh Venkataramanan et al. 18) IP fragmentation match offload support in nfp driver, from Pieter Jansen van Vuuren. 19) Support XDP redirect in i40e driver, from Björn Töpel. 20) Add BPF_RAW_TRACEPOINT program type for accessing the arguments of tracepoints in their raw form, from Alexei Starovoitov. 21) Lots of striding RQ improvements to mlx5 driver with many performance improvements, from Tariq Toukan. 22) Use rhashtable for inet frag reassembly, from Eric Dumazet. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next: (1678 commits) net: mvneta: improve suspend/resume net: mvneta: split rxq/txq init and txq deinit into SW and HW parts ipv6: frags: fix /proc/sys/net/ipv6/ip6frag_low_thresh net: bgmac: Fix endian access in bgmac_dma_tx_ring_free() net: bgmac: Correctly annotate register space route: check sysctl_fib_multipath_use_neigh earlier than hash fix typo in command value in drivers/net/phy/mdio-bitbang. sky2: Increase D3 delay to sky2 stops working after suspend net/mlx5e: Set EQE based as default TX interrupt moderation mode ibmvnic: Disable irqs before exiting reset from closed state net: sched: do not emit messages while holding spinlock vlan: also check phy_driver ts_info for vlan's real device Bluetooth: Mark expected switch fall-throughs Bluetooth: Set HCI_QUIRK_SIMULTANEOUS_DISCOVERY for BTUSB_QCA_ROME Bluetooth: btrsi: remove unused including <linux/version.h> Bluetooth: hci_bcm: Remove DMI quirk for the MINIX Z83-4 sh_eth: kill useless check in __sh_eth_get_regs() sh_eth: add sh_eth_cpu_data::no_xdfar flag ipv6: factorize sk_wmem_alloc updates done by __ip6_append_data() ipv4: factorize sk_wmem_alloc updates done by __ip_append_data() ...
Diffstat (limited to 'net/socket.c')
-rw-r--r--net/socket.c51
1 files changed, 26 insertions, 25 deletions
diff --git a/net/socket.c b/net/socket.c
index 4ba9fc631c43..54dcb43e25a1 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -104,7 +104,6 @@
104#include <linux/ipv6_route.h> 104#include <linux/ipv6_route.h>
105#include <linux/route.h> 105#include <linux/route.h>
106#include <linux/sockios.h> 106#include <linux/sockios.h>
107#include <linux/atalk.h>
108#include <net/busy_poll.h> 107#include <net/busy_poll.h>
109#include <linux/errqueue.h> 108#include <linux/errqueue.h>
110 109
@@ -234,7 +233,7 @@ static int move_addr_to_user(struct sockaddr_storage *kaddr, int klen,
234 return __put_user(klen, ulen); 233 return __put_user(klen, ulen);
235} 234}
236 235
237static struct kmem_cache *sock_inode_cachep __read_mostly; 236static struct kmem_cache *sock_inode_cachep __ro_after_init;
238 237
239static struct inode *sock_alloc_inode(struct super_block *sb) 238static struct inode *sock_alloc_inode(struct super_block *sb)
240{ 239{
@@ -991,10 +990,11 @@ static long sock_do_ioctl(struct net *net, struct socket *sock,
991 * what to do with it - that's up to the protocol still. 990 * what to do with it - that's up to the protocol still.
992 */ 991 */
993 992
994static struct ns_common *get_net_ns(struct ns_common *ns) 993struct ns_common *get_net_ns(struct ns_common *ns)
995{ 994{
996 return &get_net(container_of(ns, struct net, ns))->ns; 995 return &get_net(container_of(ns, struct net, ns))->ns;
997} 996}
997EXPORT_SYMBOL_GPL(get_net_ns);
998 998
999static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg) 999static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
1000{ 1000{
@@ -1593,8 +1593,9 @@ int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
1593 goto out_fd; 1593 goto out_fd;
1594 1594
1595 if (upeer_sockaddr) { 1595 if (upeer_sockaddr) {
1596 if (newsock->ops->getname(newsock, (struct sockaddr *)&address, 1596 len = newsock->ops->getname(newsock,
1597 &len, 2) < 0) { 1597 (struct sockaddr *)&address, 2);
1598 if (len < 0) {
1598 err = -ECONNABORTED; 1599 err = -ECONNABORTED;
1599 goto out_fd; 1600 goto out_fd;
1600 } 1601 }
@@ -1685,7 +1686,7 @@ int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
1685{ 1686{
1686 struct socket *sock; 1687 struct socket *sock;
1687 struct sockaddr_storage address; 1688 struct sockaddr_storage address;
1688 int len, err, fput_needed; 1689 int err, fput_needed;
1689 1690
1690 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1691 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1691 if (!sock) 1692 if (!sock)
@@ -1695,10 +1696,11 @@ int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
1695 if (err) 1696 if (err)
1696 goto out_put; 1697 goto out_put;
1697 1698
1698 err = sock->ops->getname(sock, (struct sockaddr *)&address, &len, 0); 1699 err = sock->ops->getname(sock, (struct sockaddr *)&address, 0);
1699 if (err) 1700 if (err < 0)
1700 goto out_put; 1701 goto out_put;
1701 err = move_addr_to_user(&address, len, usockaddr, usockaddr_len); 1702 /* "err" is actually length in this case */
1703 err = move_addr_to_user(&address, err, usockaddr, usockaddr_len);
1702 1704
1703out_put: 1705out_put:
1704 fput_light(sock->file, fput_needed); 1706 fput_light(sock->file, fput_needed);
@@ -1722,7 +1724,7 @@ int __sys_getpeername(int fd, struct sockaddr __user *usockaddr,
1722{ 1724{
1723 struct socket *sock; 1725 struct socket *sock;
1724 struct sockaddr_storage address; 1726 struct sockaddr_storage address;
1725 int len, err, fput_needed; 1727 int err, fput_needed;
1726 1728
1727 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1729 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1728 if (sock != NULL) { 1730 if (sock != NULL) {
@@ -1732,11 +1734,10 @@ int __sys_getpeername(int fd, struct sockaddr __user *usockaddr,
1732 return err; 1734 return err;
1733 } 1735 }
1734 1736
1735 err = 1737 err = sock->ops->getname(sock, (struct sockaddr *)&address, 1);
1736 sock->ops->getname(sock, (struct sockaddr *)&address, &len, 1738 if (err >= 0)
1737 1); 1739 /* "err" is actually length in this case */
1738 if (!err) 1740 err = move_addr_to_user(&address, err, usockaddr,
1739 err = move_addr_to_user(&address, len, usockaddr,
1740 usockaddr_len); 1741 usockaddr_len);
1741 fput_light(sock->file, fput_needed); 1742 fput_light(sock->file, fput_needed);
1742 } 1743 }
@@ -2363,10 +2364,12 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
2363 if (!sock) 2364 if (!sock)
2364 return err; 2365 return err;
2365 2366
2366 err = sock_error(sock->sk); 2367 if (likely(!(flags & MSG_ERRQUEUE))) {
2367 if (err) { 2368 err = sock_error(sock->sk);
2368 datagrams = err; 2369 if (err) {
2369 goto out_put; 2370 datagrams = err;
2371 goto out_put;
2372 }
2370 } 2373 }
2371 2374
2372 entry = mmsg; 2375 entry = mmsg;
@@ -3259,17 +3262,15 @@ int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
3259} 3262}
3260EXPORT_SYMBOL(kernel_connect); 3263EXPORT_SYMBOL(kernel_connect);
3261 3264
3262int kernel_getsockname(struct socket *sock, struct sockaddr *addr, 3265int kernel_getsockname(struct socket *sock, struct sockaddr *addr)
3263 int *addrlen)
3264{ 3266{
3265 return sock->ops->getname(sock, addr, addrlen, 0); 3267 return sock->ops->getname(sock, addr, 0);
3266} 3268}
3267EXPORT_SYMBOL(kernel_getsockname); 3269EXPORT_SYMBOL(kernel_getsockname);
3268 3270
3269int kernel_getpeername(struct socket *sock, struct sockaddr *addr, 3271int kernel_getpeername(struct socket *sock, struct sockaddr *addr)
3270 int *addrlen)
3271{ 3272{
3272 return sock->ops->getname(sock, addr, addrlen, 1); 3273 return sock->ops->getname(sock, addr, 1);
3273} 3274}
3274EXPORT_SYMBOL(kernel_getpeername); 3275EXPORT_SYMBOL(kernel_getpeername);
3275 3276