diff mbox series

[mptcp-next,2/8] mptcp: add the outgoing ADD_ADDR port support

Message ID 28c900686b7ce170435daec8d9cd71527636a8af.1603952836.git.geliangtang@gmail.com
State Superseded, archived
Delegated to: Mat Martineau
Headers show
Series ADD_ADDR: ports support | expand

Commit Message

Geliang Tang Oct. 29, 2020, 6:39 a.m. UTC
This patch added a new add_addr_signal type named MPTCP_ADD_ADDR_PORT,
to identify this is an address with port.

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

Signed-off-by: Geliang Tang <geliangtang@gmail.com>
---
 net/mptcp/options.c  | 10 +++++++---
 net/mptcp/pm.c       |  5 +++--
 net/mptcp/protocol.h | 17 +++++++++++++++--
 3 files changed, 25 insertions(+), 7 deletions(-)

Comments

Mat Martineau Oct. 30, 2020, 11:55 p.m. UTC | #1
On Thu, 29 Oct 2020, Geliang Tang wrote:

> This patch added a new add_addr_signal type named MPTCP_ADD_ADDR_PORT,
> to identify this is an address with port.
>
> It also added a new argument 'port' for both mptcp_add_addr_len and
> mptcp_pm_add_addr_signal.
>
> Signed-off-by: Geliang Tang <geliangtang@gmail.com>
> ---
> net/mptcp/options.c  | 10 +++++++---
> net/mptcp/pm.c       |  5 +++--
> net/mptcp/protocol.h | 17 +++++++++++++++--
> 3 files changed, 25 insertions(+), 7 deletions(-)
>
> diff --git a/net/mptcp/options.c b/net/mptcp/options.c
> index 7c928286c0da..24117c45f4e1 100644
> --- a/net/mptcp/options.c
> +++ b/net/mptcp/options.c
> @@ -586,6 +586,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) &&
> @@ -597,10 +598,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;
>
> @@ -608,6 +609,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 = saddr.port;
> 	if (saddr.family == AF_INET) {
> 		opts->suboptions |= OPTION_MPTCP_ADD_ADDR;
> 		opts->addr = saddr.addr;
> @@ -630,7 +633,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, ntohs(opts->port));

Remove ntohs() if opts->port converted to u16.

>
> 	return true;
> }
> diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
> index 75c5040e8d5d..6d4be02681fa 100644
> --- a/net/mptcp/pm.c
> +++ b/net/mptcp/pm.c
> @@ -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;
> diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
> index f303c46bcc29..2a5db34f63bf 100644
> --- a/net/mptcp/protocol.h
> +++ b/net/mptcp/protocol.h
> @@ -171,6 +171,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 {
> @@ -539,13 +540,25 @@ 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)
> {
> +	if (port) {
> +		if (family == AF_INET)
> +			return echo ? TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT
> +				    : TCPOLEN_MPTCP_ADD_ADDR_PORT;
> +		return echo ? TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT : TCPOLEN_MPTCP_ADD_ADDR6_PORT;
> +	}
> +
> 	if (family == AF_INET)
> 		return echo ? TCPOLEN_MPTCP_ADD_ADDR_BASE
> 			    : TCPOLEN_MPTCP_ADD_ADDR;

This helper function is getting kind of complicated for what it does. Can 
you convert it to add up the correct size rather than returning one of the 
eight constants?

Like:

unsigned int len = TCPOLEN_MPTCP_ADD_ADDR_BASE;

if (echo)
         len += 8;

if (family == AF_INET6)
         len += 12;
...

> @@ -553,7 +566,7 @@ static inline unsigned int mptcp_add_addr_len(int family, bool echo)
> }
>
> 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);
> -- 
> 2.26.2

--
Mat Martineau
Intel
diff mbox series

Patch

diff --git a/net/mptcp/options.c b/net/mptcp/options.c
index 7c928286c0da..24117c45f4e1 100644
--- a/net/mptcp/options.c
+++ b/net/mptcp/options.c
@@ -586,6 +586,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) &&
@@ -597,10 +598,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;
 
@@ -608,6 +609,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 = saddr.port;
 	if (saddr.family == AF_INET) {
 		opts->suboptions |= OPTION_MPTCP_ADD_ADDR;
 		opts->addr = saddr.addr;
@@ -630,7 +633,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, ntohs(opts->port));
 
 	return true;
 }
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index 75c5040e8d5d..6d4be02681fa 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -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;
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index f303c46bcc29..2a5db34f63bf 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -171,6 +171,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 {
@@ -539,13 +540,25 @@  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)
 {
+	if (port) {
+		if (family == AF_INET)
+			return echo ? TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT
+				    : TCPOLEN_MPTCP_ADD_ADDR_PORT;
+		return echo ? TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT : TCPOLEN_MPTCP_ADD_ADDR6_PORT;
+	}
+
 	if (family == AF_INET)
 		return echo ? TCPOLEN_MPTCP_ADD_ADDR_BASE
 			    : TCPOLEN_MPTCP_ADD_ADDR;
@@ -553,7 +566,7 @@  static inline unsigned int mptcp_add_addr_len(int family, bool echo)
 }
 
 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);