From patchwork Wed Jul 3 18:57:32 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthieu Baerts X-Patchwork-Id: 13722717 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4BE7C18C334; Wed, 3 Jul 2024 18:58:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720033097; cv=none; b=P0myGThwqGWIVF77l6Rcv5tXdwxol1cYnC4mUuI8I0Db6/ObQnkCtVj4PsTh8c6mBhwCUyrmE1LdVQCvjGCxPl3TshcWlUawbX3672eXbCdFreOSKIwHuBQs01rblY8+uKEbbj8qDvDchPf5keQLS0yRplOsT5Rpa48SMTZOhTs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720033097; c=relaxed/simple; bh=/K688bWxCbz/40YsdYV732cI2lnwaSfpa2N/5rT1qss=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XHCEuH64HCePinFXfTv1iUhVviYUq2I3UnkPoxTRQ9PgW7yydAraSF3hNj1xXfPi6ujD/mc+kUojoMzk6awqhNX0YRczSL/LK515tLtiybxWk8oCNXk7yQeSdMDhNClhV5koYhBXK6S+Em+Kt9wBySN5UpJn5UYBrsxkiuIy1JU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JXG8rynO; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="JXG8rynO" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 67A79C32781; Wed, 3 Jul 2024 18:58:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1720033096; bh=/K688bWxCbz/40YsdYV732cI2lnwaSfpa2N/5rT1qss=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=JXG8rynOWSh+DrYqgIWENjw3UZEfFtMR8EF0KAE5ma3DW7YcSecykSJnAgxw3Vy/i Rn5XEigv2uTLLUyoRzMB7F3Ilm7KiwfrB0zfDVlZ7edWdYSLrV3M05577+KlXE3uAq EEyslQxj/cB0w8mDWcWn5J9tmD6u/3ZGhQwKUSxym5D/rpL+Qfp+1MkjAkDBqXiVSp 3AlgxS+T6sZKw7nKM5R/WF9GXy0EhWpVzq1NZnen0xwKd1mAtqqf5lYbrmEo4g8HN+ 4ApDffWR3jjmVhvFjqaeBAm46MrFSjAphT0RVq5sXb8gBACUXN1/7ftVhScN5g/s6X gR6YguqUzWMCw== From: "Matthieu Baerts (NGI0)" Date: Wed, 03 Jul 2024 20:57:32 +0200 Subject: [PATCH bpf-next v3 1/3] selftests/bpf: Add mptcp subflow example Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240703-upstream-bpf-next-20240506-mptcp-subflow-test-v3-1-ebdc2d494049@kernel.org> References: <20240703-upstream-bpf-next-20240506-mptcp-subflow-test-v3-0-ebdc2d494049@kernel.org> In-Reply-To: <20240703-upstream-bpf-next-20240506-mptcp-subflow-test-v3-0-ebdc2d494049@kernel.org> To: mptcp@lists.linux.dev, Mat Martineau , Geliang Tang , Andrii Nakryiko , Eduard Zingerman , Mykola Lysenko , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , Shuah Khan , "David S. Miller" , Jakub Kicinski , Jesper Dangaard Brouer Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, "Matthieu Baerts (NGI0)" , Nicolas Rybowski , Geliang Tang X-Mailer: b4 0.14.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=4209; i=matttbe@kernel.org; h=from:subject:message-id; bh=8LIsOEqtSsrfu9qHTzMNH2/0Gf2ZWWs2EYf0FocaPOw=; b=owEBbQKS/ZANAwAIAfa3gk9CaaBzAcsmYgBmhZ89Q6kfMhdSjZgckDauEayNuZlLBUTR5OMKn 3G41v+djRCJAjMEAAEIAB0WIQToy4X3aHcFem4n93r2t4JPQmmgcwUCZoWfPQAKCRD2t4JPQmmg c6TmEADVpcXozHm0MhH2Hjag6HNPAdCL+QiRGhnemlX29T4SNnopT2kLseEZmJMxq8j00pSNlP6 SkTUbX/P8Balfkn21N/zieosRK6nAO47MgvO4hFaRHiU+yE+0OCubk1+dH6e5+6K173C02IijIS Dfq6HZqdO2X8n+kPftAnvbbDMMYzTcXh384zZ5NATTtcA/Gg/smF1gBf729toROtNGJE5NS15jg PgFfck8U7iXVK3TIJhmAoTstB/qefaOeEaHOg5j3cy2qGZlCPffyQhjy3m/OCPFjd8cRWE9/QTU 8Dhw85n56bIIiWkDrAb6WPCk2uxYvAl3+GHGDVv+iLsotqqt4gLvR7j53Zv8D+6fB4LdU+JURiy O8bqXyq8Ws7Xaf2rqZ1n+lHRc2ABP0Pgs5jwBm+gBSAXICoKIPE7DKEXAnQwicI8/byl5xgfZlP hib2Cvi7T557mQXZEi8c3o1fiidi2Re/CTPrltfgr+9FoWSquhI+ShCCxOlYDNpU6IoZ1jx6dDU Ai2lB4TfMy6W0viXM0gtGphM6RiewFwgUIqjvW7bCpTsJTqDy7h0YaLJyVuoO1fcIbPwtJqiM29 DzOPu9My74yztw02E9q5OmpqHSnpDl0839LY86ZHr0UINkG2DkJNPEyJeK3gNkaLxYMRDNXpG9m Xlxu7HJ7odxkOQQ== X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 From: Nicolas Rybowski Move Nicolas' patch into bpf selftests directory. This example adds a different mark (SO_MARK) on each subflow, and changes the TCP CC only on the first subflow. From the userspace, an application can do a setsockopt() on an MPTCP socket, and typically the same value will be propagated to all subflows (paths). If someone wants to have different values per subflow, the recommended way is to use BPF. So it is good to add such example here, and make sure there is no regressions. This example shows how it is possible to: Identify the parent msk of an MPTCP subflow. Put different sockopt for each subflow of a same MPTCP connection. Here especially, two different behaviours are implemented: A socket mark (SOL_SOCKET SO_MARK) is put on each subflow of a same MPTCP connection. The order of creation of the current subflow defines its mark. The TCP CC algorithm of the very first subflow of an MPTCP connection is set to "reno". This is just to show it is possible to identify an MPTCP connection, and set socket options, from different SOL levels, per subflow. "reno" has been picked because it is built-in and usually not set as default one. It is easy to verify with 'ss' that these modifications have been applied correctly. That's what the next patch is going to do. Nicolas' code comes from: commit 4d120186e4d6 ("bpf:examples: update mptcp_set_mark_kern.c") from the MPTCP repo https://github.com/multipath-tcp/mptcp_net-next (the "scripts" branch), and it has been adapted by Geliang. Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/76 Co-developed-by: Geliang Tang Signed-off-by: Geliang Tang Signed-off-by: Nicolas Rybowski Reviewed-by: Mat Martineau Signed-off-by: Matthieu Baerts (NGI0) --- Notes: - v1 -> v2: - The commit message has been updated: why setting multiple socket options, why reno, the verification is done in a later patch (different author). (Alexei) - v2 -> v3: - Only #include "bpf_tracing_net.h", linked to: https://lore.kernel.org/20240509175026.3423614-1-martin.lau@linux.dev --- tools/testing/selftests/bpf/progs/mptcp_subflow.c | 59 +++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/tools/testing/selftests/bpf/progs/mptcp_subflow.c b/tools/testing/selftests/bpf/progs/mptcp_subflow.c new file mode 100644 index 000000000000..bc572e1d6df8 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/mptcp_subflow.c @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2020, Tessares SA. */ +/* Copyright (c) 2024, Kylin Software */ + +/* vmlinux.h, bpf_helpers.h and other 'define' */ +#include "bpf_tracing_net.h" + +char _license[] SEC("license") = "GPL"; + +char cc[TCP_CA_NAME_MAX] = "reno"; + +/* Associate a subflow counter to each token */ +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(key_size, sizeof(__u32)); + __uint(value_size, sizeof(__u32)); + __uint(max_entries, 100); +} mptcp_sf SEC(".maps"); + +SEC("sockops") +int mptcp_subflow(struct bpf_sock_ops *skops) +{ + __u32 init = 1, key, mark, *cnt; + struct mptcp_sock *msk; + struct bpf_sock *sk; + int err; + + if (skops->op != BPF_SOCK_OPS_TCP_CONNECT_CB) + return 1; + + sk = skops->sk; + if (!sk) + return 1; + + msk = bpf_skc_to_mptcp_sock(sk); + if (!msk) + return 1; + + key = msk->token; + cnt = bpf_map_lookup_elem(&mptcp_sf, &key); + if (cnt) { + /* A new subflow is added to an existing MPTCP connection */ + __sync_fetch_and_add(cnt, 1); + mark = *cnt; + } else { + /* A new MPTCP connection is just initiated and this is its primary subflow */ + bpf_map_update_elem(&mptcp_sf, &key, &init, BPF_ANY); + mark = init; + } + + /* Set the mark of the subflow's socket based on appearance order */ + err = bpf_setsockopt(skops, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)); + if (err < 0) + return 1; + if (mark == 1) + err = bpf_setsockopt(skops, SOL_TCP, TCP_CONGESTION, cc, TCP_CA_NAME_MAX); + + return 1; +} From patchwork Wed Jul 3 18:57:33 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthieu Baerts X-Patchwork-Id: 13722718 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A917B187570; Wed, 3 Jul 2024 18:58:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720033102; cv=none; b=prjKePaHqyrJLLLq5zTHxJzKM7WC0eJv54iKwGKLb4uDLeBbNRM++rnZvJtQ3sg8mbXAECPGFgUfHqupjdjMg0JlpWRqrD9euHxpq7MfwS+RK28OiuEYKG1A2Invfm33vqk6+DKnh0IE2nCSX0CcwMzT+oCtHOshvm/TroM7qc4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720033102; c=relaxed/simple; bh=VoE1ILimCqHk/YEb77HzYZmafHMCPkpjf277zBCgqn4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aRZPt7TvIzsbt+e043hAmBJRf2w6ZryIut/K1dOxWUy8Lck0aonMfr5gUkAOFnlC778sylAleEkWIPMLKicFXdZt1iMQFvitVoLwtH5qu/JrKr3NIOm8Kao5eoMgDWYuYTYhAJ68wtQ0lB5V+n9RT49yN0tnnS0+2xXshF4GYyM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=njRdy4Yj; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="njRdy4Yj" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 302A2C4AF0A; Wed, 3 Jul 2024 18:58:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1720033102; bh=VoE1ILimCqHk/YEb77HzYZmafHMCPkpjf277zBCgqn4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=njRdy4YjVI9U+jv7lJefsam78iojDnr0G80PZ2qjWXnSSyQUur7KMnLJpRu+gwgDx TTErMXS61l6+2dndZBdvph8UMXNKH3IIWYecF9AN32Fj8GeRuzj211lO4rrrNf7554 COp3mNM0DIce+ZZEcpasFtakCc9CY4adM0fn2qnYakyrZQhiK9AaRCWeEDqf33+REB 0W3qweQUKLIr/b/W2istHXjTkpKRnv+OOT2rsZ3d6SZKIAsgV+tMcYmBD2jykZYcUd TgJdzAVhepdGDhs/v+GELmPfSvpz4HXAt3XjQ8BnC8acltc1VvwITzi4ELkkALJmFq WJdOo72sj4SSw== From: "Matthieu Baerts (NGI0)" Date: Wed, 03 Jul 2024 20:57:33 +0200 Subject: [PATCH bpf-next v3 2/3] selftests/bpf: Add mptcp pm_nl_ctl link Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240703-upstream-bpf-next-20240506-mptcp-subflow-test-v3-2-ebdc2d494049@kernel.org> References: <20240703-upstream-bpf-next-20240506-mptcp-subflow-test-v3-0-ebdc2d494049@kernel.org> In-Reply-To: <20240703-upstream-bpf-next-20240506-mptcp-subflow-test-v3-0-ebdc2d494049@kernel.org> To: mptcp@lists.linux.dev, Mat Martineau , Geliang Tang , Andrii Nakryiko , Eduard Zingerman , Mykola Lysenko , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , Shuah Khan , "David S. Miller" , Jakub Kicinski , Jesper Dangaard Brouer Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, "Matthieu Baerts (NGI0)" , Geliang Tang X-Mailer: b4 0.14.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=2481; i=matttbe@kernel.org; h=from:subject:message-id; bh=DrossgVs4wFMMCErNvKxWMQ2m+UYYVayQgbZBaY+EqY=; b=owEBbQKS/ZANAwAIAfa3gk9CaaBzAcsmYgBmhZ89PjoNh4U76dfEkvQVWWraM1scfYPvEllIG 12Gw2KLEOqJAjMEAAEIAB0WIQToy4X3aHcFem4n93r2t4JPQmmgcwUCZoWfPQAKCRD2t4JPQmmg c26RD/9JDCtmw3uszrPvUgqQNbBiZk1dkLb4j4Mm4R6u2oK5aGjx2NjiU0zvN8Me2Yhblq9pdG7 dpmL2dr+kUuZt9go/aauQV0TOhx9UaL0GXGkj4sALZLyjctLYZRAuvjGJ7YIkebv68ApzHaQsp1 UPZSY4YKtX9QCajnETOsCkeoyFWHmY9UOZlhjJowVuulv6LpnuRZQoMEqGouKnH9BvAQ+uDhwRG 4iF4VvgRl1RYJcCfJvwDnlRIsnOmlZNUjmXDFIwb3hpy8b5AxBdgJS7FGB+uFBWzxBNZKZJGMN3 2PzkLeua01nUFjULDRe+aK13NIwmUoJRmeKigkTQtubOEmu//22rBwFsivszzJjWSGloFrt3PFm vnMdAV2wOdJm7N6lT/cWwAs2YdSM3+PzXBXRI7PV2uMcgnH9kFJU9NQISNvD5oIPap4fDY4gLnM 9rkSE+ai+6ptPWK+AE191jxfaLpmxf4XCEgfiWZz1/+JjLUAlezcK6Wx1wb7cfVvI4zrVeVl+7k 7EK56UDFC1qbiXmXo3ZdVCKFurtXQAtLMpEkixTgaCnY6srvCYm4Lv1dQroS/nzmyGX/rEqE66z 0VJr8kKLPkRxodcRFF/NWiEkhLslto9NA63ueavi/xkIid81JxGz95bKMUuPF5dgxIM5oEDSUSm aKeN6HDlYY+hN0Q== X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 From: Geliang Tang This patch adds a symlink to MPTCP's pm_nl_ctl tool into bpf selftests, and updates Makefile to compile it. This is useful to run MPTCP BPF selftests on systems with an old version of IPRoute2. This tool can be used as an alternative to 'ip mptcp'. MAINTAINERS needs to be updated since a new file is added in a non covered place. Signed-off-by: Geliang Tang Reviewed-by: Matthieu Baerts (NGI0) Signed-off-by: Matthieu Baerts (NGI0) --- MAINTAINERS | 1 + tools/testing/selftests/bpf/Makefile | 3 ++- tools/testing/selftests/bpf/mptcp_pm_nl_ctl.c | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/MAINTAINERS b/MAINTAINERS index cd3277a98cfe..4ea5db496698 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -15756,6 +15756,7 @@ F: include/trace/events/mptcp.h F: include/uapi/linux/mptcp*.h F: net/mptcp/ F: tools/testing/selftests/bpf/*/*mptcp*.c +F: tools/testing/selftests/bpf/*mptcp*.c F: tools/testing/selftests/net/mptcp/ NETWORKING [TCP] diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile index e0b3887b3d2d..204269d0b5b8 100644 --- a/tools/testing/selftests/bpf/Makefile +++ b/tools/testing/selftests/bpf/Makefile @@ -144,7 +144,7 @@ TEST_GEN_PROGS_EXTENDED = test_skb_cgroup_id_user \ flow_dissector_load test_flow_dissector test_tcp_check_syncookie_user \ test_lirc_mode2_user xdping test_cpp runqslower bench bpf_testmod.ko \ xskxceiver xdp_redirect_multi xdp_synproxy veristat xdp_hw_metadata \ - xdp_features bpf_test_no_cfi.ko + xdp_features bpf_test_no_cfi.ko mptcp_pm_nl_ctl TEST_GEN_FILES += liburandom_read.so urandom_read sign-file uprobe_multi @@ -645,6 +645,7 @@ TRUNNER_EXTRA_FILES := $(OUTPUT)/urandom_read $(OUTPUT)/bpf_testmod.ko \ $(OUTPUT)/xdp_synproxy \ $(OUTPUT)/sign-file \ $(OUTPUT)/uprobe_multi \ + $(OUTPUT)/mptcp_pm_nl_ctl \ ima_setup.sh \ verify_sig_setup.sh \ $(wildcard progs/btf_dump_test_case_*.c) \ diff --git a/tools/testing/selftests/bpf/mptcp_pm_nl_ctl.c b/tools/testing/selftests/bpf/mptcp_pm_nl_ctl.c new file mode 120000 index 000000000000..5a08c255b278 --- /dev/null +++ b/tools/testing/selftests/bpf/mptcp_pm_nl_ctl.c @@ -0,0 +1 @@ +../net/mptcp/pm_nl_ctl.c \ No newline at end of file From patchwork Wed Jul 3 18:57:34 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthieu Baerts X-Patchwork-Id: 13722719 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6359B18754A; Wed, 3 Jul 2024 18:58:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720033108; cv=none; b=FO333DNa8+atFFxPeVtct9ljkO6rHcZlbJCl3NP/7bn47f3VSxNiBmInye2B6jPEDA2ADdBKN3amvPhOPHhFV6dpifuNVCiS0pspB58r5O7IGKWE1np83heyl6wZMlsiw+VKFSmgVXBTXeGGED+u3CC2isZ9D9+VkOgrUWFp0II= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720033108; c=relaxed/simple; bh=6QPk+srK9z43lFM/ESJev1DJPcxAMk78tLELME0IaFI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pqwWvxZDJlavdFYHkx/I07oHZgnh0yy0bUe6gLgDfVLQbubP9OFcd16VTeklh5Dmi1l+hY5nDBf6PTyIfyO6vTSijajbEWSaCtiIq1Rqdn2F3iE+09cF+fN9KIgzT02Yjn/EauIn0H55KsU/f/kCWxvVk4tJJhEQlzNCDfNSbWI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=eiC0l/TR; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="eiC0l/TR" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BFB95C2BD10; Wed, 3 Jul 2024 18:58:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1720033107; bh=6QPk+srK9z43lFM/ESJev1DJPcxAMk78tLELME0IaFI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=eiC0l/TRpCMRBrtvfOeDi3p/8cDj2nWflAsx4JX8ddL97LeQqjYhvmfvIkiM8rZ4A u23JM6kkPpeY1DeCk5FAe86p7OKlyxaw5KD++tZSSk2S1zeAEi7TQ6jYQUuLOkGOTz gVPVnuY86cVKYINzGH1jWbLUddV7+86Dv2PPnV0iOQtYCCk3OhTiZN2kdfoMS4RwjI x815awVZThzfwuwg/r7SooS5uFXgrCnQ1p+Nd8cx3isyl7uqzHBZfjP/ERmO9d2q3p lsbSN677l5nCoGl04JxBymBxPLGInNA2+ZL0ezlI+qVVuvyazjdQO+hh50+HaysDbu TQZ5qdIxKcQLA== From: "Matthieu Baerts (NGI0)" Date: Wed, 03 Jul 2024 20:57:34 +0200 Subject: [PATCH bpf-next v3 3/3] selftests/bpf: Add mptcp subflow subtest Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240703-upstream-bpf-next-20240506-mptcp-subflow-test-v3-3-ebdc2d494049@kernel.org> References: <20240703-upstream-bpf-next-20240506-mptcp-subflow-test-v3-0-ebdc2d494049@kernel.org> In-Reply-To: <20240703-upstream-bpf-next-20240506-mptcp-subflow-test-v3-0-ebdc2d494049@kernel.org> To: mptcp@lists.linux.dev, Mat Martineau , Geliang Tang , Andrii Nakryiko , Eduard Zingerman , Mykola Lysenko , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , Shuah Khan , "David S. Miller" , Jakub Kicinski , Jesper Dangaard Brouer Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, "Matthieu Baerts (NGI0)" , Geliang Tang X-Mailer: b4 0.14.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=4683; i=matttbe@kernel.org; h=from:subject:message-id; bh=dH35MZ5rm45k9pWY9PE4QpIU29g4nqtSyv2YEmWbywA=; b=owEBbQKS/ZANAwAIAfa3gk9CaaBzAcsmYgBmhZ89U47GykCQSwKXwLX/QpFcuJdORLCQz6qKV yEcqwneMUeJAjMEAAEIAB0WIQToy4X3aHcFem4n93r2t4JPQmmgcwUCZoWfPQAKCRD2t4JPQmmg c3/GD/41hNnel2jqoiVyS8jZ7d7rRIkls5m3Ozj9tjOdYWR+Axw4/VqYLvAMcWcpBaDGK9d+710 JPQSosre3iRyDZAx6WFvUI8D7BcUnZQsk6hkG8qPdTj2okrrOhFHTR68ITFVysjAxa1BYAcavtd 7QeWa6pY/TdrXUrsx9U1ijdZBjLN5dWmoJo8oO3RgijwJd0LWcDyoxS5pJAiWvOn2dLbeT06+SO 34MQsPIg0w8zo4suz66cS4U4T3QaKPzezBG6OYb0+qPRBXCkxM5EmSDInDlY7bD7ObJpw0Ki8FJ ke7KCVwvQ504F6pHgNIT7mluc91mnKUBbgbqJ0c50uC1GhJWSL7drMJ+K555AZEifTgEvUkY29Y mF5PPSW1p79OoiG03kWmS0l3W6vBqN60ZuJzM53FqVIRkSNA+/cKJbLH8KcHxFnIplobwPtwjwD p/pZ5aSjg5f2QdnnvPrrGts6ySTal2lqiOVBSgXw75MOnLe/ylkKepYEG5rbhRF+GzXK9HnuW+a 6/WGxkykfkH3Edz4ar32WR0AOXJhiZjQC+pgseEcErkmQKEoAH/VREAWej16eaE4D361mq9Ne71 qFKgCZ8T1GkGxoLlFUqyENuT0UcHJo+wjK4LS53PbqhDywLBWIz1XuKts3PyvmxvCYeUAvWZP2D Rys1JXaavlxRLaw== X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 From: Geliang Tang This patch adds a subtest named test_subflow to load and verify the newly added mptcp subflow example in test_mptcp. Add a helper endpoint_init() to add a new subflow endpoint. Add another helper ss_search() to verify the fwmark and congestion values set by mptcp_subflow prog using setsockopts. Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/76 Signed-off-by: Geliang Tang Reviewed-by: Mat Martineau Signed-off-by: Matthieu Baerts (NGI0) --- Notes: - v2 -> v3: - Use './mptcp_pm_nl_ctl' instead of 'ip mptcp', not supported by the BPF CI running IPRoute 5.5.0. - Use SYS_NOFAIL() in _ss_search() instead of calling system() --- tools/testing/selftests/bpf/prog_tests/mptcp.c | 104 +++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c index d2ca32fa3b21..975427b3c66e 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -9,8 +9,12 @@ #include "network_helpers.h" #include "mptcp_sock.skel.h" #include "mptcpify.skel.h" +#include "mptcp_subflow.skel.h" #define NS_TEST "mptcp_ns" +#define ADDR_1 "10.0.1.1" +#define ADDR_2 "10.0.1.2" +#define PORT_1 10001 #ifndef IPPROTO_MPTCP #define IPPROTO_MPTCP 262 @@ -335,10 +339,110 @@ static void test_mptcpify(void) close(cgroup_fd); } +static int endpoint_init(char *flags) +{ + SYS(fail, "ip -net %s link add veth1 type veth peer name veth2", NS_TEST); + SYS(fail, "ip -net %s addr add %s/24 dev veth1", NS_TEST, ADDR_1); + SYS(fail, "ip -net %s link set dev veth1 up", NS_TEST); + SYS(fail, "ip -net %s addr add %s/24 dev veth2", NS_TEST, ADDR_2); + SYS(fail, "ip -net %s link set dev veth2 up", NS_TEST); + /* It would be better to use "ip -net %s mptcp endpoint add %s %s", + * but the BPF CI is using an old version of IPRoute (5.5.0). + */ + SYS(fail, "ip netns exec %s ./mptcp_pm_nl_ctl add %s flags %s", NS_TEST, ADDR_2, flags); + + return 0; +fail: + return -1; +} + +static int _ss_search(char *src, char *dst, char *port, char *keyword) +{ + return SYS_NOFAIL("ip netns exec %s ss -enita src %s dst %s %s %d | grep -q '%s'", + NS_TEST, src, dst, port, PORT_1, keyword); +} + +static int ss_search(char *src, char *keyword) +{ + return _ss_search(src, ADDR_1, "dport", keyword); +} + +static void run_subflow(char *new) +{ + int server_fd, client_fd, err; + char cc[TCP_CA_NAME_MAX]; + socklen_t len = sizeof(cc); + + server_fd = start_mptcp_server(AF_INET, ADDR_1, PORT_1, 0); + if (!ASSERT_GE(server_fd, 0, "start_mptcp_server")) + return; + + client_fd = connect_to_fd(server_fd, 0); + if (!ASSERT_GE(client_fd, 0, "connect to fd")) + goto fail; + + err = getsockopt(server_fd, SOL_TCP, TCP_CONGESTION, cc, &len); + if (!ASSERT_OK(err, "getsockopt(srv_fd, TCP_CONGESTION)")) + goto fail; + + send_byte(client_fd); + + ASSERT_OK(ss_search(ADDR_1, "fwmark:0x1"), "ss_search fwmark:0x1"); + ASSERT_OK(ss_search(ADDR_2, "fwmark:0x2"), "ss_search fwmark:0x2"); + ASSERT_OK(ss_search(ADDR_1, new), "ss_search new cc"); + ASSERT_OK(ss_search(ADDR_2, cc), "ss_search default cc"); + + close(client_fd); +fail: + close(server_fd); +} + +static void test_subflow(void) +{ + int cgroup_fd, prog_fd, err; + struct mptcp_subflow *skel; + struct nstoken *nstoken; + + cgroup_fd = test__join_cgroup("/mptcp_subflow"); + if (!ASSERT_GE(cgroup_fd, 0, "join_cgroup: mptcp_subflow")) + return; + + skel = mptcp_subflow__open_and_load(); + if (!ASSERT_OK_PTR(skel, "skel_open_load: mptcp_subflow")) + goto close_cgroup; + + err = mptcp_subflow__attach(skel); + if (!ASSERT_OK(err, "skel_attach: mptcp_subflow")) + goto skel_destroy; + + prog_fd = bpf_program__fd(skel->progs.mptcp_subflow); + err = bpf_prog_attach(prog_fd, cgroup_fd, BPF_CGROUP_SOCK_OPS, 0); + if (!ASSERT_OK(err, "prog_attach")) + goto skel_destroy; + + nstoken = create_netns(); + if (!ASSERT_OK_PTR(nstoken, "create_netns: mptcp_subflow")) + goto skel_destroy; + + if (!ASSERT_OK(endpoint_init("subflow"), "endpoint_init")) + goto close_netns; + + run_subflow(skel->data->cc); + +close_netns: + cleanup_netns(nstoken); +skel_destroy: + mptcp_subflow__destroy(skel); +close_cgroup: + close(cgroup_fd); +} + void test_mptcp(void) { if (test__start_subtest("base")) test_base(); if (test__start_subtest("mptcpify")) test_mptcpify(); + if (test__start_subtest("subflow")) + test_subflow(); }