summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/mptcp/pm.c3
-rw-r--r--net/mptcp/pm_netlink.c15
2 files changed, 11 insertions, 7 deletions
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index 16cacce6c10fe..6c8cadf84f31f 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -251,6 +251,9 @@ void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
pr_debug("msk=%p\n", msk);
+ if (!READ_ONCE(pm->work_pending))
+ return;
+
spin_lock_bh(&pm->lock);
if (mptcp_lookup_anno_list_by_saddr(msk, addr) && READ_ONCE(pm->work_pending))
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index d4328443d844d..4bebc4963c42d 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1907,11 +1907,12 @@ static void mptcp_pm_nl_fullmesh(struct mptcp_sock *msk,
spin_unlock_bh(&msk->pm.lock);
}
-static void mptcp_nl_set_flags(struct net *net, struct mptcp_addr_info *addr,
- u8 flags, u8 changed)
+static void mptcp_nl_set_flags(struct net *net,
+ struct mptcp_pm_addr_entry *local,
+ u8 changed)
{
- u8 is_subflow = !!(flags & MPTCP_PM_ADDR_FLAG_SUBFLOW);
- u8 bkup = !!(flags & MPTCP_PM_ADDR_FLAG_BACKUP);
+ u8 is_subflow = !!(local->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW);
+ u8 bkup = !!(local->flags & MPTCP_PM_ADDR_FLAG_BACKUP);
long s_slot = 0, s_num = 0;
struct mptcp_sock *msk;
@@ -1926,10 +1927,10 @@ static void mptcp_nl_set_flags(struct net *net, struct mptcp_addr_info *addr,
lock_sock(sk);
if (changed & MPTCP_PM_ADDR_FLAG_BACKUP)
- mptcp_pm_nl_mp_prio_send_ack(msk, addr, NULL, bkup);
+ mptcp_pm_nl_mp_prio_send_ack(msk, &local->addr, NULL, bkup);
/* Subflows will only be recreated if the SUBFLOW flag is set */
if (is_subflow && (changed & MPTCP_PM_ADDR_FLAG_FULLMESH))
- mptcp_pm_nl_fullmesh(msk, addr);
+ mptcp_pm_nl_fullmesh(msk, &local->addr);
release_sock(sk);
next:
@@ -1983,7 +1984,7 @@ int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
*local = *entry;
spin_unlock_bh(&pernet->lock);
- mptcp_nl_set_flags(net, &local->addr, entry->flags, changed);
+ mptcp_nl_set_flags(net, local, changed);
return 0;
}