1// SPDX-License-Identifier: GPL-2.0
2// Copyright (c) 2020 Facebook
3
4#include <linux/bpf.h>
5#include <bpf/bpf_helpers.h>
6
7#define LOOP_BOUND 0xf
8#define MAX_ENTRIES 8
9#define HALF_ENTRIES (MAX_ENTRIES >> 1)
10
11_Static_assert(MAX_ENTRIES < LOOP_BOUND, "MAX_ENTRIES must be < LOOP_BOUND");
12
13enum bpf_map_type g_map_type = BPF_MAP_TYPE_UNSPEC;
14__u32 g_line = 0;
15int page_size = 0; /* userspace should set it */
16
17#define VERIFY_TYPE(type, func) ({ \
18 g_map_type = type; \
19 if (!func()) \
20 return 0; \
21})
22
23
24#define VERIFY(expr) ({ \
25 g_line = __LINE__; \
26 if (!(expr)) \
27 return 0; \
28})
29
30struct bpf_map {
31 enum bpf_map_type map_type;
32 __u32 key_size;
33 __u32 value_size;
34 __u32 max_entries;
35 __u32 id;
36} __attribute__((preserve_access_index));
37
38static inline int check_bpf_map_fields(struct bpf_map *map, __u32 key_size,
39 __u32 value_size, __u32 max_entries)
40{
41 VERIFY(map->map_type == g_map_type);
42 VERIFY(map->key_size == key_size);
43 VERIFY(map->value_size == value_size);
44 VERIFY(map->max_entries == max_entries);
45 VERIFY(map->id > 0);
46
47 return 1;
48}
49
50static inline int check_bpf_map_ptr(struct bpf_map *indirect,
51 struct bpf_map *direct)
52{
53 VERIFY(indirect->map_type == direct->map_type);
54 VERIFY(indirect->key_size == direct->key_size);
55 VERIFY(indirect->value_size == direct->value_size);
56 VERIFY(indirect->max_entries == direct->max_entries);
57 VERIFY(indirect->id == direct->id);
58
59 return 1;
60}
61
62static inline int check(struct bpf_map *indirect, struct bpf_map *direct,
63 __u32 key_size, __u32 value_size, __u32 max_entries)
64{
65 VERIFY(check_bpf_map_ptr(indirect, direct));
66 VERIFY(check_bpf_map_fields(indirect, key_size, value_size,
67 max_entries));
68 return 1;
69}
70
71static inline int check_default(struct bpf_map *indirect,
72 struct bpf_map *direct)
73{
74 VERIFY(check(indirect, direct, sizeof(__u32), sizeof(__u32),
75 MAX_ENTRIES));
76 return 1;
77}
78
79static __noinline int
80check_default_noinline(struct bpf_map *indirect, struct bpf_map *direct)
81{
82 VERIFY(check(indirect, direct, sizeof(__u32), sizeof(__u32),
83 MAX_ENTRIES));
84 return 1;
85}
86
87typedef struct {
88 int counter;
89} atomic_t;
90
91struct bpf_htab {
92 struct bpf_map map;
93 atomic_t count;
94 __u32 n_buckets;
95 __u32 elem_size;
96} __attribute__((preserve_access_index));
97
98struct {
99 __uint(type, BPF_MAP_TYPE_HASH);
100 __uint(map_flags, BPF_F_NO_PREALLOC); /* to test bpf_htab.count */
101 __uint(max_entries, MAX_ENTRIES);
102 __type(key, __u32);
103 __type(value, __u32);
104} m_hash SEC(".maps");
105
106__s64 bpf_map_sum_elem_count(struct bpf_map *map) __ksym;
107
108static inline int check_hash(void)
109{
110 struct bpf_htab *hash = (struct bpf_htab *)&m_hash;
111 struct bpf_map *map = (struct bpf_map *)&m_hash;
112 int i;
113
114 VERIFY(check_default_noinline(&hash->map, map));
115
116 VERIFY(hash->n_buckets == MAX_ENTRIES);
117 VERIFY(hash->elem_size == 64);
118
119 VERIFY(hash->count.counter == 0);
120 VERIFY(bpf_map_sum_elem_count(map) == 0);
121
122 for (i = 0; i < HALF_ENTRIES; ++i) {
123 const __u32 key = i;
124 const __u32 val = 1;
125
126 if (bpf_map_update_elem(hash, &key, &val, 0))
127 return 0;
128 }
129 VERIFY(hash->count.counter == HALF_ENTRIES);
130 VERIFY(bpf_map_sum_elem_count(map) == HALF_ENTRIES);
131
132 return 1;
133}
134
135struct bpf_array {
136 struct bpf_map map;
137 __u32 elem_size;
138} __attribute__((preserve_access_index));
139
140struct {
141 __uint(type, BPF_MAP_TYPE_ARRAY);
142 __uint(max_entries, MAX_ENTRIES);
143 __type(key, __u32);
144 __type(value, __u32);
145} m_array SEC(".maps");
146
147static inline int check_array(void)
148{
149 struct bpf_array *array = (struct bpf_array *)&m_array;
150 struct bpf_map *map = (struct bpf_map *)&m_array;
151 int i, n_lookups = 0, n_keys = 0;
152
153 VERIFY(check_default(&array->map, map));
154
155 VERIFY(array->elem_size == 8);
156
157 for (i = 0; i < array->map.max_entries && i < LOOP_BOUND; ++i) {
158 const __u32 key = i;
159 __u32 *val = bpf_map_lookup_elem(array, &key);
160
161 ++n_lookups;
162 if (val)
163 ++n_keys;
164 }
165
166 VERIFY(n_lookups == MAX_ENTRIES);
167 VERIFY(n_keys == MAX_ENTRIES);
168
169 return 1;
170}
171
172struct {
173 __uint(type, BPF_MAP_TYPE_PROG_ARRAY);
174 __uint(max_entries, MAX_ENTRIES);
175 __type(key, __u32);
176 __type(value, __u32);
177} m_prog_array SEC(".maps");
178
179static inline int check_prog_array(void)
180{
181 struct bpf_array *prog_array = (struct bpf_array *)&m_prog_array;
182 struct bpf_map *map = (struct bpf_map *)&m_prog_array;
183
184 VERIFY(check_default(&prog_array->map, map));
185
186 return 1;
187}
188
189struct {
190 __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
191 __uint(max_entries, MAX_ENTRIES);
192 __type(key, __u32);
193 __type(value, __u32);
194} m_perf_event_array SEC(".maps");
195
196static inline int check_perf_event_array(void)
197{
198 struct bpf_array *perf_event_array = (struct bpf_array *)&m_perf_event_array;
199 struct bpf_map *map = (struct bpf_map *)&m_perf_event_array;
200
201 VERIFY(check_default(&perf_event_array->map, map));
202
203 return 1;
204}
205
206struct {
207 __uint(type, BPF_MAP_TYPE_PERCPU_HASH);
208 __uint(max_entries, MAX_ENTRIES);
209 __type(key, __u32);
210 __type(value, __u32);
211} m_percpu_hash SEC(".maps");
212
213static inline int check_percpu_hash(void)
214{
215 struct bpf_htab *percpu_hash = (struct bpf_htab *)&m_percpu_hash;
216 struct bpf_map *map = (struct bpf_map *)&m_percpu_hash;
217
218 VERIFY(check_default(&percpu_hash->map, map));
219
220 return 1;
221}
222
223struct {
224 __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
225 __uint(max_entries, MAX_ENTRIES);
226 __type(key, __u32);
227 __type(value, __u32);
228} m_percpu_array SEC(".maps");
229
230static inline int check_percpu_array(void)
231{
232 struct bpf_array *percpu_array = (struct bpf_array *)&m_percpu_array;
233 struct bpf_map *map = (struct bpf_map *)&m_percpu_array;
234
235 VERIFY(check_default(&percpu_array->map, map));
236
237 return 1;
238}
239
240struct bpf_stack_map {
241 struct bpf_map map;
242} __attribute__((preserve_access_index));
243
244struct {
245 __uint(type, BPF_MAP_TYPE_STACK_TRACE);
246 __uint(max_entries, MAX_ENTRIES);
247 __type(key, __u32);
248 __type(value, __u64);
249} m_stack_trace SEC(".maps");
250
251static inline int check_stack_trace(void)
252{
253 struct bpf_stack_map *stack_trace =
254 (struct bpf_stack_map *)&m_stack_trace;
255 struct bpf_map *map = (struct bpf_map *)&m_stack_trace;
256
257 VERIFY(check(&stack_trace->map, map, sizeof(__u32), sizeof(__u64),
258 MAX_ENTRIES));
259
260 return 1;
261}
262
263struct {
264 __uint(type, BPF_MAP_TYPE_CGROUP_ARRAY);
265 __uint(max_entries, MAX_ENTRIES);
266 __type(key, __u32);
267 __type(value, __u32);
268} m_cgroup_array SEC(".maps");
269
270static inline int check_cgroup_array(void)
271{
272 struct bpf_array *cgroup_array = (struct bpf_array *)&m_cgroup_array;
273 struct bpf_map *map = (struct bpf_map *)&m_cgroup_array;
274
275 VERIFY(check_default(&cgroup_array->map, map));
276
277 return 1;
278}
279
280struct {
281 __uint(type, BPF_MAP_TYPE_LRU_HASH);
282 __uint(max_entries, MAX_ENTRIES);
283 __type(key, __u32);
284 __type(value, __u32);
285} m_lru_hash SEC(".maps");
286
287static inline int check_lru_hash(void)
288{
289 struct bpf_htab *lru_hash = (struct bpf_htab *)&m_lru_hash;
290 struct bpf_map *map = (struct bpf_map *)&m_lru_hash;
291
292 VERIFY(check_default(&lru_hash->map, map));
293
294 return 1;
295}
296
297struct {
298 __uint(type, BPF_MAP_TYPE_LRU_PERCPU_HASH);
299 __uint(max_entries, MAX_ENTRIES);
300 __type(key, __u32);
301 __type(value, __u32);
302} m_lru_percpu_hash SEC(".maps");
303
304static inline int check_lru_percpu_hash(void)
305{
306 struct bpf_htab *lru_percpu_hash = (struct bpf_htab *)&m_lru_percpu_hash;
307 struct bpf_map *map = (struct bpf_map *)&m_lru_percpu_hash;
308
309 VERIFY(check_default(&lru_percpu_hash->map, map));
310
311 return 1;
312}
313
314struct lpm_trie {
315 struct bpf_map map;
316} __attribute__((preserve_access_index));
317
318struct lpm_key {
319 struct bpf_lpm_trie_key_hdr trie_key;
320 __u32 data;
321};
322
323struct {
324 __uint(type, BPF_MAP_TYPE_LPM_TRIE);
325 __uint(map_flags, BPF_F_NO_PREALLOC);
326 __uint(max_entries, MAX_ENTRIES);
327 __type(key, struct lpm_key);
328 __type(value, __u32);
329} m_lpm_trie SEC(".maps");
330
331static inline int check_lpm_trie(void)
332{
333 struct lpm_trie *lpm_trie = (struct lpm_trie *)&m_lpm_trie;
334 struct bpf_map *map = (struct bpf_map *)&m_lpm_trie;
335
336 VERIFY(check(&lpm_trie->map, map, sizeof(struct lpm_key), sizeof(__u32),
337 MAX_ENTRIES));
338
339 return 1;
340}
341
342#define INNER_MAX_ENTRIES 1234
343
344struct inner_map {
345 __uint(type, BPF_MAP_TYPE_ARRAY);
346 __uint(max_entries, INNER_MAX_ENTRIES);
347 __type(key, __u32);
348 __type(value, __u32);
349} inner_map SEC(".maps");
350
351struct {
352 __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS);
353 __uint(max_entries, MAX_ENTRIES);
354 __type(key, __u32);
355 __type(value, __u32);
356 __array(values, struct {
357 __uint(type, BPF_MAP_TYPE_ARRAY);
358 __uint(max_entries, INNER_MAX_ENTRIES);
359 __type(key, __u32);
360 __type(value, __u32);
361 });
362} m_array_of_maps SEC(".maps") = {
363 .values = { (void *)&inner_map, 0, 0, 0, 0, 0, 0, 0, 0 },
364};
365
366static inline int check_array_of_maps(void)
367{
368 struct bpf_array *array_of_maps = (struct bpf_array *)&m_array_of_maps;
369 struct bpf_map *map = (struct bpf_map *)&m_array_of_maps;
370 struct bpf_array *inner_map;
371 int key = 0;
372
373 VERIFY(check_default(&array_of_maps->map, map));
374 inner_map = bpf_map_lookup_elem(array_of_maps, &key);
375 VERIFY(inner_map != NULL);
376 VERIFY(inner_map->map.max_entries == INNER_MAX_ENTRIES);
377
378 return 1;
379}
380
381struct {
382 __uint(type, BPF_MAP_TYPE_HASH_OF_MAPS);
383 __uint(max_entries, MAX_ENTRIES);
384 __type(key, __u32);
385 __type(value, __u32);
386 __array(values, struct inner_map);
387} m_hash_of_maps SEC(".maps") = {
388 .values = {
389 [2] = &inner_map,
390 },
391};
392
393static inline int check_hash_of_maps(void)
394{
395 struct bpf_htab *hash_of_maps = (struct bpf_htab *)&m_hash_of_maps;
396 struct bpf_map *map = (struct bpf_map *)&m_hash_of_maps;
397 struct bpf_htab *inner_map;
398 int key = 2;
399
400 VERIFY(check_default(&hash_of_maps->map, map));
401 inner_map = bpf_map_lookup_elem(hash_of_maps, &key);
402 VERIFY(inner_map != NULL);
403 VERIFY(inner_map->map.max_entries == INNER_MAX_ENTRIES);
404
405 return 1;
406}
407
408struct bpf_dtab {
409 struct bpf_map map;
410} __attribute__((preserve_access_index));
411
412struct {
413 __uint(type, BPF_MAP_TYPE_DEVMAP);
414 __uint(max_entries, MAX_ENTRIES);
415 __type(key, __u32);
416 __type(value, __u32);
417} m_devmap SEC(".maps");
418
419static inline int check_devmap(void)
420{
421 struct bpf_dtab *devmap = (struct bpf_dtab *)&m_devmap;
422 struct bpf_map *map = (struct bpf_map *)&m_devmap;
423
424 VERIFY(check_default(&devmap->map, map));
425
426 return 1;
427}
428
429struct bpf_stab {
430 struct bpf_map map;
431} __attribute__((preserve_access_index));
432
433struct {
434 __uint(type, BPF_MAP_TYPE_SOCKMAP);
435 __uint(max_entries, MAX_ENTRIES);
436 __type(key, __u32);
437 __type(value, __u32);
438} m_sockmap SEC(".maps");
439
440static inline int check_sockmap(void)
441{
442 struct bpf_stab *sockmap = (struct bpf_stab *)&m_sockmap;
443 struct bpf_map *map = (struct bpf_map *)&m_sockmap;
444
445 VERIFY(check_default(&sockmap->map, map));
446
447 return 1;
448}
449
450struct bpf_cpu_map {
451 struct bpf_map map;
452} __attribute__((preserve_access_index));
453
454struct {
455 __uint(type, BPF_MAP_TYPE_CPUMAP);
456 __uint(max_entries, MAX_ENTRIES);
457 __type(key, __u32);
458 __type(value, __u32);
459} m_cpumap SEC(".maps");
460
461static inline int check_cpumap(void)
462{
463 struct bpf_cpu_map *cpumap = (struct bpf_cpu_map *)&m_cpumap;
464 struct bpf_map *map = (struct bpf_map *)&m_cpumap;
465
466 VERIFY(check_default(&cpumap->map, map));
467
468 return 1;
469}
470
471struct xsk_map {
472 struct bpf_map map;
473} __attribute__((preserve_access_index));
474
475struct {
476 __uint(type, BPF_MAP_TYPE_XSKMAP);
477 __uint(max_entries, MAX_ENTRIES);
478 __type(key, __u32);
479 __type(value, __u32);
480} m_xskmap SEC(".maps");
481
482static inline int check_xskmap(void)
483{
484 struct xsk_map *xskmap = (struct xsk_map *)&m_xskmap;
485 struct bpf_map *map = (struct bpf_map *)&m_xskmap;
486
487 VERIFY(check_default(&xskmap->map, map));
488
489 return 1;
490}
491
492struct bpf_shtab {
493 struct bpf_map map;
494} __attribute__((preserve_access_index));
495
496struct {
497 __uint(type, BPF_MAP_TYPE_SOCKHASH);
498 __uint(max_entries, MAX_ENTRIES);
499 __type(key, __u32);
500 __type(value, __u32);
501} m_sockhash SEC(".maps");
502
503static inline int check_sockhash(void)
504{
505 struct bpf_shtab *sockhash = (struct bpf_shtab *)&m_sockhash;
506 struct bpf_map *map = (struct bpf_map *)&m_sockhash;
507
508 VERIFY(check_default(&sockhash->map, map));
509
510 return 1;
511}
512
513struct bpf_cgroup_storage_map {
514 struct bpf_map map;
515} __attribute__((preserve_access_index));
516
517struct {
518 __uint(type, BPF_MAP_TYPE_CGROUP_STORAGE);
519 __type(key, struct bpf_cgroup_storage_key);
520 __type(value, __u32);
521} m_cgroup_storage SEC(".maps");
522
523static inline int check_cgroup_storage(void)
524{
525 struct bpf_cgroup_storage_map *cgroup_storage =
526 (struct bpf_cgroup_storage_map *)&m_cgroup_storage;
527 struct bpf_map *map = (struct bpf_map *)&m_cgroup_storage;
528
529 VERIFY(check(&cgroup_storage->map, map,
530 sizeof(struct bpf_cgroup_storage_key), sizeof(__u32), 0));
531
532 return 1;
533}
534
535struct reuseport_array {
536 struct bpf_map map;
537} __attribute__((preserve_access_index));
538
539struct {
540 __uint(type, BPF_MAP_TYPE_REUSEPORT_SOCKARRAY);
541 __uint(max_entries, MAX_ENTRIES);
542 __type(key, __u32);
543 __type(value, __u32);
544} m_reuseport_sockarray SEC(".maps");
545
546static inline int check_reuseport_sockarray(void)
547{
548 struct reuseport_array *reuseport_sockarray =
549 (struct reuseport_array *)&m_reuseport_sockarray;
550 struct bpf_map *map = (struct bpf_map *)&m_reuseport_sockarray;
551
552 VERIFY(check_default(&reuseport_sockarray->map, map));
553
554 return 1;
555}
556
557struct {
558 __uint(type, BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE);
559 __type(key, struct bpf_cgroup_storage_key);
560 __type(value, __u32);
561} m_percpu_cgroup_storage SEC(".maps");
562
563static inline int check_percpu_cgroup_storage(void)
564{
565 struct bpf_cgroup_storage_map *percpu_cgroup_storage =
566 (struct bpf_cgroup_storage_map *)&m_percpu_cgroup_storage;
567 struct bpf_map *map = (struct bpf_map *)&m_percpu_cgroup_storage;
568
569 VERIFY(check(&percpu_cgroup_storage->map, map,
570 sizeof(struct bpf_cgroup_storage_key), sizeof(__u32), 0));
571
572 return 1;
573}
574
575struct bpf_queue_stack {
576 struct bpf_map map;
577} __attribute__((preserve_access_index));
578
579struct {
580 __uint(type, BPF_MAP_TYPE_QUEUE);
581 __uint(max_entries, MAX_ENTRIES);
582 __type(value, __u32);
583} m_queue SEC(".maps");
584
585static inline int check_queue(void)
586{
587 struct bpf_queue_stack *queue = (struct bpf_queue_stack *)&m_queue;
588 struct bpf_map *map = (struct bpf_map *)&m_queue;
589
590 VERIFY(check(&queue->map, map, 0, sizeof(__u32), MAX_ENTRIES));
591
592 return 1;
593}
594
595struct {
596 __uint(type, BPF_MAP_TYPE_STACK);
597 __uint(max_entries, MAX_ENTRIES);
598 __type(value, __u32);
599} m_stack SEC(".maps");
600
601static inline int check_stack(void)
602{
603 struct bpf_queue_stack *stack = (struct bpf_queue_stack *)&m_stack;
604 struct bpf_map *map = (struct bpf_map *)&m_stack;
605
606 VERIFY(check(&stack->map, map, 0, sizeof(__u32), MAX_ENTRIES));
607
608 return 1;
609}
610
611struct bpf_local_storage_map {
612 struct bpf_map map;
613} __attribute__((preserve_access_index));
614
615struct {
616 __uint(type, BPF_MAP_TYPE_SK_STORAGE);
617 __uint(map_flags, BPF_F_NO_PREALLOC);
618 __type(key, __u32);
619 __type(value, __u32);
620} m_sk_storage SEC(".maps");
621
622static inline int check_sk_storage(void)
623{
624 struct bpf_local_storage_map *sk_storage =
625 (struct bpf_local_storage_map *)&m_sk_storage;
626 struct bpf_map *map = (struct bpf_map *)&m_sk_storage;
627
628 VERIFY(check(&sk_storage->map, map, sizeof(__u32), sizeof(__u32), 0));
629
630 return 1;
631}
632
633struct {
634 __uint(type, BPF_MAP_TYPE_DEVMAP_HASH);
635 __uint(max_entries, MAX_ENTRIES);
636 __type(key, __u32);
637 __type(value, __u32);
638} m_devmap_hash SEC(".maps");
639
640static inline int check_devmap_hash(void)
641{
642 struct bpf_dtab *devmap_hash = (struct bpf_dtab *)&m_devmap_hash;
643 struct bpf_map *map = (struct bpf_map *)&m_devmap_hash;
644
645 VERIFY(check_default(&devmap_hash->map, map));
646
647 return 1;
648}
649
650struct bpf_ringbuf_map {
651 struct bpf_map map;
652} __attribute__((preserve_access_index));
653
654struct {
655 __uint(type, BPF_MAP_TYPE_RINGBUF);
656} m_ringbuf SEC(".maps");
657
658static inline int check_ringbuf(void)
659{
660 struct bpf_ringbuf_map *ringbuf = (struct bpf_ringbuf_map *)&m_ringbuf;
661 struct bpf_map *map = (struct bpf_map *)&m_ringbuf;
662
663 VERIFY(check(&ringbuf->map, map, 0, 0, page_size));
664
665 return 1;
666}
667
668SEC("cgroup_skb/egress")
669int cg_skb(void *ctx)
670{
671 VERIFY_TYPE(BPF_MAP_TYPE_HASH, check_hash);
672 VERIFY_TYPE(BPF_MAP_TYPE_ARRAY, check_array);
673 VERIFY_TYPE(BPF_MAP_TYPE_PROG_ARRAY, check_prog_array);
674 VERIFY_TYPE(BPF_MAP_TYPE_PERF_EVENT_ARRAY, check_perf_event_array);
675 VERIFY_TYPE(BPF_MAP_TYPE_PERCPU_HASH, check_percpu_hash);
676 VERIFY_TYPE(BPF_MAP_TYPE_PERCPU_ARRAY, check_percpu_array);
677 VERIFY_TYPE(BPF_MAP_TYPE_STACK_TRACE, check_stack_trace);
678 VERIFY_TYPE(BPF_MAP_TYPE_CGROUP_ARRAY, check_cgroup_array);
679 VERIFY_TYPE(BPF_MAP_TYPE_LRU_HASH, check_lru_hash);
680 VERIFY_TYPE(BPF_MAP_TYPE_LRU_PERCPU_HASH, check_lru_percpu_hash);
681 VERIFY_TYPE(BPF_MAP_TYPE_LPM_TRIE, check_lpm_trie);
682 VERIFY_TYPE(BPF_MAP_TYPE_ARRAY_OF_MAPS, check_array_of_maps);
683 VERIFY_TYPE(BPF_MAP_TYPE_HASH_OF_MAPS, check_hash_of_maps);
684 VERIFY_TYPE(BPF_MAP_TYPE_DEVMAP, check_devmap);
685 VERIFY_TYPE(BPF_MAP_TYPE_SOCKMAP, check_sockmap);
686 VERIFY_TYPE(BPF_MAP_TYPE_CPUMAP, check_cpumap);
687 VERIFY_TYPE(BPF_MAP_TYPE_XSKMAP, check_xskmap);
688 VERIFY_TYPE(BPF_MAP_TYPE_SOCKHASH, check_sockhash);
689 VERIFY_TYPE(BPF_MAP_TYPE_CGROUP_STORAGE, check_cgroup_storage);
690 VERIFY_TYPE(BPF_MAP_TYPE_REUSEPORT_SOCKARRAY,
691 check_reuseport_sockarray);
692 VERIFY_TYPE(BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE,
693 check_percpu_cgroup_storage);
694 VERIFY_TYPE(BPF_MAP_TYPE_QUEUE, check_queue);
695 VERIFY_TYPE(BPF_MAP_TYPE_STACK, check_stack);
696 VERIFY_TYPE(BPF_MAP_TYPE_SK_STORAGE, check_sk_storage);
697 VERIFY_TYPE(BPF_MAP_TYPE_DEVMAP_HASH, check_devmap_hash);
698 VERIFY_TYPE(BPF_MAP_TYPE_RINGBUF, check_ringbuf);
699
700 return 1;
701}
702
703char _license[] SEC("license") = "GPL";
704

source code of linux/tools/testing/selftests/bpf/progs/map_ptr_kern.c