Commit 902c8f86 authored by Matthieu Baerts's avatar Matthieu Baerts Committed by David S. Miller

mptcp: reduce branching when writing MP_FAIL option

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: default avatarGeliang Tang <geliang.tang@suse.com>
Signed-off-by: default avatarGeliang Tang <geliang.tang@suse.com>
Signed-off-by: default avatarMatthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d7889cfa
...@@ -1267,17 +1267,6 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp, ...@@ -1267,17 +1267,6 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp,
const struct sock *ssk = (const struct sock *)tp; const struct sock *ssk = (const struct sock *)tp;
struct mptcp_subflow_context *subflow; 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, /* DSS, MPC, MPJ, ADD_ADDR, FASTCLOSE and RST are mutually exclusive,
* see mptcp_established_options*() * see mptcp_established_options*()
*/ */
...@@ -1336,6 +1325,10 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp, ...@@ -1336,6 +1325,10 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp,
} }
ptr += 1; 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) { } else if (OPTIONS_MPTCP_MPC & opts->suboptions) {
u8 len, flag = MPTCP_CAP_HMAC_SHA256; u8 len, flag = MPTCP_CAP_HMAC_SHA256;
...@@ -1476,6 +1469,21 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp, ...@@ -1476,6 +1469,21 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp,
put_unaligned_be64(opts->rcvr_key, ptr); put_unaligned_be64(opts->rcvr_key, ptr);
ptr += 2; 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) if (OPTION_MPTCP_RST & opts->suboptions)
goto mp_rst; goto mp_rst;
return; return;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment