mptcp: move to next addr when subflow creation fail
authorGeliang Tang <geliangtang@gmail.com>
Fri, 26 Mar 2021 18:26:38 +0000 (11:26 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 26 Mar 2021 22:05:15 +0000 (15:05 -0700)
When an invalid address was announced, the subflow couldn't be created
for this address. Therefore mptcp_pm_nl_subflow_established couldn't be
invoked. Then the next addresses in the local address list didn't have a
chance to be announced.

This patch invokes the new function mptcp_pm_add_addr_echoed when the
address is echoed. In it, use mptcp_lookup_anno_list_by_saddr to check
whether this address is in the anno_list. If it is, PM schedules the
status MPTCP_PM_SUBFLOW_ESTABLISHED to invoke
mptcp_pm_create_subflow_or_signal_addr to deal with the next address in
the local address list.

Signed-off-by: Geliang Tang <geliangtang@gmail.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mptcp/options.c
net/mptcp/pm.c
net/mptcp/protocol.h

index 2d2340b22f616cba51155259ef2190a9649cf01b..69cafaacc31bfc771f23d622f0436de50fec8c9d 100644 (file)
@@ -1040,6 +1040,7 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
                        mptcp_pm_add_addr_received(msk, &addr);
                        MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ADDADDR);
                } else {
+                       mptcp_pm_add_addr_echoed(msk, &addr);
                        mptcp_pm_del_add_timer(msk, &addr);
                        MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ECHOADD);
                }
index 0a06d5947a73e58f0d56ff452f548d427de4391a..966942d1013fbc26a74f561de6c827e1d36e4a75 100644 (file)
@@ -196,6 +196,21 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
        spin_unlock_bh(&pm->lock);
 }
 
+void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
+                             struct mptcp_addr_info *addr)
+{
+       struct mptcp_pm_data *pm = &msk->pm;
+
+       pr_debug("msk=%p", msk);
+
+       spin_lock_bh(&pm->lock);
+
+       if (mptcp_lookup_anno_list_by_saddr(msk, addr) && READ_ONCE(pm->work_pending))
+               mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED);
+
+       spin_unlock_bh(&pm->lock);
+}
+
 void mptcp_pm_add_addr_send_ack(struct mptcp_sock *msk)
 {
        if (!mptcp_pm_should_add_signal(msk))
index 9c51444b26cf1e8332c9b65043acde26b9cc859f..b417b3591e071663e55500266bd23b5821428f12 100644 (file)
@@ -647,6 +647,8 @@ void mptcp_pm_subflow_established(struct mptcp_sock *msk);
 void mptcp_pm_subflow_closed(struct mptcp_sock *msk, u8 id);
 void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
                                const struct mptcp_addr_info *addr);
+void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
+                             struct mptcp_addr_info *addr);
 void mptcp_pm_add_addr_send_ack(struct mptcp_sock *msk);
 void mptcp_pm_rm_addr_received(struct mptcp_sock *msk,
                               const struct mptcp_rm_list *rm_list);