From: Mingyi Zhang <zhangmingyi5@xxxxxxxxxx> We try to use bpf_set/getsockopt to set/get TCP_ULP in sockops, and "tls" need connect is established. To avoid impacting other test cases, I have written a separate ebpf prog. Signed-off-by: Mingyi Zhang <zhangmingyi5@xxxxxxxxxx> Signed-off-by: Xin Liu <liuxin350@xxxxxxxxxx> --- .../selftests/bpf/prog_tests/setget_sockopt.c | 32 +++++++++++++++++++ .../selftests/bpf/progs/bpf_tracing_net.h | 1 + .../selftests/bpf/progs/setget_sockopt.c | 24 ++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/tools/testing/selftests/bpf/prog_tests/setget_sockopt.c b/tools/testing/selftests/bpf/prog_tests/setget_sockopt.c index e12255121c15..2953076bc2f0 100644 --- a/tools/testing/selftests/bpf/prog_tests/setget_sockopt.c +++ b/tools/testing/selftests/bpf/prog_tests/setget_sockopt.c @@ -199,6 +199,36 @@ static void test_nonstandard_opt(int family) bpf_link__destroy(getsockopt_link); } +static void test_tcp_ulp(int family) +{ + struct setget_sockopt__bss *bss = skel->bss; + struct bpf_link *skops_sockopt_tcp_ulp = NULL; + int sfd = -1, cfd = -1; + + memset(bss, 0, sizeof(*bss)); + + skops_sockopt_tcp_ulp = + bpf_program__attach_cgroup(skel->progs.skops_sockopt_tcp_ulp, cg_fd); + if (!ASSERT_OK_PTR(skel->links.skops_sockopt_tcp_ulp, "attach_cgroup")) + return; + + sfd = start_server(family, SOCK_STREAM, + family == AF_INET6 ? addr6_str : addr4_str, 0, 0); + if (!ASSERT_GE(sfd, 0, "start_server")) + goto err_out; + + cfd = connect_to_fd(sfd, 0); + if (!ASSERT_GE(cfd, 0, "connect_to_fd_server")) + goto err_out; + ASSERT_EQ(bss->nr_tcp_ulp, 3, "nr_tcp_ulp"); + +err_out: + close(sfd); + if (cfd != -1) + close(cfd); + bpf_link__destroy(skops_sockopt_tcp_ulp); +} + void test_setget_sockopt(void) { cg_fd = test__join_cgroup(CG_NAME); @@ -238,6 +268,8 @@ void test_setget_sockopt(void) test_ktls(AF_INET); test_nonstandard_opt(AF_INET); test_nonstandard_opt(AF_INET6); + test_tcp_ulp(AF_INET6); + test_tcp_ulp(AF_INET); done: setget_sockopt__destroy(skel); diff --git a/tools/testing/selftests/bpf/progs/bpf_tracing_net.h b/tools/testing/selftests/bpf/progs/bpf_tracing_net.h index 59843b430f76..f3ce0d74be18 100644 --- a/tools/testing/selftests/bpf/progs/bpf_tracing_net.h +++ b/tools/testing/selftests/bpf/progs/bpf_tracing_net.h @@ -47,6 +47,7 @@ #define TCP_NOTSENT_LOWAT 25 #define TCP_SAVE_SYN 27 #define TCP_SAVED_SYN 28 +#define TCP_ULP 31 #define TCP_CA_NAME_MAX 16 #define TCP_NAGLE_OFF 1 diff --git a/tools/testing/selftests/bpf/progs/setget_sockopt.c b/tools/testing/selftests/bpf/progs/setget_sockopt.c index 6dd4318debbf..80b3179c0454 100644 --- a/tools/testing/selftests/bpf/progs/setget_sockopt.c +++ b/tools/testing/selftests/bpf/progs/setget_sockopt.c @@ -20,6 +20,7 @@ int nr_connect; int nr_binddev; int nr_socket_post_create; int nr_fin_wait1; +int nr_tcp_ulp; struct sockopt_test { int opt; @@ -417,4 +418,27 @@ int skops_sockopt(struct bpf_sock_ops *skops) return 1; } +SEC("sockops") +int skops_sockopt_tcp_ulp(struct bpf_sock_ops *skops) +{ + static const char target_ulp[] = "tls"; + char verify_ulp[sizeof(target_ulp)]; + + switch (skops->op) { + case BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB: + if (bpf_setsockopt(skops, IPPROTO_TCP, TCP_ULP, (void *)target_ulp, + sizeof(target_ulp)) != 0) + return 1; + nr_tcp_ulp++; + if (bpf_getsockopt(skops, IPPROTO_TCP, TCP_ULP, verify_ulp, + sizeof(verify_ulp)) != 0) + return 1; + nr_tcp_ulp++; + if (bpf_strncmp(verify_ulp, sizeof(target_ulp), "tls") != 0) + return 1; + nr_tcp_ulp++; + } + return 1; +} + char _license[] SEC("license") = "GPL"; -- 2.43.0