OSDN Git Service

selftests/bpf: Add fexit-to-skb test for global funcs
authorAlexei Starovoitov <ast@kernel.org>
Fri, 10 Jan 2020 06:41:21 +0000 (22:41 -0800)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 10 Jan 2020 16:20:07 +0000 (17:20 +0100)
Add simple fexit prog type to skb prog type test when subprogram is a global
function.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Song Liu <songliubraving@fb.com>
Link: https://lore.kernel.org/bpf/20200110064124.1760511-4-ast@kernel.org
tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c
tools/testing/selftests/bpf/progs/fexit_bpf2bpf.c
tools/testing/selftests/bpf/progs/test_pkt_access.c

index b426bf2..7d3740d 100644 (file)
@@ -98,6 +98,7 @@ static void test_target_yes_callees(void)
                "fexit/test_pkt_access",
                "fexit/test_pkt_access_subprog1",
                "fexit/test_pkt_access_subprog2",
+               "fexit/test_pkt_access_subprog3",
        };
        test_fexit_bpf2bpf_common("./fexit_bpf2bpf.o",
                                  "./test_pkt_access.o",
index 2d211ee..81d7b4a 100644 (file)
@@ -79,4 +79,19 @@ int test_subprog2(struct args_subprog2 *ctx)
        test_result_subprog2 = 1;
        return 0;
 }
+
+__u64 test_result_subprog3 = 0;
+BPF_TRACE_3("fexit/test_pkt_access_subprog3", test_subprog3,
+           int, val, struct sk_buff *, skb, int, ret)
+{
+       int len;
+
+       __builtin_preserve_access_index(({
+               len = skb->len;
+       }));
+       if (len != 74 || ret != 74 * val || val != 3)
+               return 0;
+       test_result_subprog3 = 1;
+       return 0;
+}
 char _license[] SEC("license") = "GPL";
index 3a7b4b6..b77cebf 100644 (file)
@@ -47,6 +47,32 @@ int test_pkt_access_subprog2(int val, volatile struct __sk_buff *skb)
        return skb->len * val;
 }
 
+#define MAX_STACK (512 - 2 * 32)
+
+__attribute__ ((noinline))
+int get_skb_len(struct __sk_buff *skb)
+{
+       volatile char buf[MAX_STACK] = {};
+
+       return skb->len;
+}
+
+int get_skb_ifindex(int, struct __sk_buff *skb, int);
+
+__attribute__ ((noinline))
+int test_pkt_access_subprog3(int val, struct __sk_buff *skb)
+{
+       return get_skb_len(skb) * get_skb_ifindex(val, skb, 1);
+}
+
+__attribute__ ((noinline))
+int get_skb_ifindex(int val, struct __sk_buff *skb, int var)
+{
+       volatile char buf[MAX_STACK] = {};
+
+       return skb->ifindex * val * var;
+}
+
 SEC("classifier/test_pkt_access")
 int test_pkt_access(struct __sk_buff *skb)
 {
@@ -82,6 +108,8 @@ int test_pkt_access(struct __sk_buff *skb)
                return TC_ACT_SHOT;
        if (test_pkt_access_subprog2(2, skb) != skb->len * 2)
                return TC_ACT_SHOT;
+       if (test_pkt_access_subprog3(3, skb) != skb->len * 3 * skb->ifindex)
+               return TC_ACT_SHOT;
        if (tcp) {
                if (((void *)(tcp) + 20) > data_end || proto != 6)
                        return TC_ACT_SHOT;