Skip to content

Commit 0f21cc2

Browse files
matttbegregkh
authored andcommitted
mptcp: pm: do not ignore 'subflow' if 'signal' flag is also set
commit 85df533 upstream. Up to the 'Fixes' commit, having an endpoint with both the 'signal' and 'subflow' flags, resulted in the creation of a subflow and an address announcement using the address linked to this endpoint. After this commit, only the address announcement was done, ignoring the 'subflow' flag. That's because the same bitmap is used for the two flags. It is OK to keep this single bitmap, the already selected local endpoint simply have to be re-used, but not via select_local_address() not to look at the just modified bitmap. Note that it is unusual to set the two flags together: creating a new subflow using a new local address will implicitly advertise it to the other peer. So in theory, no need to advertise it explicitly as well. Maybe there are use-cases -- the subflow might not reach the other peer that way, we can ask the other peer to try initiating the new subflow without delay -- or very likely the user is confused, and put both flags "just to be sure at least the right one is set". Still, if it is allowed, the kernel should do what has been asked: using this endpoint to announce the address and to create a new subflow from it. An alternative is to forbid the use of the two flags together, but that's probably too late, there are maybe use-cases, and it was working before. This patch will avoid people complaining subflows are not created using the endpoint they added with the 'subflow' and 'signal' flag. Note that with the current patch, the subflow might not be created in some corner cases, e.g. if the 'subflows' limit was reached when sending the ADD_ADDR, but changed later on. It is probably not worth splitting id_avail_bitmap per target ('signal', 'subflow'), which will add another large field to the msk "just" to track (again) endpoints. Anyway, currently when the limits are changed, the kernel doesn't check if new subflows can be created or removed, because we would need to keep track of the received ADD_ADDR, and more. It sounds OK to assume that the limits should be properly configured before establishing new connections. Fixes: 86e39e0 ("mptcp: keep track of local endpoint still available for each msk") Cc: stable@vger.kernel.org Suggested-by: Paolo Abeni <pabeni@redhat.com> Reviewed-by: Mat Martineau <martineau@kernel.org> Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org> Link: https://patch.msgid.link/20240731-upstream-net-20240731-mptcp-endp-subflow-signal-v1-5-c8a9b036493b@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent f706e29 commit 0f21cc2

1 file changed

Lines changed: 12 additions & 4 deletions

File tree

net/mptcp/pm_netlink.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -512,8 +512,8 @@ __lookup_addr(struct pm_nl_pernet *pernet, const struct mptcp_addr_info *info)
512512

513513
static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
514514
{
515+
struct mptcp_pm_addr_entry *local, *signal_and_subflow = NULL;
515516
struct sock *sk = (struct sock *)msk;
516-
struct mptcp_pm_addr_entry *local;
517517
unsigned int add_addr_signal_max;
518518
unsigned int local_addr_max;
519519
struct pm_nl_pernet *pernet;
@@ -579,6 +579,9 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
579579
msk->pm.add_addr_signaled++;
580580
mptcp_pm_announce_addr(msk, &local->addr, false);
581581
mptcp_pm_nl_addr_send_ack(msk);
582+
583+
if (local->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW)
584+
signal_and_subflow = local;
582585
}
583586

584587
subflow:
@@ -589,9 +592,14 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
589592
bool fullmesh;
590593
int i, nr;
591594

592-
local = select_local_address(pernet, msk);
593-
if (!local)
594-
break;
595+
if (signal_and_subflow) {
596+
local = signal_and_subflow;
597+
signal_and_subflow = NULL;
598+
} else {
599+
local = select_local_address(pernet, msk);
600+
if (!local)
601+
break;
602+
}
595603

596604
fullmesh = !!(local->flags & MPTCP_PM_ADDR_FLAG_FULLMESH);
597605

0 commit comments

Comments
 (0)