From nobody Sun May 5 10:06:05 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:ac4:a898:0:b0:4b1:af33:c52d with SMTP id z24csp2372888pid; Wed, 20 Apr 2022 15:25:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx1E++hma7pJlCkpVREVU8mF4oX9nnVGLvxUDXt4XUbh0FZtD8hKv9onQugtnXVWkqq52f0 X-Received: by 2002:a17:90a:bb88:b0:1d6:f63:b336 with SMTP id v8-20020a17090abb8800b001d60f63b336mr34355pjr.154.1650493518918; Wed, 20 Apr 2022 15:25:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650493518; cv=none; d=google.com; s=arc-20160816; b=QeR0/30wRzOWwuhX7+omwGtPrjkGu3xt4xdRI51qkLApt6NbXl+lwJOI8YUs/A9y+3 zXOi/+cPywJ4WP1SyyWhCY7PC16rgweyeV62w5W5CzswtBBbxWnJY4QV4XJhtqj3YHnm JwUAkYWlRwwZyVhlRXLlL9M/by0IxfeGwxtc8R0ODId4EchA9nBQwT9ea4H1d1z3JNwz SL9jP0wwIA6NTHXDjuxDFlOBKat3z9nC2nOJEWJDEIyD+D/lpYrD7EBODCEqQP8MfgV+ D1LxyovMtT7Lt4D75qIJUgFQwxML6PG1ofi1TA2ohrvl8Qk607sDvvhrAIEwbewjHLTl 0DXg== 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=vgQZFs73u05H9KyQoc+nEL0yj29M7RXb6iqYBK3Lbso=; b=s15yksUNzmRCzFzJMJC8w9KlZVfpCCJTH/6iLWKGaYzi1gmVZyzMMc7lLJr1S2jP1y dNnYlQDlsPvnZW40WHxsutosEWy/dsJthWSKG1dC14LBvwe2vQBepxD8CZ52ZJXqH8MJ 9KZm0IhSZEU2SjQHtHeL75X3ekw8sn1nIUywWoTMDZGiINOXpxqPKCwr9Bv3vFX4T888 m5NmQJJMRImV166glQRb25JORGrZBeCPC4yGIYVDX/JOawVe/DtyK2xIZkvX2nFm6MAm SDD/7oRoLioxmtvFLzvXoFp8sH3nDChaZ1MgJZCW8Abpp8KDDQEvzxjqU9qAVKr6wNoa /2dw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=BUYNBSE1; spf=pass (google.com: domain of mptcp+bounces-4811-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-4811-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 m6-20020a056a00080600b004fa3a8e000csi3958646pfk.195.2022.04.20.15.25.18 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Apr 2022 15:25:18 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4811-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=BUYNBSE1; spf=pass (google.com: domain of mptcp+bounces-4811-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-4811-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 8FC55280A83 for ; Wed, 20 Apr 2022 22:25:18 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id BD8613D6B; Wed, 20 Apr 2022 22:25:17 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 EFCEC2F39 for ; Wed, 20 Apr 2022 22:25:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1650493515; x=1682029515; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=DnWR4bk+hv6VcI7OdulN0bk+Petr2t2+O49LbWUe6JI=; b=BUYNBSE1u2zPy5wJ+X2aWdgSaxjnAtOpfj6KG0+q7GKUUTiUJKgcsY9E n9fN/RYrmjMQ94skyJlel19GZBVP66SQa+eP92I8+igB4w7ysqciltlGl yPgs7Qf9VQwTQShHhpTLyhvmLZxwfGxFycSRacCEDqiM22+eWsq/enJij U6vQakbZlrvAWrXpHnCDJuwh6U+DafxLbXnunJIbbUOUe1SREypmSiRbB oDWDDPGrKELomocTRv2vt7OkDOAmaQH+8c9ZACmxCbk7rUC+AKEviJBPd V4e4vwm+k6kI+Q4F1ooWQXVFZyeSr+FSjBByRNz/yB8ciHNvn86UMTYR1 A==; X-IronPort-AV: E=McAfee;i="6400,9594,10323"; a="289277578" X-IronPort-AV: E=Sophos;i="5.90,276,1643702400"; d="scan'208";a="289277578" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Apr 2022 15:25:14 -0700 X-IronPort-AV: E=Sophos;i="5.90,276,1643702400"; d="scan'208";a="555422582" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.209.100.38]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Apr 2022 15:25:13 -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 1/7] bpf: expose is_mptcp flag to bpf_tcp_sock Date: Wed, 20 Apr 2022 15:24:53 -0700 Message-Id: <20220420222459.307649-2-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220420222459.307649-1-mathew.j.martineau@linux.intel.com> References: <20220420222459.307649-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 d14b10b85e51..9ef1f3e1c22f 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -5694,6 +5694,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 143f442a9505..7b1867f1f422 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 d14b10b85e51..9ef1f3e1c22f 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -5694,6 +5694,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 Sun May 5 10:06:05 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:ac4:a898:0:b0:4b1:af33:c52d with SMTP id z24csp2372905pid; Wed, 20 Apr 2022 15:25:22 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwWEjUC95zsagGgOp4ed0iFXQAjLfqH659IaJNP6Ew8id9eJ4+1HiZ29zvwrAYP9sCuq7Wm X-Received: by 2002:a2e:320f:0:b0:24d:cd53:3bc6 with SMTP id y15-20020a2e320f000000b0024dcd533bc6mr5793799ljy.516.1650493522397; Wed, 20 Apr 2022 15:25:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650493522; cv=none; d=google.com; s=arc-20160816; b=e/kQHyFSBn6GRoHlBgSGWd0D8hXMI23YpLszvV4JelFv/q9/vrNSrYI1OdwaX9Rb25 lgwUKssB6A+HnHR+lmACx6aA0/CwE5ALzlsScuYNjXxnJ9pKn7K6v6+VQDN+S6DNy7pS rzN04XkooVS3jM7s6xxKwx4fkAPpGNCgN233/9TUPncx4DYrmMdCnJ8XbojCZFVtq7gd 5uQFOtCMDwnKShucmLUsizMMpZzJKosHKuMDqkw5Q27m01A44MR5HCv4R1DvO5pmon0j SSOkw/e07SC+c2r3fyj0Itb8tQbvB4KCnMTxvUSXzjTYKfSCGb/5+C5U7dYXCItD1wMM rodQ== 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=NIqk/8lQ3aA1b/X0wOjWJ5z6hkibG+fGq0BKWwJ4mtA=; b=kNTnr02BXI8N40LOqSb8t7wSQCsmjTwd5qjIBRk+7xgHgO8T1aL5t56Ma9YYu+2NLJ QguVl60m0QP5ZSZet9t0IgWCJEZNYju05tSVf269dd7b+cZmdScTO7a5BnRNC03G6hNB tNMHeZ4q75h++rxNPr3g25lG9LJBomEycx4KTBdBOiNqHJ1bgW+zzd/ECFSzB400+U4Z DBMANM2CBH2l6mXWnPsh4q5kdqqHznEjlECVhoDrUvmnNw6eEd7oJp8/so+Kp8ecKYdN KR0Yx97kUW38v6Omkr8/scSiGiDLS3ZH9fgj/Y0NmJYSv1YkdwvU0pG162xu5U9Rg6NF hNOw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=lj3LOF+G; spf=pass (google.com: domain of mptcp+bounces-4812-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4812-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 x7-20020a2e9c87000000b0024c83e314e5si3289775lji.130.2022.04.20.15.25.21 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Apr 2022 15:25:22 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4812-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=lj3LOF+G; spf=pass (google.com: domain of mptcp+bounces-4812-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4812-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 F0F5F2E0CE2 for ; Wed, 20 Apr 2022 22:25:19 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 307433D6D; Wed, 20 Apr 2022 22:25:18 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 4F9B67A for ; Wed, 20 Apr 2022 22:25:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1650493516; x=1682029516; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=7JGsPMfEIizl3uiYOkvij3X2qHRKl3rpmk92jGiEIgA=; b=lj3LOF+Grbbd4asy2dZxYczEopn1qC+NzFGx59xyFws/tSwqY9tzwCfM 9cHSK24zsEYuIKXLfPrd3c+AkidKGI1rhNY9FfFy7ekXDWWVICZIKpoTP yppA7KFZyiJK5d4kcYCuo+jAyT49A6qZE0Ywa/0xGkn38LEf/6+Pr7xJL x3Bd8bc4OrxN/AiOq1QIa4M65lNFuN+jFjsALVWcRmf2Upyv25bT7g5mt U0tpvDR0xoQipTBJ4/+5N1+70Y9Az5OGW9S9ncihVt1qfXx+kLwXd7+Ba g4OIvwWloOYKK+6s8e6CQ3Z/feK0yxKfkRtdVo91lo29L9rbDBr4VaaD5 Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10323"; a="289277586" X-IronPort-AV: E=Sophos;i="5.90,276,1643702400"; d="scan'208";a="289277586" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Apr 2022 15:25:15 -0700 X-IronPort-AV: E=Sophos;i="5.90,276,1643702400"; d="scan'208";a="555422587" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.209.100.38]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Apr 2022 15:25:14 -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 2/7] bpf: add bpf_skc_to_mptcp_sock_proto Date: Wed, 20 Apr 2022 15:24:54 -0700 Message-Id: <20220420222459.307649-3-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220420222459.307649-1-mathew.j.martineau@linux.intel.com> References: <20220420222459.307649-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. 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/btf_ids.h | 3 ++- include/net/mptcp.h | 6 ++++++ include/uapi/linux/bpf.h | 7 +++++++ net/core/filter.c | 17 +++++++++++++++++ net/mptcp/Makefile | 4 ++++ net/mptcp/bpf.c | 22 ++++++++++++++++++++++ scripts/bpf_doc.py | 2 ++ tools/include/uapi/linux/bpf.h | 7 +++++++ 8 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 net/mptcp/bpf.c 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 0a3b0fb04a3b..5b3a6f783182 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -283,4 +283,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_JIT) && 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 9ef1f3e1c22f..785f2cb15495 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -5143,6 +5143,12 @@ union bpf_attr { * The **hash_algo** is returned on success, * **-EOPNOTSUP** if the hash calculation failed or **-EINVAL** if * invalid arguments are passed. + * + * 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), \ @@ -5339,6 +5345,7 @@ union bpf_attr { FN(copy_from_user_task), \ FN(skb_set_tstamp), \ FN(ima_file_hash), \ + FN(skc_to_mptcp_sock), \ /* */ =20 /* integer value in 'imm' field of BPF_CALL instruction selects which help= er diff --git a/net/core/filter.c b/net/core/filter.c index 7b1867f1f422..4081c55f6f78 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,19 @@ 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) +{ + return (unsigned long)bpf_mptcp_sock_from_subflow(sk); +} + +static 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 +11335,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..168c55d1c917 100644 --- a/net/mptcp/Makefile +++ b/net/mptcp/Makefile @@ -10,3 +10,7 @@ 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 + +ifeq ($(CONFIG_BPF_JIT),y) +obj-$(CONFIG_BPF_SYSCALL) +=3D bpf.o +endif 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 9ef1f3e1c22f..785f2cb15495 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -5143,6 +5143,12 @@ union bpf_attr { * The **hash_algo** is returned on success, * **-EOPNOTSUP** if the hash calculation failed or **-EINVAL** if * invalid arguments are passed. + * + * 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), \ @@ -5339,6 +5345,7 @@ union bpf_attr { FN(copy_from_user_task), \ FN(skb_set_tstamp), \ FN(ima_file_hash), \ + 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 Sun May 5 10:06:05 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:ac4:a898:0:b0:4b1:af33:c52d with SMTP id z24csp2372908pid; Wed, 20 Apr 2022 15:25:23 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy+4Ob6PnbbHHi9snwCBhK6avcrEKeej2SF6cGMd1k9vlQEtb7XzniXTNiduEzcJKfW10BF X-Received: by 2002:a2e:9447:0:b0:24a:e13d:cfec with SMTP id o7-20020a2e9447000000b0024ae13dcfecmr14740964ljh.413.1650493523013; Wed, 20 Apr 2022 15:25:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650493523; cv=none; d=google.com; s=arc-20160816; b=RzegsFojb3y8zx3wRrx1TQl3q1AuFqrRKiGXk2YGu5SEiGkEZu8uEohfGHq9xmKu/j KyLMpDKbkAYCRphhxZ11M4NsSV2zaR+bxqECWGC09S/DLnRNU/o7ATudV3N0I8Zzfxjg W4OENCtBq4tqosf5uRr7IAj3uk6IY6ZhqJ4LVUmTJSZGPviKllxpCcWPwIrN35/b3jVr C7SFhc2IVwp3mvoMNwITgPDCdvSJOQ0bSmCU0sHaqSv/nkjWnLo95Aw9572eesugtu0a 5ehn/P0NlBToDa/iMI7Lzh/A4VuH3cSPd35AJnuUXbZcuj1hdTIRPl+sN56mYdxBnvrC zNog== 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=Xae04LR249/5bH8xh8yv69JhAU78C/JyU+Pq0bCQMh8=; b=G2oKCzkF5YolKkKTdPUKt4+j6VSptIJSW1C2U90V6TdwzbVzjoIYfQP7HUxmTSPnU9 zlmZ2rIFtu+a6n3ovSNq2btV5t7gxAVf9I4Q7Dua41N2cnn4/JYF2Onogb2mp1KTgvQA gGhFugVthFDBBnLgsKFC7gM0lTjzVnwoumLi9+pmfAW0CoJKLI61UXZ/nf3mg1ICr5MC ZOoDZfKJz54u83Nd9AXxPwPpX0+JuuNnQjxxV7WwdmW/zvTvfL4c/73Hftl4AajOcOPt IrOFMTEcRpy0vg9lCx4N/te7QDs+i57ldyRPKqHhRfE7vUotHZDkPLx+5JZd8MgmNio7 tvEw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=NZxuLTUV; spf=pass (google.com: domain of mptcp+bounces-4814-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-4814-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 k3-20020ac24f03000000b0044a0f13c94esi3270848lfr.601.2022.04.20.15.25.22 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Apr 2022 15:25:23 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4814-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=NZxuLTUV; spf=pass (google.com: domain of mptcp+bounces-4814-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-4814-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 4C1232E0CEC for ; Wed, 20 Apr 2022 22:25:22 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id AA0A03D6B; Wed, 20 Apr 2022 22:25:19 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 F3DAB3D6A for ; Wed, 20 Apr 2022 22:25:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1650493517; x=1682029517; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=CJEA91hGX63WlTUh2tNFXbq1iTbpLEuPj9zTwImLkf0=; b=NZxuLTUVBePnCcWwHboeYvcwAbGZ3VzmgqRE1xkN2snHF0urMcr3E8H3 TARS1o4ik4AuLVFZBxoitVps5DBROqtq1SsMtuFA7ICt/EvGzmkthUPU3 ZNOZzNwQVULBtMKjUkPm1mMxdBO62QtuC4qn5MXS498H8enoHlvY0esj+ wpdpDIAKzZqnpe9HBSLRzD4tPefoGmJlOTt6PTiQp0yvSUrS/VP89L63r e3fikIDVO4LYLgYK9Z3JlGoYMucJJDv+fv84b3WiibcBGgDFMlnkVfQhK s4ojHHzhHyhVPuzOaYOudeaN9a9TXTz7iAVDFgDSGlamYnvS8Fbc+wANm Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10323"; a="289277591" X-IronPort-AV: E=Sophos;i="5.90,276,1643702400"; d="scan'208";a="289277591" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Apr 2022 15:25:16 -0700 X-IronPort-AV: E=Sophos;i="5.90,276,1643702400"; d="scan'208";a="555422591" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.209.100.38]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Apr 2022 15:25:15 -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 3/7] selftests: bpf: add MPTCP test base Date: Wed, 20 Apr 2022 15:24:55 -0700 Message-Id: <20220420222459.307649-4-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220420222459.307649-1-mathew.j.martineau@linux.intel.com> References: <20220420222459.307649-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 fd768d43e048..01fbdb0e0180 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -13764,6 +13764,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 763db63a3890..fe0d3ad6ecd8 100644 --- a/tools/testing/selftests/bpf/config +++ b/tools/testing/selftests/bpf/config @@ -53,3 +53,4 @@ CONFIG_NF_DEFRAG_IPV4=3Dy CONFIG_NF_DEFRAG_IPV6=3Dy CONFIG_NF_CONNTRACK=3Dy CONFIG_USERFAULTFD=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 Sun May 5 10:06:05 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:ac4:a898:0:b0:4b1:af33:c52d with SMTP id z24csp2372901pid; Wed, 20 Apr 2022 15:25:22 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxeS+uBtUG9zZ+dK7XTLpjyLflqCFdNjRbY375mrgZcgTRLkogh3ufS84L2Zo9IvHZTzUui X-Received: by 2002:a05:6512:923:b0:46b:beaa:d3ad with SMTP id f3-20020a056512092300b0046bbeaad3admr16555762lft.316.1650493521857; Wed, 20 Apr 2022 15:25:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650493521; cv=none; d=google.com; s=arc-20160816; b=WEtHePgJ9OtP6+53rbyeGbe55r5KmzxvTqCnu5UviUS+GxLi40Ijd73wikoJiDGeKz tKsNHKwfyb1IwbNB3AkJE9oUOXdKtR73JFzGLBnqgG+pBu9I8cykyCf6cSLVSZy2FztD pakM+0Ji+ZrZd/ro1ukiX6lDfbmYoNl0NBqJspxEaMrSyjPFnpEy1wuGq23qE0OmhP58 EMcPCmNnMWVC9ZMzE8ZWMhcNeU3UxkrcIofObJtrbO/I2YvmgEqpWe9SRWa0yOxQpT24 KohCfb7FxIv73nzc3Sx06Hxn2sWSh+DIsixKQADdm9nOoJAzWFWyWhchl1M0GL8OdewW CCzQ== 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=4MCjWrLNF85Nud0RhFFj2h/wG4XBK+bOo1wDDf0ZZfI=; b=uhHZRQ5npx62hBNwYNcr/bUxecgaFmGT5XF7ufmjVlFfrxbZkPMA+osCFegbHbzK4K AIJtk5KhJxhVleB3pqbwAS/FoH1e3f+xovb6s+OtiTVlI/D1sk8r4yETYU6KDudlfYBQ lOrDmgxTvpRvoifCA2stcnZpQKjvkaUVQoAW2rMoJcKiJjjp9Fl1ERx94US/kOlS/PrJ ITEEgHgSdLXVA+X090Zr68Ns/qFF9Nae2AWib0f/C7IWlLe0kFPKorvTAvcX+3bFwdpa X/hwkjMM0FZ0RxYWxYUhvXKAw5h9UTWXJcdNwh1hLPGf8MKnNu4lh1l9C9ZGMlwrmLQf vOXA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=k2buzFNU; spf=pass (google.com: domain of mptcp+bounces-4813-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4813-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 v12-20020a2e960c000000b0024b3a591675si3079440ljh.164.2022.04.20.15.25.21 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Apr 2022 15:25:21 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4813-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=k2buzFNU; spf=pass (google.com: domain of mptcp+bounces-4813-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4813-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 236E42E0CD9 for ; Wed, 20 Apr 2022 22:25:21 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 58AE43D6E; Wed, 20 Apr 2022 22:25:19 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 C6DAB3D6C for ; Wed, 20 Apr 2022 22:25:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1650493517; x=1682029517; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=I/fyyemIfL8f6DzsdezVEl00OqqrHn4zb2LgLSArq5c=; b=k2buzFNUt/a3NkFL5o+rWApztitiemezP028XNMcoBzkBuCru3iKAn85 mBu/2+yCZHbkQ5aF2WEvNK+qXfC/PSLggcl7KCuXIj/a4CJ57k+DZhhtA v/BPfOHVUSUawwd42mJW0S7AlyKJ4eInOJzwgNtKXZf0/gUKkCtW0pR7W L2K8Y8txK2l9BohmNkXnAA46pU9ZMoe+E52Q41mgQReiOmrqB2VEfAAoc FPfPd2cYFoacaACguCu+/cUoTkHrER1RLkk4jHR7+OHTiS0i32CoLb5XE RzBqyb47NLeYvInuzQ6jKUIKLNsVf6DKLgb2PV6jYkczrvigBQ1TZuDxa A==; X-IronPort-AV: E=McAfee;i="6400,9594,10323"; a="289277599" X-IronPort-AV: E=Sophos;i="5.90,276,1643702400"; d="scan'208";a="289277599" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Apr 2022 15:25:17 -0700 X-IronPort-AV: E=Sophos;i="5.90,276,1643702400"; d="scan'208";a="555422598" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.209.100.38]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Apr 2022 15:25:16 -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 4/7] selftests: bpf: test bpf_skc_to_mptcp_sock Date: Wed, 20 Apr 2022 15:24:56 -0700 Message-Id: <20220420222459.307649-5-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220420222459.307649-1-mathew.j.martineau@linux.intel.com> References: <20220420222459.307649-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. 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 | 22 +++++++++--- 4 files changed, 62 insertions(+), 11 deletions(-) create mode 100644 tools/testing/selftests/bpf/bpf_mptcp_helpers.h diff --git a/MAINTAINERS b/MAINTAINERS index 01fbdb0e0180..f31fa73266f9 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -13764,6 +13764,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..5cfaec4e7245 100644 --- a/tools/testing/selftests/bpf/progs/mptcp_sock.c +++ b/tools/testing/selftests/bpf/progs/mptcp_sock.c @@ -3,6 +3,7 @@ =20 #include #include +#include "bpf_mptcp_helpers.h" =20 char _license[] SEC("license") =3D "GPL"; __u32 _version SEC("version") =3D 1; @@ -24,6 +25,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 +40,21 @@ 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 { + msk =3D bpf_skc_to_mptcp_sock(sk); + if (!msk) + return 1; + + 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 Sun May 5 10:06:05 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:ac4:a898:0:b0:4b1:af33:c52d with SMTP id z24csp2372913pid; Wed, 20 Apr 2022 15:25:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwcFrnu52B2m+HqBLVO8/nt49P2dg5N9AX62NnBI4qsWcKi/Y+SGs//lDpkcaui9m2fcpGZ X-Received: by 2002:a2e:9c99:0:b0:24d:a258:8923 with SMTP id x25-20020a2e9c99000000b0024da2588923mr14528351lji.122.1650493524241; Wed, 20 Apr 2022 15:25:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650493524; cv=none; d=google.com; s=arc-20160816; b=CAW4OLdWU8Kv7cr8x9NkYlz/LJPnXPERCF0FImWzSLUjXrrGZtjFrtQAaRGmM6BJDe 44FNoDCyLoqLL76lhRzjNOBgIwG0Z11uqUBkcN/nlJld9Ee3amk2Oc0cR1KICVEYxETy buOl00D7+g/871/3TCtNkVfTYvUl/hPh4AzhkRg4dpCrYubDzas6FjEMbJSTBzbDaJHQ FaAtM/p9l7i2jS+rzvzekM60YDMCzjDMkPItFV6dlpMmPzCNnP0BsrEDBnm/fDEi4U+6 gkYKe9y+tSNPqFXvsrWZb6o4XyVRrU/CUar7xXnCXElbJBtE/dIFvE/G3z2pRe1pQzCn mluA== 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=YBj2B0NDU05hdcNTQW0sdzvAsRdZ0cT9nRQR6DUuY5A=; b=JQDiAxaMPoCE0SlpweNIc2Y+ovb718RMsVMIHnN+bOZPBGVtLiiiSdPW9lOAZOEI+T JTv1T9Mwybf5qatrjxXflVwiC2ynpW2MdyT503Hclbpd5LrcRrBHMILSqRDJTlOUb2pM 67kZ2PfAW2ctJoSKJ1E/O/0VXG80Y0VmNdApHynLEhhuDZ4cDjCSj0RaDmkKMW8fp7Pv 0XGTkta7JuFyZah73RO3glv34TOFPdLpIikNkenWlgOoA0cA2/Ecq+Gh57/JsrNCQ7RX Qm/TLLaECqi8fpVSf9JG9AsfRBeZD+HNmTn0ubsTB/XPvGTIC6EPxaWTKoBALj19m1Ph RlVA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=WMNv1Emw; spf=pass (google.com: domain of mptcp+bounces-4815-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4815-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 z25-20020a0565120c1900b0046ba4d310a8si3463189lfu.410.2022.04.20.15.25.23 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Apr 2022 15:25:24 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4815-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=WMNv1Emw; spf=pass (google.com: domain of mptcp+bounces-4815-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4815-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 830F42E0CB6 for ; Wed, 20 Apr 2022 22:25:23 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 174223D6F; Wed, 20 Apr 2022 22:25:20 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 44D847A for ; Wed, 20 Apr 2022 22:25:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1650493518; x=1682029518; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=3+l/q0awMNcnjC8pV+An6v6Ed4WAzYGKwHgbYfPu7PI=; b=WMNv1EmwX5kRLQA4zOd8j/FF2Uhz0AE+2ChOlJx7Rc2dj8uMb+s2nDnf dH6zTdEgVMC1UUeOB8Z8yvwP4c+YGjuyYNq4FgJqKyZrYzbTe3MqtUkgM W4p8mFpaKOQvTUwwD2urPZhjw6CCe27rAQa7vQBhDSMY48ww0IU0rsTpm WUclWx5olLj379oE1DHGNvgVK3uIJBOvMNCvmPnYKxlXgojEc8ceKnPRE mCxhP992jMggi3li0uDkUlDq2B6f1dWH7u//u0P1eWmRZFRfWmgv8/IRP Rct5NZkROOrEhPZlLabEvHzHBQVDH6W3scf5RcjmvsZreSQVw8PiCdd8B g==; X-IronPort-AV: E=McAfee;i="6400,9594,10323"; a="289277605" X-IronPort-AV: E=Sophos;i="5.90,276,1643702400"; d="scan'208";a="289277605" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Apr 2022 15:25:17 -0700 X-IronPort-AV: E=Sophos;i="5.90,276,1643702400"; d="scan'208";a="555422604" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.209.100.38]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Apr 2022 15:25:17 -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 5/7] selftests: bpf: verify token of struct mptcp_sock Date: Wed, 20 Apr 2022 15:24:57 -0700 Message-Id: <20220420222459.307649-6-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220420222459.307649-1-mathew.j.martineau@linux.intel.com> References: <20220420222459.307649-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 5cfaec4e7245..56cc7c61131b 100644 --- a/tools/testing/selftests/bpf/progs/mptcp_sock.c +++ b/tools/testing/selftests/bpf/progs/mptcp_sock.c @@ -11,6 +11,7 @@ __u32 _version SEC("version") =3D 1; struct mptcp_storage { __u32 invoked; __u32 is_mptcp; + __u32 token; }; =20 struct { @@ -45,6 +46,8 @@ int _sockops(struct bpf_sock_ops *ctx) BPF_SK_STORAGE_GET_F_CREATE); if (!storage) return 1; + + storage->token =3D 0; } else { msk =3D bpf_skc_to_mptcp_sock(sk); if (!msk) @@ -54,6 +57,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 Sun May 5 10:06:05 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:ac4:a898:0:b0:4b1:af33:c52d with SMTP id z24csp2372916pid; Wed, 20 Apr 2022 15:25:25 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyatfeodCGFnaQhqCekubhgQDyrdFp5JnGAgNw7RFZyO6bhIwUsI+U/pi9W7m983izeZKQx X-Received: by 2002:a19:f518:0:b0:46d:58b:160c with SMTP id j24-20020a19f518000000b0046d058b160cmr15940687lfb.533.1650493525346; Wed, 20 Apr 2022 15:25:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650493525; cv=none; d=google.com; s=arc-20160816; b=UOPpH48d+Zu9FNEnaLPCXSpuTVhkeqv+l+nG0E6KyGn29Fi3ZAO36HT1W6aNF77Y3Q lrM2XOEZAqmQ1hFJW5qSD2j3pbHIvymFUw8+GRl+ScW9t510zVpvGz5Y6/mlH9UI5pek UCUyewN3xR7b//l/jhIxjyxn++k9FsbYXhBW0OUbz0t+oXsFVFboDt+OIuD2V2mTN0gp 5XXuRQ6JGOszGDCV7crTTmPEC/YJG4LWKMpwMeE5kQwSryCr2V9GgKNcUeM7SLMcZ1hL GDa+iSQ8j/aPZcLGjHC1hSUOEY+CHtqT79Yo8NihhgX48t+iRavi9uucHtJ2NfIbxnHR PzzQ== 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=aCGbtQDlMX8DfqnnEOjJvU+EB5xPTYDtCSbbqRACVzs=; b=VKeG2qXjA0tFrZSXOrw1gCtrY70plqwpyrP07TB/phPIRyKbZAGTI6ACHtkRabE+7F fP04O0DYJs4S9GrHAK58LvM3w69o+mSEpD/6zpIMke1OCUJds12rJeGoGUSOyxAGiFRz AUm9jpN8NSmWG9sGbE/vZbnJ4zUJKPcKtOt5/CBL0dRqL53T7n0DOM1AmMjTPvU6LQm4 eGSy6MSug9jjaU7xPROKFwKT+jFZZ0qjsNmUeiSDdThouO/DrMtHD+liId5O4991aPaW lL8bMJW/+Qez0p4xNGiRUIk9hkht+1bkjrh4RbunJZEUbZA/4ClUwnHodPmtHaRxfysg U4wQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=ep7UWlky; spf=pass (google.com: domain of mptcp+bounces-4816-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4816-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 g25-20020a2e9e59000000b0024da25ea044si3220303ljk.284.2022.04.20.15.25.24 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Apr 2022 15:25:25 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4816-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=ep7UWlky; spf=pass (google.com: domain of mptcp+bounces-4816-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4816-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 9A83B2E0CE6 for ; Wed, 20 Apr 2022 22:25:24 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id C8FD07A; Wed, 20 Apr 2022 22:25:20 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 6387B3D6C for ; Wed, 20 Apr 2022 22:25:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1650493519; x=1682029519; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ucorovcDrcWUwvZrK1HhQ9+JjNaUShoehufUGweoie0=; b=ep7UWlkyL2DrzKirYHD3IUVGUJRtYdf9DlAjMUzEDy+++BdiRrjAZNMy tAtQd47WKegy13pjUUORkMp+RGoj67SuangXmwqV2lRqyeprVW9ByutaG EJs5gm4aN4V5en6iebeSK1/bnW9ZjugWPb/6of3YPORiwp3bDhzR2J+JB YMUwHLo2/vBdhTl1Igh5ElP7ADAG+r209xEKsaGbJTY0pBu8o9o902u1g PFjWXktY+Wp90pCN8+hV6bOxJKMDylaepWB2GvNRYz4oItVVOHpqL3WLu x8hjxo7UI/xLlemCeJHuBKncV1Jr2WqSmRyC0+D3zb+73YiUi52bwtpcW g==; X-IronPort-AV: E=McAfee;i="6400,9594,10323"; a="289277610" X-IronPort-AV: E=Sophos;i="5.90,276,1643702400"; d="scan'208";a="289277610" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Apr 2022 15:25:18 -0700 X-IronPort-AV: E=Sophos;i="5.90,276,1643702400"; d="scan'208";a="555422607" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.209.100.38]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Apr 2022 15:25:17 -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 6/7] selftests: bpf: verify ca_name of struct mptcp_sock Date: Wed, 20 Apr 2022 15:24:58 -0700 Message-Id: <20220420222459.307649-7-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220420222459.307649-1-mathew.j.martineau@linux.intel.com> References: <20220420222459.307649-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(). 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 | 24 +++++++++++++++++++ .../testing/selftests/bpf/progs/mptcp_sock.c | 4 ++++ 4 files changed, 33 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..4518aa6e661e 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,22 @@ static __u32 get_msk_token(void) return token; } =20 +void get_msk_ca_name(char ca_name[]) +{ + FILE *stream =3D popen("sysctl -b net.ipv4.tcp_congestion_control", "r"); + + if (!fgets(ca_name, TCP_CA_NAME_MAX, stream)) + log_err("Failed to read ca_name"); + + pclose(stream); +} + 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 +108,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 +133,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 56cc7c61131b..53bf67580010 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" @@ -12,6 +13,7 @@ struct mptcp_storage { __u32 invoked; __u32 is_mptcp; __u32 token; + char ca_name[TCP_CA_NAME_MAX]; }; =20 struct { @@ -48,6 +50,7 @@ int _sockops(struct bpf_sock_ops *ctx) return 1; =20 storage->token =3D 0; + bzero(storage->ca_name, TCP_CA_NAME_MAX); } else { msk =3D bpf_skc_to_mptcp_sock(sk); if (!msk) @@ -59,6 +62,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 Sun May 5 10:06:05 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:ac4:a898:0:b0:4b1:af33:c52d with SMTP id z24csp2372925pid; Wed, 20 Apr 2022 15:25:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwD/aeQdEYTSI8WsPptYhJ0xw0b0OrwHGB6TMwLeZZnUR2Mw0t1YCGUFKUmrLQ/K0WAX/9I X-Received: by 2002:a63:9:0:b0:3aa:7182:9868 with SMTP id 9-20020a630009000000b003aa71829868mr3410548pga.486.1650493526262; Wed, 20 Apr 2022 15:25:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650493526; cv=none; d=google.com; s=arc-20160816; b=0ghmnbJh+idgIoWMWYPx6l2kC3qTgbAm6xv7TbtbR1bNi66XD6Jv3oLiD3ReSExJaA JPkfmaoekUf9j0G9x6F9D5gE55Z64DPi1j4jReq4VvFM0P8Vah3z5T3k6iEEE/RapFhY 7/grzJwmjKg7M1jSdzzyrIJpv+P12TBHD0r49Am11LvlxX1Eipomee008s/74fFKimJd FQZfOlJ/BIGXhzImHRwooJJQ7Vr7GojrGS6FbRCI6Oj419z+XRyehbDdbvVX8FT27VOs 72lPuZkX/Og6xkfeZxZ6XgBeGxQiKVIenoakLt+Wa15wammDGEdWu3cUsLgTttXJEDHb 9KdQ== 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=DGJ3C3eXXb5VMg0c8BBis+Ob7xbNOXlDQH9esErswSA=; b=LTTcnG8cILSznpbj4Dknes8z9lRszY7Ofj4go8A3cuDgykw9QmzSdURQZkRbRl8oaC sJhc7qS7pafhqGoWGVbFnEjwdx9d/cnW3HWxCEDDTqSRjGjdYJ1SFpcyFIUpBBBDiuBj dqU1iOl2YAIE/B94mVE44kNvEGigBrLlceOUjRbG+vx6ByaXPi6XFfVV+7RPEhOnkRcL d3WxG/SmmRxbfWyTEQZwxUn/aEFqCrEL0rscuLtL4ppUYxOWMGlCujlvI/tFgs2Qqdti hfzgYmrc0+3cet0FeEm64tQlhHgaNCraiLVUKFLMqIgt5lQbznIFucoKPet1Zw6Zeati 1swg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Mzqaa9TL; spf=pass (google.com: domain of mptcp+bounces-4817-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-4817-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 n13-20020a170903110d00b00153b2d16415si3799937plh.29.2022.04.20.15.25.26 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Apr 2022 15:25:26 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4817-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=Mzqaa9TL; spf=pass (google.com: domain of mptcp+bounces-4817-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-4817-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 75236280A9C for ; Wed, 20 Apr 2022 22:25:25 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 04C073D6C; Wed, 20 Apr 2022 22:25:21 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 C7AAD3D6A for ; Wed, 20 Apr 2022 22:25:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1650493519; x=1682029519; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=CPu4e6OUHz5baMW3HN5yprGNNE3W9upTmbpPnEKQkfk=; b=Mzqaa9TLg61IOQKtgwIahZ6DUvrO/XdfDJ8Uuv3/PhtY6FRZ4btpcSB5 F74QLwW+j8Z3Fq8PMMCbO3RPZ+JVhazO3y3AfJ6X+LtqFZ9Lt7AvvXZV2 umzmCs9ob7rv1HIq2THCR/vfk5OIRPrjnMtwwD5mgF2m+XqbOD4DS2NFO sYpYDZo1cBCCu8TmwR6Mjr9u2zxDyThDS+g7+ALQApaDwgme2KPygLMaA 5x8VQBWDdsxyGUsrFya8Czk1qiqqt8Mk/de/JaYvym3YrMqkF/3aZTyAX 8oLb13A9W6ovvkY0iHiJW/JpMyJ1/62iQf28gjEUU3HkwSh5uEhWQYV5b w==; X-IronPort-AV: E=McAfee;i="6400,9594,10323"; a="289277614" X-IronPort-AV: E=Sophos;i="5.90,276,1643702400"; d="scan'208";a="289277614" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Apr 2022 15:25:19 -0700 X-IronPort-AV: E=Sophos;i="5.90,276,1643702400"; d="scan'208";a="555422613" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.209.100.38]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Apr 2022 15:25:18 -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 7/7] selftests: bpf: verify first of struct mptcp_sock Date: Wed, 20 Apr 2022 15:24:59 -0700 Message-Id: <20220420222459.307649-8-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220420222459.307649-1-mathew.j.martineau@linux.intel.com> References: <20220420222459.307649-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 4518aa6e661e..7e704f5aab05 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 @@ -133,6 +135,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 53bf67580010..1d1ac7cda2a2 100644 --- a/tools/testing/selftests/bpf/progs/mptcp_sock.c +++ b/tools/testing/selftests/bpf/progs/mptcp_sock.c @@ -12,7 +12,9 @@ __u32 _version SEC("version") =3D 1; struct mptcp_storage { __u32 invoked; __u32 is_mptcp; + struct sock *sk; __u32 token; + struct sock *first; char ca_name[TCP_CA_NAME_MAX]; }; =20 @@ -51,6 +53,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 { msk =3D bpf_skc_to_mptcp_sock(sk); if (!msk) @@ -63,9 +66,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