All of lore.kernel.org
 help / color / mirror / Atom feed
* [MPTCP] Re: [MPTCP][PATCH v3 mptcp-next 1/2] mptcp: convert IPv4 address with IPv4-mapped address
@ 2020-12-18 23:06 Mat Martineau
  0 siblings, 0 replies; only message in thread
From: Mat Martineau @ 2020-12-18 23:06 UTC (permalink / raw)
  To: mptcp

[-- Attachment #1: Type: text/plain, Size: 4754 bytes --]

On Fri, 18 Dec 2020, Geliang Tang wrote:

> Currently, PM doesn't create subflow with IPv4-mapped IPv6 socket. This
> patch added IPv4-mapped Ipv6 address support, by converting the IPv4
> address with IPv4-mapped IPv6 address.
>
> Co-developed-by: Matthieu Baerts <matthieu.baerts(a)tessares.net>
> Signed-off-by: Matthieu Baerts <matthieu.baerts(a)tessares.net>
> Signed-off-by: Geliang Tang <geliangtang(a)gmail.com>
> ---
> net/mptcp/pm_netlink.c | 21 ++++++++++++---------
> net/mptcp/subflow.c    | 22 +++++++++++++++-------
> 2 files changed, 27 insertions(+), 16 deletions(-)
>
> diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
> index 9b1f6298bbdb..9c688023f494 100644
> --- a/net/mptcp/pm_netlink.c
> +++ b/net/mptcp/pm_netlink.c
> @@ -60,15 +60,19 @@ static bool addresses_equal(const struct mptcp_addr_info *a,
> {
> 	bool addr_equals = false;
>
> -	if (a->family != b->family)
> -		return false;
> -
> -	if (a->family == AF_INET)
> -		addr_equals = a->addr.s_addr == b->addr.s_addr;
> +	if (a->family == b->family) {
> +		if (a->family == AF_INET)
> +			addr_equals = a->addr.s_addr == b->addr.s_addr;
> #if IS_ENABLED(CONFIG_MPTCP_IPV6)
> -	else
> -		addr_equals = !ipv6_addr_cmp(&a->addr6, &b->addr6);
> +		else
> +			addr_equals = !ipv6_addr_cmp(&a->addr6, &b->addr6);
> +	} else {
> +		if (a->family == AF_INET && ipv6_addr_v4mapped(&b->addr6))
> +			addr_equals = a->addr.s_addr == b->addr6.s6_addr32[3];
> +		if (b->family == AF_INET && ipv6_addr_v4mapped(&a->addr6))
> +			addr_equals = a->addr6.s6_addr32[3] == b->addr.s_addr;
> #endif
> +	}
>
> 	if (!addr_equals)
> 		return false;
> @@ -147,8 +151,7 @@ select_local_address(const struct pm_nl_pernet *pernet,
> 		/* avoid any address already in use by subflows and
> 		 * pending join
> 		 */
> -		if (entry->addr.family == ((struct sock *)msk)->sk_family &&
> -		    !lookup_subflow_by_saddr(&msk->conn_list, &entry->addr)) {
> +		if (!lookup_subflow_by_saddr(&msk->conn_list, &entry->addr)) {
> 			ret = entry;
> 			break;
> 		}
> diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
> index 278cbe3e539e..8586d95310e2 100644
> --- a/net/mptcp/subflow.c
> +++ b/net/mptcp/subflow.c
> @@ -1074,21 +1074,29 @@ void mptcpv6_handle_mapped(struct sock *sk, bool mapped)
> #endif
>
> static void mptcp_info2sockaddr(const struct mptcp_addr_info *info,
> -				struct sockaddr_storage *addr)
> +				struct sockaddr_storage *addr,
> +				unsigned short family)
> {
> 	memset(addr, 0, sizeof(*addr));
> -	addr->ss_family = info->family;
> +	addr->ss_family = family;
> 	if (addr->ss_family == AF_INET) {
> 		struct sockaddr_in *in_addr = (struct sockaddr_in *)addr;
>
> -		in_addr->sin_addr = info->addr;
> +		if (info->family == AF_INET)
> +			in_addr->sin_addr = info->addr;

> +		else
> +			in_addr->sin_addr.s_addr = info->addr6.s6_addr32[3];

One small fix - addr6 needs CONFIG_MPTCP_IPV6, this breaks non-IPv6 
builds.

The rest looks good to me! Tests pass on my system.

Mat


> 		in_addr->sin_port = info->port;
> 	}
> #if IS_ENABLED(CONFIG_MPTCP_IPV6)
> 	else if (addr->ss_family == AF_INET6) {
> 		struct sockaddr_in6 *in6_addr = (struct sockaddr_in6 *)addr;
>
> -		in6_addr->sin6_addr = info->addr6;
> +		if (info->family == AF_INET)
> +			ipv6_addr_set_v4mapped(info->addr.s_addr,
> +					       &in6_addr->sin6_addr);
> +		else
> +			in6_addr->sin6_addr = info->addr6;
> 		in6_addr->sin6_port = info->port;
> 	}
> #endif
> @@ -1132,11 +1140,11 @@ int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc,
> 	subflow->remote_key = msk->remote_key;
> 	subflow->local_key = msk->local_key;
> 	subflow->token = msk->token;
> -	mptcp_info2sockaddr(loc, &addr);
> +	mptcp_info2sockaddr(loc, &addr, ssk->sk_family);
>
> 	addrlen = sizeof(struct sockaddr_in);
> #if IS_ENABLED(CONFIG_MPTCP_IPV6)
> -	if (loc->family == AF_INET6)
> +	if (addr.ss_family == AF_INET6)
> 		addrlen = sizeof(struct sockaddr_in6);
> #endif
> 	ssk->sk_bound_dev_if = loc->ifindex;
> @@ -1152,7 +1160,7 @@ int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc,
> 	subflow->remote_id = remote_id;
> 	subflow->request_join = 1;
> 	subflow->request_bkup = !!(loc->flags & MPTCP_PM_ADDR_FLAG_BACKUP);
> -	mptcp_info2sockaddr(remote, &addr);
> +	mptcp_info2sockaddr(remote, &addr, ssk->sk_family);
>
> 	mptcp_add_pending_subflow(msk, subflow);
> 	err = kernel_connect(sf, (struct sockaddr *)&addr, addrlen, O_NONBLOCK);
> -- 
> 2.29.2
> _______________________________________________
> mptcp mailing list -- mptcp(a)lists.01.org
> To unsubscribe send an email to mptcp-leave(a)lists.01.org
>

--
Mat Martineau
Intel

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-12-18 23:06 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-18 23:06 [MPTCP] Re: [MPTCP][PATCH v3 mptcp-next 1/2] mptcp: convert IPv4 address with IPv4-mapped address Mat Martineau

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.