From nobody Fri May 3 21:23:10 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp486535pis; Fri, 13 May 2022 15:48:40 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyDZhGMQEuETbvUW7S8Copdxh9sqqweuYqxJa9iylgduvKC27kEA9uxcSjTrjhq1qii1LVY X-Received: by 2002:a17:902:e2d4:b0:15e:e9f1:4d3e with SMTP id l20-20020a170902e2d400b0015ee9f14d3emr6771819plc.73.1652482120103; Fri, 13 May 2022 15:48:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1652482120; cv=none; d=google.com; s=arc-20160816; b=sWnav6qG/NhOOvw9353PoYqgdgTiVdu9Lut5MkH9eSX95hAW6tJ1858WgWZ480EOkp kA55etUXZwO9sgURg6pLAN+Otb6YJ26yhhwsn352CkZk5evGsP9yyZKMwzE4ogD4lHhW JtT7XTIfjYy0yy1ISM21xntk+KQRDFY7KPg+SNBvej1onM+qK2SyvCLG0NxAdjhGSLwY y0udkdJR6UWg5vfwnJqgZrv3j3wYtoFUuzR5sximLpdrAaXkZkSVK9Zo7hlvq+ocSUp9 zZ4oMeb19dcvdGQbz9kn5Qm6ZA0ggpTljdiktFZIzsvlestVNu11I4l0PCngmZ+KJw/8 CI+A== 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=rc828IlIKF3yB8NDOxBhR5UPLFutNFfFlNYfpJTkNcg=; b=Y37Ovoq95+vFimzPH4XQqnoUFJ5fpXAAO+Ob67IV1vD32u1mpaF6seaZaRHOhJ3kh/ i0wDskrkSJa1yQhqzbD2zmHrkvNOwZO+IOrFiF9Uq6rItdJqQBwxZZh2D9X/H4BfUA2I zIUcWwxf78UBhS5M9E5dtBgd1G7wbrwjqTxc0LbsMSjRNfF8oNZoAxlOCUfaESq3J3FH k2oCg3dFHH0AnTje+wXi3cI82Y1e0INV1lc/7q4SSrbLOPw9KiJrU5iB3boXoQAg/0Rx SMwJcgt9D4On3Y0kSZTMLSNdD7zHvtqaN2IZUjLSkdCH91Cs8YAH85hwDF0Rb9D9ZpAM bHiA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=gGgYZSOB; spf=pass (google.com: domain of mptcp+bounces-5285-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5285-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 z17-20020a170903019100b0015b4a198c8fsi5332949plg.288.2022.05.13.15.48.40 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 13 May 2022 15:48:40 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5285-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=gGgYZSOB; spf=pass (google.com: domain of mptcp+bounces-5285-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5285-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 B9685280BEE for ; Fri, 13 May 2022 22:48:39 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 0F8A82586; Fri, 13 May 2022 22:48:38 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 A3EEF256E for ; Fri, 13 May 2022 22:48:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1652482116; x=1684018116; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=JB7bATcZn/WA8er13fmFYWIBL3gX8WgQ2rDYBtRcyis=; b=gGgYZSOBfjV/HbU8AMGalHJuxd3hnXKlAh5Aa6INpqcQEcD2x0dpy+RL fPzK9lKxD/ap1+B2C+UfgtijvU37XZbRudfTsZfRpb4Hm6AHSzFuaZIeS 05DNHLoTt7bdShBOy9o2T2paQLvsQQJbsimlc4SkFRh0M1Ki44tOM27F5 AGnDiozx9ycRP8GZ8iRNx8F4ZVBDUFjccqxWOrjkGcmAcHpysYgc1mfcg 6fZ9kVRDKmpbWCodkBux0fzfnM0JJ9//2HOuDGjcbJKbmxT2UU/c+Y8CW WtjidmaEk4BSzUHW9vBArDgLBpUlwG6FJy80w+bXwNdB0wbIeQgKqh2oX g==; X-IronPort-AV: E=McAfee;i="6400,9594,10346"; a="333462009" X-IronPort-AV: E=Sophos;i="5.91,223,1647327600"; d="scan'208";a="333462009" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 May 2022 15:48:33 -0700 X-IronPort-AV: E=Sophos;i="5.91,223,1647327600"; d="scan'208";a="815588246" Received: from clakshma-mobl1.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.212.160.121]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 May 2022 15:48:33 -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 v4 1/7] bpf: add bpf_skc_to_mptcp_sock_proto Date: Fri, 13 May 2022 15:48:21 -0700 Message-Id: <20220513224827.662254-2-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220513224827.662254-1-mathew.j.martineau@linux.intel.com> References: <20220513224827.662254-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 5061ccd8b2dc..c129c2e2dd95 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -2229,6 +2229,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 0210f85131b3..56688bee20d9 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -5172,6 +5172,12 @@ union bpf_attr { * Return * Map value associated to *key* on *cpu*, or **NULL** if no entry * was found or *cpu* is invalid. + * + * 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), \ @@ -5370,6 +5376,7 @@ union bpf_attr { FN(ima_file_hash), \ FN(kptr_xchg), \ FN(map_lookup_percpu_elem), \ + 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 05c1b6656824..10ed10b24860 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 7141ca8a1c2d..10b157a6d73e 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -1705,6 +1705,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 fe0da529d00f..5af58eb48587 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); @@ -11281,6 +11282,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); @@ -11323,6 +11338,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 0210f85131b3..56688bee20d9 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -5172,6 +5172,12 @@ union bpf_attr { * Return * Map value associated to *key* on *cpu*, or **NULL** if no entry * was found or *cpu* is invalid. + * + * 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), \ @@ -5370,6 +5376,7 @@ union bpf_attr { FN(ima_file_hash), \ FN(kptr_xchg), \ FN(map_lookup_percpu_elem), \ + FN(skc_to_mptcp_sock), \ /* */ =20 /* integer value in 'imm' field of BPF_CALL instruction selects which help= er --=20 2.36.1 From nobody Fri May 3 21:23:10 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp486524pis; Fri, 13 May 2022 15:48:39 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwngDuxTXAzlvycQlk8xCbsW6tHvNEs0Dj2wwVuc3qArDoQNUsXHbx7VX9GQFfDYoKjd6jC X-Received: by 2002:a63:2bc4:0:b0:3ab:1d76:64db with SMTP id r187-20020a632bc4000000b003ab1d7664dbmr5607085pgr.508.1652482118968; Fri, 13 May 2022 15:48:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1652482118; cv=none; d=google.com; s=arc-20160816; b=bhKiSo3NNI7eDDzqDeYqf0Y3wADm3RxSVUJYjQSEH0t0lPVQJSkr2nWPbeDOSU1FO8 sWOF8AT98KanSoN/4W3aja5dDyHyvpspJgTLLUjC/VUi4ei+unofB2pSSi72W03TDlGU YdJmtxvM0hFWRbr+mz3CkxynZwMxOkh1HF/3W9pnmFaQ1lmc/uZ9LfhR028VavCxbJK3 GFgpuPK63JmdpfG+Sq/eiOfXimFsWloOnHZUuQA3HYSsifqraEm9LmA925IxdOUWbbCc eYLTGc5DGhajzenvCCckAii9Ij44ZySFhYxyi5NeDA8RcBvJ6Iv0jK3D4+9ZNPZGode1 5BdQ== 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=lcPwex0cEiPfzSKvkoByE/6Q9IVUbfy9HZVTvHWAC3M=; b=Mr8tOV3w7Ecc41QuSXrIucy9sG27c0Bn4IsDmy5SRTmFdea75w9IBlJp2VIoX4eJtU A1qRo60fCVK6t7mOsW560vxEqrI8rOjrQtQsGJP0KGgorAUCmA1j9e1vhfYKrP6vtXvz unlvGxVWJQpZpYzMDD0T3dNZ7NCtLtP+tOOdRNxnohXpAS4N4R9HftOOKkliY6QdHa9B dRTBnrAiCyOwk+ZNLwBV9MlV623pYB5b5qFasaAcEukuWanYDoaZt/pmfP2ByjAp0upt GRuEYb7egyLfc6U5ZIsYiBnqFAUTBjeTHU1+b24p9mUgeD8Se8P7Ejzz62JK67BtnGk3 BcAA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=iWGTzy4w; spf=pass (google.com: domain of mptcp+bounces-5284-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5284-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 s21-20020a63e815000000b003c6115ef99esi4244334pgh.49.2022.05.13.15.48.38 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 13 May 2022 15:48:38 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5284-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=iWGTzy4w; spf=pass (google.com: domain of mptcp+bounces-5284-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5284-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 9B165280AB1 for ; Fri, 13 May 2022 22:48:38 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id BABEF2589; Fri, 13 May 2022 22:48:37 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 B03892586 for ; Fri, 13 May 2022 22:48:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1652482116; x=1684018116; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Fpbu7J+T3sEY5KzKGDHOZcdSlNTcq4FmV5F0zYAzn2c=; b=iWGTzy4wIOkzXUIAPHxhoEzF4Tfd5Q9irKEpB+sPYtNVXE6bNwEXkBRI mLwHRWwUTy2MFDuLm4wP18k0/kWVhUMw9KCeehI2VF23PjtzSra2fSohJ uOYy1vvcfd3E0gJ+h0s3BIEj29ZQ5hy/TT0t/rGRgFkexsTBbwFtxOoX7 tobVHnAu40NhQsrYUimWVxH/d6qX/tqel07m5XdtSBLt/tgaU48f4TeQ5 XPLuzXo7BXeXHRf7OaDcREEWzWVVbJvldNXK/t6JHMYAIO34mMebXC22r 8NIlm83whKkkiIVzqEJwvTjEXXW+bKOhIv6m2EBt5Im9LNXG9veJJVhhW Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10346"; a="333462011" X-IronPort-AV: E=Sophos;i="5.91,223,1647327600"; d="scan'208";a="333462011" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 May 2022 15:48:34 -0700 X-IronPort-AV: E=Sophos;i="5.91,223,1647327600"; d="scan'208";a="815588248" Received: from clakshma-mobl1.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.212.160.121]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 May 2022 15:48:33 -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 v4 2/7] selftests/bpf: Enable CONFIG_IKCONFIG_PROC in config Date: Fri, 13 May 2022 15:48:22 -0700 Message-Id: <20220513224827.662254-3-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220513224827.662254-1-mathew.j.martineau@linux.intel.com> References: <20220513224827.662254-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 Acked-by: Andrii Nakryiko Signed-off-by: Geliang Tang Signed-off-by: Mat Martineau --- 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 08c6e5a66d87..6840d4625e01 100644 --- a/tools/testing/selftests/bpf/config +++ b/tools/testing/selftests/bpf/config @@ -54,3 +54,5 @@ CONFIG_NF_DEFRAG_IPV6=3Dy CONFIG_NF_CONNTRACK=3Dy CONFIG_USERFAULTFD=3Dy CONFIG_FPROBE=3Dy +CONFIG_IKCONFIG=3Dy +CONFIG_IKCONFIG_PROC=3Dy --=20 2.36.1 From nobody Fri May 3 21:23:10 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp486571pis; Fri, 13 May 2022 15:48:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzAyXpI4mddHYdInHqFOfzUxFmkNk6BuCbpE5uwh1odT2/+S2/9wR7mJqiJVdRxarGOcqU+ X-Received: by 2002:a05:6402:3ca:b0:42a:6266:3f1b with SMTP id t10-20020a05640203ca00b0042a62663f1bmr875919edw.424.1652482125026; Fri, 13 May 2022 15:48:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1652482125; cv=none; d=google.com; s=arc-20160816; b=cW201gp7shamba8uww7ufT7fx3Gc1xB1BWA6CKO4CO18ZD1T19iShkzOodGvH+nGOD YKmdw1qYmoaK2wNGmRObxmZbrMskHkk/yJAo7wNNUDZ5r5nPlAoYXmQSkn+sNkRh4mLs poSHrG+nFi31VB7uj3O+B6tTgbfhNJya+hJva8rsATKBcSIdhrLIZT8iOjz6Cb1ShG5g D1e+QQ1k0Qjr8BOkAk66Mkr6i12bEY4EHEn687ZFuuxIEHuNA7Vrmzi934/IhmVHiNxW KSXhPFJrpRj2hI6+vWw7BPuBa1I4kDRW8C6K1LSTl30rS9BWoaYo1a1N27Ozl6yvNuhi 5ElQ== 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=rfftF8PyMlvgRSttwk/JzLlMBSWmC4tC/07xssYrI4M=; b=VI77sKPUKGQ33pmVQTjzAXBJkQs0xxKDscBOQw9d+6QXucpcRuECalHVzatbc2hi63 YoY7CL6peuyChffwUgH1+vVk6x+UQ0AUckid0yIAlrh8uwOp52/cKxP4JYqe7MlBgJ5G wRJPc12/RYWs71xx5TTr7n/gpzKckmP9PsW59rhf+3b6RZxcCfRZWvPHGfV8v73KnGTA b6zCg/g9gYiPIwjaSQhd6Zbm+5JrWbNhlpDvetYNdBvbmFTPvLTnT90guiSv0YzTEj0d QJ2P4gr8I6y+O0nxyh7hqAJQYhM53qHo5IbvWAttRPpmcB3kUhBrj4k6uuDhM0S7bwgG EWjw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=PI7jIpo7; spf=pass (google.com: domain of mptcp+bounces-5287-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5287-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 cs18-20020a170906dc9200b006f428fb25b5si3433368ejc.674.2022.05.13.15.48.44 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 13 May 2022 15:48:45 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5287-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=PI7jIpo7; spf=pass (google.com: domain of mptcp+bounces-5287-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5287-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 884072E09C4 for ; Fri, 13 May 2022 22:48:42 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 1C13A2588; Fri, 13 May 2022 22:48:39 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 F0B242587 for ; Fri, 13 May 2022 22:48:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1652482116; x=1684018116; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=LFzEVrUeuSdUqC7pZJ3ZiE9lR8hcl5P4xDvHZxTgGm0=; b=PI7jIpo7ajs2V+ybibipBoLXXWPPVNcQ47jWI+wSbp2xIZfd8kpOIgmA PW91i7Y4afIfxyHqDp9QNLrVOl/QCESOvsbuBZ421FXvdF7aCgYg7FSdK cpVfdAgUllvwcCPcRL4ifXT16dy8lFoBN7zrv2oZ/JHGwfwjN4mAVXipU 74+dXuUYFoXTQpcWZz05CO3GE5ApQxpM4FrDsMeIPQLr94wPBbjrWr8T3 G4ugJYe3+MIdZSaQdDot2znbOWAdW2JWl6ySZUFixQAx1cAvMEdsXt+a8 xocD5VAXAgf0ytW5/im6/rNEel6twJ1Z7zxfYLkvwJWHoHyA0DPr4Ax/W g==; X-IronPort-AV: E=McAfee;i="6400,9594,10346"; a="333462015" X-IronPort-AV: E=Sophos;i="5.91,223,1647327600"; d="scan'208";a="333462015" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 May 2022 15:48:34 -0700 X-IronPort-AV: E=Sophos;i="5.91,223,1647327600"; d="scan'208";a="815588249" Received: from clakshma-mobl1.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.212.160.121]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 May 2022 15:48:33 -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 v4 3/7] selftests/bpf: add MPTCP test base Date: Fri, 13 May 2022 15:48:23 -0700 Message-Id: <20220513224827.662254-4-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220513224827.662254-1-mathew.j.martineau@linux.intel.com> References: <20220513224827.662254-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. v4: - add copyright 2022 (Andrii) - use ASSERT_* instead of CHECK_FAIL (Andrii) - drop SEC("version") (Andrii) - use is_mptcp in tcp_sock, instead of bpf_tcp_sock (Martin & Andrii) 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/bpf_tcp_helpers.h | 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 | 53 +++++++ 7 files changed, 231 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/bpf_tcp_helpers.h b/tools/testing/= selftests/bpf/bpf_tcp_helpers.h index b1ede6f0b821..22e0c8849a17 100644 --- a/tools/testing/selftests/bpf/bpf_tcp_helpers.h +++ b/tools/testing/selftests/bpf/bpf_tcp_helpers.h @@ -81,6 +81,7 @@ struct tcp_sock { __u32 lsndtime; __u32 prior_cwnd; __u64 tcp_mstamp; /* most recent packet received/sent */ + bool is_mptcp; } __attribute__((preserve_access_index)); =20 static __always_inline struct inet_connection_sock *inet_csk(const struct = sock *sk) diff --git a/tools/testing/selftests/bpf/config b/tools/testing/selftests/b= pf/config index 6840d4625e01..3b3edc0fc8a6 100644 --- a/tools/testing/selftests/bpf/config +++ b/tools/testing/selftests/bpf/config @@ -56,3 +56,4 @@ CONFIG_USERFAULTFD=3Dy CONFIG_FPROBE=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..cb0389ca8690 --- /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. */ +/* Copyright (c) 2022, SUSE. */ + +#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, cfd =3D client_fd; + struct mptcp_storage val; + + if (is_mptcp =3D=3D 1) + return 0; + + err =3D bpf_map_lookup_elem(map_fd, &cfd, &val); + if (!ASSERT_OK(err, "bpf_map_lookup_elem")) + return err; + + 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 (!ASSERT_OK(err, "bpf_object__load")) + goto out; + + prog =3D bpf_object__find_program_by_name(obj, "_sockops"); + if (!ASSERT_OK_PTR(prog, "bpf_object__find_program_by_name")) { + err =3D -EIO; + goto out; + } + + prog_fd =3D bpf_program__fd(prog); + if (!ASSERT_GE(prog_fd, 0, "bpf_program__fd")) { + err =3D -EIO; + goto out; + } + + map =3D bpf_object__find_map_by_name(obj, "socket_storage_map"); + if (!ASSERT_OK_PTR(map, "bpf_object__find_map_by_name")) { + err =3D -EIO; + goto out; + } + + map_fd =3D bpf_map__fd(map); + if (!ASSERT_GE(map_fd, 0, "bpf_map__fd")) { + err =3D -EIO; + goto out; + } + + err =3D bpf_prog_attach(prog_fd, cgroup_fd, BPF_CGROUP_SOCK_OPS, 0); + if (!ASSERT_OK(err, "bpf_prog_attach")) + goto out; + + client_fd =3D is_mptcp ? connect_to_mptcp_fd(server_fd, 0) : + connect_to_fd(server_fd, 0); + if (!ASSERT_GE(client_fd, 0, "connect to fd")) { + 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..bc09dba0b078 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/mptcp_sock.c @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2020, Tessares SA. */ +/* Copyright (c) 2022, SUSE. */ + +#include +#include +#include "bpf_tcp_helpers.h" + +char _license[] SEC("license") =3D "GPL"; + +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; + int op =3D (int)ctx->op; + struct tcp_sock *tsk; + struct bpf_sock *sk; + bool is_mptcp; + + if (op !=3D BPF_SOCK_OPS_TCP_CONNECT_CB) + return 1; + + sk =3D ctx->sk; + if (!sk) + return 1; + + tsk =3D bpf_skc_to_tcp_sock(sk); + if (!tsk) + return 1; + + is_mptcp =3D bpf_core_field_exists(tsk->is_mptcp) ? tsk->is_mptcp : 0; + 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 is_mptcp; + + return 1; +} --=20 2.36.1 From nobody Fri May 3 21:23:10 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp486583pis; Fri, 13 May 2022 15:48:46 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzipSDZLjpVgH8MXycuvOXO8Vedar2RIgYvAlVI+sbxv0hEiybC2TGbwI/CSBlMdKSYSt41 X-Received: by 2002:a17:90b:3e8b:b0:1dc:e471:1a69 with SMTP id rj11-20020a17090b3e8b00b001dce4711a69mr18437463pjb.60.1652482126268; Fri, 13 May 2022 15:48:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1652482126; cv=none; d=google.com; s=arc-20160816; b=Ak+TnRGNCAVZKS+wwGezrswJkiRPTJaQqe8g7O8XQuW/CRsXppyxV/NOpWnzIBi84x spgq0+CN9fUHWrVmmL2hXjCmgSrZpYAZWOEg/PqIoU2jpFN9QnhNiisVo2mBr5+y9xZj MB+8t2QQKntDXLccnMjemDR6R3so1mVQT6K16ies3pgZrkbdZpwqvaoSCD4+SKdjCKdF fZFRq0dkOCD+TJFVXy10B2XyFPUP8xZPdDxyOqtSEWuwmlDsmieeXk5khJdqBQmMizbS oJqrwnU39trgJTxBrjNt8yqwgTq4S8FLykGr+5LQL1s0N2TfSPjUv3GDa2tKFyEjbfZY FoNA== 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=a3gYT8CsAi6AS3AQTxaPWieJYVvpmI+ClJqChstH7m8=; b=VrfWUk/YR57qf747/kir0QwcbW7kdOGoQM2XIevNygW7OPRbUSUJ3x3I1hdgs9/O0e y3MBhWaFf2yDGPScfJVMlwm+GYNYRqKfLi2kDUUXahD/iliU3VNAk0jCIm8GXUcUJfzk +Gd+09diM1wy1Wwmh5OV/UIogxHLtmCuqlPl62o+26a4Hosylj0qiUNBxJYzdhvl08pr 6Cx/jOCvCf9HriXI/xkcD1hPRf11N1BDcYy7iE1Q16qTBct9sjtVdCw4lI0wOBEgv47a ZZCROiberznc1v/G4zAOKiQiKWBaNeFS+06jm7VDiIc/B9bplv88GwA7Ql+F7Gy9El+D 0kfw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=WtOfwPfv; spf=pass (google.com: domain of mptcp+bounces-5290-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5290-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 m11-20020a656a0b000000b003c61e82a816si5523089pgu.475.2022.05.13.15.48.46 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 13 May 2022 15:48:46 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5290-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=WtOfwPfv; spf=pass (google.com: domain of mptcp+bounces-5290-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5290-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 D2168280C1A for ; Fri, 13 May 2022 22:48:45 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 479F12586; Fri, 13 May 2022 22:48:41 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 26374256E for ; Fri, 13 May 2022 22:48:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1652482119; x=1684018119; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=AI+iLl0CdYRnbsKkyMDDmzOGsATE3q4/Dmj+lbPscS0=; b=WtOfwPfvDcV2ydCW/iHZAZD3zI1wOJaXNYcGEuToPo1m9rU67Dc3bxCA 3q4gaHxQlfzPHuad4X1O0l/C2wjpIJ1BLRuM/B1ynVcPrYBBlCnndK0FT jzDr2NXRhEVG6wwDqCIA3LSlq0Wi5xVk392J9ANaRHwOmke9iGh/nv59q 8jWB9Yjil275qM741RkviosBMVaanzf8m0utwmcbhtKiqRNaE7t/CsSMi Ts45O3kz7II0NkmvY8aZrljPjsSo10i3F67JkKoUpPlvRSRMTXU4gihzJ 4TNFynV7rw/Xva0YGm1h5VitipbXRA55EYm6y3nl/IzFQV/5aNFO+x7iW g==; X-IronPort-AV: E=McAfee;i="6400,9594,10346"; a="333462017" X-IronPort-AV: E=Sophos;i="5.91,223,1647327600"; d="scan'208";a="333462017" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 May 2022 15:48:34 -0700 X-IronPort-AV: E=Sophos;i="5.91,223,1647327600"; d="scan'208";a="815588252" Received: from clakshma-mobl1.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.212.160.121]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 May 2022 15:48:34 -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 v4 4/7] selftests/bpf: test bpf_skc_to_mptcp_sock Date: Fri, 13 May 2022 15:48:24 -0700 Message-Id: <20220513224827.662254-5-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220513224827.662254-1-mathew.j.martineau@linux.intel.com> References: <20220513224827.662254-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 v4: - use ASSERT_* instead of CHECK_FAIL (Andrii) - drop bpf_mptcp_helpers.h (Andrii) Acked-by: Matthieu Baerts Signed-off-by: Geliang Tang Signed-off-by: Mat Martineau --- tools/testing/selftests/bpf/bpf_tcp_helpers.h | 5 +++ .../testing/selftests/bpf/prog_tests/mptcp.c | 45 ++++++++++++++----- .../testing/selftests/bpf/progs/mptcp_sock.c | 23 ++++++++-- 3 files changed, 58 insertions(+), 15 deletions(-) diff --git a/tools/testing/selftests/bpf/bpf_tcp_helpers.h b/tools/testing/= selftests/bpf/bpf_tcp_helpers.h index 22e0c8849a17..90fecafc493d 100644 --- a/tools/testing/selftests/bpf/bpf_tcp_helpers.h +++ b/tools/testing/selftests/bpf/bpf_tcp_helpers.h @@ -226,4 +226,9 @@ static __always_inline bool tcp_cc_eq(const char *a, co= nst char *b) extern __u32 tcp_slow_start(struct tcp_sock *tp, __u32 acked) __ksym; extern void tcp_cong_avoid_ai(struct tcp_sock *tp, __u32 w, __u32 acked) _= _ksym; =20 +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 cb0389ca8690..02e7fd8918e6 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -11,14 +11,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, cfd =3D client_fd; struct mptcp_storage val; =20 - if (is_mptcp =3D=3D 1) - return 0; - err =3D bpf_map_lookup_elem(map_fd, &cfd, &val); if (!ASSERT_OK(err, "bpf_map_lookup_elem")) return err; @@ -38,6 +36,31 @@ 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, cfd =3D client_fd; + struct mptcp_storage val; + + err =3D bpf_map_lookup_elem(map_fd, &cfd, &val); + if (!ASSERT_OK(err, "bpf_map_lookup_elem")) + return err; + + 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 +111,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 @@ -103,25 +126,25 @@ void test_base(void) int server_fd, cgroup_fd; =20 cgroup_fd =3D test__join_cgroup("/mptcp"); - if (CHECK_FAIL(cgroup_fd < 0)) + if (!ASSERT_GE(cgroup_fd, 0, "test__join_cgroup")) return; =20 /* without MPTCP */ server_fd =3D start_server(AF_INET, SOCK_STREAM, NULL, 0, 0); - if (CHECK_FAIL(server_fd < 0)) + if (!ASSERT_GE(server_fd, 0, "start_server")) goto with_mptcp; =20 - CHECK_FAIL(run_test(cgroup_fd, server_fd, false)); + ASSERT_OK(run_test(cgroup_fd, server_fd, false), "run_test tcp"); =20 close(server_fd); =20 with_mptcp: /* with MPTCP */ server_fd =3D start_mptcp_server(AF_INET, NULL, 0, 0); - if (CHECK_FAIL(server_fd < 0)) + if (!ASSERT_GE(server_fd, 0, "start_mptcp_server")) goto close_cgroup_fd; =20 - CHECK_FAIL(run_test(cgroup_fd, server_fd, true)); + ASSERT_OK(run_test(cgroup_fd, server_fd, true), "run_test mptcp"); =20 close(server_fd); =20 diff --git a/tools/testing/selftests/bpf/progs/mptcp_sock.c b/tools/testing= /selftests/bpf/progs/mptcp_sock.c index bc09dba0b078..3feb7ff578e2 100644 --- a/tools/testing/selftests/bpf/progs/mptcp_sock.c +++ b/tools/testing/selftests/bpf/progs/mptcp_sock.c @@ -7,6 +7,7 @@ #include "bpf_tcp_helpers.h" =20 char _license[] SEC("license") =3D "GPL"; +extern bool CONFIG_MPTCP __kconfig; =20 struct mptcp_storage { __u32 invoked; @@ -24,6 +25,7 @@ SEC("sockops") int _sockops(struct bpf_sock_ops *ctx) { struct mptcp_storage *storage; + struct mptcp_sock *msk; int op =3D (int)ctx->op; struct tcp_sock *tsk; struct bpf_sock *sk; @@ -41,11 +43,24 @@ int _sockops(struct bpf_sock_ops *ctx) return 1; =20 is_mptcp =3D bpf_core_field_exists(tsk->is_mptcp) ? tsk->is_mptcp : 0; - storage =3D bpf_sk_storage_get(&socket_storage_map, sk, 0, - BPF_SK_STORAGE_GET_F_CREATE); - if (!storage) - return 1; + if (!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 is_mptcp; =20 --=20 2.36.1 From nobody Fri May 3 21:23:10 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp486575pis; Fri, 13 May 2022 15:48:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwfh4Suflrs9LVetfNY2fk+qcF5miFw01T0AD5pZ/fyeEj4fsIRYCJw8Fn9jsFpc5kWJaZ5 X-Received: by 2002:a05:6402:28b6:b0:425:e137:e31a with SMTP id eg54-20020a05640228b600b00425e137e31amr870950edb.215.1652482125551; Fri, 13 May 2022 15:48:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1652482125; cv=none; d=google.com; s=arc-20160816; b=mp7mccy/iMEdGQL2zOLxldCOfE/4TpByAG9PYK6y/bpn9dlpK7EPa2vcHpbGxwvAu8 /utaV3d2CVP2zhyov55RdIdR3wiHwYxkPGPoTLWK4a/2joIz0iMFx6DfQDUy82nF3dU1 iLkUtgPQtoF25lXylhwKLcsJ2zBLd029Y9dQ6DBZGp6bqAz5pWARhiUOJbfA8OyI5Yjx cAOrvAPRQWBv6q3v63mlk7jQn3RUBts7LBaLx0ql3saEJ2zRS/Fzjeab4W67DXi+DFUz iEoIs+IilR0Nsx/6Xle8zkAt8g0m0jtVMbVGspTg/N54szq73EcKwrLyZkKbs+D9IQMc CoYg== 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=mQgKcTQ18CQyZUlbak+lg+oVXwyf72zHMIjSc08IrFc=; b=jaIEKRI5bztpiwsMXyCdsVuVgtlR3NvnB974Eh4j98abbL0EBDvaVQfQ/wDc9OuFbH T7L0XU0Tou2CR0bZ/Vs8S5dy8Q45yDNaDx2hFV/4HceBWpHaTvsvB9igLGXt+CvsVglB xfWcdTZn9fnb5D3+RzDoPCvzLaIQScvON34pAmU6xDIRFbNdilcZ6q6alKqu+jdULopb fDqClNbcY3q7CS/syM2V9C6tSHoaOoerIGG+yOyQ1C/31eFvfCUb+a8ay0fMLzhLiZo0 8J5eRYUgON1lEg3bYgrrp4acela+ttTbEabW1d543zl8sLpKREkb1x46WgGgelzQ0hPF 6uTw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=UbMOex+N; spf=pass (google.com: domain of mptcp+bounces-5288-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5288-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 kl25-20020a170907995900b006f435477a96si2899438ejc.557.2022.05.13.15.48.45 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 13 May 2022 15:48:45 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5288-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=UbMOex+N; spf=pass (google.com: domain of mptcp+bounces-5288-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5288-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 C973D2E09D3 for ; Fri, 13 May 2022 22:48:43 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 24BBE2589; Fri, 13 May 2022 22:48:40 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 263A3258B for ; Fri, 13 May 2022 22:48:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1652482119; x=1684018119; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=lAAWLgQZcywB+GB+atlb4GlgXzeDxqNyDVPW19oil1c=; b=UbMOex+NipZxbS2ZNirxzgP474p2+unQvA5D0SIqpfe+7tKZTCFarW/2 ne2STVJ/xPsbuVCsAeyfhYRSronaduJOnk2zQschPZav/4bV1Qr6kKv5e tn+6UFIyAzgpjJ5w7725CsJFE+vC/bx9BebleBzXenqiLH+ehCqukOGRg 3+vt5f62Z99xUkV5QN0Sc+7JwTFQEvvge/Qk4l506S1+8BuZTM8eMERDG Vz8AJdqaqY+e/3xn8BpZQ/VEGTmK1Yy6He31d5z9qNa+mdsvkt+3Pm1eM tWDrNRfKhMvDz5evgteNGAPoIUvl3Ikiop365NZ5LDjk/w18OjldmXOTY A==; X-IronPort-AV: E=McAfee;i="6400,9594,10346"; a="333462019" X-IronPort-AV: E=Sophos;i="5.91,223,1647327600"; d="scan'208";a="333462019" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 May 2022 15:48:35 -0700 X-IronPort-AV: E=Sophos;i="5.91,223,1647327600"; d="scan'208";a="815588254" Received: from clakshma-mobl1.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.212.160.121]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 May 2022 15:48:34 -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 v4 5/7] selftests/bpf: verify token of struct mptcp_sock Date: Fri, 13 May 2022 15:48:25 -0700 Message-Id: <20220513224827.662254-6-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220513224827.662254-1-mathew.j.martineau@linux.intel.com> References: <20220513224827.662254-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(). v4: - use ASSERT_* instead of CHECK_FAIL (Andrii) - skip the test if 'ip mptcp monitor' is not supported (Mat) Acked-by: Matthieu Baerts Signed-off-by: Geliang Tang Signed-off-by: Mat Martineau --- tools/testing/selftests/bpf/bpf_tcp_helpers.h | 1 + .../testing/selftests/bpf/prog_tests/mptcp.c | 64 +++++++++++++++++++ .../testing/selftests/bpf/progs/mptcp_sock.c | 5 ++ 3 files changed, 70 insertions(+) diff --git a/tools/testing/selftests/bpf/bpf_tcp_helpers.h b/tools/testing/= selftests/bpf/bpf_tcp_helpers.h index 90fecafc493d..422491872619 100644 --- a/tools/testing/selftests/bpf/bpf_tcp_helpers.h +++ b/tools/testing/selftests/bpf/bpf_tcp_helpers.h @@ -229,6 +229,7 @@ extern void tcp_cong_avoid_ai(struct tcp_sock *tp, __u3= 2 w, __u32 acked) __ksym; 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 02e7fd8918e6..ac98aa314123 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -9,8 +9,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,52 @@ 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 (!ASSERT_GE(fd, 0, "Failed to open monitor_log_path")) + return token; + + len =3D read(fd, buf, sizeof(buf)); + if (!ASSERT_GT(len, 0, "Failed to read 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, cfd =3D client_fd; struct mptcp_storage val; + __u32 token; + + token =3D get_msk_token(); + if (!ASSERT_GT(token, 0, "Unexpected token")) + return -1; =20 err =3D bpf_map_lookup_elem(map_fd, &cfd, &val); if (!ASSERT_OK(err, "bpf_map_lookup_elem")) @@ -58,6 +102,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 @@ -123,6 +173,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"); @@ -140,6 +191,17 @@ void test_base(void) =20 with_mptcp: /* with MPTCP */ + if (system("ip mptcp help 2>&1 | grep -q monitor")) { + test__skip(); + goto close_cgroup_fd; + } + if (!ASSERT_OK_PTR(mkdtemp(tmp_dir), "mkdtemp")) + 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 (!ASSERT_OK(system(cmd), "ip mptcp monitor")) + goto close_cgroup_fd; server_fd =3D start_mptcp_server(AF_INET, NULL, 0, 0); if (!ASSERT_GE(server_fd, 0, "start_mptcp_server")) goto close_cgroup_fd; @@ -147,6 +209,8 @@ void test_base(void) ASSERT_OK(run_test(cgroup_fd, server_fd, true), "run_test mptcp"); =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 3feb7ff578e2..4890130826c6 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 { @@ -48,6 +49,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; @@ -60,6 +63,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 is_mptcp; --=20 2.36.1 From nobody Fri May 3 21:23:10 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp486587pis; Fri, 13 May 2022 15:48:46 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxhiYT2zJWCyJS9wsnjSi84l9Lh8KVPgMMFxoUxOU3dk1nZgKbx7B/Tq1F+DHaG1FTVSHVm X-Received: by 2002:a17:907:a089:b0:6f4:a99c:8e05 with SMTP id hu9-20020a170907a08900b006f4a99c8e05mr6138795ejc.31.1652482126533; Fri, 13 May 2022 15:48:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1652482126; cv=none; d=google.com; s=arc-20160816; b=MUVDtSpfVg+OQG5bT9YOcuaZiJNqRlA7bv+CV5ML65jEY08vd79sgdmKh+O4fyPUQU bItjzuK04DVwnQX+N+yl+mbsDe8LBYZovd78FzHvDPzWcd3SwVQhN/qNfR8vVQOl/AL1 fRx7h0ACp6y5eImIzoOSPdPhEY+1q6E9VqHHb9gUG0c9uDwRl+aDwvZXkBIHaVcnCv9d /oXTD44xL5EhCxOK8oCJjqrCgJKRMC5MVvWIkRlRcgLCPrEeyX8SS3JxvF7ZbaMM+hka /TaB0fTa0adR+Bt7Jru8rkgRj81pgX+a/xVtTcktTBxqWs+j4cH+fipUiE23Q7LPI+SJ lhyg== 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=xrrwn6laPUBuSYqpglX9xE8Jx5hPTYHWp0OaW1v4a2U=; b=LVSKLWM0cT+fz0qgc94DVSCmlm03XI8zQ288JEeke8lLcqz9NcfpWzqIj7Lhwm6xvK QlDjRYdIUPvimjXQE/vaCv2kIdU3oVUSrPImt0tZzLHt92/rvShPy2WeHiyFmpYRk/y0 oNqwYMM3a7fEYDNFO9uIl436kOtMxcQdq8WDHR87Mu5ktVCIr46OmvqQSfhlJK0CsEQV WkUSJNflzofWPtr6Zd78hvMiwc2eVccn7q3MmctvxJL/VnCGEM7MK1UG3ovQuRRX7cEy 93tUvrvjlsX9CAJlzKOq8A9ePFNtSXAWIGKy62w7N+sjbVR5thrhA4sFfvumscoEupGV mbdA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=hxC5GrK4; spf=pass (google.com: domain of mptcp+bounces-5289-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5289-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 ga27-20020a1709070c1b00b006f39eac8ff0si3692617ejc.243.2022.05.13.15.48.46 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 13 May 2022 15:48:46 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5289-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=hxC5GrK4; spf=pass (google.com: domain of mptcp+bounces-5289-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5289-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 CCEA52E09F7 for ; Fri, 13 May 2022 22:48:44 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id C85E3258B; Fri, 13 May 2022 22:48:40 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 56E472587 for ; Fri, 13 May 2022 22:48:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1652482119; x=1684018119; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=laeO4u7TU0q3/dYSryZrbK67npAa9r/pFeBQjOmJvOo=; b=hxC5GrK4DwLdB0IGJxXpCGXlVRh/XcTaVJnOSSO/3hCZiQiA4KWklFiG izfekrXhMHAu6PmXrYUGbUaiVpShwKf0IpEonhKHEhKPyb2XoofG2OQlj K9J/kbERDoIGc08xVPQqo5ylpWz2wwOtIgG1XMjOp4Aw6uBn9mUkRjsNk A1+EiRr9oTOsIkxyFn42FRXBxVU2pAxLhxzUbCLjBoP/t4G0D+wz1xCLG GhhpU+8EZ/r44gVvHoIK9QLtIOvv31EQ/USklgahK/oYUbzkm37m4ID0+ 03FJ75CwgAyRbG88G754su6+dUGSP0XWVlQociz7kxLrIvhOvZqwINWaM w==; X-IronPort-AV: E=McAfee;i="6400,9594,10346"; a="333462020" X-IronPort-AV: E=Sophos;i="5.91,223,1647327600"; d="scan'208";a="333462020" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 May 2022 15:48:36 -0700 X-IronPort-AV: E=Sophos;i="5.91,223,1647327600"; d="scan'208";a="815588256" Received: from clakshma-mobl1.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.212.160.121]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 May 2022 15:48:35 -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 v4 6/7] selftests/bpf: verify ca_name of struct mptcp_sock Date: Fri, 13 May 2022 15:48:26 -0700 Message-Id: <20220513224827.662254-7-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220513224827.662254-1-mathew.j.martineau@linux.intel.com> References: <20220513224827.662254-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. v4: use ASSERT_* instead of CHECK_FAIL (Andrii) Acked-by: Matthieu Baerts Signed-off-by: Geliang Tang Signed-off-by: Mat Martineau --- tools/testing/selftests/bpf/bpf_tcp_helpers.h | 5 +++ .../testing/selftests/bpf/prog_tests/mptcp.c | 34 +++++++++++++++++++ .../testing/selftests/bpf/progs/mptcp_sock.c | 4 +++ 3 files changed, 43 insertions(+) diff --git a/tools/testing/selftests/bpf/bpf_tcp_helpers.h b/tools/testing/= selftests/bpf/bpf_tcp_helpers.h index 422491872619..c38c66d5c1e6 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 { @@ -230,6 +234,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/prog_tests/mptcp.c b/tools/testing= /selftests/bpf/prog_tests/mptcp.c index ac98aa314123..2ff7f18ea0ce 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -6,10 +6,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]; @@ -75,17 +80,40 @@ 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 (!ASSERT_GE(fd, 0, "Failed to open tcp_congestion_control")) + return; + + len =3D read(fd, ca_name, TCP_CA_NAME_MAX); + if (!ASSERT_GT(len, 0, "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, cfd =3D client_fd; struct mptcp_storage val; + char ca_name[TCP_CA_NAME_MAX]; __u32 token; =20 token =3D get_msk_token(); if (!ASSERT_GT(token, 0, "Unexpected token")) return -1; =20 + get_msk_ca_name(ca_name); + err =3D bpf_map_lookup_elem(map_fd, &cfd, &val); if (!ASSERT_OK(err, "bpf_map_lookup_elem")) return err; @@ -108,6 +136,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 4890130826c6..c36f2f6bd2f1 100644 --- a/tools/testing/selftests/bpf/progs/mptcp_sock.c +++ b/tools/testing/selftests/bpf/progs/mptcp_sock.c @@ -2,6 +2,7 @@ /* Copyright (c) 2020, Tessares SA. */ /* Copyright (c) 2022, SUSE. */ =20 +#include #include #include #include "bpf_tcp_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 { @@ -51,6 +53,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; @@ -65,6 +68,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 is_mptcp; --=20 2.36.1 From nobody Fri May 3 21:23:10 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp486547pis; Fri, 13 May 2022 15:48:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzACtU6JF07W6PJZAWxREAux9c2NIC8REPHSRADRrR9Ep5ShvfFaHOpvkf0/PN2ssmT7NQt X-Received: by 2002:a17:90a:191a:b0:1dc:a3d3:f579 with SMTP id 26-20020a17090a191a00b001dca3d3f579mr18473646pjg.30.1652482121551; Fri, 13 May 2022 15:48:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1652482121; cv=none; d=google.com; s=arc-20160816; b=vcQs+zt6FmjpHOBjrdHUWA76jVqWV/lvv8xv1WSNdq7vHH1RZRnHwk5N75l1NEBYR9 6a10kkqFqzh6d4D+R6YO19oCYqY7nRDL9W2WPBfZ0Bnbq0KVU4krVC6wLefPaX8FdMiv 9BR1LSt9oHwq2ea9wP+Fg5oocHocFGy8gQQrlYmQiK2cQmz3TtYbLNlQRzSNZRhp+ziU 7dz0HBJOA7nPHIx1HTqNgiQAArJXx5EBBLUU9d5uWDE1OjiC9iZAfyAd1c8Q5tz02vyB vZHEouWD9KT4+NmbMirdxMcMkHaNnCdpgr1zh2ilXy5DvZQv/0rYa9yVeXo1Nqw5Surj mDJQ== 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=7Gj3rSAzmbNR3Bzedj/Jy8vD3QRMEtyQFmz4LO7ig4s=; b=lU/jpECT5CkGcOCleKZsqkVF7OW3+j4ZqwfdBG8EDyqlZCb0U9Or81BpJRIPZAEnjg gCDu1fNTRDR7u9v7R3EoD5yyGTTemg2NqnK8U9FZBrS3IsJ5DlV8eriijt+umpDqsBKo ybRDKNpq3+J4QZCVM9Ii35n/5DDxNanpWWflahYg2re8k5ClCVee3Zra1BOTuWzIGjKL O/NWaBwpGx7ygu/9KNAwo0ppQfWj+MEpIObtXLEbujCw/KsR23Yn35xYNHt4eSGnHz9H GIBCEsvDOr4q7TwZihgnPNRzmQa0fi0y07wEZBk1Yav+t4xUnhStGXmgBdVabmIh6VVv hTIA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=AgbReDXt; spf=pass (google.com: domain of mptcp+bounces-5286-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5286-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 bk14-20020a056a02028e00b003c23927073asi4285249pgb.613.2022.05.13.15.48.41 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 13 May 2022 15:48:41 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5286-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=AgbReDXt; spf=pass (google.com: domain of mptcp+bounces-5286-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5286-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 E4558280C03 for ; Fri, 13 May 2022 22:48:40 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 010EB2579; Fri, 13 May 2022 22:48:39 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) (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 2D37F2588 for ; Fri, 13 May 2022 22:48:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1652482117; x=1684018117; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=URZIdz+kPYwRPTgIUb6zoaKFH5Th8DZkust7oQxgKFc=; b=AgbReDXtugXoIxtxgrrkDr+e9kmgVZ27YAU8C+nSmLC0UodZ5+g27bST ajkV7VHQEzCC0mR3rBBjKWVo/3S3S54nTcwmU7UfukvrHLhhBunh4Gner jweBz6C0Uf8kytlgluGndKBCRPmvDqXt+NU2eD2JHILBtYonYSwMaccyl J6kXVC6YHeeW0TG+5uuNZUoRFk/51pJJNQHeLKpuzFYX58mUUW4T7kAFd T+04S88SHnK99P4UMnRl0CpiTsIjYIrEY6r5USxOHhH8DMSRxO3O5zn7/ lTz6zM+VbZzZFGoJ9CUpJM03I2wLkIRqgGcZ1ykjWhEUP4K3W3D8uo0lt A==; X-IronPort-AV: E=McAfee;i="6400,9594,10346"; a="252475200" X-IronPort-AV: E=Sophos;i="5.91,223,1647327600"; d="scan'208";a="252475200" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 May 2022 15:48:36 -0700 X-IronPort-AV: E=Sophos;i="5.91,223,1647327600"; d="scan'208";a="815588257" Received: from clakshma-mobl1.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.212.160.121]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 May 2022 15:48:35 -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 v4 7/7] selftests/bpf: verify first of struct mptcp_sock Date: Fri, 13 May 2022 15:48:27 -0700 Message-Id: <20220513224827.662254-8-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220513224827.662254-1-mathew.j.martineau@linux.intel.com> References: <20220513224827.662254-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_tcp_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_tcp_helpers.h b/tools/testing/= selftests/bpf/bpf_tcp_helpers.h index c38c66d5c1e6..82a7c9de95f9 100644 --- a/tools/testing/selftests/bpf/bpf_tcp_helpers.h +++ b/tools/testing/selftests/bpf/bpf_tcp_helpers.h @@ -234,6 +234,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 2ff7f18ea0ce..51a3e17acb9e 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -13,7 +13,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 @@ -136,6 +138,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 c36f2f6bd2f1..ab135edf3ae3 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 @@ -54,6 +56,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; @@ -69,9 +72,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 is_mptcp; + storage->sk =3D (struct sock *)sk; =20 return 1; } --=20 2.36.1