diff options
author | Jakub Kicinski <kuba@kernel.org> | 2020-10-10 11:05:10 -0700 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2020-10-10 11:05:10 -0700 |
commit | 49fb2f33f6a401d69002a30e804a786523a7b874 (patch) | |
tree | 6160e37cd56d5a28940c4e18f00eade5f9489fc0 /net/mptcp/subflow.c | |
parent | 16cb3653803dee243547f95cb51f01bec1323cdf (diff) | |
parent | 0e4f35d7880157ceccf0a58377d778b02762af82 (diff) |
Merge branch 'mptcp-some-fallback-fixes'
Paolo Abeni says:
====================
mptcp: some fallback fixes
pktdrill pointed-out we currently don't handle properly some
fallback scenario for MP_JOIN subflows
The first patch addresses such issue.
Patch 2/2 fixes a related pre-existing issue that is more
evident after 1/2: we could keep using for MPTCP signaling
closed subflows.
====================
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'net/mptcp/subflow.c')
-rw-r--r-- | net/mptcp/subflow.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 91bef7bfffa6..559f5bbd9622 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -270,6 +270,19 @@ static bool subflow_thmac_valid(struct mptcp_subflow_context *subflow) return thmac == subflow->thmac; } +void mptcp_subflow_reset(struct sock *ssk) +{ + struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); + struct sock *sk = subflow->conn; + + tcp_set_state(ssk, TCP_CLOSE); + tcp_send_active_reset(ssk, GFP_ATOMIC); + tcp_done(ssk); + if (!test_and_set_bit(MPTCP_WORK_CLOSE_SUBFLOW, &mptcp_sk(sk)->flags) && + schedule_work(&mptcp_sk(sk)->work)) + sock_hold(sk); +} + static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb) { struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); @@ -342,8 +355,7 @@ fallback: return; do_reset: - tcp_send_active_reset(sk, GFP_ATOMIC); - tcp_done(sk); + mptcp_subflow_reset(sk); } struct request_sock_ops mptcp_subflow_request_sock_ops; |