]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mptcp: fix NL PM announced address accounting
authorPaolo Abeni <pabeni@redhat.com>
Sat, 27 Jul 2024 09:04:00 +0000 (11:04 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 11 Aug 2024 10:58:02 +0000 (12:58 +0200)
commit 4b317e0eb287bd30a1b329513531157c25e8b692 upstream.

Currently the per connection announced address counter is never
decreased. As a consequence, after connection establishment, if
the NL PM deletes an endpoint and adds a new/different one, no
additional subflow is created for the new endpoint even if the
current limits allow that.

Address the issue properly updating the signaled address counter
every time the NL PM removes such addresses.

Fixes: 01cacb00b35c ("mptcp: add netlink-based PM")
Cc: stable@vger.kernel.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/mptcp/pm_netlink.c

index b399f2b7a36943608172837146d5702c79b9825b..f65831de5c1ac00f8f6c97c18af367011827cac3 100644 (file)
@@ -1401,6 +1401,7 @@ static bool mptcp_pm_remove_anno_addr(struct mptcp_sock *msk,
        ret = remove_anno_list_by_saddr(msk, addr);
        if (ret || force) {
                spin_lock_bh(&msk->pm.lock);
+               msk->pm.add_addr_signaled -= ret;
                mptcp_pm_remove_addr(msk, &list);
                spin_unlock_bh(&msk->pm.lock);
        }
@@ -1565,17 +1566,18 @@ static void mptcp_pm_remove_addrs_and_subflows(struct mptcp_sock *msk,
        struct mptcp_pm_addr_entry *entry;
 
        list_for_each_entry(entry, rm_list, list) {
-               if (lookup_subflow_by_saddr(&msk->conn_list, &entry->addr) &&
-                   slist.nr < MPTCP_RM_IDS_MAX)
+               if (slist.nr < MPTCP_RM_IDS_MAX &&
+                   lookup_subflow_by_saddr(&msk->conn_list, &entry->addr))
                        slist.ids[slist.nr++] = entry->addr.id;
 
-               if (remove_anno_list_by_saddr(msk, &entry->addr) &&
-                   alist.nr < MPTCP_RM_IDS_MAX)
+               if (alist.nr < MPTCP_RM_IDS_MAX &&
+                   remove_anno_list_by_saddr(msk, &entry->addr))
                        alist.ids[alist.nr++] = entry->addr.id;
        }
 
        if (alist.nr) {
                spin_lock_bh(&msk->pm.lock);
+               msk->pm.add_addr_signaled -= alist.nr;
                mptcp_pm_remove_addr(msk, &alist);
                spin_unlock_bh(&msk->pm.lock);
        }