Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /* Copyright Amazon.com Inc. or its affiliates. */
0003 #include <sys/socket.h>
0004 #include <sys/un.h>
0005 #include <test_progs.h>
0006 #include "bpf_iter_setsockopt_unix.skel.h"
0007 
0008 #define NR_CASES 5
0009 
0010 static int create_unix_socket(struct bpf_iter_setsockopt_unix *skel)
0011 {
0012     struct sockaddr_un addr = {
0013         .sun_family = AF_UNIX,
0014         .sun_path = "",
0015     };
0016     socklen_t len;
0017     int fd, err;
0018 
0019     fd = socket(AF_UNIX, SOCK_STREAM, 0);
0020     if (!ASSERT_NEQ(fd, -1, "socket"))
0021         return -1;
0022 
0023     len = offsetof(struct sockaddr_un, sun_path);
0024     err = bind(fd, (struct sockaddr *)&addr, len);
0025     if (!ASSERT_OK(err, "bind"))
0026         return -1;
0027 
0028     len = sizeof(addr);
0029     err = getsockname(fd, (struct sockaddr *)&addr, &len);
0030     if (!ASSERT_OK(err, "getsockname"))
0031         return -1;
0032 
0033     memcpy(&skel->bss->sun_path, &addr.sun_path,
0034            len - offsetof(struct sockaddr_un, sun_path));
0035 
0036     return fd;
0037 }
0038 
0039 static void test_sndbuf(struct bpf_iter_setsockopt_unix *skel, int fd)
0040 {
0041     socklen_t optlen;
0042     int i, err;
0043 
0044     for (i = 0; i < NR_CASES; i++) {
0045         if (!ASSERT_NEQ(skel->data->sndbuf_getsockopt[i], -1,
0046                 "bpf_(get|set)sockopt"))
0047             return;
0048 
0049         err = setsockopt(fd, SOL_SOCKET, SO_SNDBUF,
0050                  &(skel->data->sndbuf_setsockopt[i]),
0051                  sizeof(skel->data->sndbuf_setsockopt[i]));
0052         if (!ASSERT_OK(err, "setsockopt"))
0053             return;
0054 
0055         optlen = sizeof(skel->bss->sndbuf_getsockopt_expected[i]);
0056         err = getsockopt(fd, SOL_SOCKET, SO_SNDBUF,
0057                  &(skel->bss->sndbuf_getsockopt_expected[i]),
0058                  &optlen);
0059         if (!ASSERT_OK(err, "getsockopt"))
0060             return;
0061 
0062         if (!ASSERT_EQ(skel->data->sndbuf_getsockopt[i],
0063                    skel->bss->sndbuf_getsockopt_expected[i],
0064                    "bpf_(get|set)sockopt"))
0065             return;
0066     }
0067 }
0068 
0069 void test_bpf_iter_setsockopt_unix(void)
0070 {
0071     struct bpf_iter_setsockopt_unix *skel;
0072     int err, unix_fd, iter_fd;
0073     char buf;
0074 
0075     skel = bpf_iter_setsockopt_unix__open_and_load();
0076     if (!ASSERT_OK_PTR(skel, "open_and_load"))
0077         return;
0078 
0079     unix_fd = create_unix_socket(skel);
0080     if (!ASSERT_NEQ(unix_fd, -1, "create_unix_server"))
0081         goto destroy;
0082 
0083     skel->links.change_sndbuf = bpf_program__attach_iter(skel->progs.change_sndbuf, NULL);
0084     if (!ASSERT_OK_PTR(skel->links.change_sndbuf, "bpf_program__attach_iter"))
0085         goto destroy;
0086 
0087     iter_fd = bpf_iter_create(bpf_link__fd(skel->links.change_sndbuf));
0088     if (!ASSERT_GE(iter_fd, 0, "bpf_iter_create"))
0089         goto destroy;
0090 
0091     while ((err = read(iter_fd, &buf, sizeof(buf))) == -1 &&
0092            errno == EAGAIN)
0093         ;
0094     if (!ASSERT_OK(err, "read iter error"))
0095         goto destroy;
0096 
0097     test_sndbuf(skel, unix_fd);
0098 destroy:
0099     bpf_iter_setsockopt_unix__destroy(skel);
0100 }