mptcp: send ADD_ADDR echo before create subflows
authorYonglong Li <liyonglong@chinatelecom.cn>
Thu, 17 Mar 2022 22:14:44 +0000 (15:14 -0700)
committerJakub Kicinski <kuba@kernel.org>
Fri, 18 Mar 2022 21:14:09 +0000 (14:14 -0700)
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>
net/mptcp/pm_netlink.c

index 800515fe5e1dd38f6c788705feb6861e8452bccb..b5e8de6f75076ba53670fcb6f5ab9eddef5b3a79 100644 (file)
@@ -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);
@@ -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.
@@ -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)