Skip to content

Commit 82ab6b5

Browse files
DaanDeMeyerMartin KaFai Lau
authored andcommitted
selftests/bpf: Add tests for cgroup unix socket address hooks
These selftests are written in prog_tests style instead of adding them to the existing test_sock_addr tests. Migrating the existing sock addr tests to prog_tests style is left for future work. This commit adds support for testing bind() sockaddr hooks, even though there's no unix socket sockaddr hook for bind(). We leave this code intact for when the INET and INET6 tests are migrated in the future which do support intercepting bind(). Signed-off-by: Daan De Meyer <daan.j.demeyer@gmail.com> Link: https://lore.kernel.org/r/20231011185113.140426-10-daan.j.demeyer@gmail.com Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
1 parent af2752e commit 82ab6b5

File tree

10 files changed

+883
-0
lines changed

10 files changed

+883
-0
lines changed

tools/testing/selftests/bpf/bpf_kfuncs.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#ifndef __BPF_KFUNCS__
22
#define __BPF_KFUNCS__
33

4+
struct bpf_sock_addr_kern;
5+
46
/* Description
57
* Initializes an skb-type dynptr
68
* Returns
@@ -41,4 +43,16 @@ extern bool bpf_dynptr_is_rdonly(const struct bpf_dynptr *ptr) __ksym;
4143
extern __u32 bpf_dynptr_size(const struct bpf_dynptr *ptr) __ksym;
4244
extern int bpf_dynptr_clone(const struct bpf_dynptr *ptr, struct bpf_dynptr *clone__init) __ksym;
4345

46+
/* Description
47+
* Modify the address of a AF_UNIX sockaddr.
48+
* Returns__bpf_kfunc
49+
* -EINVAL if the address size is too big or, 0 if the sockaddr was successfully modified.
50+
*/
51+
extern int bpf_sock_addr_set_sun_path(struct bpf_sock_addr_kern *sa_kern,
52+
const __u8 *sun_path, __u32 sun_path__sz) __ksym;
53+
54+
void *bpf_cast_to_kern_ctx(void *) __ksym;
55+
56+
void *bpf_rdonly_cast(void *obj, __u32 btf_id) __ksym;
57+
4458
#endif

tools/testing/selftests/bpf/network_helpers.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <arpa/inet.h>
1212
#include <sys/mount.h>
1313
#include <sys/stat.h>
14+
#include <sys/un.h>
1415

1516
#include <linux/err.h>
1617
#include <linux/in.h>
@@ -257,6 +258,26 @@ static int connect_fd_to_addr(int fd,
257258
return 0;
258259
}
259260

261+
int connect_to_addr(const struct sockaddr_storage *addr, socklen_t addrlen, int type)
262+
{
263+
int fd;
264+
265+
fd = socket(addr->ss_family, type, 0);
266+
if (fd < 0) {
267+
log_err("Failed to create client socket");
268+
return -1;
269+
}
270+
271+
if (connect_fd_to_addr(fd, addr, addrlen, false))
272+
goto error_close;
273+
274+
return fd;
275+
276+
error_close:
277+
save_errno_close(fd);
278+
return -1;
279+
}
280+
260281
static const struct network_helper_opts default_opts;
261282

262283
int connect_to_fd_opts(int server_fd, const struct network_helper_opts *opts)
@@ -380,6 +401,19 @@ int make_sockaddr(int family, const char *addr_str, __u16 port,
380401
if (len)
381402
*len = sizeof(*sin6);
382403
return 0;
404+
} else if (family == AF_UNIX) {
405+
/* Note that we always use abstract unix sockets to avoid having
406+
* to clean up leftover files.
407+
*/
408+
struct sockaddr_un *sun = (void *)addr;
409+
410+
memset(addr, 0, sizeof(*sun));
411+
sun->sun_family = family;
412+
sun->sun_path[0] = 0;
413+
strcpy(sun->sun_path + 1, addr_str);
414+
if (len)
415+
*len = offsetof(struct sockaddr_un, sun_path) + 1 + strlen(addr_str);
416+
return 0;
383417
}
384418
return -1;
385419
}

tools/testing/selftests/bpf/network_helpers.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ int *start_reuseport_server(int family, int type, const char *addr_str,
5151
__u16 port, int timeout_ms,
5252
unsigned int nr_listens);
5353
void free_fds(int *fds, unsigned int nr_close_fds);
54+
int connect_to_addr(const struct sockaddr_storage *addr, socklen_t len, int type);
5455
int connect_to_fd(int server_fd, int timeout_ms);
5556
int connect_to_fd_opts(int server_fd, const struct network_helper_opts *opts);
5657
int connect_fd_to_fd(int client_fd, int server_fd, int timeout_ms);

tools/testing/selftests/bpf/prog_tests/section_names.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,11 @@ static struct sec_name_test tests[] = {
123123
{0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_CONNECT},
124124
{0, BPF_CGROUP_INET6_CONNECT},
125125
},
126+
{
127+
"cgroup/connect_unix",
128+
{0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UNIX_CONNECT},
129+
{0, BPF_CGROUP_UNIX_CONNECT},
130+
},
126131
{
127132
"cgroup/sendmsg4",
128133
{0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UDP4_SENDMSG},
@@ -133,6 +138,11 @@ static struct sec_name_test tests[] = {
133138
{0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UDP6_SENDMSG},
134139
{0, BPF_CGROUP_UDP6_SENDMSG},
135140
},
141+
{
142+
"cgroup/sendmsg_unix",
143+
{0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UNIX_SENDMSG},
144+
{0, BPF_CGROUP_UNIX_SENDMSG},
145+
},
136146
{
137147
"cgroup/recvmsg4",
138148
{0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UDP4_RECVMSG},
@@ -143,6 +153,11 @@ static struct sec_name_test tests[] = {
143153
{0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UDP6_RECVMSG},
144154
{0, BPF_CGROUP_UDP6_RECVMSG},
145155
},
156+
{
157+
"cgroup/recvmsg_unix",
158+
{0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UNIX_RECVMSG},
159+
{0, BPF_CGROUP_UNIX_RECVMSG},
160+
},
146161
{
147162
"cgroup/sysctl",
148163
{0, BPF_PROG_TYPE_CGROUP_SYSCTL, BPF_CGROUP_SYSCTL},
@@ -168,6 +183,11 @@ static struct sec_name_test tests[] = {
168183
{0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_GETPEERNAME},
169184
{0, BPF_CGROUP_INET6_GETPEERNAME},
170185
},
186+
{
187+
"cgroup/getpeername_unix",
188+
{0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UNIX_GETPEERNAME},
189+
{0, BPF_CGROUP_UNIX_GETPEERNAME},
190+
},
171191
{
172192
"cgroup/getsockname4",
173193
{0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_GETSOCKNAME},
@@ -178,6 +198,11 @@ static struct sec_name_test tests[] = {
178198
{0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_GETSOCKNAME},
179199
{0, BPF_CGROUP_INET6_GETSOCKNAME},
180200
},
201+
{
202+
"cgroup/getsockname_unix",
203+
{0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UNIX_GETSOCKNAME},
204+
{0, BPF_CGROUP_UNIX_GETSOCKNAME},
205+
},
181206
};
182207

183208
static void test_prog_type_by_name(const struct sec_name_test *test)

0 commit comments

Comments
 (0)