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