So that we can skip already used endpoint at local address
selection time.
This allows for fair local endpoints usage in case of subflow
failure.
As a side effect, this patch also enforces that each endpoint
is used at most once for each mptcp connection.
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
net/mptcp/pm.c | 1 +
net/mptcp/pm_netlink.c | 8 +++++++-
net/mptcp/protocol.h | 1 +
3 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index 761995a34124..1ff856dd92c4 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -376,6 +376,7 @@ void mptcp_pm_data_reset(struct mptcp_sock *msk)
WRITE_ONCE(msk->pm.accept_subflow, false);
WRITE_ONCE(msk->pm.remote_deny_join_id0, false);
msk->pm.status = 0;
+ bitmap_zero(msk->pm.endpoint_usage_mask, 256);
mptcp_pm_nl_data_init(msk);
}
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 3186d33b5208..78b68a8216b6 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -173,6 +173,9 @@ select_local_address(const struct pm_nl_pernet *pernet,
if (!(entry->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW))
continue;
+ if (test_bit(entry->addr.id, msk->pm.endpoint_usage_mask))
+ continue;
+
if (entry->addr.family != sk->sk_family) {
#if IS_ENABLED(CONFIG_MPTCP_IPV6)
if ((entry->addr.family == AF_INET &&
@@ -512,8 +515,10 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
check_work_pending(msk);
nr = fill_remote_addresses_vec(msk, fullmesh, addrs);
spin_unlock_bh(&msk->pm.lock);
- for (i = 0; i < nr; i++)
+ for (i = 0; i < nr; i++) {
+ set_bit(local->addr.id, msk->pm.endpoint_usage_mask);
__mptcp_subflow_connect(sk, &local->addr, &addrs[i]);
+ }
spin_lock_bh(&msk->pm.lock);
return;
}
@@ -1282,6 +1287,7 @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net,
mptcp_pm_remove_anno_addr(msk, addr, remove_subflow);
if (remove_subflow)
mptcp_pm_remove_subflow(msk, &list);
+ clear_bit(addr->id, msk->pm.endpoint_usage_mask);
release_sock(sk);
next:
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index a6a4bd7de5b4..d384f285b6c1 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -190,6 +190,7 @@ struct mptcp_pm_data {
spinlock_t lock; /*protects the whole PM data */
+ DECLARE_BITMAP(endpoint_usage_mask, 256);
u8 addr_signal;
bool server_side;
bool work_pending;
--
2.33.1