From nobody Wed Apr 24 11:26:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp4161632pis; Mon, 2 May 2022 14:12:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwayr3wZZ2shntk615cIZ0OY4rfKQAHCBYRFhQCARVup6bPij7Y51Kr7Gqd8701kySnPqEY X-Received: by 2002:a17:902:e94e:b0:15b:22a7:f593 with SMTP id b14-20020a170902e94e00b0015b22a7f593mr13537395pll.148.1651525965446; Mon, 02 May 2022 14:12:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651525965; cv=none; d=google.com; s=arc-20160816; b=c7XNBUbk8is29WGpPScWv9rqrC1WbJjvWQF538YCVZeF9jOLJU6K0G4HmSweABdLil 0btq0jzZoyXxqVdZtB6PEQeNkmZb/zFp5fHZvM4+Fduggnk2dPXrwwbl/I2IIzZPadIA t1dbiYIHTqeWO0bdDAYyk9AhZATD2mDTbiDHn3khdFfGE1YSoD+IlletLPEzVRABnHv6 ipQHrmZLhp+LnEfFwhXLu0HCBaUXAiV0m3n6HjwTxMdO+D0b80OKxDm8UB5uE+9abWg4 Sfzq0ng96cPoM7QrVJeiNWvGvI6nA2L6MkhWx9M9vgqP1yYoAPpMYnGwTCof0E9hzU6k 5CAA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=CKZhxK0kn9BiyX3NzrmPxllUslXKUkItIBA2lzlAqmQ=; b=TRJZ3RkPtfy11D6JEB/k0ZoIKEIABiE9nBP4HbBNLJyaV2xD+e/IxW6r5Tmrm48NGV GkfP89K7aQzemnmGcodZfk3qA2OWmWLuBQwoRYaIRb5r/t+yg0SWg05YcIZTOqZR41jS /LVwQ9GUZs2e8YM1tptisTQ75pTLCJOY8YGTrYuFQQfYO7iwEhOVsi/nHpQbvPMAn2KT ZuJJuU4BC+4z3t2IkJ98dik0xckPGvcqxHYbGLpH7ZO8Yc4U4DGJ9YiDTfP90nXVFd2C STFWLOCKeMvXxaix4PQXozeYN7lm3dyEzb4YWZ5NqfN6TnbSAwDoVGq7NiYXsyGTIOqT fvFA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=CImgaPIl; spf=pass (google.com: domain of mptcp+bounces-5034-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5034-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id x6-20020a170902ec8600b00156f362e9ecsi16573207plg.105.2022.05.02.14.12.45 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 02 May 2022 14:12:45 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5034-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=CImgaPIl; spf=pass (google.com: domain of mptcp+bounces-5034-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5034-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 0E360280A71 for ; Mon, 2 May 2022 21:12:45 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B6A3B321D; Mon, 2 May 2022 21:12:43 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) (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 133703217 for ; Mon, 2 May 2022 21:12:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1651525962; x=1683061962; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=DlnszPk3X2RPEnjbzh3vP3TQq5DteMJxTVw6ps/Fp2w=; b=CImgaPIlKKDMIZGAz9en31dCvs36kNBqGqtQIWqQSoTaZ7lGe4wJxyd8 SNlb6moWfDMtQsfDN0LjA40GKmQedV+YiJ55FgOmIDHqdu5KFJTC9FNe4 oi7jvqOlk9efMRW5qqk0tmRm4IGiMr2Ig2VO64CZO8Kq/ObGFfIGb0D3G jog/OlcEw8qde2vxMbPb5ZIE6bQGAybirT5rMnwEzqtyn7YGaPxtJrH57 DoMvIslMq6J/66HJcKoAF/UGF9fMnDN8Hhf5YuqFy0O/iwZakXBl2UT+D Oxk4oEQPsLal11VtiHOEXUjvQl4BsKXnbWcTxbGdW5QI3bcZgs6KSdDDi w==; X-IronPort-AV: E=McAfee;i="6400,9594,10335"; a="247878460" X-IronPort-AV: E=Sophos;i="5.91,193,1647327600"; d="scan'208";a="247878460" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 May 2022 14:12:40 -0700 X-IronPort-AV: E=Sophos;i="5.91,193,1647327600"; d="scan'208";a="810393787" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.212.141.55]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 May 2022 14:12:40 -0700 From: Mat Martineau To: netdev@vger.kernel.org, bpf@vger.kernel.org Cc: Nicolas Rybowski , ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, mptcp@lists.linux.dev, Matthieu Baerts , Mat Martineau Subject: [PATCH bpf-next v3 1/8] bpf: expose is_mptcp flag to bpf_tcp_sock Date: Mon, 2 May 2022 14:12:27 -0700 Message-Id: <20220502211235.142250-2-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220502211235.142250-1-mathew.j.martineau@linux.intel.com> References: <20220502211235.142250-1-mathew.j.martineau@linux.intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Nicolas Rybowski is_mptcp is a field from struct tcp_sock used to indicate that the current tcp_sock is part of the MPTCP protocol. In this protocol, a first socket (mptcp_sock) is created with sk_protocol set to IPPROTO_MPTCP (=3D262) for control purpose but it isn't directly on the wire. This is the role of the subflow (kernel) sockets which are classical tcp_sock with sk_protocol set to IPPROTO_TCP. The only way to differentiate such sockets from plain TCP sockets is the is_mptcp field from tcp_sock. Such an exposure in BPF is thus required to be able to differentiate plain TCP sockets from MPTCP subflow sockets in BPF_PROG_TYPE_SOCK_OPS programs. The choice has been made to silently pass the case when CONFIG_MPTCP is unset by defaulting is_mptcp to 0 in order to make BPF independent of the MPTCP configuration. Another solution is to make the verifier fail in 'bpf_tcp_sock_is_valid_ctx_access' but this will add an additional '#ifdef CONFIG_MPTCP' in the BPF code and a same injected BPF program will not run if MPTCP is not set. An example use-case is provided in https://github.com/multipath-tcp/mptcp_net-next/tree/scripts/bpf/examples Suggested-by: Matthieu Baerts Acked-by: Matthieu Baerts Signed-off-by: Nicolas Rybowski Signed-off-by: Mat Martineau --- include/uapi/linux/bpf.h | 1 + net/core/filter.c | 9 ++++++++- tools/include/uapi/linux/bpf.h | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 444fe6f1cf35..7043f3641534 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -5706,6 +5706,7 @@ struct bpf_tcp_sock { __u32 delivered; /* Total data packets delivered incl. rexmits */ __u32 delivered_ce; /* Like the above but only ECE marked packets */ __u32 icsk_retransmits; /* Number of unrecovered [RTO] timeouts */ + __u32 is_mptcp; /* Is MPTCP subflow? */ }; =20 struct bpf_sock_tuple { diff --git a/net/core/filter.c b/net/core/filter.c index b741b9f7e6a9..b474e5bd1458 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -6754,7 +6754,7 @@ bool bpf_tcp_sock_is_valid_access(int off, int size, = enum bpf_access_type type, struct bpf_insn_access_aux *info) { if (off < 0 || off >=3D offsetofend(struct bpf_tcp_sock, - icsk_retransmits)) + is_mptcp)) return false; =20 if (off % size !=3D 0) @@ -6888,6 +6888,13 @@ u32 bpf_tcp_sock_convert_ctx_access(enum bpf_access_= type type, case offsetof(struct bpf_tcp_sock, icsk_retransmits): BPF_INET_SOCK_GET_COMMON(icsk_retransmits); break; + case offsetof(struct bpf_tcp_sock, is_mptcp): +#ifdef CONFIG_MPTCP + BPF_TCP_SOCK_GET_COMMON(is_mptcp); +#else + *insn++ =3D BPF_MOV32_IMM(si->dst_reg, 0); +#endif + break; } =20 return insn - insn_buf; diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 444fe6f1cf35..7043f3641534 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -5706,6 +5706,7 @@ struct bpf_tcp_sock { __u32 delivered; /* Total data packets delivered incl. rexmits */ __u32 delivered_ce; /* Like the above but only ECE marked packets */ __u32 icsk_retransmits; /* Number of unrecovered [RTO] timeouts */ + __u32 is_mptcp; /* Is MPTCP subflow? */ }; =20 struct bpf_sock_tuple { --=20 2.36.0 From nobody Wed Apr 24 11:26:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp4161641pis; Mon, 2 May 2022 14:12:47 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw7lXEeuMXEdma3nHcsXIMflgq8b6tG0dN6QViWq4Xt7WMrm2RDCY1BkGqsI5RKTO/dR/pD X-Received: by 2002:a05:6870:f697:b0:d7:5679:8fc8 with SMTP id el23-20020a056870f69700b000d756798fc8mr492448oab.172.1651525966906; Mon, 02 May 2022 14:12:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651525966; cv=none; d=google.com; s=arc-20160816; b=zQuJT21cw+3/dXfFYRppa8F72kW7Zikc/yLCe8YmDrvkpEjRuVPgk+hpBf4ifUgTKV pbNcCBr3cmrsz9499jcuHm/9ND7iOpIU/bNJuw7gv/xfVVV9EcmE/F0eq3BwZjsr/Yem JRFsYzZpqRKjtJaFXsvSRFmmWn8LzryyzfHVG21w+9eedAmeGjrJ0qVHofd5WnbUX046 rSBVIzzT8zNSOjGsxk8/ScmoJ2y4NZLdHjlnK0bHekBHtqrHCfQxFu8gmvly/4up8wqi ns8yDg1dK8U4kSsRzAZr5qVkuN7kXvKXJp1hwqrDMoK7awl+fJG3GMkwzD5/DOlsoqqq 6k1g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=PTwLo7q9FVQp/fmrOFQfzFMHyowuC4btlUeCHqoUvaE=; b=epTgsWE+MytIC2a2S672Hgdnb8m1dSd6KYAysnvCgjaM6f7L4r2aL06hSmIwaONkE4 i59eAma3R+nl6QFHo3qwxYC7BRktbD0e2BnM+sthhTHgMpLqryl0cyCLbBORMuaw/MS7 NjjEJB51YaP8a2ei49bCJmqtaV8zEf54wYJgfillRUtPwyHpMIvaggb0A84uOzxNElxe cI8HeU/nBdcOaLRYsLVySh6SebYK9+sGZuy3OQtlCWx0mzg7gAHCJzv0jv+QgeJPDNCs uNTGOrtwhoJGND0SEeGVUnct2jQDRUD1e40vzVWPMaw7PlqhNlOV7SYtlEcsWGg0EQzR hYpg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=TwkvGfLf; spf=pass (google.com: domain of mptcp+bounces-5035-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5035-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from da.mirrors.kernel.org (da.mirrors.kernel.org. [2604:1380:4040:4f00::1]) by mx.google.com with ESMTPS id l7-20020a05687040c700b000e952f92fb0si1421220oal.89.2022.05.02.14.12.46 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 02 May 2022 14:12:46 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5035-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) client-ip=2604:1380:4040:4f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=TwkvGfLf; spf=pass (google.com: domain of mptcp+bounces-5035-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5035-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by da.mirrors.kernel.org (Postfix) with ESMTPS id A05B62E09C3 for ; Mon, 2 May 2022 21:12:46 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6AF5F321E; Mon, 2 May 2022 21:12:44 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) (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 D1202321B for ; Mon, 2 May 2022 21:12:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1651525962; x=1683061962; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Sbr7UpGJJXVohOnWT1r89ePskvsRIk6ToKbM/nWwg2Y=; b=TwkvGfLfSv1AbDE0i9Iz+nwCoqJBTqTcPbpb5udmP9XUBshcwBSgvimp 6a7OFcMDz/RfBwATwCcoYZAOcut2XFr50EaSxJa4c74XrS0k/s6aGbNwY 8jVDgr6/Smgvb2JwTqFA840W0G1OAh64bfLww5ZGKrKcC5XBTy4Y+Qe8F qpqMqFHiyq2EtxRX3paeCBpBPmB5O7FBFM7E0keKDVu95RibUHxoRpKSU yOHFMw5a0pvssZCLZAYYWfLALOjs6vJzyBb7nXZsdD3PJdOghk3uTQC/R f/bm386c76xrXNo7QmWcKyiHlZKGSjuFRKSZmtXZJPYsSnHDHoQuam36f Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10335"; a="247878463" X-IronPort-AV: E=Sophos;i="5.91,193,1647327600"; d="scan'208";a="247878463" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 May 2022 14:12:41 -0700 X-IronPort-AV: E=Sophos;i="5.91,193,1647327600"; d="scan'208";a="810393791" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.212.141.55]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 May 2022 14:12:40 -0700 From: Mat Martineau To: netdev@vger.kernel.org, bpf@vger.kernel.org Cc: Geliang Tang , ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, mptcp@lists.linux.dev, Nicolas Rybowski , Matthieu Baerts , Mat Martineau Subject: [PATCH bpf-next v3 2/8] bpf: add bpf_skc_to_mptcp_sock_proto Date: Mon, 2 May 2022 14:12:28 -0700 Message-Id: <20220502211235.142250-3-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220502211235.142250-1-mathew.j.martineau@linux.intel.com> References: <20220502211235.142250-1-mathew.j.martineau@linux.intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang This patch implements a new struct bpf_func_proto, named bpf_skc_to_mptcp_sock_proto. Define a new bpf_id BTF_SOCK_TYPE_MPTCP, and a new helper bpf_skc_to_mptcp_sock(), which invokes another new helper bpf_mptcp_sock_from_subflow() in net/mptcp/bpf.c to get struct mptcp_sock from a given subflow socket. v2: Emit BTF type, add func_id checks in verifier.c and bpf_trace.c, remove build check for CONFIG_BPF_JIT Co-developed-by: Nicolas Rybowski Signed-off-by: Nicolas Rybowski Co-developed-by: Matthieu Baerts Signed-off-by: Matthieu Baerts Signed-off-by: Geliang Tang Signed-off-by: Mat Martineau --- include/linux/bpf.h | 1 + include/linux/btf_ids.h | 3 ++- include/net/mptcp.h | 6 ++++++ include/uapi/linux/bpf.h | 7 +++++++ kernel/bpf/verifier.c | 1 + kernel/trace/bpf_trace.c | 2 ++ net/core/filter.c | 18 ++++++++++++++++++ net/mptcp/Makefile | 2 ++ net/mptcp/bpf.c | 22 ++++++++++++++++++++++ scripts/bpf_doc.py | 2 ++ tools/include/uapi/linux/bpf.h | 7 +++++++ 11 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 net/mptcp/bpf.c diff --git a/include/linux/bpf.h b/include/linux/bpf.h index be94833d390a..f53e39065a6e 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -2204,6 +2204,7 @@ extern const struct bpf_func_proto bpf_skc_to_tcp_tim= ewait_sock_proto; extern const struct bpf_func_proto bpf_skc_to_tcp_request_sock_proto; extern const struct bpf_func_proto bpf_skc_to_udp6_sock_proto; extern const struct bpf_func_proto bpf_skc_to_unix_sock_proto; +extern const struct bpf_func_proto bpf_skc_to_mptcp_sock_proto; extern const struct bpf_func_proto bpf_copy_from_user_proto; extern const struct bpf_func_proto bpf_snprintf_btf_proto; extern const struct bpf_func_proto bpf_snprintf_proto; diff --git a/include/linux/btf_ids.h b/include/linux/btf_ids.h index bc5d9cc34e4c..335a19092368 100644 --- a/include/linux/btf_ids.h +++ b/include/linux/btf_ids.h @@ -178,7 +178,8 @@ extern struct btf_id_set name; BTF_SOCK_TYPE(BTF_SOCK_TYPE_TCP6, tcp6_sock) \ BTF_SOCK_TYPE(BTF_SOCK_TYPE_UDP, udp_sock) \ BTF_SOCK_TYPE(BTF_SOCK_TYPE_UDP6, udp6_sock) \ - BTF_SOCK_TYPE(BTF_SOCK_TYPE_UNIX, unix_sock) + BTF_SOCK_TYPE(BTF_SOCK_TYPE_UNIX, unix_sock) \ + BTF_SOCK_TYPE(BTF_SOCK_TYPE_MPTCP, mptcp_sock) =20 enum { #define BTF_SOCK_TYPE(name, str) name, diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 8b1afd6f5cc4..2ba09de955c7 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -284,4 +284,10 @@ static inline int mptcpv6_init(void) { return 0; } static inline void mptcpv6_handle_mapped(struct sock *sk, bool mapped) { } #endif =20 +#if defined(CONFIG_MPTCP) && defined(CONFIG_BPF_SYSCALL) +struct mptcp_sock *bpf_mptcp_sock_from_subflow(struct sock *sk); +#else +static inline struct mptcp_sock *bpf_mptcp_sock_from_subflow(struct sock *= sk) { return NULL; } +#endif + #endif /* __NET_MPTCP_H */ diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 7043f3641534..56a66778dc28 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -5154,6 +5154,12 @@ union bpf_attr { * if not NULL, is a reference which must be released using its * corresponding release function, or moved into a BPF map before * program exit. + * + * struct mptcp_sock *bpf_skc_to_mptcp_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *mptcp_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. */ #define __BPF_FUNC_MAPPER(FN) \ FN(unspec), \ @@ -5351,6 +5357,7 @@ union bpf_attr { FN(skb_set_tstamp), \ FN(ima_file_hash), \ FN(kptr_xchg), \ + FN(skc_to_mptcp_sock), \ /* */ =20 /* integer value in 'imm' field of BPF_CALL instruction selects which help= er diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 813f6ee80419..3d8790e81c48 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -509,6 +509,7 @@ static bool is_ptr_cast_function(enum bpf_func_id func_= id) func_id =3D=3D BPF_FUNC_skc_to_tcp_sock || func_id =3D=3D BPF_FUNC_skc_to_tcp6_sock || func_id =3D=3D BPF_FUNC_skc_to_udp6_sock || + func_id =3D=3D BPF_FUNC_skc_to_mptcp_sock || func_id =3D=3D BPF_FUNC_skc_to_tcp_timewait_sock || func_id =3D=3D BPF_FUNC_skc_to_tcp_request_sock; } diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index f15b826f9899..8451fc83d031 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -1688,6 +1688,8 @@ tracing_prog_func_proto(enum bpf_func_id func_id, con= st struct bpf_prog *prog) return &bpf_skc_to_udp6_sock_proto; case BPF_FUNC_skc_to_unix_sock: return &bpf_skc_to_unix_sock_proto; + case BPF_FUNC_skc_to_mptcp_sock: + return &bpf_skc_to_mptcp_sock_proto; case BPF_FUNC_sk_storage_get: return &bpf_sk_storage_get_tracing_proto; case BPF_FUNC_sk_storage_delete: diff --git a/net/core/filter.c b/net/core/filter.c index b474e5bd1458..b39e4af9a0ec 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -78,6 +78,7 @@ #include #include #include +#include =20 static const struct bpf_func_proto * bpf_sk_base_func_proto(enum bpf_func_id func_id); @@ -11279,6 +11280,20 @@ const struct bpf_func_proto bpf_skc_to_unix_sock_p= roto =3D { .ret_btf_id =3D &btf_sock_ids[BTF_SOCK_TYPE_UNIX], }; =20 +BPF_CALL_1(bpf_skc_to_mptcp_sock, struct sock *, sk) +{ + BTF_TYPE_EMIT(struct mptcp_sock); + return (unsigned long)bpf_mptcp_sock_from_subflow(sk); +} + +const struct bpf_func_proto bpf_skc_to_mptcp_sock_proto =3D { + .func =3D bpf_skc_to_mptcp_sock, + .gpl_only =3D false, + .ret_type =3D RET_PTR_TO_BTF_ID_OR_NULL, + .arg1_type =3D ARG_PTR_TO_SOCK_COMMON, + .ret_btf_id =3D &btf_sock_ids[BTF_SOCK_TYPE_MPTCP], +}; + BPF_CALL_1(bpf_sock_from_file, struct file *, file) { return (unsigned long)sock_from_file(file); @@ -11321,6 +11336,9 @@ bpf_sk_base_func_proto(enum bpf_func_id func_id) case BPF_FUNC_skc_to_unix_sock: func =3D &bpf_skc_to_unix_sock_proto; break; + case BPF_FUNC_skc_to_mptcp_sock: + func =3D &bpf_skc_to_mptcp_sock_proto; + break; case BPF_FUNC_ktime_get_coarse_ns: return &bpf_ktime_get_coarse_ns_proto; default: diff --git a/net/mptcp/Makefile b/net/mptcp/Makefile index e54daceac58b..99dddf08ca73 100644 --- a/net/mptcp/Makefile +++ b/net/mptcp/Makefile @@ -10,3 +10,5 @@ obj-$(CONFIG_INET_MPTCP_DIAG) +=3D mptcp_diag.o mptcp_crypto_test-objs :=3D crypto_test.o mptcp_token_test-objs :=3D token_test.o obj-$(CONFIG_MPTCP_KUNIT_TEST) +=3D mptcp_crypto_test.o mptcp_token_test.o + +obj-$(CONFIG_BPF_SYSCALL) +=3D bpf.o diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c new file mode 100644 index 000000000000..535602ba2582 --- /dev/null +++ b/net/mptcp/bpf.c @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Multipath TCP + * + * Copyright (c) 2020, Tessares SA. + * Copyright (c) 2022, SUSE. + * + * Author: Nicolas Rybowski + */ + +#define pr_fmt(fmt) "MPTCP: " fmt + +#include +#include "protocol.h" + +struct mptcp_sock *bpf_mptcp_sock_from_subflow(struct sock *sk) +{ + if (sk && sk_fullsock(sk) && sk->sk_protocol =3D=3D IPPROTO_TCP && sk_is_= mptcp(sk)) + return mptcp_sk(mptcp_subflow_ctx(sk)->conn); + + return NULL; +} +EXPORT_SYMBOL(bpf_mptcp_sock_from_subflow); diff --git a/scripts/bpf_doc.py b/scripts/bpf_doc.py index 096625242475..d5452f7eb996 100755 --- a/scripts/bpf_doc.py +++ b/scripts/bpf_doc.py @@ -633,6 +633,7 @@ class PrinterHelpers(Printer): 'struct socket', 'struct file', 'struct bpf_timer', + 'struct mptcp_sock', ] known_types =3D { '...', @@ -682,6 +683,7 @@ class PrinterHelpers(Printer): 'struct socket', 'struct file', 'struct bpf_timer', + 'struct mptcp_sock', } mapped_types =3D { 'u8': '__u8', diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 7043f3641534..56a66778dc28 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -5154,6 +5154,12 @@ union bpf_attr { * if not NULL, is a reference which must be released using its * corresponding release function, or moved into a BPF map before * program exit. + * + * struct mptcp_sock *bpf_skc_to_mptcp_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *mptcp_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. */ #define __BPF_FUNC_MAPPER(FN) \ FN(unspec), \ @@ -5351,6 +5357,7 @@ union bpf_attr { FN(skb_set_tstamp), \ FN(ima_file_hash), \ FN(kptr_xchg), \ + FN(skc_to_mptcp_sock), \ /* */ =20 /* integer value in 'imm' field of BPF_CALL instruction selects which help= er --=20 2.36.0 From nobody Wed Apr 24 11:26:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp4161648pis; Mon, 2 May 2022 14:12:48 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw13NR+Qt4nMnYjuSMUQPTZIr8UwwCRMwkJ37yi3VbdaW0FD9NLz7p+6KaCT9HFL5kyMtDt X-Received: by 2002:a05:6830:1e70:b0:605:f348:6623 with SMTP id m16-20020a0568301e7000b00605f3486623mr4843877otr.172.1651525967898; Mon, 02 May 2022 14:12:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651525967; cv=none; d=google.com; s=arc-20160816; b=S92i/cWef1N3+jpt44Au9ukThCM5m829PZ12/0Q33qzHd/UuJ9BdSDA+1nkVETbn82 ZHcCzjG7xbiZFTZXcXMqfc0hCNB/bU8o9RwoGResgbfRD2vHK0k4TfDG3/0osjcNorn4 zYHQrPx0QJYIme7Q0DavtILCPu48JUvXtXIgSyGKWbfDqMkxYBeOXsL9yYH3X5Se4Gb1 KJy9FkJWFTjvvO+WiJ09pmqa8/UHZ2xW7xtvDG7PcJ8kfkmYi7az6FyhZGCHl/QJzWrr qNltSJfAH9EQu5EFBTh8fqgEk/nh8lJzp5LcWgeN00wfJy9E0/BGj9OMgzGQ+sS/JtWJ FSuw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=vfg9CXUrVI44AZDigsUaPGTBvXG8hQw1hAyKc3SZ/IU=; b=y6nu7RPKl7tRymZil7ogOxU73+PZMQD+njYNw5QADsJjxhKes0jtMwA/LtJweJYbpj 3R1IqBEVXZj0eUgHc9M8sX7JEqh5/4Wb9dLN9wVOJpqoMsHL4/50+F7LHX/10QsstPS/ 3HiDHkeltnfYzWG5NTbTjF1MccMLlxmt18pRrDUusTAchkwh/BZuSG88oYZEVK3Qn5lh maplHdy/KoC66XWn1UoOd/jr4d37MKL+QsUS90eYS7IynhoaZnd8LbQEbR8NlkCTaFM+ 8LToCEdm98plpweQg4Undkdvp/QfHn0q/dXqbo0RcjwjYlIF8Q3SWzejg4wSqK7a+wWt WijQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=k0RtDYP5; spf=pass (google.com: domain of mptcp+bounces-5036-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5036-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from da.mirrors.kernel.org (da.mirrors.kernel.org. [139.178.84.19]) by mx.google.com with ESMTPS id w6-20020acadf06000000b0032623890704si826216oig.31.2022.05.02.14.12.47 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 02 May 2022 14:12:47 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5036-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) client-ip=139.178.84.19; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=k0RtDYP5; spf=pass (google.com: domain of mptcp+bounces-5036-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5036-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by da.mirrors.kernel.org (Postfix) with ESMTPS id B1E1E2E09E7 for ; Mon, 2 May 2022 21:12:47 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B3C93321F; Mon, 2 May 2022 21:12:44 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) (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 153C03212 for ; Mon, 2 May 2022 21:12:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1651525963; x=1683061963; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=+FuImKOJOtYzqv/FixcaUvgSqdHmeQHXTS1C2ZFwjaY=; b=k0RtDYP5jC80tObXrwupwv4E7mtOPphm1ft/YkO3iSPEfi/IDjeW5zl2 6sCHZQvpoyScQyfVU7UJj+yslSlVCwhevirKxOFotHd1nS8EoJhiIvsQB dg2uTKWe4V6WAF+ynf/GGGm9eAD8qZ/9olXyithS3QQ5MSU1h2Plg8U6s wuxwjLWGWuzPuV8O21akN/A/Uss5xZUmmNU7Ovo2H5Za/Gv49WF0cmQ6x MLEUPxAgWPs+2bgR64mrSY7R1svOR/drMh6UyXGoyRhBt5jPSJfjP2vyQ dU4E4UZu2jdgrYgDO3xvwBCltAKUHDMrwz5cKD+mtphnxyoQ/vU/omfK6 A==; X-IronPort-AV: E=McAfee;i="6400,9594,10335"; a="247878465" X-IronPort-AV: E=Sophos;i="5.91,193,1647327600"; d="scan'208";a="247878465" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 May 2022 14:12:41 -0700 X-IronPort-AV: E=Sophos;i="5.91,193,1647327600"; d="scan'208";a="810393792" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.212.141.55]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 May 2022 14:12:41 -0700 From: Mat Martineau To: netdev@vger.kernel.org, bpf@vger.kernel.org Cc: Geliang Tang , ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, mptcp@lists.linux.dev, Mat Martineau Subject: [PATCH bpf-next v3 3/8] selftests: bpf: Enable CONFIG_IKCONFIG_PROC in config Date: Mon, 2 May 2022 14:12:29 -0700 Message-Id: <20220502211235.142250-4-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220502211235.142250-1-mathew.j.martineau@linux.intel.com> References: <20220502211235.142250-1-mathew.j.martineau@linux.intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang CONFIG_IKCONFIG_PROC is required by BPF selftests, otherwise we get errors like this: libbpf: failed to open system Kconfig libbpf: failed to load object 'kprobe_multi' libbpf: failed to load BPF skeleton 'kprobe_multi': -22 It's because /proc/config.gz is opened in bpf_object__read_kconfig_file() in tools/lib/bpf/libbpf.c: file =3D gzopen("/proc/config.gz", "r"); So this patch enables CONFIG_IKCONFIG and CONFIG_IKCONFIG_PROC in tools/testing/selftests/bpf/config. Suggested-by: Mat Martineau Signed-off-by: Geliang Tang Signed-off-by: Mat Martineau Acked-by: Andrii Nakryiko --- tools/testing/selftests/bpf/config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/testing/selftests/bpf/config b/tools/testing/selftests/b= pf/config index 763db63a3890..8d7faff33c54 100644 --- a/tools/testing/selftests/bpf/config +++ b/tools/testing/selftests/bpf/config @@ -53,3 +53,5 @@ CONFIG_NF_DEFRAG_IPV4=3Dy CONFIG_NF_DEFRAG_IPV6=3Dy CONFIG_NF_CONNTRACK=3Dy CONFIG_USERFAULTFD=3Dy +CONFIG_IKCONFIG=3Dy +CONFIG_IKCONFIG_PROC=3Dy --=20 2.36.0 From nobody Wed Apr 24 11:26:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp4161656pis; Mon, 2 May 2022 14:12:49 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwmjinFyCQ4F5GNRubZJtVwXLFgR5vKJ4HNbs96EDNrzyM0PINBJml9yN7BzOLFbSj/kG9W X-Received: by 2002:a17:902:6bc1:b0:15d:1e15:1a75 with SMTP id m1-20020a1709026bc100b0015d1e151a75mr13765366plt.114.1651525969093; Mon, 02 May 2022 14:12:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651525969; cv=none; d=google.com; s=arc-20160816; b=pjsEIwz1d+WBjPPuh1LxPX5fUfc1IVsb7mN2f9+VvA1oCHu7ZtGNkKd2FK4N5LPjoG 2adynDalR8OxW8dxRF03LoU2zyGap5v9uvJM3AdKXFZPy6lf0j7R8r4ri5tjl9p6STdg ihxgdye4d0hMWIbZw7TSoV9eLbIxf8YHg3KNaL+/MVI5/4oy8EYO+5otnMArLLMYlRcK 9GDnh7I7VnOK8687BB90hK6Q9tXkFYgfuv2GcW11bSwPqwNEuzIPKG/D9RTiYwoGiUdH 0h+O5OKX91fyOxx18AQKqJ/jnUwUBfb++peE6FXXS+WbqM/owd0FbpUds7mnKjWk4o7e 2Epg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=VUPraHOGAAtZtmUvi7YWs14VZDtcsVZUBlhTscj3cZg=; b=PbWK7Lee48uGP1V4QGg/HD3bIvPplOOyK90h8VI9gDt5nEM9heMl2Gi7Xl+xZBni9d OG7cxE2o8dOpAqllD0zuxtz6NFJ3pFC3O0iBYd8BEn/inE+1QISZxRgeniDg6sEEZ+f+ WkyzgTj60A35BzqIiRZlJph6QyNvy+9GqaY86JZo7o1pJ+hIlAM3ivxEJxDxdiYU12rh Q/biSnpiUMjqXSTNpVbUSMdXplnAkdeMaUZb4hmgMQW/C+7umJEhqOLG9haLiYNrLXn7 x4DYMgIhDuZG91BR/V0rs5ybpOlcIubQE3PVclIK+XaKaz/awKyjl5UIj3jABBg5FQ8h Ql3A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=a+eVoNUM; spf=pass (google.com: domain of mptcp+bounces-5037-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5037-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id t5-20020a17090ad14500b001d29583a7e1si328996pjw.81.2022.05.02.14.12.48 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 02 May 2022 14:12:49 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5037-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=a+eVoNUM; spf=pass (google.com: domain of mptcp+bounces-5037-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5037-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 9E029280A9C for ; Mon, 2 May 2022 21:12:48 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 59FC63218; Mon, 2 May 2022 21:12:45 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) (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 C1A6F3217 for ; Mon, 2 May 2022 21:12:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1651525963; x=1683061963; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=w7DmikPOEaCyht0W/XjjvDZXzRCMKS5BeJ10fuKH5eY=; b=a+eVoNUMGAKdrG/fGWqFxG2y5v3WCI10kkfFjXM9ST0qwYsyTodhgUSJ IqBrFcc1BFyxyrIZ0P2DP9FmD9h2tReMSzzIk7I3Vl7Dj7qhmckUagT+Z UjygU7gCzmRhT3PZB7AdE3vVBvISmoZ+pOjoxBBLwL3kwyrXtcHXyogBJ Kkzixlj51X9G33Es5FLoAUy0ObbFyVpy+jhRVk45/tgThp4y+VwvywVzS +NOOxKH5nte46VJxQ3nG150Kv31CNAx1eTDVzMgmZ35OoT328u1LxClXM u508jM4eBGXfDts9N9HKVHRD97elt48USfATSB6Ji2w+cKFvvsv23TtFn g==; X-IronPort-AV: E=McAfee;i="6400,9594,10335"; a="247878467" X-IronPort-AV: E=Sophos;i="5.91,193,1647327600"; d="scan'208";a="247878467" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 May 2022 14:12:41 -0700 X-IronPort-AV: E=Sophos;i="5.91,193,1647327600"; d="scan'208";a="810393793" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.212.141.55]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 May 2022 14:12:41 -0700 From: Mat Martineau To: netdev@vger.kernel.org, bpf@vger.kernel.org Cc: Nicolas Rybowski , ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, mptcp@lists.linux.dev, Matthieu Baerts , Geliang Tang , Mat Martineau Subject: [PATCH bpf-next v3 4/8] selftests: bpf: add MPTCP test base Date: Mon, 2 May 2022 14:12:30 -0700 Message-Id: <20220502211235.142250-5-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220502211235.142250-1-mathew.j.martineau@linux.intel.com> References: <20220502211235.142250-1-mathew.j.martineau@linux.intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Nicolas Rybowski This patch adds a base for MPTCP specific tests. It is currently limited to the is_mptcp field in case of plain TCP connection because there is no easy way to get the subflow sk from a msk in userspace. This implies that we cannot lookup the sk_storage attached to the subflow sk in the sockops program. Acked-by: Matthieu Baerts Co-developed-by: Geliang Tang Signed-off-by: Geliang Tang Signed-off-by: Nicolas Rybowski Signed-off-by: Mat Martineau --- MAINTAINERS | 1 + tools/testing/selftests/bpf/config | 1 + tools/testing/selftests/bpf/network_helpers.c | 43 ++++-- tools/testing/selftests/bpf/network_helpers.h | 4 + .../testing/selftests/bpf/prog_tests/mptcp.c | 136 ++++++++++++++++++ .../testing/selftests/bpf/progs/mptcp_sock.c | 50 +++++++ 6 files changed, 227 insertions(+), 8 deletions(-) create mode 100644 tools/testing/selftests/bpf/prog_tests/mptcp.c create mode 100644 tools/testing/selftests/bpf/progs/mptcp_sock.c diff --git a/MAINTAINERS b/MAINTAINERS index cc5559a7fb5c..359afc617b92 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -13780,6 +13780,7 @@ F: include/net/mptcp.h 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/net/mptcp/ =20 NETWORKING [TCP] diff --git a/tools/testing/selftests/bpf/config b/tools/testing/selftests/b= pf/config index 8d7faff33c54..a25e15d55918 100644 --- a/tools/testing/selftests/bpf/config +++ b/tools/testing/selftests/bpf/config @@ -55,3 +55,4 @@ CONFIG_NF_CONNTRACK=3Dy CONFIG_USERFAULTFD=3Dy CONFIG_IKCONFIG=3Dy CONFIG_IKCONFIG_PROC=3Dy +CONFIG_MPTCP=3Dy diff --git a/tools/testing/selftests/bpf/network_helpers.c b/tools/testing/= selftests/bpf/network_helpers.c index 2bb1f9b3841d..c9a2e39e34fc 100644 --- a/tools/testing/selftests/bpf/network_helpers.c +++ b/tools/testing/selftests/bpf/network_helpers.c @@ -21,6 +21,10 @@ #include "network_helpers.h" #include "test_progs.h" =20 +#ifndef IPPROTO_MPTCP +#define IPPROTO_MPTCP 262 +#endif + #define clean_errno() (errno =3D=3D 0 ? "None" : strerror(errno)) #define log_err(MSG, ...) ({ \ int __save =3D errno; \ @@ -73,13 +77,13 @@ int settimeo(int fd, int timeout_ms) =20 #define save_errno_close(fd) ({ int __save =3D errno; close(fd); errno =3D= __save; }) =20 -static int __start_server(int type, const struct sockaddr *addr, +static int __start_server(int type, int protocol, const struct sockaddr *a= ddr, socklen_t addrlen, int timeout_ms, bool reuseport) { int on =3D 1; int fd; =20 - fd =3D socket(addr->sa_family, type, 0); + fd =3D socket(addr->sa_family, type, protocol); if (fd < 0) { log_err("Failed to create server socket"); return -1; @@ -113,8 +117,8 @@ static int __start_server(int type, const struct sockad= dr *addr, return -1; } =20 -int start_server(int family, int type, const char *addr_str, __u16 port, - int timeout_ms) +static int start_server_proto(int family, int type, int protocol, + const char *addr_str, __u16 port, int timeout_ms) { struct sockaddr_storage addr; socklen_t addrlen; @@ -122,10 +126,23 @@ int start_server(int family, int type, const char *ad= dr_str, __u16 port, if (make_sockaddr(family, addr_str, port, &addr, &addrlen)) return -1; =20 - return __start_server(type, (struct sockaddr *)&addr, + return __start_server(type, protocol, (struct sockaddr *)&addr, addrlen, timeout_ms, false); } =20 +int start_server(int family, int type, const char *addr_str, __u16 port, + int timeout_ms) +{ + return start_server_proto(family, type, 0, addr_str, port, timeout_ms); +} + +int start_mptcp_server(int family, const char *addr_str, __u16 port, + int timeout_ms) +{ + return start_server_proto(family, SOCK_STREAM, IPPROTO_MPTCP, addr_str, + port, timeout_ms); +} + int *start_reuseport_server(int family, int type, const char *addr_str, __u16 port, int timeout_ms, unsigned int nr_listens) { @@ -144,7 +161,7 @@ int *start_reuseport_server(int family, int type, const= char *addr_str, if (!fds) return NULL; =20 - fds[0] =3D __start_server(type, (struct sockaddr *)&addr, addrlen, + fds[0] =3D __start_server(type, 0, (struct sockaddr *)&addr, addrlen, timeout_ms, true); if (fds[0] =3D=3D -1) goto close_fds; @@ -154,7 +171,7 @@ int *start_reuseport_server(int family, int type, const= char *addr_str, goto close_fds; =20 for (; nr_fds < nr_listens; nr_fds++) { - fds[nr_fds] =3D __start_server(type, (struct sockaddr *)&addr, + fds[nr_fds] =3D __start_server(type, 0, (struct sockaddr *)&addr, addrlen, timeout_ms, true); if (fds[nr_fds] =3D=3D -1) goto close_fds; @@ -265,7 +282,7 @@ int connect_to_fd_opts(int server_fd, const struct netw= ork_helper_opts *opts) } =20 addr_in =3D (struct sockaddr_in *)&addr; - fd =3D socket(addr_in->sin_family, type, 0); + fd =3D socket(addr_in->sin_family, type, opts->protocol); if (fd < 0) { log_err("Failed to create client socket"); return -1; @@ -298,6 +315,16 @@ int connect_to_fd(int server_fd, int timeout_ms) return connect_to_fd_opts(server_fd, &opts); } =20 +int connect_to_mptcp_fd(int server_fd, int timeout_ms) +{ + struct network_helper_opts opts =3D { + .timeout_ms =3D timeout_ms, + .protocol =3D IPPROTO_MPTCP, + }; + + return connect_to_fd_opts(server_fd, &opts); +} + int connect_fd_to_fd(int client_fd, int server_fd, int timeout_ms) { struct sockaddr_storage addr; diff --git a/tools/testing/selftests/bpf/network_helpers.h b/tools/testing/= selftests/bpf/network_helpers.h index a4b3b2f9877b..e0feb115b2ae 100644 --- a/tools/testing/selftests/bpf/network_helpers.h +++ b/tools/testing/selftests/bpf/network_helpers.h @@ -21,6 +21,7 @@ struct network_helper_opts { const char *cc; int timeout_ms; bool must_fail; + int protocol; }; =20 /* ipv4 test vector */ @@ -42,11 +43,14 @@ extern struct ipv6_packet pkt_v6; int settimeo(int fd, int timeout_ms); int start_server(int family, int type, const char *addr, __u16 port, int timeout_ms); +int start_mptcp_server(int family, const char *addr, __u16 port, + int timeout_ms); int *start_reuseport_server(int family, int type, const char *addr_str, __u16 port, int timeout_ms, unsigned int nr_listens); void free_fds(int *fds, unsigned int nr_close_fds); int connect_to_fd(int server_fd, int timeout_ms); +int connect_to_mptcp_fd(int server_fd, int timeout_ms); int connect_to_fd_opts(int server_fd, const struct network_helper_opts *op= ts); int connect_fd_to_fd(int client_fd, int server_fd, int timeout_ms); int fastopen_connect(int server_fd, const char *data, unsigned int data_le= n, diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing= /selftests/bpf/prog_tests/mptcp.c new file mode 100644 index 000000000000..cd548bb2828f --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -0,0 +1,136 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2020, Tessares SA. */ + +#include +#include "cgroup_helpers.h" +#include "network_helpers.h" + +struct mptcp_storage { + __u32 invoked; + __u32 is_mptcp; +}; + +static int verify_sk(int map_fd, int client_fd, const char *msg, __u32 is_= mptcp) +{ + int err =3D 0, cfd =3D client_fd; + struct mptcp_storage val; + + if (is_mptcp =3D=3D 1) + return 0; + + if (CHECK_FAIL(bpf_map_lookup_elem(map_fd, &cfd, &val) < 0)) { + perror("Failed to read socket storage"); + return -1; + } + + if (val.invoked !=3D 1) { + log_err("%s: unexpected invoked count %d !=3D 1", + msg, val.invoked); + err++; + } + + if (val.is_mptcp !=3D 0) { + log_err("%s: unexpected bpf_tcp_sock.is_mptcp %d !=3D 0", + msg, val.is_mptcp); + err++; + } + + return err; +} + +static int run_test(int cgroup_fd, int server_fd, bool is_mptcp) +{ + int client_fd, prog_fd, map_fd, err; + struct bpf_program *prog; + struct bpf_object *obj; + struct bpf_map *map; + + obj =3D bpf_object__open("./mptcp_sock.o"); + if (libbpf_get_error(obj)) + return -EIO; + + err =3D bpf_object__load(obj); + if (CHECK_FAIL(err)) + goto out; + + prog =3D bpf_object__find_program_by_name(obj, "_sockops"); + if (CHECK_FAIL(!prog)) { + err =3D -EIO; + goto out; + } + + prog_fd =3D bpf_program__fd(prog); + if (CHECK_FAIL(prog_fd < 0)) { + err =3D -EIO; + goto out; + } + + map =3D bpf_object__find_map_by_name(obj, "socket_storage_map"); + if (CHECK_FAIL(!map)) { + err =3D -EIO; + goto out; + } + + map_fd =3D bpf_map__fd(map); + if (CHECK_FAIL(map_fd < 0)) { + err =3D -EIO; + goto out; + } + + err =3D bpf_prog_attach(prog_fd, cgroup_fd, BPF_CGROUP_SOCK_OPS, 0); + if (CHECK_FAIL(err)) + goto out; + + client_fd =3D is_mptcp ? connect_to_mptcp_fd(server_fd, 0) : + connect_to_fd(server_fd, 0); + if (client_fd < 0) { + err =3D -EIO; + goto out; + } + + err +=3D is_mptcp ? verify_sk(map_fd, client_fd, "MPTCP subflow socket", = 1) : + verify_sk(map_fd, client_fd, "plain TCP socket", 0); + + close(client_fd); + +out: + bpf_object__close(obj); + return err; +} + +void test_base(void) +{ + int server_fd, cgroup_fd; + + cgroup_fd =3D test__join_cgroup("/mptcp"); + if (CHECK_FAIL(cgroup_fd < 0)) + return; + + /* without MPTCP */ + server_fd =3D start_server(AF_INET, SOCK_STREAM, NULL, 0, 0); + if (CHECK_FAIL(server_fd < 0)) + goto with_mptcp; + + CHECK_FAIL(run_test(cgroup_fd, server_fd, false)); + + close(server_fd); + +with_mptcp: + /* with MPTCP */ + server_fd =3D start_mptcp_server(AF_INET, NULL, 0, 0); + if (CHECK_FAIL(server_fd < 0)) + goto close_cgroup_fd; + + CHECK_FAIL(run_test(cgroup_fd, server_fd, true)); + + close(server_fd); + +close_cgroup_fd: + close(cgroup_fd); +} + +void test_mptcp(void) +{ + if (test__start_subtest("base")) + test_base(); +} diff --git a/tools/testing/selftests/bpf/progs/mptcp_sock.c b/tools/testing= /selftests/bpf/progs/mptcp_sock.c new file mode 100644 index 000000000000..0d65fb889d03 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/mptcp_sock.c @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2020, Tessares SA. */ + +#include +#include + +char _license[] SEC("license") =3D "GPL"; +__u32 _version SEC("version") =3D 1; + +struct mptcp_storage { + __u32 invoked; + __u32 is_mptcp; +}; + +struct { + __uint(type, BPF_MAP_TYPE_SK_STORAGE); + __uint(map_flags, BPF_F_NO_PREALLOC); + __type(key, int); + __type(value, struct mptcp_storage); +} socket_storage_map SEC(".maps"); + +SEC("sockops") +int _sockops(struct bpf_sock_ops *ctx) +{ + struct mptcp_storage *storage; + struct bpf_tcp_sock *tcp_sk; + int op =3D (int)ctx->op; + struct bpf_sock *sk; + + if (op !=3D BPF_SOCK_OPS_TCP_CONNECT_CB) + return 1; + + sk =3D ctx->sk; + if (!sk) + return 1; + + tcp_sk =3D bpf_tcp_sock(sk); + if (!tcp_sk) + return 1; + + storage =3D bpf_sk_storage_get(&socket_storage_map, sk, 0, + BPF_SK_STORAGE_GET_F_CREATE); + if (!storage) + return 1; + + storage->invoked++; + storage->is_mptcp =3D tcp_sk->is_mptcp; + + return 1; +} --=20 2.36.0 From nobody Wed Apr 24 11:26:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp4161667pis; Mon, 2 May 2022 14:12:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwWzIenZbk+kEv6achJaL2ECcpBdFr9fdmC40EEd/OglRiRKP94chTvipjOEWb2PNZjqJA5 X-Received: by 2002:a17:902:ec8c:b0:15e:a371:ad7d with SMTP id x12-20020a170902ec8c00b0015ea371ad7dmr7092919plg.12.1651525970267; Mon, 02 May 2022 14:12:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651525970; cv=none; d=google.com; s=arc-20160816; b=LzSgpOgiBX2HZsDZDq13pTeEcsZG3tE/ppw/04F4XMKEy7vFpIn0+Dv8G7VpHZS/TU F6CUChkw8bKDsm2nLQbMw8VoBYCQpN0ZcPzxcWkkbpETszZoWRyJ/IWmcEGKnQZIeC5E C5HhDJzfn86ORMXgH4bsfdpPLOC09s3Lsb2yJRmwr1KI7gljqAVriqW5pdNozeUVpgtB 3QdK0HycsZWMhsrFkPcCcYQoPe94OrH+4fsAxc0mx002Q0lLanmiqs9p8MLjBhY7b0Yp ktIy2zPVyLAGuNFh001iYGdIno8YrwXJmEVBPiorNP8mQbzpqWC87bf/AiWIOCdvQlXR 46cg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=1kZ1EGRDpN6iEwOv3M0EoyEMjWmjpdbwOz1njgyKv68=; b=lDlj2EGl5n97YsUX5U7ntJgRuMtQs+BY2eLgC9BvdO+v2gCNwb1XMEeve86DjFn2dE TDFZ82sXJoTE+g8g+OHHUS5Ljb/91ahWKb+VS6eSShSzSdW/T+6GzYdCS67HkMb0Lkw0 FmIONgBqJFMLjlyDbTMRlItFoUkGp7sBH68gE+j4PgSN7QX8tOUoBz74mskZG5hzWNNH Z/s8latvOdTYKW4j4J4VrFtLH94RSxSTl0y0ZLu+gzBg6qpgoq3Fzl53YcqaQiIp99GV 1s4vs1awuMYwXpzo30D3OQP25uZEIXQLpyKw+jWFdT1qnnotEtL1zzop8ewezsmM4IDJ W0kg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=bwZTS6J4; spf=pass (google.com: domain of mptcp+bounces-5038-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5038-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id y10-20020a17090a600a00b001dc558eeb3esi309579pji.146.2022.05.02.14.12.50 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 02 May 2022 14:12:50 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5038-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=bwZTS6J4; spf=pass (google.com: domain of mptcp+bounces-5038-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5038-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id B572B280AC3 for ; Mon, 2 May 2022 21:12:49 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A8E033220; Mon, 2 May 2022 21:12:45 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) (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 781FA321B for ; Mon, 2 May 2022 21:12:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1651525964; x=1683061964; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=kqffaK3daxbD22vmQV/99UWXGn1rJCRY5uMKADdtxY0=; b=bwZTS6J4/W4Qt6Y63OZ/vDg3MEhD75LFqin1gm8tRTgTojaHLUzui33u FJJWJvFXSTkYtn1nL9W+LhvhXL4hyt+q+GfKTS+ysTqPN7+pMAkRlrVou 69qm9zaZV1a5C/sOID8mpJe4o+OA/Kml3fO3M8QJKPc1JB/gKY5Uumxkn ek279tt0pVKafX20kpEx60724w5dEMiWV8bv5hDv/FX/+Q7zSFUDNYCuK ue7gOcMiOuGjp8uzVW+RCeZhKMKQ5DCeydmsS8p8OJojQy8wGGnLwt21b C6cCAc0ipdtgpqSvAbFgPE4mnf/A4n7attmXb8OIa80+vcltO73mP5bbj g==; X-IronPort-AV: E=McAfee;i="6400,9594,10335"; a="247878470" X-IronPort-AV: E=Sophos;i="5.91,193,1647327600"; d="scan'208";a="247878470" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 May 2022 14:12:42 -0700 X-IronPort-AV: E=Sophos;i="5.91,193,1647327600"; d="scan'208";a="810393794" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.212.141.55]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 May 2022 14:12:41 -0700 From: Mat Martineau To: netdev@vger.kernel.org, bpf@vger.kernel.org Cc: Geliang Tang , ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, mptcp@lists.linux.dev, Matthieu Baerts , Mat Martineau Subject: [PATCH bpf-next v3 5/8] selftests: bpf: test bpf_skc_to_mptcp_sock Date: Mon, 2 May 2022 14:12:31 -0700 Message-Id: <20220502211235.142250-6-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220502211235.142250-1-mathew.j.martineau@linux.intel.com> References: <20220502211235.142250-1-mathew.j.martineau@linux.intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang This patch extends the MPTCP test base, to test the new helper bpf_skc_to_mptcp_sock(). Define struct mptcp_sock in bpf_tcp_helpers.h, use bpf_skc_to_mptcp_sock to get the msk socket in progs/mptcp_sock.c and store the infos in socket_storage_map. Get the infos from socket_storage_map in prog_tests/mptcp.c. Add a new function verify_msk() to verify the infos of MPTCP socket, and rename verify_sk() to verify_tsk() to verify TCP socket only. v2: Add CONFIG_MPTCP check for clearer error messages Acked-by: Matthieu Baerts Signed-off-by: Geliang Tang Signed-off-by: Mat Martineau --- MAINTAINERS | 1 + .../testing/selftests/bpf/bpf_mptcp_helpers.h | 14 ++++++++ .../testing/selftests/bpf/prog_tests/mptcp.c | 36 +++++++++++++++---- .../testing/selftests/bpf/progs/mptcp_sock.c | 24 ++++++++++--- 4 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 tools/testing/selftests/bpf/bpf_mptcp_helpers.h diff --git a/MAINTAINERS b/MAINTAINERS index 359afc617b92..d48d3cb6abbc 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -13780,6 +13780,7 @@ F: include/net/mptcp.h F: include/trace/events/mptcp.h F: include/uapi/linux/mptcp.h F: net/mptcp/ +F: tools/testing/selftests/bpf/bpf_mptcp_helpers.h F: tools/testing/selftests/bpf/*/*mptcp*.c F: tools/testing/selftests/net/mptcp/ =20 diff --git a/tools/testing/selftests/bpf/bpf_mptcp_helpers.h b/tools/testin= g/selftests/bpf/bpf_mptcp_helpers.h new file mode 100644 index 000000000000..18da4cc65e89 --- /dev/null +++ b/tools/testing/selftests/bpf/bpf_mptcp_helpers.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright (c) 2022, SUSE. */ + +#ifndef __BPF_MPTCP_HELPERS_H +#define __BPF_MPTCP_HELPERS_H + +#include "bpf_tcp_helpers.h" + +struct mptcp_sock { + struct inet_connection_sock sk; + +} __attribute__((preserve_access_index)); + +#endif diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing= /selftests/bpf/prog_tests/mptcp.c index cd548bb2828f..4b40bbdaf91f 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -10,14 +10,12 @@ struct mptcp_storage { __u32 is_mptcp; }; =20 -static int verify_sk(int map_fd, int client_fd, const char *msg, __u32 is_= mptcp) +static int verify_tsk(int map_fd, int client_fd) { + char *msg =3D "plain TCP socket"; int err =3D 0, cfd =3D client_fd; struct mptcp_storage val; =20 - if (is_mptcp =3D=3D 1) - return 0; - if (CHECK_FAIL(bpf_map_lookup_elem(map_fd, &cfd, &val) < 0)) { perror("Failed to read socket storage"); return -1; @@ -38,6 +36,32 @@ static int verify_sk(int map_fd, int client_fd, const ch= ar *msg, __u32 is_mptcp) return err; } =20 +static int verify_msk(int map_fd, int client_fd) +{ + char *msg =3D "MPTCP subflow socket"; + int err =3D 0, cfd =3D client_fd; + struct mptcp_storage val; + + if (CHECK_FAIL(bpf_map_lookup_elem(map_fd, &cfd, &val) < 0)) { + perror("Failed to read socket storage"); + return -1; + } + + if (val.invoked !=3D 1) { + log_err("%s: unexpected invoked count %d !=3D 1", + msg, val.invoked); + err++; + } + + if (val.is_mptcp !=3D 1) { + log_err("%s: unexpected bpf_tcp_sock.is_mptcp %d !=3D 1", + msg, val.is_mptcp); + err++; + } + + return err; +} + static int run_test(int cgroup_fd, int server_fd, bool is_mptcp) { int client_fd, prog_fd, map_fd, err; @@ -88,8 +112,8 @@ static int run_test(int cgroup_fd, int server_fd, bool i= s_mptcp) goto out; } =20 - err +=3D is_mptcp ? verify_sk(map_fd, client_fd, "MPTCP subflow socket", = 1) : - verify_sk(map_fd, client_fd, "plain TCP socket", 0); + err +=3D is_mptcp ? verify_msk(map_fd, client_fd) : + verify_tsk(map_fd, client_fd); =20 close(client_fd); =20 diff --git a/tools/testing/selftests/bpf/progs/mptcp_sock.c b/tools/testing= /selftests/bpf/progs/mptcp_sock.c index 0d65fb889d03..7b6a25e37de8 100644 --- a/tools/testing/selftests/bpf/progs/mptcp_sock.c +++ b/tools/testing/selftests/bpf/progs/mptcp_sock.c @@ -3,9 +3,11 @@ =20 #include #include +#include "bpf_mptcp_helpers.h" =20 char _license[] SEC("license") =3D "GPL"; __u32 _version SEC("version") =3D 1; +extern bool CONFIG_MPTCP __kconfig; =20 struct mptcp_storage { __u32 invoked; @@ -24,6 +26,7 @@ int _sockops(struct bpf_sock_ops *ctx) { struct mptcp_storage *storage; struct bpf_tcp_sock *tcp_sk; + struct mptcp_sock *msk; int op =3D (int)ctx->op; struct bpf_sock *sk; =20 @@ -38,11 +41,24 @@ int _sockops(struct bpf_sock_ops *ctx) if (!tcp_sk) return 1; =20 - storage =3D bpf_sk_storage_get(&socket_storage_map, sk, 0, - BPF_SK_STORAGE_GET_F_CREATE); - if (!storage) - return 1; + if (!tcp_sk->is_mptcp) { + storage =3D bpf_sk_storage_get(&socket_storage_map, sk, 0, + BPF_SK_STORAGE_GET_F_CREATE); + if (!storage) + return 1; + } else { + if (!CONFIG_MPTCP) + return 1; + + msk =3D bpf_skc_to_mptcp_sock(sk); + if (!msk) + return 1; =20 + storage =3D bpf_sk_storage_get(&socket_storage_map, msk, 0, + BPF_SK_STORAGE_GET_F_CREATE); + if (!storage) + return 1; + } storage->invoked++; storage->is_mptcp =3D tcp_sk->is_mptcp; =20 --=20 2.36.0 From nobody Wed Apr 24 11:26:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp4161681pis; Mon, 2 May 2022 14:12:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw2biX1pquz7nePJmFop5xvTsgvuwqzg5oQz7byvlJeDzPsnQu/pg+X67L1pHQDaxtyo5oX X-Received: by 2002:a05:6870:41c4:b0:e6:6550:2da3 with SMTP id z4-20020a05687041c400b000e665502da3mr494650oac.13.1651525971294; Mon, 02 May 2022 14:12:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651525971; cv=none; d=google.com; s=arc-20160816; b=c6Znt1oOg24USkNy6GXmD9O9s9DhVglLcsH0FFmLaMTTj1azddWh5FrGhSRltcafvi 4vSCVBs7/Ja4HhQcd5h2KmU8dgJ4DYjH+1lU3uwTSIp6VmZekFS40p2Uf/y7YTucu6y3 56Apdz4xaE1X1L1IzFlfi2oRJXiN5n64hnBfjaG59wjzpv84PkEtVVCKyjVbG7/+Uxjq pwGUad9RwEhz6dfrKr9e4Pe8qjWx6xbiJRfWEwUueMr8danagt7q/9YLIVcqWiNqKrZx FD8guQTH3JiOpElZ3VchDXe2UIACDn0YnFTWn3LDE4/W8FeHggYB2AeTdJxKZVsYOGD7 Suyg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=frpwiAKMoadnEQGdRm1Qs2UzxU3iO4eX51dGUn5O3XI=; b=tJaHPGA8mEswqzs6/RDZHArRkrCnk2Tbge59tR9y6Wp8wRdjPDiXGRVRs6x/6m9Q8W xUdKtSvMR29MkPg3Tu4sazyaDZzH6i+v0hil1sgan6jebDwS7ilgy1dLiuQ7kQQn9i/C A7/RCYcoE4QD24OFHl4NMijNnS2EsCjjtCSEMYNvBSpPdCAXkLEqlJkn+F+Ncr3Dhy+d 3Q0Jlrmdz0WCC52JxWmZun/AXhwJM+8iiSLEh0fpQNi0esf8VMttT1Kitj0fZGR3+8gd XGafcEGLG59D9H6rcJOh5pewVfoR9jjIscH3zvSKrOHT2BtBTNSi0Fg80Tk01Lpgcp84 YMug== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=MuPQGVRz; spf=pass (google.com: domain of mptcp+bounces-5039-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5039-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from da.mirrors.kernel.org (da.mirrors.kernel.org. [139.178.84.19]) by mx.google.com with ESMTPS id w6-20020acadf06000000b0032623890704si826216oig.31.2022.05.02.14.12.51 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 02 May 2022 14:12:51 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5039-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) client-ip=139.178.84.19; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=MuPQGVRz; spf=pass (google.com: domain of mptcp+bounces-5039-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5039-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by da.mirrors.kernel.org (Postfix) with ESMTPS id 237842E09EC for ; Mon, 2 May 2022 21:12:51 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 0E3383222; Mon, 2 May 2022 21:12:46 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) (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 BF6983212 for ; Mon, 2 May 2022 21:12:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1651525964; x=1683061964; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=5iPMySKUpf93N23lqTMqnVufH1GUMnK0ljO1C+LsgqY=; b=MuPQGVRzKYjKthxePfhA2skRCJFjoEpIjXjJDQWNIK9W1E//O1x/kgKZ VoKfwhkvm2/N0v9g5fifKRdOoGyQ8C7OuxGQctBxFi9ba5peEsqFaoGmc v2j6cylT9FdN8ZlL77xP8Qi6YVPdaHIRCJmPjckYWDllxQmVd/IRE7HU+ 8DSDKEzZyqb9btLAzAnM03PorIBAAQg+tGZWWKkGvehmZ6C2IpQEZRyVQ GVj8fuKwhc08mDFqOgqs0j4ilr4a7KceKfETp6Qk7lUBuB0ImZBHhlQxZ +JDog4B7TDS1c54jCBpS+FnqLbWGg9LcwvbNA2MR8viNayHi0rGOLabNZ w==; X-IronPort-AV: E=McAfee;i="6400,9594,10335"; a="247878472" X-IronPort-AV: E=Sophos;i="5.91,193,1647327600"; d="scan'208";a="247878472" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 May 2022 14:12:42 -0700 X-IronPort-AV: E=Sophos;i="5.91,193,1647327600"; d="scan'208";a="810393795" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.212.141.55]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 May 2022 14:12:42 -0700 From: Mat Martineau To: netdev@vger.kernel.org, bpf@vger.kernel.org Cc: Geliang Tang , ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, mptcp@lists.linux.dev, Matthieu Baerts , Mat Martineau Subject: [PATCH bpf-next v3 6/8] selftests: bpf: verify token of struct mptcp_sock Date: Mon, 2 May 2022 14:12:32 -0700 Message-Id: <20220502211235.142250-7-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220502211235.142250-1-mathew.j.martineau@linux.intel.com> References: <20220502211235.142250-1-mathew.j.martineau@linux.intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang This patch verifies the struct member token of struct mptcp_sock. Add a new function get_msk_token() to parse the msk token from the output of the command 'ip mptcp monitor', and verify it in verify_msk(). Acked-by: Matthieu Baerts Signed-off-by: Geliang Tang Signed-off-by: Mat Martineau --- .../testing/selftests/bpf/bpf_mptcp_helpers.h | 1 + .../testing/selftests/bpf/prog_tests/mptcp.c | 66 +++++++++++++++++++ .../testing/selftests/bpf/progs/mptcp_sock.c | 5 ++ 3 files changed, 72 insertions(+) diff --git a/tools/testing/selftests/bpf/bpf_mptcp_helpers.h b/tools/testin= g/selftests/bpf/bpf_mptcp_helpers.h index 18da4cc65e89..87e15810997d 100644 --- a/tools/testing/selftests/bpf/bpf_mptcp_helpers.h +++ b/tools/testing/selftests/bpf/bpf_mptcp_helpers.h @@ -9,6 +9,7 @@ struct mptcp_sock { struct inet_connection_sock sk; =20 + __u32 token; } __attribute__((preserve_access_index)); =20 #endif diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing= /selftests/bpf/prog_tests/mptcp.c index 4b40bbdaf91f..c5d96ba81e04 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -8,8 +8,11 @@ struct mptcp_storage { __u32 invoked; __u32 is_mptcp; + __u32 token; }; =20 +static char monitor_log_path[64]; + static int verify_tsk(int map_fd, int client_fd) { char *msg =3D "plain TCP socket"; @@ -36,11 +39,58 @@ static int verify_tsk(int map_fd, int client_fd) return err; } =20 +/* + * Parse the token from the output of 'ip mptcp monitor': + * + * [ CREATED] token=3D3ca933d3 remid=3D0 locid=3D0 saddr4=3D127.0.0.= 1 ... + * [ CREATED] token=3D2ab57040 remid=3D0 locid=3D0 saddr4=3D127.0.0.= 1 ... + */ +static __u32 get_msk_token(void) +{ + char *prefix =3D "[ CREATED] token=3D"; + char buf[BUFSIZ] =3D {}; + __u32 token =3D 0; + ssize_t len; + int fd; + + sync(); + + fd =3D open(monitor_log_path, O_RDONLY); + if (CHECK_FAIL(fd < 0)) { + log_err("Failed to open %s", monitor_log_path); + return token; + } + + len =3D read(fd, buf, sizeof(buf)); + if (CHECK_FAIL(len < 0)) { + log_err("Failed to read %s", monitor_log_path); + goto err; + } + + if (strncmp(buf, prefix, strlen(prefix))) { + log_err("Invalid prefix %s", buf); + goto err; + } + + token =3D strtol(buf + strlen(prefix), NULL, 16); + +err: + close(fd); + return token; +} + static int verify_msk(int map_fd, int client_fd) { char *msg =3D "MPTCP subflow socket"; int err =3D 0, cfd =3D client_fd; struct mptcp_storage val; + __u32 token; + + token =3D get_msk_token(); + if (token <=3D 0) { + log_err("Unexpected token %x", token); + return -1; + } =20 if (CHECK_FAIL(bpf_map_lookup_elem(map_fd, &cfd, &val) < 0)) { perror("Failed to read socket storage"); @@ -59,6 +109,12 @@ static int verify_msk(int map_fd, int client_fd) err++; } =20 + if (val.token !=3D token) { + log_err("Unexpected mptcp_sock.token %x !=3D %x", + val.token, token); + err++; + } + return err; } =20 @@ -124,6 +180,7 @@ static int run_test(int cgroup_fd, int server_fd, bool = is_mptcp) =20 void test_base(void) { + char cmd[256], tmp_dir[] =3D "/tmp/XXXXXX"; int server_fd, cgroup_fd; =20 cgroup_fd =3D test__join_cgroup("/mptcp"); @@ -141,6 +198,13 @@ void test_base(void) =20 with_mptcp: /* with MPTCP */ + if (CHECK_FAIL(!mkdtemp(tmp_dir))) + goto close_cgroup_fd; + snprintf(monitor_log_path, sizeof(monitor_log_path), + "%s/ip_mptcp_monitor", tmp_dir); + snprintf(cmd, sizeof(cmd), "ip mptcp monitor > %s &", monitor_log_path); + if (CHECK_FAIL(system(cmd))) + goto close_cgroup_fd; server_fd =3D start_mptcp_server(AF_INET, NULL, 0, 0); if (CHECK_FAIL(server_fd < 0)) goto close_cgroup_fd; @@ -148,6 +212,8 @@ void test_base(void) CHECK_FAIL(run_test(cgroup_fd, server_fd, true)); =20 close(server_fd); + snprintf(cmd, sizeof(cmd), "rm -rf %s", tmp_dir); + system(cmd); =20 close_cgroup_fd: close(cgroup_fd); diff --git a/tools/testing/selftests/bpf/progs/mptcp_sock.c b/tools/testing= /selftests/bpf/progs/mptcp_sock.c index 7b6a25e37de8..c58c191d8416 100644 --- a/tools/testing/selftests/bpf/progs/mptcp_sock.c +++ b/tools/testing/selftests/bpf/progs/mptcp_sock.c @@ -12,6 +12,7 @@ extern bool CONFIG_MPTCP __kconfig; struct mptcp_storage { __u32 invoked; __u32 is_mptcp; + __u32 token; }; =20 struct { @@ -46,6 +47,8 @@ int _sockops(struct bpf_sock_ops *ctx) BPF_SK_STORAGE_GET_F_CREATE); if (!storage) return 1; + + storage->token =3D 0; } else { if (!CONFIG_MPTCP) return 1; @@ -58,6 +61,8 @@ int _sockops(struct bpf_sock_ops *ctx) BPF_SK_STORAGE_GET_F_CREATE); if (!storage) return 1; + + storage->token =3D msk->token; } storage->invoked++; storage->is_mptcp =3D tcp_sk->is_mptcp; --=20 2.36.0 From nobody Wed Apr 24 11:26:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp4161685pis; Mon, 2 May 2022 14:12:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx/cACK4J6V5F7Cnb5DIpj96i5OG1mNJjZPg3YzkucBEBJ0j6TI+j4fHkc/eyHDCzaWKOtP X-Received: by 2002:a05:6870:a1a8:b0:e2:182d:6375 with SMTP id a40-20020a056870a1a800b000e2182d6375mr474055oaf.247.1651525972627; Mon, 02 May 2022 14:12:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651525972; cv=none; d=google.com; s=arc-20160816; b=iGR63Sz7j415saVRMwhMRIGYk9LsIMhPto2mGLS3f6IKjIzYajkPJDbR4RvVS7LbJ4 ExwVNBf3e6SBBbaoZVnPGTdPMj7NEbC/0pbnsPOjkNb5ka6cg1BkMik2G1VtVcbeh+Yj bRDgXhK0gljqpVgOIVE9V3huj4sQ5Y3fPezTPloXVtTrlXyb0C/otxcIAUcsvZQiO4Ir RGXZxC/BPJ7K0FxWU3Ht1A4d37ZXeEBx4QLtFN8FrwOSwNhaL8FXvlTvdXZdrc4OmxwS 9YVVKsc4ynYjIbNvln8HA4PGErEYIjfh+h+GSQKf/YLFXQXQfCzPd4JqnPxRSjjjBr6y QiLw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=nFApvUP/hdG5PNIomIlsaclXWqJoKRloB1lZgBrZpjo=; b=uS1e3hbeqFzdKxNBcMMVMraZULHz4NaYqU0H95239E9f0QjB/grMVrLL1c9OE0t5cX HpvOfnZ25ZYCmFn8w3mOGbH/r4+KS5C6jy7nn8/h+f7c6csheewHmIqfI0Hs6XHh+k+e FXxIkwzK2GvNfU+pGbbsEHCb+mbWDjRKgXJLtUXTFQbw58pqGcFcN59TxWOH/t45sEE6 gVGVIPq3kwE3ressV4d9hsCTK8ZV4nND0UqnakBNHnZ2D97MKL87KfI5sLtT5kzKZpKl QBxSFMLG6Xu2KvOkF3Fse8tuScMBd+g3kVjkFJ8iE5cSbGcWY6ESdD9s4vzARWko1ssO lFIw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=B0WsOw3i; spf=pass (google.com: domain of mptcp+bounces-5040-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5040-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from da.mirrors.kernel.org (da.mirrors.kernel.org. [2604:1380:4040:4f00::1]) by mx.google.com with ESMTPS id g4-20020a4adc84000000b0035ecda9d5e1si4561106oou.37.2022.05.02.14.12.52 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 02 May 2022 14:12:52 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5040-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) client-ip=2604:1380:4040:4f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=B0WsOw3i; spf=pass (google.com: domain of mptcp+bounces-5040-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5040-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by da.mirrors.kernel.org (Postfix) with ESMTPS id 39E6D2E09FA for ; Mon, 2 May 2022 21:12:52 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 87EEF3212; Mon, 2 May 2022 21:12:46 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) (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 6673A3217 for ; Mon, 2 May 2022 21:12:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1651525965; x=1683061965; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=szTMMA+89v2H8xSDvTnXgwA74cZHtkhg7qzXfwihkzw=; b=B0WsOw3iOUZO+//gtslm+Z5qMJ8KiypWkdC9dTzrMI/0AXhHk1319nlw j6OMCgMydHtMbJcrrkBr03nL6B4qpdQpaSPLfDcmtY1VwHpyowF4Jhf3Y 0PwI6oOdSISSySd0cDCQKBwXusuxi+XQiI40jRY6mriRNVhNwMEgwAY70 aQWbmB0DCkYUOs79cxTR110FKrmKt/SkvF6CbdmWMgvdtOCMtamIwaw+h Nh+OdN1v5B1WzCCPShUlIANZTPZ9LrN6CyLRRETGYDcWMUFUd4/4di/Q7 iTAOnCmUJakdKXTHH00diTmlh5egDI7cvVXfecrx4KEuRX5zaYFJaVWIJ A==; X-IronPort-AV: E=McAfee;i="6400,9594,10335"; a="247878475" X-IronPort-AV: E=Sophos;i="5.91,193,1647327600"; d="scan'208";a="247878475" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 May 2022 14:12:42 -0700 X-IronPort-AV: E=Sophos;i="5.91,193,1647327600"; d="scan'208";a="810393796" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.212.141.55]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 May 2022 14:12:42 -0700 From: Mat Martineau To: netdev@vger.kernel.org, bpf@vger.kernel.org Cc: Geliang Tang , ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, mptcp@lists.linux.dev, Matthieu Baerts , Mat Martineau Subject: [PATCH bpf-next v3 7/8] selftests: bpf: verify ca_name of struct mptcp_sock Date: Mon, 2 May 2022 14:12:33 -0700 Message-Id: <20220502211235.142250-8-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220502211235.142250-1-mathew.j.martineau@linux.intel.com> References: <20220502211235.142250-1-mathew.j.martineau@linux.intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang This patch verifies another member of struct mptcp_sock, ca_name. Add a new function get_msk_ca_name() to read the sysctl tcp_congestion_control and verify it in verify_msk(). v3: Access the sysctl through the filesystem to avoid compatibility issues with the busybox sysctl command. Acked-by: Matthieu Baerts Signed-off-by: Geliang Tang Signed-off-by: Mat Martineau --- .../testing/selftests/bpf/bpf_mptcp_helpers.h | 1 + tools/testing/selftests/bpf/bpf_tcp_helpers.h | 4 ++ .../testing/selftests/bpf/prog_tests/mptcp.c | 38 +++++++++++++++++++ .../testing/selftests/bpf/progs/mptcp_sock.c | 4 ++ 4 files changed, 47 insertions(+) diff --git a/tools/testing/selftests/bpf/bpf_mptcp_helpers.h b/tools/testin= g/selftests/bpf/bpf_mptcp_helpers.h index 87e15810997d..463e4e061c96 100644 --- a/tools/testing/selftests/bpf/bpf_mptcp_helpers.h +++ b/tools/testing/selftests/bpf/bpf_mptcp_helpers.h @@ -10,6 +10,7 @@ struct mptcp_sock { struct inet_connection_sock sk; =20 __u32 token; + char ca_name[TCP_CA_NAME_MAX]; } __attribute__((preserve_access_index)); =20 #endif diff --git a/tools/testing/selftests/bpf/bpf_tcp_helpers.h b/tools/testing/= selftests/bpf/bpf_tcp_helpers.h index b1ede6f0b821..89750d732cfa 100644 --- a/tools/testing/selftests/bpf/bpf_tcp_helpers.h +++ b/tools/testing/selftests/bpf/bpf_tcp_helpers.h @@ -16,6 +16,10 @@ BPF_PROG(name, args) #define SOL_TCP 6 #endif =20 +#ifndef TCP_CA_NAME_MAX +#define TCP_CA_NAME_MAX 16 +#endif + #define tcp_jiffies32 ((__u32)bpf_jiffies64()) =20 struct sock_common { diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing= /selftests/bpf/prog_tests/mptcp.c index c5d96ba81e04..f2d22507431c 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -5,10 +5,15 @@ #include "cgroup_helpers.h" #include "network_helpers.h" =20 +#ifndef TCP_CA_NAME_MAX +#define TCP_CA_NAME_MAX 16 +#endif + struct mptcp_storage { __u32 invoked; __u32 is_mptcp; __u32 token; + char ca_name[TCP_CA_NAME_MAX]; }; =20 static char monitor_log_path[64]; @@ -79,11 +84,36 @@ static __u32 get_msk_token(void) return token; } =20 +void get_msk_ca_name(char ca_name[]) +{ + size_t len; + int fd; + + fd =3D open("/proc/sys/net/ipv4/tcp_congestion_control", O_RDONLY); + if (CHECK_FAIL(fd < 0)) { + log_err("Failed to open tcp_congestion_control"); + return; + } + + len =3D read(fd, ca_name, TCP_CA_NAME_MAX); + if (CHECK_FAIL(len < 0)) { + log_err("Failed to read ca_name"); + goto err; + } + + if (len > 0 && ca_name[len - 1] =3D=3D '\n') + ca_name[len - 1] =3D '\0'; + +err: + close(fd); +} + static int verify_msk(int map_fd, int client_fd) { char *msg =3D "MPTCP subflow socket"; int err =3D 0, cfd =3D client_fd; struct mptcp_storage val; + char ca_name[TCP_CA_NAME_MAX]; __u32 token; =20 token =3D get_msk_token(); @@ -92,6 +122,8 @@ static int verify_msk(int map_fd, int client_fd) return -1; } =20 + get_msk_ca_name(ca_name); + if (CHECK_FAIL(bpf_map_lookup_elem(map_fd, &cfd, &val) < 0)) { perror("Failed to read socket storage"); return -1; @@ -115,6 +147,12 @@ static int verify_msk(int map_fd, int client_fd) err++; } =20 + if (strncmp(val.ca_name, ca_name, TCP_CA_NAME_MAX)) { + log_err("Unexpected mptcp_sock.ca_name %s !=3D %s", + val.ca_name, ca_name); + err++; + } + return err; } =20 diff --git a/tools/testing/selftests/bpf/progs/mptcp_sock.c b/tools/testing= /selftests/bpf/progs/mptcp_sock.c index c58c191d8416..226571673800 100644 --- a/tools/testing/selftests/bpf/progs/mptcp_sock.c +++ b/tools/testing/selftests/bpf/progs/mptcp_sock.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 /* Copyright (c) 2020, Tessares SA. */ =20 +#include #include #include #include "bpf_mptcp_helpers.h" @@ -13,6 +14,7 @@ struct mptcp_storage { __u32 invoked; __u32 is_mptcp; __u32 token; + char ca_name[TCP_CA_NAME_MAX]; }; =20 struct { @@ -49,6 +51,7 @@ int _sockops(struct bpf_sock_ops *ctx) return 1; =20 storage->token =3D 0; + bzero(storage->ca_name, TCP_CA_NAME_MAX); } else { if (!CONFIG_MPTCP) return 1; @@ -63,6 +66,7 @@ int _sockops(struct bpf_sock_ops *ctx) return 1; =20 storage->token =3D msk->token; + memcpy(storage->ca_name, msk->ca_name, TCP_CA_NAME_MAX); } storage->invoked++; storage->is_mptcp =3D tcp_sk->is_mptcp; --=20 2.36.0 From nobody Wed Apr 24 11:26:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp4161701pis; Mon, 2 May 2022 14:12:53 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyw+xFdu22AwGasG5/EHEEWRAWXOenZfoz4j8/qd2uQGzPHJOeHJL/hCETxB1lo9UCiMbYV X-Received: by 2002:a17:902:cec5:b0:15e:6c60:2d1d with SMTP id d5-20020a170902cec500b0015e6c602d1dmr14022710plg.155.1651525973810; Mon, 02 May 2022 14:12:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651525973; cv=none; d=google.com; s=arc-20160816; b=eL+7uZ5wz1ttTgHhuofkILx/hL5/3e8F1/wkNgRDZrM4jL2PzViAwrv0Sig7pH1tHn flnst8bM0zww33lWX5a9NjrCNXnAMaok0m7nqRcFpCjRLL+G6tvyYsYrzKAw6UC7Tg+0 2xcEdB1uXmVeGp6SzFK/8ksDnuI/mDgRDjx/GFArV7zh01xxay+5zmSjglW/JMzVFQR1 JVJAPonQwOzJWu+6WrtpxJaPZQnKlAYNW2lGLMzIbWMoB84L/XHKQRHuwNs3IqU7Ivtu TYJlN7dkLme+/dSb+zSLCoc6iT/Z5S+4zq5nukXrmLZsLgISgDUpcZNjwKRJWSfxEXCs jIkQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=ITADeBCP8At/JluMnICzU/ymeNWWYfFMu0qigVinTCk=; b=K4FAqX/uL/FpHJafoWkg9b6E18E528PR26GKOdJ72SqCSE+SPZKmkOx3uwfnH43QH/ Rr1aJ6bVYkJV4DnBDbfcn4cpk2y/2CvwW5gWIJYam24KVcdPJQD4l5hz9S2U/37fgvBY seF+/dkaCOMHcYbLc8PDuiVMtRIALMSBa2eM+lEs4eHgsyE8poXEgW3mnugMsjO4xa91 ReMD8Fo3Jm3VtrJ57dOvTv9KKs3daJP9+QkzEJpZ3ADFkzL63tVYCjstCtByrj+h8B+0 F6BrLUxswvQVZ4neGRh0outwWYojfPkDRbPJGLgIghiSA+7r0VUBrFglwjZVQ4OvEqmC TCZQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=e79cNpTc; spf=pass (google.com: domain of mptcp+bounces-5041-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5041-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id f24-20020a631f18000000b003985223c137si14562202pgf.354.2022.05.02.14.12.53 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 02 May 2022 14:12:53 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5041-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=e79cNpTc; spf=pass (google.com: domain of mptcp+bounces-5041-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5041-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 2F6A2280BE5 for ; Mon, 2 May 2022 21:12:53 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id BBB563217; Mon, 2 May 2022 21:12:46 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) (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 BA045321B for ; Mon, 2 May 2022 21:12:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1651525965; x=1683061965; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ePBoh8AS4mwSPeuWl8RsJ+xb84HPUdh2FWvDwxtDwec=; b=e79cNpTcg5yPxr0faNCpkbLdZ9TsTo1hw1grHsEO1T+mf5NS4gJrYwA0 6k0OKUhs3ouZOB45Y9E2A2H/eYjmhh+WoO8//tgXvlOl+Nh5wUHJv6FGf lajqraLKWut61ZzxfGAUcnDR1aeLw8u/9z4WV/P3/Q1lWbtpA+63O65OH 49zxMmMW/a/UHyG7GiL7dN1kW2heAf4UwGqh9YT5pW3MoCwG0iBxfIidg nvaAYbbfci+hU0hMIPgdAmqgAsM+pCNAlvyJtq0nWsh8LYx6bMd48LYFv JjgtCkojhH3UdkvTs48CfPfx17M5sviYodYw1O4i2hGcY8eTZL8j99LCu g==; X-IronPort-AV: E=McAfee;i="6400,9594,10335"; a="247878478" X-IronPort-AV: E=Sophos;i="5.91,193,1647327600"; d="scan'208";a="247878478" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 May 2022 14:12:43 -0700 X-IronPort-AV: E=Sophos;i="5.91,193,1647327600"; d="scan'208";a="810393797" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.212.141.55]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 May 2022 14:12:42 -0700 From: Mat Martineau To: netdev@vger.kernel.org, bpf@vger.kernel.org Cc: Geliang Tang , ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, mptcp@lists.linux.dev, Matthieu Baerts , Mat Martineau Subject: [PATCH bpf-next v3 8/8] selftests: bpf: verify first of struct mptcp_sock Date: Mon, 2 May 2022 14:12:34 -0700 Message-Id: <20220502211235.142250-9-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220502211235.142250-1-mathew.j.martineau@linux.intel.com> References: <20220502211235.142250-1-mathew.j.martineau@linux.intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang This patch verifies the 'first' struct member of struct mptcp_sock, which points to the first subflow of msk. Save 'sk' in mptcp_storage, and verify it with 'first' in verify_msk(). Acked-by: Matthieu Baerts Signed-off-by: Geliang Tang Signed-off-by: Mat Martineau --- tools/testing/selftests/bpf/bpf_mptcp_helpers.h | 1 + tools/testing/selftests/bpf/prog_tests/mptcp.c | 8 ++++++++ tools/testing/selftests/bpf/progs/mptcp_sock.c | 5 +++++ 3 files changed, 14 insertions(+) diff --git a/tools/testing/selftests/bpf/bpf_mptcp_helpers.h b/tools/testin= g/selftests/bpf/bpf_mptcp_helpers.h index 463e4e061c96..b5a43b108982 100644 --- a/tools/testing/selftests/bpf/bpf_mptcp_helpers.h +++ b/tools/testing/selftests/bpf/bpf_mptcp_helpers.h @@ -10,6 +10,7 @@ struct mptcp_sock { struct inet_connection_sock sk; =20 __u32 token; + struct sock *first; char ca_name[TCP_CA_NAME_MAX]; } __attribute__((preserve_access_index)); =20 diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing= /selftests/bpf/prog_tests/mptcp.c index f2d22507431c..ed5773c26045 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -12,7 +12,9 @@ struct mptcp_storage { __u32 invoked; __u32 is_mptcp; + struct sock *sk; __u32 token; + struct sock *first; char ca_name[TCP_CA_NAME_MAX]; }; =20 @@ -147,6 +149,12 @@ static int verify_msk(int map_fd, int client_fd) err++; } =20 + if (val.first !=3D val.sk) { + log_err("Unexpected mptcp_sock.first %p !=3D %p", + val.first, val.sk); + err++; + } + if (strncmp(val.ca_name, ca_name, TCP_CA_NAME_MAX)) { log_err("Unexpected mptcp_sock.ca_name %s !=3D %s", val.ca_name, ca_name); diff --git a/tools/testing/selftests/bpf/progs/mptcp_sock.c b/tools/testing= /selftests/bpf/progs/mptcp_sock.c index 226571673800..b1e7f3b4330a 100644 --- a/tools/testing/selftests/bpf/progs/mptcp_sock.c +++ b/tools/testing/selftests/bpf/progs/mptcp_sock.c @@ -13,7 +13,9 @@ extern bool CONFIG_MPTCP __kconfig; struct mptcp_storage { __u32 invoked; __u32 is_mptcp; + struct sock *sk; __u32 token; + struct sock *first; char ca_name[TCP_CA_NAME_MAX]; }; =20 @@ -52,6 +54,7 @@ int _sockops(struct bpf_sock_ops *ctx) =20 storage->token =3D 0; bzero(storage->ca_name, TCP_CA_NAME_MAX); + storage->first =3D NULL; } else { if (!CONFIG_MPTCP) return 1; @@ -67,9 +70,11 @@ int _sockops(struct bpf_sock_ops *ctx) =20 storage->token =3D msk->token; memcpy(storage->ca_name, msk->ca_name, TCP_CA_NAME_MAX); + storage->first =3D msk->first; } storage->invoked++; storage->is_mptcp =3D tcp_sk->is_mptcp; + storage->sk =3D (struct sock *)sk; =20 return 1; } --=20 2.36.0