protocol.c (fdff7c21ea00787e3f70a1a00b40b88eb998c6ad) protocol.c (2c22c06ce426a0d025a3dacd17cd8868f3dbe96b)
1// SPDX-License-Identifier: GPL-2.0
2/* Multipath TCP
3 *
4 * Copyright (c) 2017 - 2019, Intel Corporation.
5 */
6
7#define pr_fmt(fmt) "MPTCP: " fmt
8

--- 10 unchanged lines hidden (view full) ---

19#if IS_ENABLED(CONFIG_MPTCP_IPV6)
20#include <net/transp_v6.h>
21#endif
22#include <net/mptcp.h>
23#include "protocol.h"
24
25#define MPTCP_SAME_STATE TCP_MAX_STATES
26
1// SPDX-License-Identifier: GPL-2.0
2/* Multipath TCP
3 *
4 * Copyright (c) 2017 - 2019, Intel Corporation.
5 */
6
7#define pr_fmt(fmt) "MPTCP: " fmt
8

--- 10 unchanged lines hidden (view full) ---

19#if IS_ENABLED(CONFIG_MPTCP_IPV6)
20#include <net/transp_v6.h>
21#endif
22#include <net/mptcp.h>
23#include "protocol.h"
24
25#define MPTCP_SAME_STATE TCP_MAX_STATES
26
27static void __mptcp_close(struct sock *sk, long timeout);
28
29static const struct proto_ops *tcp_proto_ops(struct sock *sk)
30{
31#if IS_ENABLED(CONFIG_IPV6)
32 if (sk->sk_family == AF_INET6)
33 return &inet6_stream_ops;
34#endif
35 return &inet_stream_ops;
36}
37
38/* MP_CAPABLE handshake failed, convert msk to plain tcp, replacing
39 * socket->sk and stream ops and destroying msk
40 * return the msk socket, as we can't access msk anymore after this function
41 * completes
42 * Called with msk lock held, releases such lock before returning
43 */
44static struct socket *__mptcp_fallback_to_tcp(struct mptcp_sock *msk,
45 struct sock *ssk)
46{
47 struct mptcp_subflow_context *subflow;
48 struct socket *sock;
49 struct sock *sk;
50
51 sk = (struct sock *)msk;
52 sock = sk->sk_socket;
53 subflow = mptcp_subflow_ctx(ssk);
54
55 /* detach the msk socket */
56 list_del_init(&subflow->node);
57 sock_orphan(sk);
58 sock->sk = NULL;
59
60 /* socket is now TCP */
61 lock_sock(ssk);
62 sock_graft(ssk, sock);
63 if (subflow->conn) {
64 /* We can't release the ULP data on a live socket,
65 * restore the tcp callback
66 */
67 mptcp_subflow_tcp_fallback(ssk, subflow);
68 sock_put(subflow->conn);
69 subflow->conn = NULL;
70 }
71 release_sock(ssk);
72 sock->ops = tcp_proto_ops(ssk);
73
74 /* destroy the left-over msk sock */
75 __mptcp_close(sk, 0);
76 return sock;
77}
78
79/* If msk has an initial subflow socket, and the MP_CAPABLE handshake has not
80 * completed yet or has failed, return the subflow socket.
81 * Otherwise return NULL.
82 */
83static struct socket *__mptcp_nmpc_socket(const struct mptcp_sock *msk)
84{
85 if (!msk->subflow || READ_ONCE(msk->can_ack))
86 return NULL;
87
88 return msk->subflow;
89}
90
91static bool __mptcp_needs_tcp_fallback(const struct mptcp_sock *msk)
92{
93 return msk->first && !sk_is_mptcp(msk->first);
94}
95
27/* If msk has an initial subflow socket, and the MP_CAPABLE handshake has not
28 * completed yet or has failed, return the subflow socket.
29 * Otherwise return NULL.
30 */
31static struct socket *__mptcp_nmpc_socket(const struct mptcp_sock *msk)
32{
33 if (!msk->subflow || READ_ONCE(msk->can_ack))
34 return NULL;
35
36 return msk->subflow;
37}
38
39static bool __mptcp_needs_tcp_fallback(const struct mptcp_sock *msk)
40{
41 return msk->first && !sk_is_mptcp(msk->first);
42}
43
96/* if the mp_capable handshake has failed, it fallbacks msk to plain TCP,
97 * releases the socket lock and returns a reference to the now TCP socket.
98 * Otherwise returns NULL
99 */
100static struct socket *__mptcp_tcp_fallback(struct mptcp_sock *msk)
101{
102 sock_owned_by_me((const struct sock *)msk);
103
104 if (likely(!__mptcp_needs_tcp_fallback(msk)))
105 return NULL;
106
107 if (msk->subflow) {
44static struct socket *__mptcp_tcp_fallback(struct mptcp_sock *msk)
45{
46 sock_owned_by_me((const struct sock *)msk);
47
48 if (likely(!__mptcp_needs_tcp_fallback(msk)))
49 return NULL;
50
51 if (msk->subflow) {
108 /* the first subflow is an active connection, discart the
109 * paired socket
110 */
111 msk->subflow->sk = NULL;
112 sock_release(msk->subflow);
113 msk->subflow = NULL;
52 release_sock((struct sock *)msk);
53 return msk->subflow;
114 }
115
54 }
55
116 return __mptcp_fallback_to_tcp(msk, msk->first);
56 return NULL;
117}
118
119static bool __mptcp_can_create_subflow(const struct mptcp_sock *msk)
120{
121 return !msk->first;
122}
123
124static struct socket *__mptcp_socket_create(struct mptcp_sock *msk, int state)

--- 510 unchanged lines hidden (view full) ---

635 }
636
637 /* Wake up anyone sleeping in poll. */
638 ssk->sk_state_change(ssk);
639 release_sock(ssk);
640}
641
642/* Called with msk lock held, releases such lock before returning */
57}
58
59static bool __mptcp_can_create_subflow(const struct mptcp_sock *msk)
60{
61 return !msk->first;
62}
63
64static struct socket *__mptcp_socket_create(struct mptcp_sock *msk, int state)

