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