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