Skip to content

Commit 7608e4d

Browse files
Alexei Starovoitovborkmann
authored andcommitted
selftests/bpf: Add fexit-to-skb test for global funcs
Add simple fexit prog type to skb prog type test when subprogram is a global function. Signed-off-by: Alexei Starovoitov <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]> Acked-by: Song Liu <[email protected]> Link: https://lore.kernel.org/bpf/[email protected]
1 parent 51c39bb commit 7608e4d

File tree

3 files changed

+44
-0
lines changed

3 files changed

+44
-0
lines changed

tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ static void test_target_yes_callees(void)
9898
"fexit/test_pkt_access",
9999
"fexit/test_pkt_access_subprog1",
100100
"fexit/test_pkt_access_subprog2",
101+
"fexit/test_pkt_access_subprog3",
101102
};
102103
test_fexit_bpf2bpf_common("./fexit_bpf2bpf.o",
103104
"./test_pkt_access.o",

tools/testing/selftests/bpf/progs/fexit_bpf2bpf.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,19 @@ int test_subprog2(struct args_subprog2 *ctx)
7979
test_result_subprog2 = 1;
8080
return 0;
8181
}
82+
83+
__u64 test_result_subprog3 = 0;
84+
BPF_TRACE_3("fexit/test_pkt_access_subprog3", test_subprog3,
85+
int, val, struct sk_buff *, skb, int, ret)
86+
{
87+
int len;
88+
89+
__builtin_preserve_access_index(({
90+
len = skb->len;
91+
}));
92+
if (len != 74 || ret != 74 * val || val != 3)
93+
return 0;
94+
test_result_subprog3 = 1;
95+
return 0;
96+
}
8297
char _license[] SEC("license") = "GPL";

tools/testing/selftests/bpf/progs/test_pkt_access.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,32 @@ int test_pkt_access_subprog2(int val, volatile struct __sk_buff *skb)
4747
return skb->len * val;
4848
}
4949

50+
#define MAX_STACK (512 - 2 * 32)
51+
52+
__attribute__ ((noinline))
53+
int get_skb_len(struct __sk_buff *skb)
54+
{
55+
volatile char buf[MAX_STACK] = {};
56+
57+
return skb->len;
58+
}
59+
60+
int get_skb_ifindex(int, struct __sk_buff *skb, int);
61+
62+
__attribute__ ((noinline))
63+
int test_pkt_access_subprog3(int val, struct __sk_buff *skb)
64+
{
65+
return get_skb_len(skb) * get_skb_ifindex(val, skb, 1);
66+
}
67+
68+
__attribute__ ((noinline))
69+
int get_skb_ifindex(int val, struct __sk_buff *skb, int var)
70+
{
71+
volatile char buf[MAX_STACK] = {};
72+
73+
return skb->ifindex * val * var;
74+
}
75+
5076
SEC("classifier/test_pkt_access")
5177
int test_pkt_access(struct __sk_buff *skb)
5278
{
@@ -82,6 +108,8 @@ int test_pkt_access(struct __sk_buff *skb)
82108
return TC_ACT_SHOT;
83109
if (test_pkt_access_subprog2(2, skb) != skb->len * 2)
84110
return TC_ACT_SHOT;
111+
if (test_pkt_access_subprog3(3, skb) != skb->len * 3 * skb->ifindex)
112+
return TC_ACT_SHOT;
85113
if (tcp) {
86114
if (((void *)(tcp) + 20) > data_end || proto != 6)
87115
return TC_ACT_SHOT;

0 commit comments

Comments
 (0)