Commit d84ad049 authored by Geliang Tang's avatar Geliang Tang Committed by David S. Miller

mptcp: skip connecting the connected address

This patch added a new helper named lookup_subflow_by_daddr to find
whether the destination address is in the msk's conn_list.

In mptcp_pm_nl_add_addr_received, use lookup_subflow_by_daddr to check
whether the announced address is already connected. If it is, skip
connecting this address and send out the echo.
Signed-off-by: default avatarGeliang Tang <geliangtang@gmail.com>
Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f7efc777
...@@ -140,6 +140,24 @@ static bool lookup_subflow_by_saddr(const struct list_head *list, ...@@ -140,6 +140,24 @@ static bool lookup_subflow_by_saddr(const struct list_head *list,
return false; return false;
} }
static bool lookup_subflow_by_daddr(const struct list_head *list,
struct mptcp_addr_info *daddr)
{
struct mptcp_subflow_context *subflow;
struct mptcp_addr_info cur;
struct sock_common *skc;
list_for_each_entry(subflow, list, node) {
skc = (struct sock_common *)mptcp_subflow_tcp_sock(subflow);
remote_address(skc, &cur);
if (addresses_equal(&cur, daddr, daddr->port))
return true;
}
return false;
}
static struct mptcp_pm_addr_entry * static struct mptcp_pm_addr_entry *
select_local_address(const struct pm_nl_pernet *pernet, select_local_address(const struct pm_nl_pernet *pernet,
struct mptcp_sock *msk) struct mptcp_sock *msk)
...@@ -475,6 +493,10 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk) ...@@ -475,6 +493,10 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
pr_debug("accepted %d:%d remote family %d", pr_debug("accepted %d:%d remote family %d",
msk->pm.add_addr_accepted, add_addr_accept_max, msk->pm.add_addr_accepted, add_addr_accept_max,
msk->pm.remote.family); msk->pm.remote.family);
if (lookup_subflow_by_daddr(&msk->conn_list, &msk->pm.remote))
goto add_addr_echo;
msk->pm.add_addr_accepted++; msk->pm.add_addr_accepted++;
msk->pm.subflows++; msk->pm.subflows++;
if (msk->pm.add_addr_accepted >= add_addr_accept_max || if (msk->pm.add_addr_accepted >= add_addr_accept_max ||
...@@ -494,6 +516,7 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk) ...@@ -494,6 +516,7 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
__mptcp_subflow_connect(sk, &local, &remote); __mptcp_subflow_connect(sk, &local, &remote);
spin_lock_bh(&msk->pm.lock); spin_lock_bh(&msk->pm.lock);
add_addr_echo:
mptcp_pm_announce_addr(msk, &msk->pm.remote, true); mptcp_pm_announce_addr(msk, &msk->pm.remote, true);
mptcp_pm_nl_add_addr_send_ack(msk); mptcp_pm_nl_add_addr_send_ack(msk);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment