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 Hinzstatic 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