1*0735627dSJörn-Thorben Hinz // SPDX-License-Identifier: GPL-2.0
2*0735627dSJörn-Thorben Hinz 
3*0735627dSJörn-Thorben Hinz #include "vmlinux.h"
4*0735627dSJörn-Thorben Hinz 
5*0735627dSJörn-Thorben Hinz #include <bpf/bpf_helpers.h>
6*0735627dSJörn-Thorben Hinz #include <bpf/bpf_tracing.h>
7*0735627dSJörn-Thorben Hinz 
8*0735627dSJörn-Thorben Hinz char _license[] SEC("license") = "GPL";
9*0735627dSJörn-Thorben Hinz 
tcp_sk(const struct sock * sk)10*0735627dSJörn-Thorben Hinz static inline struct tcp_sock *tcp_sk(const struct sock *sk)
11*0735627dSJörn-Thorben Hinz {
12*0735627dSJörn-Thorben Hinz 	return (struct tcp_sock *)sk;
13*0735627dSJörn-Thorben Hinz }
14*0735627dSJörn-Thorben Hinz 
15*0735627dSJörn-Thorben Hinz SEC("struct_ops/incompl_cong_ops_ssthresh")
BPF_PROG(incompl_cong_ops_ssthresh,struct sock * sk)16*0735627dSJörn-Thorben Hinz __u32 BPF_PROG(incompl_cong_ops_ssthresh, struct sock *sk)
17*0735627dSJörn-Thorben Hinz {
18*0735627dSJörn-Thorben Hinz 	return tcp_sk(sk)->snd_ssthresh;
19*0735627dSJörn-Thorben Hinz }
20*0735627dSJörn-Thorben Hinz 
21*0735627dSJörn-Thorben Hinz SEC("struct_ops/incompl_cong_ops_undo_cwnd")
BPF_PROG(incompl_cong_ops_undo_cwnd,struct sock * sk)22*0735627dSJörn-Thorben Hinz __u32 BPF_PROG(incompl_cong_ops_undo_cwnd, struct sock *sk)
23*0735627dSJörn-Thorben Hinz {
24*0735627dSJörn-Thorben Hinz 	return tcp_sk(sk)->snd_cwnd;
25*0735627dSJörn-Thorben Hinz }
26*0735627dSJörn-Thorben Hinz 
27*0735627dSJörn-Thorben Hinz SEC(".struct_ops")
28*0735627dSJörn-Thorben Hinz struct tcp_congestion_ops incompl_cong_ops = {
29*0735627dSJörn-Thorben Hinz 	/* Intentionally leaving out any of the required cong_avoid() and
30*0735627dSJörn-Thorben Hinz 	 * cong_control() here.
31*0735627dSJörn-Thorben Hinz 	 */
32*0735627dSJörn-Thorben Hinz 	.ssthresh = (void *)incompl_cong_ops_ssthresh,
33*0735627dSJörn-Thorben Hinz 	.undo_cwnd = (void *)incompl_cong_ops_undo_cwnd,
34*0735627dSJörn-Thorben Hinz 	.name = "bpf_incompl_ops",
35*0735627dSJörn-Thorben Hinz };
36