On 10/6/21 1:09 PM, Song Liu wrote: > On Tue, Oct 5, 2021 at 9:08 PM Hengqi Chen <hengqi.chen@xxxxxxxxx> wrote: >> >> Add a new test which triggers unix_listen kernel function >> to test bpf_skc_to_unix_sock helper. >> >> Signed-off-by: Hengqi Chen <hengqi.chen@xxxxxxxxx> >> --- >> .../bpf/prog_tests/skc_to_unix_sock.c | 54 +++++++++++++++++++ >> .../bpf/progs/test_skc_to_unix_sock.c | 28 ++++++++++ >> 2 files changed, 82 insertions(+) >> create mode 100644 tools/testing/selftests/bpf/prog_tests/skc_to_unix_sock.c >> create mode 100644 tools/testing/selftests/bpf/progs/test_skc_to_unix_sock.c >> >> diff --git a/tools/testing/selftests/bpf/prog_tests/skc_to_unix_sock.c b/tools/testing/selftests/bpf/prog_tests/skc_to_unix_sock.c >> new file mode 100644 >> index 000000000000..5d8ed76a71dc >> --- /dev/null >> +++ b/tools/testing/selftests/bpf/prog_tests/skc_to_unix_sock.c >> @@ -0,0 +1,54 @@ >> +/* SPDX-License-Identifier: GPL-2.0 */ >> +/* Copyright (c) 2021 Hengqi Chen */ >> + >> +#include <test_progs.h> >> +#include <sys/un.h> >> +#include "test_skc_to_unix_sock.skel.h" >> + >> +static const char *sock_path = "/tmp/test.sock"; >> + >> +void test_skc_to_unix_sock(void) >> +{ >> + struct test_skc_to_unix_sock *skel; >> + struct sockaddr_un sockaddr; >> + int err, len, sockfd = 0; >> + >> + skel = test_skc_to_unix_sock__open(); >> + if (!ASSERT_OK_PTR(skel, "could not open BPF object")) >> + return; >> + >> + skel->rodata->my_pid = getpid(); >> + >> + err = test_skc_to_unix_sock__load(skel); >> + if (!ASSERT_OK(err, "could not load BPF object")) >> + goto cleanup; >> + >> + err = test_skc_to_unix_sock__attach(skel); >> + if (!ASSERT_OK(err, "could not attach BPF object")) >> + goto cleanup; >> + >> + // trigger unix_listen >> + sockfd = socket(AF_UNIX, SOCK_STREAM, 0); >> + if (!ASSERT_GT(sockfd, 0, "socket failed")) >> + goto cleanup; >> + >> + sockaddr.sun_family = AF_UNIX; >> + strcpy(sockaddr.sun_path, sock_path); >> + len = sizeof(sockaddr); >> + unlink(sock_path); >> + >> + err = bind(sockfd, (struct sockaddr *)&sockaddr, len); >> + if (!ASSERT_OK(err, "bind failed")) >> + goto cleanup; >> + >> + err = listen(sockfd, 1); >> + if (!ASSERT_OK(err, "listen failed")) >> + goto cleanup; >> + >> + ASSERT_GT(skel->bss->ret, 0, "bpf_skc_to_unix_sock failed"); >> + >> +cleanup: >> + if (sockfd) >> + close(sockfd); >> + test_skc_to_unix_sock__destroy(skel); >> +} >> diff --git a/tools/testing/selftests/bpf/progs/test_skc_to_unix_sock.c b/tools/testing/selftests/bpf/progs/test_skc_to_unix_sock.c >> new file mode 100644 >> index 000000000000..544d2ed56d7e >> --- /dev/null >> +++ b/tools/testing/selftests/bpf/progs/test_skc_to_unix_sock.c >> @@ -0,0 +1,28 @@ >> +/* SPDX-License-Identifier: GPL-2.0 */ >> +/* Copyright (c) 2021 Hengqi Chen */ >> + >> +#include "vmlinux.h" >> +#include <bpf/bpf_helpers.h> >> +#include <bpf/bpf_tracing.h> >> + >> +const volatile pid_t my_pid = 0; >> +__u64 ret = 0; >> + >> +SEC("fentry/unix_listen") >> +int BPF_PROG(unix_listen, struct socket *sock, int backlog) >> +{ >> + pid_t pid = bpf_get_current_pid_tgid() >> 32; >> + struct unix_sock *unix_sk; >> + >> + if (pid != my_pid) >> + return 0; >> + >> + unix_sk = (struct unix_sock *)bpf_skc_to_unix_sock(sock->sk); >> + if (!unix_sk) >> + return 0; >> + >> + ret = (__u64)unix_sk; > > Other than ret !=0, can we verify unix_sk we get is expected? May we can > verify unix_sock-> path matches /tmp/test.sock? > Yes, that would be much more precise. Will do. > Thanks, > Song >