From: Davide Caratti <[email protected]>

Current MPTCP servers increment MPTcpExtMPCapableFallbackACK when they
accept non-MPC connections. As reported by Christoph, this is "surprising"
because the counter might become greater than MPTcpExtMPCapableSYNRX.

MPTcpExtMPCapableFallbackACK counter's name suggests it should only be
incremented when a connection was seen using MPTCP options, then a
fallback to TCP has been done. Let's do that by incrementing it when
the subflow context of an inbound MPC connection attempt is dropped.
Also, update mptcp_connect.sh kselftest, to ensure that the
above MIB does not increment in case a pure TCP client connects to a
MPTCP server.

Fixes: fc518953bc9c ("mptcp: add and use MIB counter infrastructure")
Cc: [email protected]
Reported-by: Christoph Paasch <[email protected]>
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/449
Signed-off-by: Davide Caratti <[email protected]>
Reviewed-by: Mat Martineau <[email protected]>
Reviewed-by: Matthieu Baerts (NGI0) <[email protected]>
Signed-off-by: Matthieu Baerts (NGI0) <[email protected]>
---
 net/mptcp/protocol.c                               | 2 --
 net/mptcp/subflow.c                                | 2 ++
 tools/testing/selftests/net/mptcp/mptcp_connect.sh | 9 +++++++++
 3 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 3a1967bc7bad..7e74b812e366 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -3937,8 +3937,6 @@ static int mptcp_stream_accept(struct socket *sock, 
struct socket *newsock,
                                mptcp_set_state(newsk, TCP_CLOSE);
                }
        } else {
-               MPTCP_INC_STATS(sock_net(ssk),
-                               MPTCP_MIB_MPCAPABLEPASSIVEFALLBACK);
 tcpfallback:
                newsk->sk_kern_sock = kern;
                lock_sock(newsk);
diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index 1626dd20c68f..6042a47da61b 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -905,6 +905,8 @@ static struct sock *subflow_syn_recv_sock(const struct sock 
*sk,
        return child;
 
 fallback:
+       if (fallback)
+               SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_MPCAPABLEPASSIVEFALLBACK);
        mptcp_subflow_drop_ctx(child);
        return child;
 }
diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.sh 
b/tools/testing/selftests/net/mptcp/mptcp_connect.sh
index 4c4248554826..4131f3263a48 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_connect.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_connect.sh
@@ -383,12 +383,14 @@ do_transfer()
        local stat_cookierx_last
        local stat_csum_err_s
        local stat_csum_err_c
+       local stat_tcpfb_last_l
        stat_synrx_last_l=$(mptcp_lib_get_counter "${listener_ns}" 
"MPTcpExtMPCapableSYNRX")
        stat_ackrx_last_l=$(mptcp_lib_get_counter "${listener_ns}" 
"MPTcpExtMPCapableACKRX")
        stat_cookietx_last=$(mptcp_lib_get_counter "${listener_ns}" 
"TcpExtSyncookiesSent")
        stat_cookierx_last=$(mptcp_lib_get_counter "${listener_ns}" 
"TcpExtSyncookiesRecv")
        stat_csum_err_s=$(mptcp_lib_get_counter "${listener_ns}" 
"MPTcpExtDataCsumErr")
        stat_csum_err_c=$(mptcp_lib_get_counter "${connector_ns}" 
"MPTcpExtDataCsumErr")
+       stat_tcpfb_last_l=$(mptcp_lib_get_counter "${listener_ns}" 
"MPTcpExtMPCapableFallbackACK")
 
        timeout ${timeout_test} \
                ip netns exec ${listener_ns} \
@@ -457,11 +459,13 @@ do_transfer()
        local stat_cookietx_now
        local stat_cookierx_now
        local stat_ooo_now
+       local stat_tcpfb_now_l
        stat_synrx_now_l=$(mptcp_lib_get_counter "${listener_ns}" 
"MPTcpExtMPCapableSYNRX")
        stat_ackrx_now_l=$(mptcp_lib_get_counter "${listener_ns}" 
"MPTcpExtMPCapableACKRX")
        stat_cookietx_now=$(mptcp_lib_get_counter "${listener_ns}" 
"TcpExtSyncookiesSent")
        stat_cookierx_now=$(mptcp_lib_get_counter "${listener_ns}" 
"TcpExtSyncookiesRecv")
        stat_ooo_now=$(mptcp_lib_get_counter "${listener_ns}" 
"TcpExtTCPOFOQueue")
+       stat_tcpfb_now_l=$(mptcp_lib_get_counter "${listener_ns}" 
"MPTcpExtMPCapableFallbackACK")
 
        expect_synrx=$((stat_synrx_last_l))
        expect_ackrx=$((stat_ackrx_last_l))
@@ -508,6 +512,11 @@ do_transfer()
                fi
        fi
 
+       if [ ${stat_ooo_now} -eq 0 ] && [ ${stat_tcpfb_last_l} -ne 
${stat_tcpfb_now_l} ]; then
+               mptcp_lib_pr_fail "unexpected fallback to TCP"
+               rets=1
+       fi
+
        if [ $cookies -eq 2 ];then
                if [ $stat_cookietx_last -ge $stat_cookietx_now ] ;then
                        extra+=" WARN: CookieSent: did not advance"

-- 
2.43.0


Reply via email to