selftests/bpf: Test switching TCP Congestion Control algorithms.
[platform/kernel/linux-starfive.git] / tools / testing / selftests / bpf / progs / tcp_ca_update.c
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
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")
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")
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")
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")
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")
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 };