diff options
| author | Jakub Kicinski <kuba@kernel.org> | 2023-06-22 18:40:38 -0700 |
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2023-06-22 18:40:38 -0700 |
| commit | a7384f3918756c193e3fcd7e3111fc4bd3686013 (patch) | |
| tree | 156fda862edf0154225e6a5d8d092b0f6fe35728 /net/mptcp/subflow.c | |
| parent | 98e95872f2b818c74872d073eaa4c937579d41fc (diff) | |
| parent | 8a28a0b6f1a1dcbf5a834600a9acfbe2ba51e5eb (diff) | |
| download | linux-a7384f3918756c193e3fcd7e3111fc4bd3686013.tar.gz linux-a7384f3918756c193e3fcd7e3111fc4bd3686013.tar.bz2 linux-a7384f3918756c193e3fcd7e3111fc4bd3686013.zip | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Cross-merge networking fixes after downstream PR.
Conflicts:
tools/testing/selftests/net/fcnal-test.sh
d7a2fc1437f7 ("selftests: net: fcnal-test: check if FIPS mode is enabled")
dd017c72dde6 ("selftests: fcnal: Test SO_DONTROUTE on TCP sockets.")
https://lore.kernel.org/all/5007b52c-dd16-dbf6-8d64-b9701bfa498b@tessares.net/
https://lore.kernel.org/all/20230619105427.4a0df9b3@canb.auug.org.au/
No adjacent changes.
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'net/mptcp/subflow.c')
| -rw-r--r-- | net/mptcp/subflow.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 222dfcdadf2e..285e8ff74277 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1751,14 +1751,16 @@ static void subflow_state_change(struct sock *sk) { struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); struct sock *parent = subflow->conn; + struct mptcp_sock *msk; __subflow_state_change(sk); + msk = mptcp_sk(parent); if (subflow_simultaneous_connect(sk)) { mptcp_propagate_sndbuf(parent, sk); mptcp_do_fallback(sk); - mptcp_rcv_space_init(mptcp_sk(parent), sk); - pr_fallback(mptcp_sk(parent)); + mptcp_rcv_space_init(msk, sk); + pr_fallback(msk); subflow->conn_finished = 1; mptcp_set_connected(parent); } @@ -1774,11 +1776,12 @@ static void subflow_state_change(struct sock *sk) subflow_sched_work_if_closed(mptcp_sk(parent), sk); - if (__mptcp_check_fallback(mptcp_sk(parent)) && - !subflow->rx_eof && subflow_is_done(sk)) { - subflow->rx_eof = 1; - mptcp_subflow_eof(parent); - } + /* when the fallback subflow closes the rx side, trigger a 'dummy' + * ingress data fin, so that the msk state will follow along + */ + if (__mptcp_check_fallback(msk) && subflow_is_done(sk) && msk->first == sk && + mptcp_update_rcv_data_fin(msk, READ_ONCE(msk->ack_seq), true)) + mptcp_schedule_work(parent); } void mptcp_subflow_queue_clean(struct sock *listener_sk, struct sock *listener_ssk) |
