From patchwork Wed Mar 20 12:37:03 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 13597841 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 E026D3BBEA for ; Wed, 20 Mar 2024 12:37:15 +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=1710938236; cv=none; b=O5+pIif4Kr4G5x8C64G9y0g6NQTumIk1k+YjEinULytoMFevJNbpmwqXJWDD5rle7mtZ2QibdxDXmRhuU9/VIjIovnLBxoqdxR10gqYyGDKkmMnD7SWGjsS2QYIAWuHAbkLICqcX3F2sug61XMoIhXVutvPkU/o4VkqhCajwKnI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710938236; c=relaxed/simple; bh=DbvUue7Hd5IAOkM+wy0uxjCf+YEJiA8Ntjlh/ZxmIC8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=F+sUyUrquhCcX/VuR2F7CIWXUP8NHMORMulIeolINdjAJ1kDUf0FGQNjUj3JEN6iptvAZG0Of03ThwTSUhVrv5KpPE/QmkaAxbDUKuujOxjIAYw3ex6AsDggtxWJudsNSel0xQs2PAC/Qs7YpBgFBnZUwBujwkaYbqGguxGzBfc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MCZ0gnVL; 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="MCZ0gnVL" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0589DC433F1; Wed, 20 Mar 2024 12:37:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710938235; bh=DbvUue7Hd5IAOkM+wy0uxjCf+YEJiA8Ntjlh/ZxmIC8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MCZ0gnVLk/PSblFOrsZEzQLxYfQkatNkP4iOFNStgNLywNHMh6fnVc+eoqXAP5NSS xQTufiSEBDnNAo5efDAdHVL+0rGQc90ESjmf98M+NoKV4DQqChgVf7B04cy/X2QMxT 8RNspwtg6XXJxWIY/Dh+3cZF48Ct4dnHobeYd2N3SPP52pQ2rqrBdW1OrWCUOLX+oV H+XefjuH6rZHz0t2Z+czLkmP+PQgspZPXpSbdhIOYfUMh2ULgnXzLLD0LN/S+oywph 96vFSaQnQgYBEs8QHjKbCRxHmEI03zalJ8O8MB/uaOUIUB8Dxnq7OfcOH4cRvsynEZ Tf9DOmFpd34Yw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next 2/4] selftests/bpf: Add mptcp subflow prog Date: Wed, 20 Mar 2024 20:37:03 +0800 Message-Id: <2e9900609e211a5b93cc682c5347035f8420bf93.1710938175.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.40.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Geliang Tang Move Nicolas's patch into bpf selftests directory. This prog added a test that was adding a different mark (SO_MARK) on each subflow, and changing the TCP CC only on the first subflow. Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/76 Signed-off-by: Geliang Tang --- .../selftests/bpf/progs/mptcp_subflow.c | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 tools/testing/selftests/bpf/progs/mptcp_subflow.c 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..1b49eaae4f77 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/mptcp_subflow.c @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024, Tessares SA. */ +/* Author: Nicolas Rybowski */ + +#include // SOL_SOCKET, SO_MARK, ... +#include // TCP_CONGESTION +#include +#include +#include "bpf_tcp_helpers.h" + +char _license[] SEC("license") = "GPL"; + +#ifndef SOL_TCP +#define SOL_TCP 6 +#endif + +#ifndef TCP_CA_NAME_MAX +#define TCP_CA_NAME_MAX 16 +#endif + +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 to its apparition 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; +}