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 ---