On Thu, 17 Feb 2022, Geliang Tang wrote:
> Add MP_FAIL echo support.
>
> Signed-off-by: Geliang Tang <geliang.tang@suse.com>
> ---
> net/mptcp/pm.c | 10 ++++++++--
> net/mptcp/protocol.h | 1 +
> net/mptcp/subflow.c | 2 ++
> 3 files changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
> index d0d31d5c198a..dc0dffc1b6b5 100644
> --- a/net/mptcp/pm.c
> +++ b/net/mptcp/pm.c
> @@ -279,8 +279,14 @@ 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))
> - subflow->send_infinite_map = 1;
> + if (!mptcp_has_another_subflow(sk) && READ_ONCE(msk->allow_infinite_fallback)) {
> + if (!subflow->mp_fail_response_expect) {
> + subflow->send_mp_fail = 1;
> + subflow->send_infinite_map = 1;
> + } else {
> + subflow->mp_fail_response_expect = 0;
I'm not sure this should be cleared. If the peer retransmits MP_FAIL, we
could receive MP_FAIL multiple times and we don't want to echo an MP_FAIL
back.
-Mat
> + }
> + }
> }
>
> /* path manager helpers */
> diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
> index 18ca0248c084..3c74b04fba6c 100644
> --- a/net/mptcp/protocol.h
> +++ b/net/mptcp/protocol.h
> @@ -448,6 +448,7 @@ struct mptcp_subflow_context {
> backup : 1,
> send_mp_prio : 1,
> send_mp_fail : 1,
> + mp_fail_response_expect : 1,
> send_fastclose : 1,
> send_infinite_map : 1,
> rx_eof : 1,
> diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
> index 8d086641bdc5..f06d93fce1bb 100644
> --- a/net/mptcp/subflow.c
> +++ b/net/mptcp/subflow.c
> @@ -1172,6 +1172,8 @@ static bool subflow_check_data_avail(struct sock *ssk)
> tcp_send_active_reset(ssk, GFP_ATOMIC);
> while ((skb = skb_peek(&ssk->sk_receive_queue)))
> sk_eat_skb(ssk, skb);
> + } else {
> + subflow->mp_fail_response_expect = 1;
> }
> WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_NODATA);
> return true;
> --
> 2.34.1
>
>
>
--
Mat Martineau
Intel