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