Skip to content

Commit

Permalink
mptcp: send ADD_ADDR echo before create subflows
Browse files Browse the repository at this point in the history
In some corner cases, the peer handing an incoming ADD_ADDR option, can
receive a retransmitted ADD_ADDR for the same address before the subflow
creation completes.

We can avoid the above issue by generating and sending the ADD_ADDR echo
before starting the MPJ subflow connection.

This slightly changes the behaviour of the packetdrill tests as the
ADD_ADDR echo packet is sent earlier.

Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Yonglong Li <liyonglong@chinatelecom.cn>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Link: https://lore.kernel.org/r/20220317221444.426335-1-mathew.j.martineau@linux.intel.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Yonglong Li authored and Jakub Kicinski committed Mar 18, 2022
1 parent 4edf21a commit 12a1834
Showing 1 changed file with 5 additions and 13 deletions.
18 changes: 5 additions & 13 deletions net/mptcp/pm_netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -650,7 +650,6 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
unsigned int add_addr_accept_max;
struct mptcp_addr_info remote;
unsigned int subflows_max;
bool reset_port = false;
int i, nr;

add_addr_accept_max = mptcp_pm_get_add_addr_accept_max(msk);
Expand All @@ -661,14 +660,15 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
msk->pm.remote.family);

remote = msk->pm.remote;
mptcp_pm_announce_addr(msk, &remote, true);
mptcp_pm_nl_addr_send_ack(msk);

if (lookup_subflow_by_daddr(&msk->conn_list, &remote))
goto add_addr_echo;
return;

/* pick id 0 port, if none is provided the remote address */
if (!remote.port) {
reset_port = true;
if (!remote.port)
remote.port = sk->sk_dport;
}

/* connect to the specified remote address, using whatever
* local address the routing configuration will pick.
Expand All @@ -684,14 +684,6 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
for (i = 0; i < nr; i++)
__mptcp_subflow_connect(sk, &addrs[i], &remote);
spin_lock_bh(&msk->pm.lock);

/* be sure to echo exactly the received address */
if (reset_port)
remote.port = 0;

add_addr_echo:
mptcp_pm_announce_addr(msk, &remote, true);
mptcp_pm_nl_addr_send_ack(msk);
}

void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk)
Expand Down

0 comments on commit 12a1834

Please sign in to comment.