Skip to content

Commit

Permalink
mptcp: create subflow or signal addr for newly added address
Browse files Browse the repository at this point in the history
Currently, when a new MPTCP endpoint is added, the existing MPTCP
sockets are not affected.

This patch implements a new function mptcp_nl_add_subflow_or_signal_addr,
invoked when an address is added from PM netlink. This function traverses
the MPTCP sockets list and invokes mptcp_pm_create_subflow_or_signal_addr
to try to create a subflow or signal an address for the newly added
address, if local constraint allows that.

Closes: #19
Reviewed-by: Mat Martineau <[email protected]>
Signed-off-by: Geliang Tang <[email protected]>
  • Loading branch information
geliangtang authored and jenkins-tessares committed Feb 2, 2021
1 parent 1031d4b commit 8333d08
Showing 1 changed file with 27 additions and 0 deletions.
27 changes: 27 additions & 0 deletions net/mptcp/pm_netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -850,6 +850,31 @@ static struct pm_nl_pernet *genl_info_pm_nl(struct genl_info *info)
return net_generic(genl_info_net(info), pm_nl_pernet_id);
}

static int mptcp_nl_add_subflow_or_signal_addr(struct net *net)
{
struct mptcp_sock *msk;
long s_slot = 0, s_num = 0;

while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) {
struct sock *sk = (struct sock *)msk;

if (!READ_ONCE(msk->fully_established))
goto next;

lock_sock(sk);
spin_lock_bh(&msk->pm.lock);
mptcp_pm_create_subflow_or_signal_addr(msk);
spin_unlock_bh(&msk->pm.lock);
release_sock(sk);

next:
sock_put(sk);
cond_resched();
}

return 0;
}

static int mptcp_nl_cmd_add_addr(struct sk_buff *skb, struct genl_info *info)
{
struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR];
Expand All @@ -875,6 +900,8 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *skb, struct genl_info *info)
return ret;
}

mptcp_nl_add_subflow_or_signal_addr(sock_net(skb->sk));

return 0;
}

Expand Down

0 comments on commit 8333d08

Please sign in to comment.