Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp1087008pxb; Wed, 3 Nov 2021 18:09:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwFpzXRi8ytxKtw0r71aYKfibLFY87OUv1ks1m5YssfwgpCmcHMOeT0gaso4A2VEZ2YVtZC X-Received: by 2002:a5d:9593:: with SMTP id a19mr9661872ioo.201.1635988181587; Wed, 03 Nov 2021 18:09:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1635988181; cv=none; d=google.com; s=arc-20160816; b=vX6cq3fjqwP0ztnr8LQW9s+XyrZrCV6yjv6IduvQ9T6wNIT89vdBTs4K+Gz1QuCW0v PTqxdViGiW7w0YIr4o6qsM2dS0XSNWRtkVZ38iaNGXjButxQP24FVZ/m+MPPRFO5M5l2 1RMyUV9Yk73VoOY6TkcuwkErLIwR9i/UzkaZ9TgDLm/s6aBMzNTj4Wv6m0nu/h0aINgc DOvEoEkg+Jo32ceepgbJMv65muk4alKZa2Hhnc4mQIM2IuPLx+BwQKsXI+6+A+uSmGii 969XCKTz/5xwDjPJ4Ev6eio1HI3dkr8JGTRHcZ2owdrAbMNOQA2f6Clcph/Vzul8tjZX EOxg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=lL9ts6d/vVyw2Y+U4T0MF7P/GhlSG+cPStNhJJ2DMYI=; b=PdLuJygJ+QV4kemjgEzHqmXF9+UvUQhye4iNRdPq5B2YGsaTGF3+LxwpgZGDm49HRM xfX0LyGJbFSmBm4aTLQ1CW8gZ/0y8APt8KsjeeR+6mFF5Tvl1yPlMHfAxF017/ySP4H1 V/5AS8GQJVJauGMt2YzfchJ1ozu/cT03vD0rSoWuWoVSLyjg0FQKmfiGOf3jRMraJ1vh d2fyYj7kX+MEhHzMiIzTnp0N60T6V87Ax8wRoL6nCES8uodF8cbJuJR9fUXiZ1vBwIjC CkiXotGkMsQ2GgASRqXyDqUFkC0ACslbzN8JvL4tP/uUJgGLN3XpKKiZJZzrCLE4B8LX PxmA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=huawei.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id e16si4697752iot.96.2021.11.03.18.09.28; Wed, 03 Nov 2021 18:09:41 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=huawei.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230233AbhKDBK6 (ORCPT + 99 others); Wed, 3 Nov 2021 21:10:58 -0400 Received: from szxga01-in.huawei.com ([45.249.212.187]:30916 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231248AbhKDBK5 (ORCPT ); Wed, 3 Nov 2021 21:10:57 -0400 Received: from dggemv704-chm.china.huawei.com (unknown [172.30.72.54]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4Hl5436T8MzcZyJ; Thu, 4 Nov 2021 09:03:31 +0800 (CST) Received: from dggpeml500011.china.huawei.com (7.185.36.84) by dggemv704-chm.china.huawei.com (10.3.19.47) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.15; Thu, 4 Nov 2021 09:08:16 +0800 Received: from localhost.localdomain (10.175.101.6) by dggpeml500011.china.huawei.com (7.185.36.84) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.15; Thu, 4 Nov 2021 09:08:16 +0800 From: Di Zhu To: , , , , , , , , , CC: , , Subject: [PATCH bpf-next v5 2/2] selftests: bpf: test BPF_PROG_QUERY for progs attached to sockmap Date: Thu, 4 Nov 2021 09:07:45 +0800 Message-ID: <20211104010745.1177032-2-zhudi2@huawei.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20211104010745.1177032-1-zhudi2@huawei.com> References: <20211104010745.1177032-1-zhudi2@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII X-Originating-IP: [10.175.101.6] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To dggpeml500011.china.huawei.com (7.185.36.84) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add test for querying progs attached to sockmap. we use an existing libbpf query interface to query prog cnt before and after progs attaching to sockmap and check whether the queried prog id is right. Signed-off-by: Di Zhu --- .../selftests/bpf/prog_tests/sockmap_basic.c | 75 +++++++++++++++++++ .../bpf/progs/test_sockmap_progs_query.c | 24 ++++++ 2 files changed, 99 insertions(+) create mode 100644 tools/testing/selftests/bpf/progs/test_sockmap_progs_query.c diff --git a/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c b/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c index 1352ec104149..de8f91d91240 100644 --- a/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c +++ b/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c @@ -8,6 +8,7 @@ #include "test_sockmap_update.skel.h" #include "test_sockmap_invalid_update.skel.h" #include "test_sockmap_skb_verdict_attach.skel.h" +#include "test_sockmap_progs_query.skel.h" #include "bpf_iter_sockmap.skel.h" #define TCP_REPAIR 19 /* TCP sock is under repair right now */ @@ -315,6 +316,74 @@ static void test_sockmap_skb_verdict_attach(enum bpf_attach_type first, test_sockmap_skb_verdict_attach__destroy(skel); } +static __u32 query_prog_id(int prog_fd) +{ + struct bpf_prog_info info = {}; + __u32 info_len = sizeof(info); + int err; + + err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len); + if (CHECK_FAIL(err || info_len != sizeof(info))) { + perror("bpf_obj_get_info_by_fd"); + return 0; + } + + return info.id; +} + +static void test_sockmap_progs_query(enum bpf_attach_type attach_type) +{ + struct test_sockmap_progs_query *skel; + int err, map_fd, verdict_fd, duration = 0; + __u32 attach_flags = 0; + __u32 prog_ids[3] = {}; + __u32 prog_cnt = 3; + + skel = test_sockmap_progs_query__open_and_load(); + if (!ASSERT_OK_PTR(skel, "test_sockmap_progs_query__open_and_load")) + return; + + map_fd = bpf_map__fd(skel->maps.sock_map); + + if (attach_type == BPF_SK_MSG_VERDICT) + verdict_fd = bpf_program__fd(skel->progs.prog_skmsg_verdict); + else + verdict_fd = bpf_program__fd(skel->progs.prog_skb_verdict); + + err = bpf_prog_query(map_fd, attach_type, 0 /* query flags */, + &attach_flags, prog_ids, &prog_cnt); + if (CHECK(err, "bpf_prog_query", "failed\n")) + goto out; + + if (CHECK(attach_flags != 0, "bpf_prog_query", + "wrong attach_flags on query: %u", attach_flags)) + goto out; + + if (CHECK(prog_cnt != 0, "bpf_prog_query", + "wrong program count on query: %u", prog_cnt)) + goto out; + + err = bpf_prog_attach(verdict_fd, map_fd, attach_type, 0); + if (CHECK(err, "bpf_prog_attach", "failed\n")) + goto out; + + prog_cnt = 1; + err = bpf_prog_query(map_fd, attach_type, 0 /* query flags */, + &attach_flags, prog_ids, &prog_cnt); + + CHECK(err, "bpf_prog_query", "failed\n"); + CHECK(attach_flags != 0, "bpf_prog_query attach_flags", + "wrong attach_flags on query: %u", attach_flags); + CHECK(prog_cnt != 1, "bpf_prog_query prog_cnt", + "wrong program count on query: %u", prog_cnt); + CHECK(prog_ids[0] != query_prog_id(verdict_fd), "bpf_prog_query", + "wrong prog_ids on query: %u", prog_ids[0]); + + bpf_prog_detach2(verdict_fd, map_fd, attach_type); +out: + test_sockmap_progs_query__destroy(skel); +} + void test_sockmap_basic(void) { if (test__start_subtest("sockmap create_update_free")) @@ -341,4 +410,10 @@ void test_sockmap_basic(void) test_sockmap_skb_verdict_attach(BPF_SK_SKB_STREAM_VERDICT, BPF_SK_SKB_VERDICT); } + if (test__start_subtest("sockmap progs query")) { + test_sockmap_progs_query(BPF_SK_MSG_VERDICT); + test_sockmap_progs_query(BPF_SK_SKB_STREAM_PARSER); + test_sockmap_progs_query(BPF_SK_SKB_STREAM_VERDICT); + test_sockmap_progs_query(BPF_SK_SKB_VERDICT); + } } diff --git a/tools/testing/selftests/bpf/progs/test_sockmap_progs_query.c b/tools/testing/selftests/bpf/progs/test_sockmap_progs_query.c new file mode 100644 index 000000000000..9d58d61c0dee --- /dev/null +++ b/tools/testing/selftests/bpf/progs/test_sockmap_progs_query.c @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-2.0 +#include "vmlinux.h" +#include + +struct { + __uint(type, BPF_MAP_TYPE_SOCKMAP); + __uint(max_entries, 1); + __type(key, __u32); + __type(value, __u64); +} sock_map SEC(".maps"); + +SEC("sk_skb") +int prog_skb_verdict(struct __sk_buff *skb) +{ + return SK_PASS; +} + +SEC("sk_msg") +int prog_skmsg_verdict(struct sk_msg_md *msg) +{ + return SK_PASS; +} + +char _license[] SEC("license") = "GPL"; -- 2.27.0