xref: /linux/tools/testing/selftests/bpf/progs/verifier_map_lookup_refine.c (revision 5a8cd539ac19f7a68e68e1d25ef9ca2ff55b8500)
1 // SPDX-License-Identifier: GPL-2.0
2 
3 #include <vmlinux.h>
4 #include <bpf/bpf_helpers.h>
5 #include "bpf_misc.h"
6 #include "bpf_kfuncs.h"
7 
8 char _license[] SEC("license") = "GPL";
9 
10 struct inner_map {
11 	__uint(type, BPF_MAP_TYPE_ARRAY);
12 	__uint(max_entries, 1);
13 	__type(key, int);
14 	__type(value, int);
15 } inner_map SEC(".maps");
16 
17 struct {
18 	__uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS);
19 	__uint(max_entries, 1);
20 	__type(key, int);
21 	__array(values, struct inner_map);
22 } outer_map SEC(".maps") = {
23 	.values = { [0] = &inner_map },
24 };
25 
26 SEC("?tc")
27 __failure __msg("type=map_ptr_or_null expected=fp")
mapofmaps_value_as_kfunc_mem_buf(struct __sk_buff * skb)28 int mapofmaps_value_as_kfunc_mem_buf(struct __sk_buff *skb)
29 {
30 	struct bpf_dynptr dptr;
31 	__u32 key = 0;
32 	void *inner;
33 	char *p;
34 
35 	inner = bpf_map_lookup_elem(&outer_map, &key);
36 	/* intentionally NOT NULL-checked: type is map_ptr_or_null */
37 
38 	bpf_dynptr_from_skb(skb, 0, &dptr);
39 	/* arg3 is mem+size */
40 	p = bpf_dynptr_slice(&dptr, 0, inner, 4);
41 	if (p)
42 		return p[0];
43 	return 0;
44 }
45 
46 SEC("?tc")
47 __failure __msg("type=map_ptr_or_null expected=fp")
mapofmaps_value_as_helper_mem_buf(struct __sk_buff * skb)48 int mapofmaps_value_as_helper_mem_buf(struct __sk_buff *skb)
49 {
50 	__u32 key = 0;
51 	void *inner;
52 
53 	inner = bpf_map_lookup_elem(&outer_map, &key);
54 	/* intentionally NOT NULL-checked: type is map_ptr_or_null */
55 
56 	/* arg1 is mem+size */
57 	return bpf_csum_diff(inner, 4, NULL, 0, 0) + skb->len;
58 }
59 
60 SEC("?tc")
61 __failure __msg("type=map_ptr_or_null expected=fp")
mapofmaps_value_as_helper_fixed_mem(struct __sk_buff * skb)62 int mapofmaps_value_as_helper_fixed_mem(struct __sk_buff *skb)
63 {
64 	char th[sizeof(struct tcphdr)] = {};
65 	__u32 key = 0;
66 	void *inner;
67 
68 	inner = bpf_map_lookup_elem(&outer_map, &key);
69 	/* intentionally NOT NULL-checked: type is map_ptr_or_null */
70 
71 	/* arg1 is fixed-sized mem */
72 	return bpf_tcp_raw_check_syncookie_ipv4(inner, (void *)th);
73 }
74