mptcp: reduce branching when writing MP_FAIL option
authorMatthieu Baerts <matthieu.baerts@tessares.net>
Thu, 3 Feb 2022 01:03:38 +0000 (17:03 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 3 Feb 2022 11:44:08 +0000 (11:44 +0000)
MP_FAIL should be use in very rare cases, either when the TCP RST flag
is set -- with or without an MP_RST -- or with a DSS, see
mptcp_established_options().

Here, we do the same in mptcp_write_options().

Co-developed-by: Geliang Tang <geliang.tang@suse.com>
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mptcp/options.c

index 5d0b3c3..ab054c3 100644 (file)
@@ -1267,17 +1267,6 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp,
        const struct sock *ssk = (const struct sock *)tp;
        struct mptcp_subflow_context *subflow;
 
-       if (unlikely(OPTION_MPTCP_FAIL & opts->suboptions)) {
-               subflow = mptcp_subflow_ctx(ssk);
-               subflow->send_mp_fail = 0;
-
-               *ptr++ = mptcp_option(MPTCPOPT_MP_FAIL,
-                                     TCPOLEN_MPTCP_FAIL,
-                                     0, 0);
-               put_unaligned_be64(opts->fail_seq, ptr);
-               ptr += 2;
-       }
-
        /* DSS, MPC, MPJ, ADD_ADDR, FASTCLOSE and RST are mutually exclusive,
         * see mptcp_established_options*()
         */
@@ -1336,6 +1325,10 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp,
                        }
                        ptr += 1;
                }
+
+               /* We might need to add MP_FAIL options in rare cases */
+               if (unlikely(OPTION_MPTCP_FAIL & opts->suboptions))
+                       goto mp_fail;
        } else if (OPTIONS_MPTCP_MPC & opts->suboptions) {
                u8 len, flag = MPTCP_CAP_HMAC_SHA256;
 
@@ -1476,6 +1469,21 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp,
                put_unaligned_be64(opts->rcvr_key, ptr);
                ptr += 2;
 
+               if (OPTION_MPTCP_RST & opts->suboptions)
+                       goto mp_rst;
+               return;
+       } else if (unlikely(OPTION_MPTCP_FAIL & opts->suboptions)) {
+mp_fail:
+               /* MP_FAIL is mutually exclusive with others except RST */
+               subflow = mptcp_subflow_ctx(ssk);
+               subflow->send_mp_fail = 0;
+
+               *ptr++ = mptcp_option(MPTCPOPT_MP_FAIL,
+                                     TCPOLEN_MPTCP_FAIL,
+                                     0, 0);
+               put_unaligned_be64(opts->fail_seq, ptr);
+               ptr += 2;
+
                if (OPTION_MPTCP_RST & opts->suboptions)
                        goto mp_rst;
                return;