From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 381C3C43387 for ; Fri, 18 Jan 2019 00:41:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id F052B20873 for ; Fri, 18 Jan 2019 00:41:27 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="GtPbHnq2" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726833AbfARAl0 (ORCPT ); Thu, 17 Jan 2019 19:41:26 -0500 Received: from mail-pg1-f202.google.com ([209.85.215.202]:45282 "EHLO mail-pg1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725981AbfARAlZ (ORCPT ); Thu, 17 Jan 2019 19:41:25 -0500 Received: by mail-pg1-f202.google.com with SMTP id y8so7291603pgq.12 for ; Thu, 17 Jan 2019 16:41:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=iatdyQTpttijykU49010aO94BKDm+r0/+2WndPhwCaw=; b=GtPbHnq2pzrD7aD7Yl5Xr2p06cPIWsGBMeLcs4ZaDCpantxH1Wn5e0xkvwXyW+pwOb a2ybS888emlKTbL+MZk+8OZazfr9dpmI/wUFttkmfAkVSbDzc+Qp9n6iATLxIO/RV4GD 4xdwBrkpntPRZfBU4le10E6rPFSXOygjzTTb/4qyaUw6NtVSC1MckT0dUEb626J/Dz8/ CCaxcQclyUZ2T1EUHAAOPLzOs/qCr6D2yTVCuyTLphoEWxn6uG3if3JWJtJKLrykeIys PAOpv4nGVwcKty6PzWGctv1rlpSgNcDfGkNlPrm4mBzUg9S6a9q78teX4/USnPJxYH4L PyVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=iatdyQTpttijykU49010aO94BKDm+r0/+2WndPhwCaw=; b=BxtOt3r9OBWqqAMuNhO5XqK6QQ90XuwjiOVYqnggG1IqCmj7n1RZeAIA4xb9PTA9t7 Yt6uDDuNGrG4gA6yuQJxA+oYnH98C/lsETcHY3hDgPk0K2CkX6To+YOuI7+DQWB8ZED0 FfJhhxXcJj2LuxGEzhzx/gY4tW7BJEFCti3NeHTzhfbAWXWdre4EDi2b16/zFI9gHVLu fdN9Z7hIbTGOuH1VJxms/ICicrwUO08nqzeKMbrsEMGy+O78ZKjppginjH9gf2vTECPn +3a4lFrFaN3Ddjp7qlySh7vdowpwrgv5BZ/6RnJ/WqNjLNvFIrTUcTf+WkHRGSWu+kTA mjKA== X-Gm-Message-State: AJcUukdxZ5YU5zlyZCVu4iFH6TXVA+Wlv7dJRGk7pHGBpDv/fDT7Y1fT XEoXLm3kGKDqQDS/8WAF1SbQOVSGWa39mp9AcjIG/PEChKJvE93L000ITFqUu9p2b1OgatqJOyR 8Dht2ylfy/3cqdofwj98ykI9y3DwMGVk97jm5WmhqApHtCUd0wHjyng== X-Google-Smtp-Source: ALg8bN7fq3YIQ6DtS8dJhX/CyjmcH4snpEYD/PPGaovpKoImEr4V1K/WN1+v1/NGCg2FloJBlm6Ke2U= X-Received: by 2002:a17:902:7888:: with SMTP id q8mr1358587pll.130.1547772084465; Thu, 17 Jan 2019 16:41:24 -0800 (PST) Date: Thu, 17 Jan 2019 16:41:06 -0800 In-Reply-To: <20190118004106.163825-1-sdf@google.com> Message-Id: <20190118004106.163825-6-sdf@google.com> Mime-Version: 1.0 References: <20190118004106.163825-1-sdf@google.com> X-Mailer: git-send-email 2.20.1.321.g9e740568ce-goog Subject: [PATCH bpf-next 5/5] selftests/bpf: add BPF_CGROUP_INET{4,6}_SOCK_RELEASE to test_sock_addr.c From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, ast@kernel.org, daniel@iogearbox.net, Stanislav Fomichev Content-Type: text/plain; charset="UTF-8" Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Count the number of times hooks were executed in the cgroup local storage to make sure they trigger. Signed-off-by: Stanislav Fomichev --- tools/testing/selftests/bpf/test_sock_addr.c | 131 ++++++++++++++++++- 1 file changed, 130 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/bpf/test_sock_addr.c b/tools/testing/selftests/bpf/test_sock_addr.c index 3f110eaaf29c..92845bf6fac9 100644 --- a/tools/testing/selftests/bpf/test_sock_addr.c +++ b/tools/testing/selftests/bpf/test_sock_addr.c @@ -82,6 +82,9 @@ struct sock_addr_test { } expected_result; }; +/* Per-test storage for additional cgroup storage map */ +static int cg_storage_fd; + static int bind4_prog_load(const struct sock_addr_test *test); static int bind6_prog_load(const struct sock_addr_test *test); static int connect4_prog_load(const struct sock_addr_test *test); @@ -94,6 +97,7 @@ static int sendmsg6_rw_asm_prog_load(const struct sock_addr_test *test); static int sendmsg6_rw_c_prog_load(const struct sock_addr_test *test); static int sendmsg6_rw_v4mapped_prog_load(const struct sock_addr_test *test); static int sendmsg6_rw_wildcard_prog_load(const struct sock_addr_test *test); +static int release46_prog_load(const struct sock_addr_test *test); static struct sock_addr_test tests[] = { /* bind */ @@ -507,6 +511,35 @@ static struct sock_addr_test tests[] = { SRC6_REWRITE_IP, SYSCALL_EPERM, }, + /* release */ + { + "release4: make sure the hook triggers", + release46_prog_load, + BPF_CGROUP_INET4_SOCK_RELEASE, + BPF_CGROUP_INET4_SOCK_RELEASE, + AF_INET, + SOCK_STREAM, + SERV4_REWRITE_IP, + 0, + SERV4_REWRITE_IP, + 0, + NULL, + SUCCESS, + }, + { + "release6: make sure the hook triggers", + release46_prog_load, + BPF_CGROUP_INET6_SOCK_RELEASE, + BPF_CGROUP_INET6_SOCK_RELEASE, + AF_INET6, + SOCK_DGRAM, + SERV6_REWRITE_IP, + 0, + SERV6_REWRITE_IP, + 0, + NULL, + SUCCESS, + }, }; static int mk_sockaddr(int domain, const char *ip, unsigned short port, @@ -554,7 +587,15 @@ static int load_insns(const struct sock_addr_test *test, int ret; memset(&load_attr, 0, sizeof(struct bpf_load_program_attr)); - load_attr.prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR; + switch (test->expected_attach_type) { + case BPF_CGROUP_INET4_SOCK_RELEASE: + case BPF_CGROUP_INET6_SOCK_RELEASE: + load_attr.prog_type = BPF_PROG_TYPE_CGROUP_SOCK; + break; + default: + load_attr.prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR; + break; + } load_attr.expected_attach_type = test->expected_attach_type; load_attr.insns = insns; load_attr.insns_cnt = insns_cnt; @@ -916,6 +957,35 @@ static int sendmsg6_rw_c_prog_load(const struct sock_addr_test *test) return load_path(test, SENDMSG6_PROG_PATH); } +static int release46_prog_load(const struct sock_addr_test *test) +{ + struct bpf_cgroup_storage_key key; + unsigned long long value; + struct bpf_insn insns[] = { + BPF_LD_MAP_FD(BPF_REG_1, 0), /* map fd */ + BPF_MOV64_IMM(BPF_REG_2, 0), /* flags, not used */ + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, + BPF_FUNC_get_local_storage), + BPF_MOV64_IMM(BPF_REG_1, 1), + BPF_STX_XADD(BPF_DW, BPF_REG_0, BPF_REG_1, 0), + BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), + BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0x1), + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), + BPF_EXIT_INSN(), + }; + + cg_storage_fd = bpf_create_map(BPF_MAP_TYPE_CGROUP_STORAGE, sizeof(key), + sizeof(value), 0, 0); + if (cg_storage_fd < 0) { + printf("Failed to create map: %s\n", strerror(errno)); + return -1; + } + + insns[0].imm = cg_storage_fd; + + return load_insns(test, insns, sizeof(insns) / sizeof(struct bpf_insn)); +} + static int cmp_addr(const struct sockaddr_storage *addr1, const struct sockaddr_storage *addr2, int cmp_port) { @@ -1346,6 +1416,57 @@ static int run_sendmsg_test_case(const struct sock_addr_test *test) return err; } +static int run_release_test_case(const struct sock_addr_test *test) +{ + socklen_t addr_len = sizeof(struct sockaddr_storage); + struct sockaddr_storage requested_addr; + struct sockaddr_storage expected_addr; + struct bpf_cgroup_storage_key key; + unsigned long long value; + int servfd = -1; + + if (bpf_map_get_next_key(cg_storage_fd, NULL, &key)) { + printf("Failed to get the first key in cgroup storage\n"); + return -1; + } + + if (bpf_map_lookup_elem(cg_storage_fd, &key, &value)) { + printf("Failed to lookup cgroup storage 0\n"); + return -1; + } + + if (value != 0) { + printf("Unexpected data in the cgroup storage: %llu\n", value); + return -1; + } + + if (init_addrs(test, &requested_addr, &expected_addr, NULL)) + return -1; + + servfd = start_server(test->type, &requested_addr, addr_len); + if (servfd < 0) + return -1; + + close(servfd); + + if (bpf_map_get_next_key(cg_storage_fd, NULL, &key)) { + printf("Failed to get the first key in cgroup storage\n"); + return -1; + } + + if (bpf_map_lookup_elem(cg_storage_fd, &key, &value)) { + printf("Failed to lookup cgroup storage 0\n"); + return -1; + } + + if (value != 1) { + printf("Unexpected data in the cgroup storage: %llu\n", value); + return -1; + } + + return 0; +} + static int run_test_case(int cgfd, const struct sock_addr_test *test) { int progfd = -1; @@ -1381,6 +1502,10 @@ static int run_test_case(int cgfd, const struct sock_addr_test *test) case BPF_CGROUP_UDP6_SENDMSG: err = run_sendmsg_test_case(test); break; + case BPF_CGROUP_INET4_SOCK_RELEASE: + case BPF_CGROUP_INET6_SOCK_RELEASE: + err = run_release_test_case(test); + break; default: goto err; } @@ -1405,6 +1530,10 @@ static int run_test_case(int cgfd, const struct sock_addr_test *test) /* Detaching w/o checking return code: best effort attempt. */ if (progfd != -1) bpf_prog_detach(cgfd, test->attach_type); + if (cg_storage_fd > 0) { + close(cg_storage_fd); + cg_storage_fd = 0; + } close(progfd); printf("[%s]\n", err ? "FAIL" : "PASS"); return err; -- 2.20.1.321.g9e740568ce-goog