Skip to content

Commit f08d246

Browse files
matttbeintel-lab-lkp
authored andcommitted
mptcp: pm: change to fullmesh only for 'subflow'
If an endpoint doesn't have the 'subflow' endpoint -- in fact, has no type, so not 'subflow', 'signal', nor 'implicit' -- there are then no subflows created from this local endpoint to at least the initial destination address. In this case, no need to call mptcp_pm_nl_fullmesh() which is there to recreate the subflows to reflect the new value of the fullmesh attribute. Similarly, there is then no need to iterate over all connections to do nothing, if only the 'fullmesh' flag has been changed, and the endpoint doesn't have the 'subflow' one. So stop early when dealing with this specific case. Signed-off-by: Matthieu Baerts (NGI0) <[email protected]>
1 parent 2cbf977 commit f08d246

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

net/mptcp/pm_netlink.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1923,11 +1923,16 @@ static void mptcp_pm_nl_fullmesh(struct mptcp_sock *msk,
19231923
}
19241924

19251925
static void mptcp_nl_set_flags(struct net *net, struct mptcp_addr_info *addr,
1926-
u8 bkup, u8 changed)
1926+
u8 flags, u8 changed)
19271927
{
1928+
u8 is_subflow = !!(flags & MPTCP_PM_ADDR_FLAG_SUBFLOW);
1929+
u8 bkup = !!(flags & MPTCP_PM_ADDR_FLAG_BACKUP);
19281930
long s_slot = 0, s_num = 0;
19291931
struct mptcp_sock *msk;
19301932

1933+
if (changed == MPTCP_PM_ADDR_FLAG_FULLMESH && !is_subflow)
1934+
return;
1935+
19311936
while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) {
19321937
struct sock *sk = (struct sock *)msk;
19331938

@@ -1937,7 +1942,8 @@ static void mptcp_nl_set_flags(struct net *net, struct mptcp_addr_info *addr,
19371942
lock_sock(sk);
19381943
if (changed & MPTCP_PM_ADDR_FLAG_BACKUP)
19391944
mptcp_pm_nl_mp_prio_send_ack(msk, addr, NULL, bkup);
1940-
if (changed & MPTCP_PM_ADDR_FLAG_FULLMESH)
1945+
/* Subflows will only be recreated if the SUBFLOW flag is set */
1946+
if (is_subflow && (changed & MPTCP_PM_ADDR_FLAG_FULLMESH))
19411947
mptcp_pm_nl_fullmesh(msk, addr);
19421948
release_sock(sk);
19431949

@@ -1959,7 +1965,6 @@ int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
19591965
struct mptcp_pm_addr_entry *entry;
19601966
struct pm_nl_pernet *pernet;
19611967
u8 lookup_by_id = 0;
1962-
u8 bkup = 0;
19631968

19641969
pernet = pm_nl_get_pernet(net);
19651970

@@ -1972,9 +1977,6 @@ int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
19721977
}
19731978
}
19741979

1975-
if (local->flags & MPTCP_PM_ADDR_FLAG_BACKUP)
1976-
bkup = 1;
1977-
19781980
spin_lock_bh(&pernet->lock);
19791981
entry = lookup_by_id ? __lookup_addr_by_id(pernet, local->addr.id) :
19801982
__lookup_addr(pernet, &local->addr);
@@ -1996,7 +1998,7 @@ int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
19961998
*local = *entry;
19971999
spin_unlock_bh(&pernet->lock);
19982000

1999-
mptcp_nl_set_flags(net, &local->addr, bkup, changed);
2001+
mptcp_nl_set_flags(net, &local->addr, entry->flags, changed);
20002002
return 0;
20012003
}
20022004

0 commit comments

Comments
 (0)