From patchwork Fri Sep 18 14:19:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 1366961 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.01.org (client-ip=2001:19d0:306:5::1; helo=ml01.01.org; envelope-from=mptcp-bounces@lists.01.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=GAhPDDxp; dkim-atps=neutral Received: from ml01.01.org (ml01.01.org [IPv6:2001:19d0:306:5::1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4BtGHc3TB7z9sRR for ; Sat, 19 Sep 2020 00:22:04 +1000 (AEST) Received: from ml01.vlan13.01.org (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 58C571495E842; Fri, 18 Sep 2020 07:22:02 -0700 (PDT) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=2607:f8b0:4864:20::441; helo=mail-pf1-x441.google.com; envelope-from=geliangtang@gmail.com; receiver= Received: from mail-pf1-x441.google.com (mail-pf1-x441.google.com [IPv6:2607:f8b0:4864:20::441]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 7E56D13E115EE for ; Fri, 18 Sep 2020 07:22:00 -0700 (PDT) Received: by mail-pf1-x441.google.com with SMTP id w7so3539082pfi.4 for ; Fri, 18 Sep 2020 07:22:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=in5YyctRTces4c6tpWmhs7z0azq/GOovghspKkQGbU8=; b=GAhPDDxpegr90ZfCp8CBYS1lOVX6/f4Mq/CZytMvedJlbfDAvCERc6WkDvBWe2saAR BmMKWkfECa/Ix9Hf0GxDOnEQMynPFuHoW4MvjHR6sdIv2GpX63fmUh+Jx02Y/ErUcWZb DtL80JJRuqBryedL/7gsRIqK40immz6X0B6RpbheyXohXBB3BNRj0VTToC+7GiZuQ94A K/MDGvwezTCNi+QbAnc6HpiisXTvRARU5DngvanpOj5CGFvYqrA+IWnqZ6KKh8RjyvzU W+KLmngk5OyjS7h4M6omRHHSq2tKBoMfeh415CEkbi8KJPPRCQl9ighwGvUjF+4lotJt JYGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=in5YyctRTces4c6tpWmhs7z0azq/GOovghspKkQGbU8=; b=ZAPN0XEf8MTcBQ5/UHZ2y1gZCn463DR2jPub+UOB3+18YLUFHfWWvpnODvLKoB135+ 69vnYpVtVLvB5P/n6gUPDvvPY5k/1ANfh61boAf1cN/VEs0eRif9K0pt0OzY1vnZ7XFd s92Jo41hqagXX/5GHfGHlNzJY2BlJHoCi8QQcu/pfcXdwZSCCuVf3Z5vkw1RxEc3CWUI nAHOhoLksoSgpnoWqxM+XpeOmkM8WYrG/reRrXQJDEWewSt/lvFHBywJ8oNmClKJiqoc 6suTzA6/lixxHrdJdXIKVph2JczryHpDRoHBgwFsOH9YOgJ/9egxKRn9qqncTABdxLxR lNZw== X-Gm-Message-State: AOAM5329nbc84KzcT1sxjxUan5mHMJ8ZCTHbKUO9hNac/Azx+I8LiCTh NXy+vLwGNkAI0+h1xCnFZxNw+5I/3LNdSA== X-Google-Smtp-Source: ABdhPJwIiZUb2dja1+qKSsdkKt03corcxSmLW0eTwo8ts6DJjB+110Ud/cSLpvmXuddAgPKVvYDxUA== X-Received: by 2002:a63:841:: with SMTP id 62mr27328330pgi.35.1600438919200; Fri, 18 Sep 2020 07:21:59 -0700 (PDT) Received: from localhost ([43.224.245.180]) by smtp.gmail.com with ESMTPSA id t24sm3417851pgo.51.2020.09.18.07.21.58 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 18 Sep 2020 07:21:58 -0700 (PDT) From: Geliang Tang To: mptcp@lists.01.org Date: Fri, 18 Sep 2020 22:19:36 +0800 Message-Id: <7d1d38ff0d05925e96ddb0782f8c5e3e1206590f.1600438707.git.geliangtang@gmail.com> X-Mailer: git-send-email 2.17.1 Message-ID-Hash: JJMUZTOM6VU3DFNSWA4T5HIUQGEMP43I X-Message-ID-Hash: JJMUZTOM6VU3DFNSWA4T5HIUQGEMP43I X-MailFrom: geliangtang@gmail.com X-Mailman-Rule-Hits: member-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address CC: Geliang Tang X-Mailman-Version: 3.1.1 Precedence: list Subject: [MPTCP] [MPTCP][PATCH mptcp-next] mptcp: add ADD_ADDR IPv6 support List-Id: Discussions regarding MPTCP upstreaming Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 When ADD_ADDR suboption include an IPv6 address, the size is 28 octets. It will not fit when other options are included, e.g. TCP Timestamps. So here we send out a mptcp dedicated packet to carry only mptcp options. Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/55 Signed-off-by: Geliang Tang --- include/linux/tcp.h | 1 + net/ipv4/tcp_output.c | 14 ++++++++ net/mptcp/options.c | 5 +-- net/mptcp/pm.c | 22 +++++++++++-- net/mptcp/protocol.h | 3 +- .../testing/selftests/net/mptcp/mptcp_join.sh | 33 ++++++++++++++++++- 6 files changed, 72 insertions(+), 6 deletions(-) diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 2f87377e9af7..847442ac5b26 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h @@ -392,6 +392,7 @@ struct tcp_sock { */ #if IS_ENABLED(CONFIG_MPTCP) bool is_mptcp; + bool mptcp_dedicated; #endif #if IS_ENABLED(CONFIG_SMC) bool syn_smc; /* SYN includes SMC */ diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 88f6872751d3..0089ed3969a0 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -921,6 +921,20 @@ static unsigned int tcp_established_options(struct sock *sk, struct sk_buff *skb opts->options = 0; *md5 = NULL; + + if (sk_is_mptcp(sk) && tp->mptcp_dedicated) { + unsigned int remaining = MAX_TCP_OPTION_SPACE - size; + unsigned int opt_size = 0; + + if (mptcp_established_options(sk, skb, &opt_size, remaining, + &opts->mptcp)) { + opts->options |= OPTION_MPTCP; + size += opt_size; + } + + return size; + } + #ifdef CONFIG_TCP_MD5SIG if (static_branch_unlikely(&tcp_md5_needed) && rcu_access_pointer(tp->md5sig_info)) { diff --git a/net/mptcp/options.c b/net/mptcp/options.c index 171039cbe9c4..f0ca3ed4dba8 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -243,7 +243,8 @@ static void mptcp_parse_option(const struct sk_buff *skb, mp_opt->add_addr = 1; mp_opt->port = 0; mp_opt->addr_id = *ptr++; - pr_debug("ADD_ADDR: id=%d, echo=%d", mp_opt->addr_id, mp_opt->echo); + pr_debug("ADD_ADDR%s: id=%d, echo=%d", (mp_opt->family == 6) ? "6" : "", + mp_opt->addr_id, mp_opt->echo); if (mp_opt->family == MPTCP_ADDR_IPVERSION_4) { memcpy((u8 *)&mp_opt->addr.s_addr, (u8 *)ptr, 4); ptr += 4; @@ -584,7 +585,7 @@ static bool mptcp_established_options_add_addr(struct sock *sk, int len; if (!mptcp_pm_should_add_signal(msk) || - !(mptcp_pm_add_addr_signal(msk, remaining, &saddr, &echo))) + !(mptcp_pm_add_addr_signal(msk, sk, remaining, &saddr, &echo))) return false; len = mptcp_add_addr_len(saddr.family); diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 6ca88422e774..0b015f8bdd34 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -170,11 +170,22 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, u8 rm_id) spin_unlock_bh(&pm->lock); } +static void mptcp_send_dedicated_ack(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + + tp->mptcp_dedicated = true; + tcp_send_ack(sk); + tp->mptcp_dedicated = false; +} + /* path manager helpers */ -bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining, +bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, struct sock *ssk, + unsigned int remaining, struct mptcp_addr_info *saddr, bool *echo) { + bool add_addr6 = false; int ret = false; spin_lock_bh(&msk->pm.lock); @@ -183,8 +194,11 @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining, if (!mptcp_pm_should_add_signal(msk)) goto out_unlock; - if (remaining < mptcp_add_addr_len(msk->pm.local.family)) + if (remaining < mptcp_add_addr_len(msk->pm.local.family)) { + if (msk->pm.local.family == AF_INET6) + add_addr6 = true; goto out_unlock; + } *saddr = msk->pm.local; *echo = READ_ONCE(msk->pm.add_addr_echo); @@ -193,6 +207,10 @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining, out_unlock: spin_unlock_bh(&msk->pm.lock); + + if (add_addr6) + mptcp_send_dedicated_ack(ssk); + return ret; } diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index db1e5de2fee7..da662a436722 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -468,7 +468,8 @@ static inline unsigned int mptcp_add_addr_len(int family) return TCPOLEN_MPTCP_ADD_ADDR6; } -bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining, +bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, struct sock *sk, + unsigned int remaining, struct mptcp_addr_info *saddr, bool *echo); bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining, u8 *rm_id); diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh index 08f53d86dedc..b37e63b04772 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh @@ -126,6 +126,12 @@ do_ping() fi } +# $1: IP address +is_v6() +{ + [ -z "${1##*:*}" ] +} + do_transfer() { listener_ns="$1" @@ -165,7 +171,15 @@ do_transfer() mptcp_connect="./mptcp_connect -r" fi - ip netns exec ${listener_ns} $mptcp_connect -t $timeout -l -p $port -s ${srv_proto} 0.0.0.0 < "$sin" > "$sout" & + local local_addr + if is_v6 "${connect_addr}"; then + local_addr="::" + mptcp_connect="./mptcp_connect -r" + else + local_addr="0.0.0.0" + fi + + ip netns exec ${listener_ns} $mptcp_connect -t $timeout -l -p $port -s ${srv_proto} ${local_addr} < "$sin" > "$sout" & spid=$! sleep 1 @@ -491,6 +505,23 @@ run_tests $ns1 $ns2 10.0.1.1 chk_join_nr "multiple subflows and signal" 3 3 3 chk_add_nr 1 1 +# subflow IPv6 +reset +ip netns exec $ns1 ./pm_nl_ctl limits 0 1 +ip netns exec $ns2 ./pm_nl_ctl limits 0 1 +ip netns exec $ns2 ./pm_nl_ctl add dead:beef:3::2 flags subflow +run_tests $ns1 $ns2 dead:beef:1::1 +chk_join_nr "single subflow IPv6" 1 1 1 + +# signal address IPv6 +reset +ip netns exec $ns1 ./pm_nl_ctl limits 0 1 +ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal +ip netns exec $ns2 ./pm_nl_ctl limits 1 1 +run_tests $ns1 $ns2 dead:beef:1::1 +chk_join_nr "single address IPv6" 1 1 1 +chk_add_nr 1 1 + # single subflow, remove reset ip netns exec $ns1 ./pm_nl_ctl limits 0 1