History

bpf: tcp: Support tcp_congestion_ops in bpf

This patch makes "struct tcp_congestion_ops" to be the first user of BPF STRUCT_OPS. It allows implementing a tcp_congestion_ops in bpf. The BPF implemented tcp_congestion_ops can be used like regular kernel tcp-cc through sysctl and setsockopt. e.g. [root@arch-fb-vm1 bpf]# sysctl -a | egrep congestion net.ipv4.tcp_allowed_congestion_control = reno cubic bpf_cubic net.ipv4.tcp_available_congestion_control = reno bic cubic bpf_cubic net.ipv4.tcp_congestion_control = bpf_cubic There has been attempt to move the TCP CC to the user space (e.g. CCP in TCP). The common arguments are faster turn around, get away from long-tail kernel versions in production...etc, which are legit points. BPF has been the continuous effort to join both kernel and userspace upsides together (e.g. XDP to gain the performance advantage without bypassing the kernel). The recent BPF advancements (in particular BTF-aware verifier, BPF trampoline, BPF CO-RE...) made implementing kernel struct ops (e.g. tcp cc) possible in BPF. It allows a faster turnaround for testing algorithm in the production while leveraging the existing (and continue growing) BPF feature/framework instead of building one specifically for userspace TCP CC. This patch allows write access to a few fields in tcp-sock (in bpf_tcp_ca_btf_struct_access()). The optional "get_info" is unsupported now. It can be added later. One possible way is to output the info with a btf-id to describe the content.

Martin KaFai Lau committed 6 years ago

Commit 0baf26b1 parent 85d33df10 files · +261 −16Browse files

Showing the changes to include/linux (1 of 10 files). Show all

Unified · Split

include/linux/filter.h+2−0
@@ -843,6 +843,8 @@ int bpf_prog_create(struct bpf_prog **pfp, struct sock_fprog_kern *fprog); · 842 unmodified lines
843843 int bpf_prog_create_from_user(struct bpf_prog **pfp, struct sock_fprog *fprog,
844844 bpf_aux_classic_check_t trans, bool save_orig);
845845 void bpf_prog_destroy(struct bpf_prog *fp);
846+const struct bpf_func_proto *
847+bpf_base_func_proto(enum bpf_func_id func_id);
846848
847849 int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk);
848850 int sk_attach_bpf(u32 ufd, struct sock *sk);