mptcp: add MP_FAIL response support
authorGeliang Tang <geliang.tang@suse.com>
Tue, 26 Apr 2022 21:57:14 +0000 (14:57 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 27 Apr 2022 09:45:54 +0000 (10:45 +0100)
This patch adds a new struct member mp_fail_response_expect in struct
mptcp_subflow_context to support MP_FAIL response. In the single subflow
with checksum error and contiguous data special case, a MP_FAIL is sent
in response to another MP_FAIL.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mptcp/pm.c
net/mptcp/protocol.h
net/mptcp/subflow.c

index 5c36870..971e843 100644 (file)
@@ -290,8 +290,16 @@ void mptcp_pm_mp_fail_received(struct sock *sk, u64 fail_seq)
 
        pr_debug("fail_seq=%llu", fail_seq);
 
-       if (!mptcp_has_another_subflow(sk) && READ_ONCE(msk->allow_infinite_fallback))
+       if (mptcp_has_another_subflow(sk) || !READ_ONCE(msk->allow_infinite_fallback))
+               return;
+
+       if (!READ_ONCE(subflow->mp_fail_response_expect)) {
+               pr_debug("send MP_FAIL response and infinite map");
+
+               subflow->send_mp_fail = 1;
+               MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFAILTX);
                subflow->send_infinite_map = 1;
+       }
 }
 
 /* path manager helpers */
index 61d6006..cc66c81 100644 (file)
@@ -448,6 +448,7 @@ struct mptcp_subflow_context {
                stale : 1,          /* unable to snd/rcv data, do not use for xmit */
                local_id_valid : 1; /* local_id is correctly initialized */
        enum mptcp_data_avail data_avail;
+       bool    mp_fail_response_expect;
        u32     remote_nonce;
        u64     thmac;
        u32     local_nonce;
index 30ffb00..ca2352a 100644 (file)
@@ -1217,6 +1217,8 @@ fallback:
                                tcp_send_active_reset(ssk, GFP_ATOMIC);
                                while ((skb = skb_peek(&ssk->sk_receive_queue)))
                                        sk_eat_skb(ssk, skb);
+                       } else {
+                               WRITE_ONCE(subflow->mp_fail_response_expect, true);
                        }
                        WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_NODATA);
                        return true;