af_inet.c (db6da59cf27b5661ced03754ae0550f8914eda9e) | af_inet.c (e1d001fa5b477c4da46a29be1fcece91db7c7c6f) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * INET An implementation of the TCP/IP protocol suite for the LINUX 4 * operating system. INET is implemented using the BSD Socket 5 * interface as the means of communication with the user level. 6 * 7 * PF_INET protocol family socket handler. 8 * --- 86 unchanged lines hidden (view full) --- 95#include <net/checksum.h> 96#include <net/ip.h> 97#include <net/protocol.h> 98#include <net/arp.h> 99#include <net/route.h> 100#include <net/ip_fib.h> 101#include <net/inet_connection_sock.h> 102#include <net/gro.h> | 1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * INET An implementation of the TCP/IP protocol suite for the LINUX 4 * operating system. INET is implemented using the BSD Socket 5 * interface as the means of communication with the user level. 6 * 7 * PF_INET protocol family socket handler. 8 * --- 86 unchanged lines hidden (view full) --- 95#include <net/checksum.h> 96#include <net/ip.h> 97#include <net/protocol.h> 98#include <net/arp.h> 99#include <net/route.h> 100#include <net/ip_fib.h> 101#include <net/inet_connection_sock.h> 102#include <net/gro.h> |
103#include <net/gso.h> |
|
103#include <net/tcp.h> 104#include <net/udp.h> 105#include <net/udplite.h> 106#include <net/ping.h> 107#include <linux/skbuff.h> 108#include <net/sock.h> 109#include <net/raw.h> 110#include <net/icmp.h> --- 470 unchanged lines hidden (view full) --- 581EXPORT_SYMBOL(inet_dgram_connect); 582 583static long inet_wait_for_connect(struct sock *sk, long timeo, int writebias) 584{ 585 DEFINE_WAIT_FUNC(wait, woken_wake_function); 586 587 add_wait_queue(sk_sleep(sk), &wait); 588 sk->sk_write_pending += writebias; | 104#include <net/tcp.h> 105#include <net/udp.h> 106#include <net/udplite.h> 107#include <net/ping.h> 108#include <linux/skbuff.h> 109#include <net/sock.h> 110#include <net/raw.h> 111#include <net/icmp.h> --- 470 unchanged lines hidden (view full) --- 582EXPORT_SYMBOL(inet_dgram_connect); 583 584static long inet_wait_for_connect(struct sock *sk, long timeo, int writebias) 585{ 586 DEFINE_WAIT_FUNC(wait, woken_wake_function); 587 588 add_wait_queue(sk_sleep(sk), &wait); 589 sk->sk_write_pending += writebias; |
590 sk->sk_wait_pending++; |
|
589 590 /* Basic assumption: if someone sets sk->sk_err, he _must_ 591 * change state of the socket from TCP_SYN_*. 592 * Connect() does not allow to get error notifications 593 * without closing the socket. 594 */ 595 while ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) { 596 release_sock(sk); 597 timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo); 598 lock_sock(sk); 599 if (signal_pending(current) || !timeo) 600 break; 601 } 602 remove_wait_queue(sk_sleep(sk), &wait); 603 sk->sk_write_pending -= writebias; | 591 592 /* Basic assumption: if someone sets sk->sk_err, he _must_ 593 * change state of the socket from TCP_SYN_*. 594 * Connect() does not allow to get error notifications 595 * without closing the socket. 596 */ 597 while ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) { 598 release_sock(sk); 599 timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo); 600 lock_sock(sk); 601 if (signal_pending(current) || !timeo) 602 break; 603 } 604 remove_wait_queue(sk_sleep(sk), &wait); 605 sk->sk_write_pending -= writebias; |
606 sk->sk_wait_pending--; |
|
604 return timeo; 605} 606 607/* 608 * Connect to a remote host. There is regrettably still a little 609 * TCP 'magic' in here. 610 */ 611int __inet_stream_connect(struct socket *sock, struct sockaddr *uaddr, --- 113 unchanged lines hidden (view full) --- 725 726 lock_sock(sock->sk); 727 err = __inet_stream_connect(sock, uaddr, addr_len, flags, 0); 728 release_sock(sock->sk); 729 return err; 730} 731EXPORT_SYMBOL(inet_stream_connect); 732 | 607 return timeo; 608} 609 610/* 611 * Connect to a remote host. There is regrettably still a little 612 * TCP 'magic' in here. 613 */ 614int __inet_stream_connect(struct socket *sock, struct sockaddr *uaddr, --- 113 unchanged lines hidden (view full) --- 728 729 lock_sock(sock->sk); 730 err = __inet_stream_connect(sock, uaddr, addr_len, flags, 0); 731 release_sock(sock->sk); 732 return err; 733} 734EXPORT_SYMBOL(inet_stream_connect); 735 |
736void __inet_accept(struct socket *sock, struct socket *newsock, struct sock *newsk) 737{ 738 sock_rps_record_flow(newsk); 739 WARN_ON(!((1 << newsk->sk_state) & 740 (TCPF_ESTABLISHED | TCPF_SYN_RECV | 741 TCPF_CLOSE_WAIT | TCPF_CLOSE))); 742 743 if (test_bit(SOCK_SUPPORT_ZC, &sock->flags)) 744 set_bit(SOCK_SUPPORT_ZC, &newsock->flags); 745 sock_graft(newsk, newsock); 746 747 newsock->state = SS_CONNECTED; 748} 749 |
|
733/* 734 * Accept a pending connection. The TCP layer now gives BSD semantics. 735 */ 736 737int inet_accept(struct socket *sock, struct socket *newsock, int flags, 738 bool kern) 739{ 740 struct sock *sk1 = sock->sk, *sk2; 741 int err = -EINVAL; 742 743 /* IPV6_ADDRFORM can change sk->sk_prot under us. */ 744 sk2 = READ_ONCE(sk1->sk_prot)->accept(sk1, flags, &err, kern); 745 if (!sk2) | 750/* 751 * Accept a pending connection. The TCP layer now gives BSD semantics. 752 */ 753 754int inet_accept(struct socket *sock, struct socket *newsock, int flags, 755 bool kern) 756{ 757 struct sock *sk1 = sock->sk, *sk2; 758 int err = -EINVAL; 759 760 /* IPV6_ADDRFORM can change sk->sk_prot under us. */ 761 sk2 = READ_ONCE(sk1->sk_prot)->accept(sk1, flags, &err, kern); 762 if (!sk2) |
746 goto do_err; | 763 return err; |
747 748 lock_sock(sk2); | 764 765 lock_sock(sk2); |
749 750 sock_rps_record_flow(sk2); 751 WARN_ON(!((1 << sk2->sk_state) & 752 (TCPF_ESTABLISHED | TCPF_SYN_RECV | 753 TCPF_CLOSE_WAIT | TCPF_CLOSE))); 754 755 if (test_bit(SOCK_SUPPORT_ZC, &sock->flags)) 756 set_bit(SOCK_SUPPORT_ZC, &newsock->flags); 757 sock_graft(sk2, newsock); 758 759 newsock->state = SS_CONNECTED; 760 err = 0; | 766 __inet_accept(sock, newsock, sk2); |
761 release_sock(sk2); | 767 release_sock(sk2); |
762do_err: 763 return err; | 768 return 0; |
764} 765EXPORT_SYMBOL(inet_accept); 766 767/* 768 * This does both peername and sockname. 769 */ 770int inet_getname(struct socket *sock, struct sockaddr *uaddr, 771 int peer) --- 50 unchanged lines hidden (view full) --- 822 if (unlikely(inet_send_prepare(sk))) 823 return -EAGAIN; 824 825 return INDIRECT_CALL_2(sk->sk_prot->sendmsg, tcp_sendmsg, udp_sendmsg, 826 sk, msg, size); 827} 828EXPORT_SYMBOL(inet_sendmsg); 829 | 769} 770EXPORT_SYMBOL(inet_accept); 771 772/* 773 * This does both peername and sockname. 774 */ 775int inet_getname(struct socket *sock, struct sockaddr *uaddr, 776 int peer) --- 50 unchanged lines hidden (view full) --- 827 if (unlikely(inet_send_prepare(sk))) 828 return -EAGAIN; 829 830 return INDIRECT_CALL_2(sk->sk_prot->sendmsg, tcp_sendmsg, udp_sendmsg, 831 sk, msg, size); 832} 833EXPORT_SYMBOL(inet_sendmsg); 834 |
835void inet_splice_eof(struct socket *sock) 836{ 837 const struct proto *prot; 838 struct sock *sk = sock->sk; 839 840 if (unlikely(inet_send_prepare(sk))) 841 return; 842 843 /* IPV6_ADDRFORM can change sk->sk_prot under us. */ 844 prot = READ_ONCE(sk->sk_prot); 845 if (prot->splice_eof) 846 prot->splice_eof(sock); 847} 848EXPORT_SYMBOL_GPL(inet_splice_eof); 849 |
|
830ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset, 831 size_t size, int flags) 832{ 833 struct sock *sk = sock->sk; 834 const struct proto *prot; 835 836 if (unlikely(inet_send_prepare(sk))) 837 return -EAGAIN; --- 135 unchanged lines hidden (view full) --- 973 case SIOCSIFPFLAGS: 974 case SIOCSIFFLAGS: 975 if (get_user_ifreq(&ifr, NULL, p)) 976 return -EFAULT; 977 err = devinet_ioctl(net, cmd, &ifr); 978 break; 979 default: 980 if (sk->sk_prot->ioctl) | 850ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset, 851 size_t size, int flags) 852{ 853 struct sock *sk = sock->sk; 854 const struct proto *prot; 855 856 if (unlikely(inet_send_prepare(sk))) 857 return -EAGAIN; --- 135 unchanged lines hidden (view full) --- 993 case SIOCSIFPFLAGS: 994 case SIOCSIFFLAGS: 995 if (get_user_ifreq(&ifr, NULL, p)) 996 return -EFAULT; 997 err = devinet_ioctl(net, cmd, &ifr); 998 break; 999 default: 1000 if (sk->sk_prot->ioctl) |
981 err = sk->sk_prot->ioctl(sk, cmd, arg); | 1001 err = sk_ioctl(sk, cmd, (void __user *)arg); |
982 else 983 err = -ENOIOCTLCMD; 984 break; 985 } 986 return err; 987} 988EXPORT_SYMBOL(inet_ioctl); 989 --- 51 unchanged lines hidden (view full) --- 1041 .shutdown = inet_shutdown, 1042 .setsockopt = sock_common_setsockopt, 1043 .getsockopt = sock_common_getsockopt, 1044 .sendmsg = inet_sendmsg, 1045 .recvmsg = inet_recvmsg, 1046#ifdef CONFIG_MMU 1047 .mmap = tcp_mmap, 1048#endif | 1002 else 1003 err = -ENOIOCTLCMD; 1004 break; 1005 } 1006 return err; 1007} 1008EXPORT_SYMBOL(inet_ioctl); 1009 --- 51 unchanged lines hidden (view full) --- 1061 .shutdown = inet_shutdown, 1062 .setsockopt = sock_common_setsockopt, 1063 .getsockopt = sock_common_getsockopt, 1064 .sendmsg = inet_sendmsg, 1065 .recvmsg = inet_recvmsg, 1066#ifdef CONFIG_MMU 1067 .mmap = tcp_mmap, 1068#endif |
1069 .splice_eof = inet_splice_eof, |
|
1049 .sendpage = inet_sendpage, 1050 .splice_read = tcp_splice_read, 1051 .read_sock = tcp_read_sock, 1052 .read_skb = tcp_read_skb, 1053 .sendmsg_locked = tcp_sendmsg_locked, 1054 .sendpage_locked = tcp_sendpage_locked, 1055 .peek_len = tcp_peek_len, 1056#ifdef CONFIG_COMPAT --- 18 unchanged lines hidden (view full) --- 1075 .listen = sock_no_listen, 1076 .shutdown = inet_shutdown, 1077 .setsockopt = sock_common_setsockopt, 1078 .getsockopt = sock_common_getsockopt, 1079 .sendmsg = inet_sendmsg, 1080 .read_skb = udp_read_skb, 1081 .recvmsg = inet_recvmsg, 1082 .mmap = sock_no_mmap, | 1070 .sendpage = inet_sendpage, 1071 .splice_read = tcp_splice_read, 1072 .read_sock = tcp_read_sock, 1073 .read_skb = tcp_read_skb, 1074 .sendmsg_locked = tcp_sendmsg_locked, 1075 .sendpage_locked = tcp_sendpage_locked, 1076 .peek_len = tcp_peek_len, 1077#ifdef CONFIG_COMPAT --- 18 unchanged lines hidden (view full) --- 1096 .listen = sock_no_listen, 1097 .shutdown = inet_shutdown, 1098 .setsockopt = sock_common_setsockopt, 1099 .getsockopt = sock_common_getsockopt, 1100 .sendmsg = inet_sendmsg, 1101 .read_skb = udp_read_skb, 1102 .recvmsg = inet_recvmsg, 1103 .mmap = sock_no_mmap, |
1104 .splice_eof = inet_splice_eof, |
|
1083 .sendpage = inet_sendpage, 1084 .set_peek_off = sk_set_peek_off, 1085#ifdef CONFIG_COMPAT 1086 .compat_ioctl = inet_compat_ioctl, 1087#endif 1088}; 1089EXPORT_SYMBOL(inet_dgram_ops); 1090 --- 15 unchanged lines hidden (view full) --- 1106 .gettstamp = sock_gettstamp, 1107 .listen = sock_no_listen, 1108 .shutdown = inet_shutdown, 1109 .setsockopt = sock_common_setsockopt, 1110 .getsockopt = sock_common_getsockopt, 1111 .sendmsg = inet_sendmsg, 1112 .recvmsg = inet_recvmsg, 1113 .mmap = sock_no_mmap, | 1105 .sendpage = inet_sendpage, 1106 .set_peek_off = sk_set_peek_off, 1107#ifdef CONFIG_COMPAT 1108 .compat_ioctl = inet_compat_ioctl, 1109#endif 1110}; 1111EXPORT_SYMBOL(inet_dgram_ops); 1112 --- 15 unchanged lines hidden (view full) --- 1128 .gettstamp = sock_gettstamp, 1129 .listen = sock_no_listen, 1130 .shutdown = inet_shutdown, 1131 .setsockopt = sock_common_setsockopt, 1132 .getsockopt = sock_common_getsockopt, 1133 .sendmsg = inet_sendmsg, 1134 .recvmsg = inet_recvmsg, 1135 .mmap = sock_no_mmap, |
1136 .splice_eof = inet_splice_eof, |
|
1114 .sendpage = inet_sendpage, 1115#ifdef CONFIG_COMPAT 1116 .compat_ioctl = inet_compat_ioctl, 1117#endif 1118}; 1119 1120static const struct net_proto_family inet_family_ops = { 1121 .family = PF_INET, --- 973 unchanged lines hidden --- | 1137 .sendpage = inet_sendpage, 1138#ifdef CONFIG_COMPAT 1139 .compat_ioctl = inet_compat_ioctl, 1140#endif 1141}; 1142 1143static const struct net_proto_family inet_family_ops = { 1144 .family = PF_INET, --- 973 unchanged lines hidden --- |