1 // SPDX-License-Identifier: GPL-2.0
2 
3 #include "vmlinux.h"
4 
5 #include <bpf/bpf_helpers.h>
6 #include <bpf/bpf_tracing.h>
7 
8 char _license[] SEC("license") = "GPL";
9 
10 int ca1_cnt = 0;
11 int ca2_cnt = 0;
12 
tcp_sk(const struct sock * sk)13 static inline struct tcp_sock *tcp_sk(const struct sock *sk)
14 {
15 	return (struct tcp_sock *)sk;
16 }
17 
18 SEC("struct_ops/ca_update_1_init")
BPF_PROG(ca_update_1_init,struct sock * sk)19 void BPF_PROG(ca_update_1_init, struct sock *sk)
20 {
21 	ca1_cnt++;
22 }
23 
24 SEC("struct_ops/ca_update_2_init")
BPF_PROG(ca_update_2_init,struct sock * sk)25 void BPF_PROG(ca_update_2_init, struct sock *sk)
26 {
27 	ca2_cnt++;
28 }
29 
30 SEC("struct_ops/ca_update_cong_control")
BPF_PROG(ca_update_cong_control,struct sock * sk,const struct rate_sample * rs)31 void BPF_PROG(ca_update_cong_control, struct sock *sk,
32 	      const struct rate_sample *rs)
33 {
34 }
35 
36 SEC("struct_ops/ca_update_ssthresh")
BPF_PROG(ca_update_ssthresh,struct sock * sk)37 __u32 BPF_PROG(ca_update_ssthresh, struct sock *sk)
38 {
39 	return tcp_sk(sk)->snd_ssthresh;
40 }
41 
42 SEC("struct_ops/ca_update_undo_cwnd")
BPF_PROG(ca_update_undo_cwnd,struct sock * sk)43 __u32 BPF_PROG(ca_update_undo_cwnd, struct sock *sk)
44 {
45 	return tcp_sk(sk)->snd_cwnd;
46 }
47 
48 SEC(".struct_ops.link")
49 struct tcp_congestion_ops ca_update_1 = {
50 	.init = (void *)ca_update_1_init,
51 	.cong_control = (void *)ca_update_cong_control,
52 	.ssthresh = (void *)ca_update_ssthresh,
53 	.undo_cwnd = (void *)ca_update_undo_cwnd,
54 	.name = "tcp_ca_update",
55 };
56 
57 SEC(".struct_ops.link")
58 struct tcp_congestion_ops ca_update_2 = {
59 	.init = (void *)ca_update_2_init,
60 	.cong_control = (void *)ca_update_cong_control,
61 	.ssthresh = (void *)ca_update_ssthresh,
62 	.undo_cwnd = (void *)ca_update_undo_cwnd,
63 	.name = "tcp_ca_update",
64 };
65 
66 SEC(".struct_ops.link")
67 struct tcp_congestion_ops ca_wrong = {
68 	.cong_control = (void *)ca_update_cong_control,
69 	.ssthresh = (void *)ca_update_ssthresh,
70 	.undo_cwnd = (void *)ca_update_undo_cwnd,
71 	.name = "tcp_ca_wrong",
72 };
73 
74 SEC(".struct_ops")
75 struct tcp_congestion_ops ca_no_link = {
76 	.cong_control = (void *)ca_update_cong_control,
77 	.ssthresh = (void *)ca_update_ssthresh,
78 	.undo_cwnd = (void *)ca_update_undo_cwnd,
79 	.name = "tcp_ca_no_link",
80 };
81