--- 510 unchanged lines hidden (view full) ---

575 }
576
577 /* Wake up anyone sleeping in poll. */
578 ssk->sk_state_change(ssk);
579 release_sock(ssk);
580}
581
582/* Called with msk lock held, releases such lock before returning */
643static void __mptcp_close(struct sock *sk, long timeout)
583static void mptcp_close(struct sock *sk, long timeout)
644{
645 struct mptcp_subflow_context *subflow, *tmp;
646 struct mptcp_sock *msk = mptcp_sk(sk);
584{
585 struct mptcp_subflow_context *subflow, *tmp;
586 struct mptcp_sock *msk = mptcp_sk(sk);
587 LIST_HEAD(conn_list);
647
588
589 lock_sock(sk);
590
648 mptcp_token_destroy(msk->token);
649 inet_sk_state_store(sk, TCP_CLOSE);
650
591 mptcp_token_destroy(msk->token);
592 inet_sk_state_store(sk, TCP_CLOSE);
593
651 list_for_each_entry_safe(subflow, tmp, &msk->conn_list, node) {
594 list_splice_init(&msk->conn_list, &conn_list);
595
596 release_sock(sk);
597
598 list_for_each_entry_safe(subflow, tmp, &conn_list, node) {
652 struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
653
654 __mptcp_close_ssk(sk, ssk, subflow, timeout);
655 }
656
599 struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
600
601 __mptcp_close_ssk(sk, ssk, subflow, timeout);
602 }
603
657 if (msk->cached_ext)
658 __skb_ext_put(msk->cached_ext);
659 release_sock(sk);
660 sk_common_release(sk);
661}
662
604 sk_common_release(sk);
605}
606
663static void mptcp_close(struct sock *sk, long timeout)
664{
665 lock_sock(sk);
666 __mptcp_close(sk, timeout);
667}
668
669static void mptcp_copy_inaddrs(struct sock *msk, const struct sock *ssk)
670{
671#if IS_ENABLED(CONFIG_MPTCP_IPV6)
672 const struct ipv6_pinfo *ssk6 = inet6_sk(ssk);
673 struct ipv6_pinfo *msk6 = inet6_sk(msk);
674
675 msk->sk_v6_daddr = ssk->sk_v6_daddr;
676 msk->sk_v6_rcv_saddr = ssk->sk_v6_rcv_saddr;

--- 94 unchanged lines hidden (view full) ---

771 release_sock(ssk);
772 }
773
774 return newsk;
775}
776
777static void mptcp_destroy(struct sock *sk)
778{
607static void mptcp_copy_inaddrs(struct sock *msk, const struct sock *ssk)
608{
609#if IS_ENABLED(CONFIG_MPTCP_IPV6)
610 const struct ipv6_pinfo *ssk6 = inet6_sk(ssk);
611 struct ipv6_pinfo *msk6 = inet6_sk(msk);
612
613 msk->sk_v6_daddr = ssk->sk_v6_daddr;
614 msk->sk_v6_rcv_saddr = ssk->sk_v6_rcv_saddr;

--- 94 unchanged lines hidden (view full) ---

709 release_sock(ssk);
710 }
711
712 return newsk;
713}
714
715static void mptcp_destroy(struct sock *sk)
716{
717 struct mptcp_sock *msk = mptcp_sk(sk);
718
719 if (msk->cached_ext)
720 __skb_ext_put(msk->cached_ext);
779}
780
781static int mptcp_setsockopt(struct sock *sk, int level, int optname,
721}
722
723static int mptcp_setsockopt(struct sock *sk, int level, int optname,
782 char __user *uoptval, unsigned int optlen)
724 char __user *optval, unsigned int optlen)
783{
784 struct mptcp_sock *msk = mptcp_sk(sk);
725{
726 struct mptcp_sock *msk = mptcp_sk(sk);
785 char __kernel *optval;
786 int ret = -EOPNOTSUPP;
787 struct socket *ssock;
727 int ret = -EOPNOTSUPP;
728 struct socket *ssock;
729 struct sock *ssk;
788
730
789 /* will be treated as __user in tcp_setsockopt */
790 optval = (char __kernel __force *)uoptval;
791
792 pr_debug("msk=%p", msk);
793
794 /* @@ the meaning of setsockopt() when the socket is connected and
795 * there are multiple subflows is not defined.
796 */
797 lock_sock(sk);
798 ssock = __mptcp_socket_create(msk, MPTCP_SAME_STATE);
731 pr_debug("msk=%p", msk);
732
733 /* @@ the meaning of setsockopt() when the socket is connected and
734 * there are multiple subflows is not defined.
735 */
736 lock_sock(sk);
737 ssock = __mptcp_socket_create(msk, MPTCP_SAME_STATE);
799 if (!IS_ERR(ssock)) {
800 pr_debug("subflow=%p", ssock->sk);
801 ret = kernel_setsockopt(ssock, level, optname, optval, optlen);
738 if (IS_ERR(ssock)) {
739 release_sock(sk);
740 return ret;
802 }
741 }
742
743 ssk = ssock->sk;
744 sock_hold(ssk);
803 release_sock(sk);
804
745 release_sock(sk);
746
747 ret = tcp_setsockopt(ssk, level, optname, optval, optlen);
748 sock_put(ssk);
749
805 return ret;
806}
807
808static int mptcp_getsockopt(struct sock *sk, int level, int optname,
750 return ret;
751}
752
753static int mptcp_getsockopt(struct sock *sk, int level, int optname,
809 char __user *uoptval, int __user *uoption)
754 char __user *optval, int __user *option)
810{
811 struct mptcp_sock *msk = mptcp_sk(sk);
755{
756 struct mptcp_sock *msk = mptcp_sk(sk);
812 char __kernel *optval;
813 int ret = -EOPNOTSUPP;
757 int ret = -EOPNOTSUPP;
814 int __kernel *option;
815 struct socket *ssock;
758 struct socket *ssock;
759 struct sock *ssk;
816
760
817 /* will be treated as __user in tcp_getsockopt */
818 optval = (char __kernel __force *)uoptval;
819 option = (int __kernel __force *)uoption;
820
821 pr_debug("msk=%p", msk);
822
823 /* @@ the meaning of getsockopt() when the socket is connected and
824 * there are multiple subflows is not defined.
825 */
826 lock_sock(sk);
827 ssock = __mptcp_socket_create(msk, MPTCP_SAME_STATE);
761 pr_debug("msk=%p", msk);
762
763 /* @@ the meaning of getsockopt() when the socket is connected and
764 * there are multiple subflows is not defined.
765 */
766 lock_sock(sk);
767 ssock = __mptcp_socket_create(msk, MPTCP_SAME_STATE);
828 if (!IS_ERR(ssock)) {
829 pr_debug("subflow=%p", ssock->sk);
830 ret = kernel_getsockopt(ssock, level, optname, optval, option);
768 if (IS_ERR(ssock)) {
769 release_sock(sk);
770 return ret;
831 }
771 }
772
773 ssk = ssock->sk;
774 sock_hold(ssk);
832 release_sock(sk);
833
775 release_sock(sk);
776
777 ret = tcp_getsockopt(ssk, level, optname, optval, option);
778 sock_put(ssk);
779
834 return ret;
835}
836
837static int mptcp_get_port(struct sock *sk, unsigned short snum)
838{
839 struct mptcp_sock *msk = mptcp_sk(sk);
840 struct socket *ssock;
841

--- 435 unchanged lines hidden ---
780 return ret;
781}
782
783static int mptcp_get_port(struct sock *sk, unsigned short snum)
784{
785 struct mptcp_sock *msk = mptcp_sk(sk);
786 struct socket *ssock;
787

--- 435 unchanged lines hidden ---