1  // SPDX-License-Identifier: GPL-2.0
2  
3  #include <linux/bpf.h>
4  #include <time.h>
5  #include <errno.h>
6  #include <bpf/bpf_helpers.h>
7  #include <bpf/bpf_tracing.h>
8  #include "bpf_misc.h"
9  
10  char _license[] SEC("license") = "GPL";
11  
12  struct elem {
13  	struct bpf_timer t;
14  };
15  
16  struct {
17  	__uint(type, BPF_MAP_TYPE_ARRAY);
18  	__uint(max_entries, 1);
19  	__type(key, int);
20  	__type(value, struct elem);
21  } timer1_map SEC(".maps");
22  
23  struct {
24  	__uint(type, BPF_MAP_TYPE_ARRAY);
25  	__uint(max_entries, 1);
26  	__type(key, int);
27  	__type(value, struct elem);
28  } timer2_map SEC(".maps");
29  
30  int timer1_err;
31  int timer2_err;
32  
timer_cb1(void * map,int * k,struct elem * v)33  static int timer_cb1(void *map, int *k, struct elem *v)
34  {
35  	struct bpf_timer *timer;
36  	int key = 0;
37  
38  	timer = bpf_map_lookup_elem(&timer2_map, &key);
39  	if (timer)
40  		timer2_err = bpf_timer_cancel(timer);
41  
42  	return 0;
43  }
44  
timer_cb2(void * map,int * k,struct elem * v)45  static int timer_cb2(void *map, int *k, struct elem *v)
46  {
47  	struct bpf_timer *timer;
48  	int key = 0;
49  
50  	timer = bpf_map_lookup_elem(&timer1_map, &key);
51  	if (timer)
52  		timer1_err = bpf_timer_cancel(timer);
53  
54  	return 0;
55  }
56  
57  SEC("tc")
timer1_prog(void * ctx)58  int timer1_prog(void *ctx)
59  {
60  	struct bpf_timer *timer;
61  	int key = 0;
62  
63  	timer = bpf_map_lookup_elem(&timer1_map, &key);
64  	if (timer) {
65  		bpf_timer_init(timer, &timer1_map, CLOCK_BOOTTIME);
66  		bpf_timer_set_callback(timer, timer_cb1);
67  		bpf_timer_start(timer, 1, BPF_F_TIMER_CPU_PIN);
68  	}
69  
70  	return 0;
71  }
72  
73  SEC("tc")
timer2_prog(void * ctx)74  int timer2_prog(void *ctx)
75  {
76  	struct bpf_timer *timer;
77  	int key = 0;
78  
79  	timer = bpf_map_lookup_elem(&timer2_map, &key);
80  	if (timer) {
81  		bpf_timer_init(timer, &timer2_map, CLOCK_BOOTTIME);
82  		bpf_timer_set_callback(timer, timer_cb2);
83  		bpf_timer_start(timer, 1, BPF_F_TIMER_CPU_PIN);
84  	}
85  
86  	return 0;
87  }
88