mptcp: add port parameter for mptcp_pm_announce_addr
authorGeliang Tang <geliangtang@gmail.com>
Wed, 9 Dec 2020 23:51:24 +0000 (15:51 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 10 Dec 2020 03:02:15 +0000 (19:02 -0800)
This patch added a new parameter 'port' for mptcp_pm_announce_addr. If
this parameter is true, we set the MPTCP_ADD_ADDR_PORT bit of the
add_addr_signal. That means the announced address is added with a port
number.

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 0c45674..e63e14f 100644 (file)
@@ -14,7 +14,7 @@
 
 int mptcp_pm_announce_addr(struct mptcp_sock *msk,
                           const struct mptcp_addr_info *addr,
-                          bool echo)
+                          bool echo, bool port)
 {
        u8 add_addr = READ_ONCE(msk->pm.add_addr_signal);
 
@@ -26,6 +26,8 @@ int mptcp_pm_announce_addr(struct mptcp_sock *msk,
                add_addr |= BIT(MPTCP_ADD_ADDR_ECHO);
        if (addr->family == AF_INET6)
                add_addr |= BIT(MPTCP_ADD_ADDR_IPV6);
+       if (port)
+               add_addr |= BIT(MPTCP_ADD_ADDR_PORT);
        WRITE_ONCE(msk->pm.add_addr_signal, add_addr);
        return 0;
 }
@@ -156,7 +158,7 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
        spin_lock_bh(&pm->lock);
 
        if (!READ_ONCE(pm->accept_addr)) {
-               mptcp_pm_announce_addr(msk, addr, true);
+               mptcp_pm_announce_addr(msk, addr, true, addr->port);
                mptcp_pm_add_addr_send_ack(msk);
        } else if (mptcp_pm_schedule_work(msk, MPTCP_PM_ADD_ADDR_RECEIVED)) {
                pm->remote = *addr;
index 7a0f700..2560c50 100644 (file)
@@ -227,7 +227,7 @@ static void mptcp_pm_add_timer(struct timer_list *timer)
 
        if (!mptcp_pm_should_add_signal(msk)) {
                pr_debug("retransmit ADD_ADDR id=%d", entry->addr.id);
-               mptcp_pm_announce_addr(msk, &entry->addr, false);
+               mptcp_pm_announce_addr(msk, &entry->addr, false, entry->addr.port);
                mptcp_pm_add_addr_send_ack(msk);
                entry->retrans_times++;
        }
@@ -328,7 +328,7 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
                if (local) {
                        if (mptcp_pm_alloc_anno_list(msk, local)) {
                                msk->pm.add_addr_signaled++;
-                               mptcp_pm_announce_addr(msk, &local->addr, false);
+                               mptcp_pm_announce_addr(msk, &local->addr, false, local->addr.port);
                                mptcp_pm_nl_add_addr_send_ack(msk);
                        }
                } else {
@@ -376,6 +376,7 @@ void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
        struct sock *sk = (struct sock *)msk;
        struct mptcp_addr_info remote;
        struct mptcp_addr_info local;
+       bool use_port = false;
 
        pr_debug("accepted %d:%d remote family %d",
                 msk->pm.add_addr_accepted, msk->pm.add_addr_accept_max,
@@ -392,6 +393,8 @@ void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
        remote = msk->pm.remote;
        if (!remote.port)
                remote.port = sk->sk_dport;
+       else
+               use_port = true;
        memset(&local, 0, sizeof(local));
        local.family = remote.family;
 
@@ -399,7 +402,7 @@ void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
        __mptcp_subflow_connect((struct sock *)msk, &local, &remote);
        spin_lock_bh(&msk->pm.lock);
 
-       mptcp_pm_announce_addr(msk, &remote, true);
+       mptcp_pm_announce_addr(msk, &remote, true, use_port);
        mptcp_pm_nl_add_addr_send_ack(msk);
 }
 
index d69b4fc..e880fa8 100644 (file)
@@ -552,7 +552,7 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk,
 
 int mptcp_pm_announce_addr(struct mptcp_sock *msk,
                           const struct mptcp_addr_info *addr,
-                          bool echo);
+                          bool echo, bool port);
 int mptcp_pm_remove_addr(struct mptcp_sock *msk, u8 local_id);
 int mptcp_pm_remove_subflow(struct mptcp_sock *msk, u8 local_id);