forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests/bpf: Test switching TCP Congestion Control algorithms.
Create a pair of sockets that utilize the congestion control algorithm under a particular name. Then switch up this congestion control algorithm to another implementation and check whether newly created connections using the same cc name now run the new implementation. Also, try to update a link with a struct_ops that is without BPF_F_LINK or with a wrong or different name. These cases should fail due to the violation of assumptions. To update a bpf_link of a struct_ops, it must be replaced with another struct_ops that is identical in type and name and has the BPF_F_LINK flag. The other test case is to create links from the same struct_ops more than once. It makes sure a struct_ops can be used repeatly. Signed-off-by: Kui-Feng Lee <kuifeng@meta.com> Link: https://lore.kernel.org/r/20230323032405.3735486-9-kuifeng@meta.com Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
- Loading branch information
Kui-Feng Lee
authored and
Martin KaFai Lau
committed
Mar 23, 2023
1 parent
809a69d
commit 06da9f3
Showing
2 changed files
with
240 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
|
||
#include "vmlinux.h" | ||
|
||
#include <bpf/bpf_helpers.h> | ||
#include <bpf/bpf_tracing.h> | ||
|
||
char _license[] SEC("license") = "GPL"; | ||
|
||
int ca1_cnt = 0; | ||
int ca2_cnt = 0; | ||
|
||
static inline struct tcp_sock *tcp_sk(const struct sock *sk) | ||
{ | ||
return (struct tcp_sock *)sk; | ||
} | ||
|
||
SEC("struct_ops/ca_update_1_init") | ||
void BPF_PROG(ca_update_1_init, struct sock *sk) | ||
{ | ||
ca1_cnt++; | ||
} | ||
|
||
SEC("struct_ops/ca_update_2_init") | ||
void BPF_PROG(ca_update_2_init, struct sock *sk) | ||
{ | ||
ca2_cnt++; | ||
} | ||
|
||
SEC("struct_ops/ca_update_cong_control") | ||
void BPF_PROG(ca_update_cong_control, struct sock *sk, | ||
const struct rate_sample *rs) | ||
{ | ||
} | ||
|
||
SEC("struct_ops/ca_update_ssthresh") | ||
__u32 BPF_PROG(ca_update_ssthresh, struct sock *sk) | ||
{ | ||
return tcp_sk(sk)->snd_ssthresh; | ||
} | ||
|
||
SEC("struct_ops/ca_update_undo_cwnd") | ||
__u32 BPF_PROG(ca_update_undo_cwnd, struct sock *sk) | ||
{ | ||
return tcp_sk(sk)->snd_cwnd; | ||
} | ||
|
||
SEC(".struct_ops.link") | ||
struct tcp_congestion_ops ca_update_1 = { | ||
.init = (void *)ca_update_1_init, | ||
.cong_control = (void *)ca_update_cong_control, | ||
.ssthresh = (void *)ca_update_ssthresh, | ||
.undo_cwnd = (void *)ca_update_undo_cwnd, | ||
.name = "tcp_ca_update", | ||
}; | ||
|
||
SEC(".struct_ops.link") | ||
struct tcp_congestion_ops ca_update_2 = { | ||
.init = (void *)ca_update_2_init, | ||
.cong_control = (void *)ca_update_cong_control, | ||
.ssthresh = (void *)ca_update_ssthresh, | ||
.undo_cwnd = (void *)ca_update_undo_cwnd, | ||
.name = "tcp_ca_update", | ||
}; | ||
|
||
SEC(".struct_ops.link") | ||
struct tcp_congestion_ops ca_wrong = { | ||
.cong_control = (void *)ca_update_cong_control, | ||
.ssthresh = (void *)ca_update_ssthresh, | ||
.undo_cwnd = (void *)ca_update_undo_cwnd, | ||
.name = "tcp_ca_wrong", | ||
}; | ||
|
||
SEC(".struct_ops") | ||
struct tcp_congestion_ops ca_no_link = { | ||
.cong_control = (void *)ca_update_cong_control, | ||
.ssthresh = (void *)ca_update_ssthresh, | ||
.undo_cwnd = (void *)ca_update_undo_cwnd, | ||
.name = "tcp_ca_no_link", | ||
}; |