mptcp: send ack for rm_addr
authorGeliang Tang <geliangtang@gmail.com>
Fri, 26 Mar 2021 18:26:40 +0000 (11:26 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 26 Mar 2021 22:05:15 +0000 (15:05 -0700)
This patch changes the sending ACK conditions for the ADD_ADDR, send an
ACK packet for RM_ADDR too.

In mptcp_pm_remove_addr, invoke mptcp_pm_nl_add_addr_send_ack to send
the ACK packet.

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/pm.c
net/mptcp/pm_netlink.c
net/mptcp/protocol.h

index 966942d1013fbc26a74f561de6c827e1d36e4a75..efa7deb96139b15fa252e7ad28352ebbe1ced051 100644 (file)
@@ -53,6 +53,7 @@ int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_
        msk->pm.rm_list_tx = *rm_list;
        rm_addr |= BIT(MPTCP_RM_ADDR_SIGNAL);
        WRITE_ONCE(msk->pm.addr_signal, rm_addr);
+       mptcp_pm_nl_add_addr_send_ack(msk);
        return 0;
 }
 
index 743bd23b1f789268044f310611862f89f53171b5..f71e910670bffcdc12e1a00c6e3716a5af152aac 100644 (file)
@@ -56,8 +56,6 @@ struct pm_nl_pernet {
 #define MPTCP_PM_ADDR_MAX      8
 #define ADD_ADDR_RETRANS_MAX   3
 
-static void mptcp_pm_nl_add_addr_send_ack(struct mptcp_sock *msk);
-
 static bool addresses_equal(const struct mptcp_addr_info *a,
                            struct mptcp_addr_info *b, bool use_port)
 {
@@ -524,14 +522,15 @@ add_addr_echo:
        mptcp_pm_nl_add_addr_send_ack(msk);
 }
 
-static void mptcp_pm_nl_add_addr_send_ack(struct mptcp_sock *msk)
+void mptcp_pm_nl_add_addr_send_ack(struct mptcp_sock *msk)
 {
        struct mptcp_subflow_context *subflow;
 
        msk_owned_by_me(msk);
        lockdep_assert_held(&msk->pm.lock);
 
-       if (!mptcp_pm_should_add_signal(msk))
+       if (!mptcp_pm_should_add_signal(msk) &&
+           !mptcp_pm_should_rm_signal(msk))
                return;
 
        __mptcp_flush_join_list(msk);
@@ -540,7 +539,8 @@ static void mptcp_pm_nl_add_addr_send_ack(struct mptcp_sock *msk)
                struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
 
                spin_unlock_bh(&msk->pm.lock);
-               pr_debug("send ack for add_addr%s%s",
+               pr_debug("send ack for %s%s%s",
+                        mptcp_pm_should_add_signal(msk) ? "add_addr" : "rm_addr",
                         mptcp_pm_should_add_signal_ipv6(msk) ? " [ipv6]" : "",
                         mptcp_pm_should_add_signal_port(msk) ? " [port]" : "");
 
index b417b3591e071663e55500266bd23b5821428f12..6ce6ef58f0924d471e625c7c50fa4362c195c446 100644 (file)
@@ -650,6 +650,7 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
 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_nl_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);
 void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup);