mptcp: don't account accept() of non-MPC client as fallback to TCP
authorDavide Caratti <dcaratti@redhat.com>
Fri, 29 Mar 2024 12:08:52 +0000 (13:08 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 2 Apr 2024 04:25:00 +0000 (21:25 -0700)
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: stable@vger.kernel.org
Reported-by: Christoph Paasch <cpaasch@apple.com>
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/449
Signed-off-by: Davide Caratti <dcaratti@redhat.com>
Reviewed-by: Mat Martineau <martineau@kernel.org>
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://lore.kernel.org/r/20240329-upstream-net-20240329-fallback-mib-v1-1-324a8981da48@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/protocol.c
net/mptcp/subflow.c
tools/testing/selftests/net/mptcp/mptcp_connect.sh

index 3a1967bc7bad63d5a8a628b3f3b868e3a27baaca..7e74b812e366ae311f52615e9b304d6fe8b924b8 100644 (file)
@@ -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);
index 1626dd20c68f1f0d67fdb8e0a2fbd2c2d1e70662..6042a47da61be8bc3000ab485fe6fbb7bff387b6 100644 (file)
@@ -905,6 +905,8 @@ dispose_child:
        return child;
 
 fallback:
+       if (fallback)
+               SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_MPCAPABLEPASSIVEFALLBACK);
        mptcp_subflow_drop_ctx(child);
        return child;
 }
index 4c424855482629d778bd67c719a82b791f15b32c..4131f3263a4826b808fca43ab92be4b893bb8522 100755 (executable)
@@ -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"