]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
mptcp: pm: inc RmAddr MIB counter once per RM_ADDR ID
authorYonglongLi <liyonglong@chinatelecom.cn>
Fri, 7 Jun 2024 15:01:49 +0000 (17:01 +0200)
committerRoxana Nicolescu <roxana.nicolescu@canonical.com>
Fri, 2 Aug 2024 14:26:57 +0000 (16:26 +0200)
BugLink: https://bugs.launchpad.net/bugs/2074091
commit 6a09788c1a66e3d8b04b3b3e7618cc817bb60ae9 upstream.

The RmAddr MIB counter is supposed to be incremented once when a valid
RM_ADDR has been received. Before this patch, it could have been
incremented as many times as the number of subflows connected to the
linked address ID, so it could have been 0, 1 or more than 1.

The "RmSubflow" is incremented after a local operation. In this case,
it is normal to tied it with the number of subflows that have been
actually removed.

The "remove invalid addresses" MP Join subtest has been modified to
validate this case. A broadcast IP address is now used instead: the
client will not be able to create a subflow to this address. The
consequence is that when receiving the RM_ADDR with the ID attached to
this broadcast IP address, no subflow linked to this ID will be found.

Fixes: 7a7e52e38a40 ("mptcp: add RM_ADDR related mibs")
Cc: stable@vger.kernel.org
Co-developed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: YonglongLi <liyonglong@chinatelecom.cn>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://lore.kernel.org/r/20240607-upstream-net-20240607-misc-fixes-v1-2-1ab9ddfa3d00@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Portia Stephens <portia.stephens@canonical.com>
Signed-off-by: Roxana Nicolescu <roxana.nicolescu@canonical.com>
net/mptcp/pm_netlink.c
tools/testing/selftests/net/mptcp/mptcp_join.sh

index 58d17d9604e78fde24795219e53e18646c53b0de..3840b29c355dc75e5a21f03ae0e22f8b72c08324 100644 (file)
@@ -822,10 +822,13 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp_sock *msk,
                        spin_lock_bh(&msk->pm.lock);
 
                        removed = true;
-                       __MPTCP_INC_STATS(sock_net(sk), rm_type);
+                       if (rm_type == MPTCP_MIB_RMSUBFLOW)
+                               __MPTCP_INC_STATS(sock_net(sk), rm_type);
                }
                if (rm_type == MPTCP_MIB_RMSUBFLOW)
                        __set_bit(rm_id ? rm_id : msk->mpc_endpoint_id, msk->pm.id_avail_bitmap);
+               else if (rm_type == MPTCP_MIB_RMADDR)
+                       __MPTCP_INC_STATS(sock_net(sk), rm_type);
                if (!removed)
                        continue;
 
index 1b6b16f1e5ea084c5d0c28d6d2535789c1798129..f431bc6061458b630b4cdcd6e98290d650c76555 100755 (executable)
@@ -2405,7 +2405,8 @@ remove_tests()
                pm_nl_set_limits $ns1 3 3
                pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
                pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
-               pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
+               # broadcast IP: no packet for this address will be received on ns1
+               pm_nl_add_endpoint $ns1 224.0.0.1 flags signal
                pm_nl_set_limits $ns2 3 3
                addr_nr_ns1=-3 speed=10 \
                        run_tests $ns1 $ns2 10.0.1.1