OSDN Git Service

mptcp: add the outgoing ADD_ADDR port support
authorGeliang Tang <geliangtang@gmail.com>
Wed, 9 Dec 2020 23:51:22 +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 add_addr_signal type named MPTCP_ADD_ADDR_PORT,
to identify it is an address with port to be added.

It also added a new parameter 'port' for both mptcp_add_addr_len and
mptcp_pm_add_addr_signal.

In mptcp_established_options_add_addr, we check whether the announced
address is added with port. If it is, we put this port number to
mptcp_out_options's port field.

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 f841128..faae58c 100644 (file)
@@ -587,6 +587,7 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *
        unsigned int opt_size = *size;
        struct mptcp_addr_info saddr;
        bool echo;
+       bool port;
        int len;
 
        if (mptcp_pm_should_add_signal_ipv6(msk) &&
@@ -598,10 +599,10 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *
        }
 
        if (!mptcp_pm_should_add_signal(msk) ||
-           !(mptcp_pm_add_addr_signal(msk, remaining, &saddr, &echo)))
+           !(mptcp_pm_add_addr_signal(msk, remaining, &saddr, &echo, &port)))
                return false;
 
-       len = mptcp_add_addr_len(saddr.family, echo);
+       len = mptcp_add_addr_len(saddr.family, echo, port);
        if (remaining < len)
                return false;
 
@@ -609,6 +610,8 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *
        if (drop_other_suboptions)
                *size -= opt_size;
        opts->addr_id = saddr.id;
+       if (port)
+               opts->port = ntohs(saddr.port);
        if (saddr.family == AF_INET) {
                opts->suboptions |= OPTION_MPTCP_ADD_ADDR;
                opts->addr = saddr.addr;
@@ -631,7 +634,8 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *
                }
        }
 #endif
-       pr_debug("addr_id=%d, ahmac=%llu, echo=%d", opts->addr_id, opts->ahmac, echo);
+       pr_debug("addr_id=%d, ahmac=%llu, echo=%d, port=%d",
+                opts->addr_id, opts->ahmac, echo, opts->port);
 
        return true;
 }
index 75c5040..6d4be02 100644 (file)
@@ -188,7 +188,7 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, u8 rm_id)
 /* path manager helpers */
 
 bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
-                             struct mptcp_addr_info *saddr, bool *echo)
+                             struct mptcp_addr_info *saddr, bool *echo, bool *port)
 {
        int ret = false;
 
@@ -199,8 +199,9 @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
                goto out_unlock;
 
        *echo = mptcp_pm_should_add_signal_echo(msk);
+       *port = mptcp_pm_should_add_signal_port(msk);
 
-       if (remaining < mptcp_add_addr_len(msk->pm.local.family, *echo))
+       if (remaining < mptcp_add_addr_len(msk->pm.local.family, *echo, *port))
                goto out_unlock;
 
        *saddr = msk->pm.local;
index 9315f6a..d69b4fc 100644 (file)
@@ -172,6 +172,7 @@ enum mptcp_add_addr_status {
        MPTCP_ADD_ADDR_SIGNAL,
        MPTCP_ADD_ADDR_ECHO,
        MPTCP_ADD_ADDR_IPV6,
+       MPTCP_ADD_ADDR_PORT,
 };
 
 struct mptcp_pm_data {
@@ -570,12 +571,17 @@ static inline bool mptcp_pm_should_add_signal_ipv6(struct mptcp_sock *msk)
        return READ_ONCE(msk->pm.add_addr_signal) & BIT(MPTCP_ADD_ADDR_IPV6);
 }
 
+static inline bool mptcp_pm_should_add_signal_port(struct mptcp_sock *msk)
+{
+       return READ_ONCE(msk->pm.add_addr_signal) & BIT(MPTCP_ADD_ADDR_PORT);
+}
+
 static inline bool mptcp_pm_should_rm_signal(struct mptcp_sock *msk)
 {
        return READ_ONCE(msk->pm.rm_addr_signal);
 }
 
-static inline unsigned int mptcp_add_addr_len(int family, bool echo)
+static inline unsigned int mptcp_add_addr_len(int family, bool echo, bool port)
 {
        u8 len = TCPOLEN_MPTCP_ADD_ADDR_BASE;
 
@@ -583,12 +589,14 @@ static inline unsigned int mptcp_add_addr_len(int family, bool echo)
                len = TCPOLEN_MPTCP_ADD_ADDR6_BASE;
        if (!echo)
                len += MPTCPOPT_THMAC_LEN;
+       if (port)
+               len += TCPOLEN_MPTCP_PORT_LEN;
 
        return len;
 }
 
 bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
-                             struct mptcp_addr_info *saddr, bool *echo);
+                             struct mptcp_addr_info *saddr, bool *echo, bool *port);
 bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
                             u8 *rm_id);
 int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);