1906bd22aSKumar Kartikeya Dwivedi // SPDX-License-Identifier: GPL-2.0
2906bd22aSKumar Kartikeya Dwivedi #include <vmlinux.h>
3906bd22aSKumar Kartikeya Dwivedi #include <bpf/bpf_helpers.h>
4906bd22aSKumar Kartikeya Dwivedi 
5906bd22aSKumar Kartikeya Dwivedi #include "bpf_misc.h"
6906bd22aSKumar Kartikeya Dwivedi 
7906bd22aSKumar Kartikeya Dwivedi struct hmap_elem {
8906bd22aSKumar Kartikeya Dwivedi 	struct bpf_timer timer;
9906bd22aSKumar Kartikeya Dwivedi };
10906bd22aSKumar Kartikeya Dwivedi 
11906bd22aSKumar Kartikeya Dwivedi struct {
12906bd22aSKumar Kartikeya Dwivedi 	__uint(type, BPF_MAP_TYPE_HASH);
13906bd22aSKumar Kartikeya Dwivedi 	__uint(max_entries, 64);
14906bd22aSKumar Kartikeya Dwivedi 	__type(key, int);
15906bd22aSKumar Kartikeya Dwivedi 	__type(value, struct hmap_elem);
16906bd22aSKumar Kartikeya Dwivedi } hmap SEC(".maps");
17906bd22aSKumar Kartikeya Dwivedi 
18906bd22aSKumar Kartikeya Dwivedi __attribute__((noinline))
timer_cb(void * map,int * key,struct bpf_timer * timer)19906bd22aSKumar Kartikeya Dwivedi static int timer_cb(void *map, int *key, struct bpf_timer *timer)
20906bd22aSKumar Kartikeya Dwivedi {
21906bd22aSKumar Kartikeya Dwivedi 	volatile char buf[256] = {};
22906bd22aSKumar Kartikeya Dwivedi 	return buf[69];
23906bd22aSKumar Kartikeya Dwivedi }
24906bd22aSKumar Kartikeya Dwivedi 
25*824adae4SKumar Kartikeya Dwivedi __attribute__((noinline))
bad_timer_cb(void * map,int * key,struct bpf_timer * timer)26*824adae4SKumar Kartikeya Dwivedi static int bad_timer_cb(void *map, int *key, struct bpf_timer *timer)
27*824adae4SKumar Kartikeya Dwivedi {
28*824adae4SKumar Kartikeya Dwivedi 	volatile char buf[300] = {};
29*824adae4SKumar Kartikeya Dwivedi 	return buf[255] + timer_cb(NULL, NULL, NULL);
30*824adae4SKumar Kartikeya Dwivedi }
31*824adae4SKumar Kartikeya Dwivedi 
32906bd22aSKumar Kartikeya Dwivedi SEC("tc")
33*824adae4SKumar Kartikeya Dwivedi __failure __msg("combined stack size of 2 calls is 576. Too large")
pseudo_call_check(struct __sk_buff * ctx)34*824adae4SKumar Kartikeya Dwivedi int pseudo_call_check(struct __sk_buff *ctx)
35906bd22aSKumar Kartikeya Dwivedi {
36906bd22aSKumar Kartikeya Dwivedi 	struct hmap_elem *elem;
37906bd22aSKumar Kartikeya Dwivedi 	volatile char buf[256] = {};
38906bd22aSKumar Kartikeya Dwivedi 
39906bd22aSKumar Kartikeya Dwivedi 	elem = bpf_map_lookup_elem(&hmap, &(int){0});
40906bd22aSKumar Kartikeya Dwivedi 	if (!elem)
41906bd22aSKumar Kartikeya Dwivedi 		return 0;
42906bd22aSKumar Kartikeya Dwivedi 
43906bd22aSKumar Kartikeya Dwivedi 	timer_cb(NULL, NULL, NULL);
44906bd22aSKumar Kartikeya Dwivedi 	return bpf_timer_set_callback(&elem->timer, timer_cb) + buf[0];
45906bd22aSKumar Kartikeya Dwivedi }
46906bd22aSKumar Kartikeya Dwivedi 
47*824adae4SKumar Kartikeya Dwivedi SEC("tc")
48*824adae4SKumar Kartikeya Dwivedi __failure __msg("combined stack size of 2 calls is 608. Too large")
async_call_root_check(struct __sk_buff * ctx)49*824adae4SKumar Kartikeya Dwivedi int async_call_root_check(struct __sk_buff *ctx)
50*824adae4SKumar Kartikeya Dwivedi {
51*824adae4SKumar Kartikeya Dwivedi 	struct hmap_elem *elem;
52*824adae4SKumar Kartikeya Dwivedi 	volatile char buf[256] = {};
53*824adae4SKumar Kartikeya Dwivedi 
54*824adae4SKumar Kartikeya Dwivedi 	elem = bpf_map_lookup_elem(&hmap, &(int){0});
55*824adae4SKumar Kartikeya Dwivedi 	if (!elem)
56*824adae4SKumar Kartikeya Dwivedi 		return 0;
57*824adae4SKumar Kartikeya Dwivedi 
58*824adae4SKumar Kartikeya Dwivedi 	return bpf_timer_set_callback(&elem->timer, bad_timer_cb) + buf[0];
59*824adae4SKumar Kartikeya Dwivedi }
60*824adae4SKumar Kartikeya Dwivedi 
61906bd22aSKumar Kartikeya Dwivedi char _license[] SEC("license") = "GPL";
62