1 // SPDX-License-Identifier: GPL-2.0
4 #include "test_progs.h"
6 #include "sock_addr_kern.skel.h"
7 #include "bind4_prog.skel.h"
8 #include "bind6_prog.skel.h"
9 #include "connect_unix_prog.skel.h"
10 #include "connect4_prog.skel.h"
11 #include "connect6_prog.skel.h"
12 #include "sendmsg4_prog.skel.h"
13 #include "sendmsg6_prog.skel.h"
14 #include "recvmsg4_prog.skel.h"
15 #include "recvmsg6_prog.skel.h"
16 #include "sendmsg_unix_prog.skel.h"
17 #include "recvmsg_unix_prog.skel.h"
18 #include "getsockname4_prog.skel.h"
19 #include "getsockname6_prog.skel.h"
20 #include "getsockname_unix_prog.skel.h"
21 #include "getpeername4_prog.skel.h"
22 #include "getpeername6_prog.skel.h"
23 #include "getpeername_unix_prog.skel.h"
24 #include "network_helpers.h"
30 #define TEST_NS "sock_addr"
31 #define TEST_IF_PREFIX "test_sock_addr"
32 #define TEST_IPV4 "127.0.0.4"
33 #define TEST_IPV6 "::6"
35 #define SERV4_IP "192.168.1.254"
36 #define SERV4_REWRITE_IP "127.0.0.1"
37 #define SRC4_IP "172.16.0.1"
38 #define SRC4_REWRITE_IP TEST_IPV4
39 #define SERV4_PORT 4040
40 #define SERV4_REWRITE_PORT 4444
42 #define SERV6_IP "face:b00c:1234:5678::abcd"
43 #define SERV6_REWRITE_IP "::1"
44 #define SERV6_V4MAPPED_IP "::ffff:192.168.0.4"
46 #define SRC6_REWRITE_IP TEST_IPV6
47 #define WILDCARD6_IP "::"
48 #define SERV6_PORT 6060
49 #define SERV6_REWRITE_PORT 6666
51 #define SERVUN_ADDRESS "bpf_cgroup_unix_test"
52 #define SERVUN_REWRITE_ADDRESS "bpf_cgroup_unix_test_rewrite"
53 #define SRCUN_ADDRESS "bpf_cgroup_unix_test_src"
55 #define save_errno_do(op) ({ int __save = errno; op; errno = __save; })
57 enum sock_addr_test_type {
59 SOCK_ADDR_TEST_CONNECT,
60 SOCK_ADDR_TEST_SENDMSG,
61 SOCK_ADDR_TEST_RECVMSG,
62 SOCK_ADDR_TEST_GETSOCKNAME,
63 SOCK_ADDR_TEST_GETPEERNAME,
66 typedef void *(*load_fn)(int cgroup_fd,
67 enum bpf_attach_type attach_type,
69 typedef void (*destroy_fn)(void *skel);
71 static int cmp_addr(const struct sockaddr_storage *addr1, socklen_t addr1_len,
72 const struct sockaddr_storage *addr2, socklen_t addr2_len,
75 struct init_sock_args {
81 char addr[sizeof(struct sockaddr_storage)];
86 struct addr_args addr;
91 static struct sock_addr_kern *skel;
93 static int run_bpf_prog(const char *prog_name, void *ctx, int ctx_size)
95 LIBBPF_OPTS(bpf_test_run_opts, topts);
96 struct bpf_program *prog;
100 topts.ctx_size_in = ctx_size;
102 prog = bpf_object__find_program_by_name(skel->obj, prog_name);
103 if (!ASSERT_OK_PTR(prog, "bpf_object__find_program_by_name"))
106 prog_fd = bpf_program__fd(prog);
107 err = bpf_prog_test_run_opts(prog_fd, &topts);
108 if (!ASSERT_OK(err, prog_name))
112 errno = -topts.retval;
120 static int kernel_init_sock(int af, int type, int protocol)
122 struct init_sock_args args = {
127 return run_bpf_prog("init_sock", &args, sizeof(args));
130 static int kernel_close_sock(int fd)
132 return run_bpf_prog("close_sock", NULL, 0);
135 static int sock_addr_op(const char *name, struct sockaddr *addr,
136 socklen_t *addrlen, bool expect_change)
138 struct addr_args args;
142 args.addrlen = *addrlen;
145 memcpy(&args.addr, addr, *addrlen);
147 err = run_bpf_prog(name, &args, sizeof(args));
149 if (!expect_change && addr)
150 if (!ASSERT_EQ(cmp_addr((struct sockaddr_storage *)addr,
152 (struct sockaddr_storage *)&args.addr,
154 0, "address_param_modified"))
158 *addrlen = args.addrlen;
161 memcpy(addr, &args.addr, *addrlen);
166 static int send_msg_op(const char *name, struct sockaddr *addr,
167 socklen_t addrlen, const char *msg, int msglen)
169 struct sendmsg_args args;
172 memset(&args, 0, sizeof(args));
173 memcpy(&args.addr.addr, addr, addrlen);
174 args.addr.addrlen = addrlen;
175 memcpy(args.msg, msg, msglen);
176 args.msglen = msglen;
178 err = run_bpf_prog(name, &args, sizeof(args));
180 if (!ASSERT_EQ(cmp_addr((struct sockaddr_storage *)addr,
182 (struct sockaddr_storage *)&args.addr.addr,
183 args.addr.addrlen, 1),
184 0, "address_param_modified"))
190 static int kernel_connect(struct sockaddr *addr, socklen_t addrlen)
192 return sock_addr_op("kernel_connect", addr, &addrlen, false);
195 static int kernel_bind(int fd, struct sockaddr *addr, socklen_t addrlen)
197 return sock_addr_op("kernel_bind", addr, &addrlen, false);
200 static int kernel_listen(void)
202 return sock_addr_op("kernel_listen", NULL, NULL, false);
205 static int kernel_sendmsg(int fd, struct sockaddr *addr, socklen_t addrlen,
206 char *msg, int msglen)
208 return send_msg_op("kernel_sendmsg", addr, addrlen, msg, msglen);
211 static int sock_sendmsg(int fd, struct sockaddr *addr, socklen_t addrlen,
212 char *msg, int msglen)
214 return send_msg_op("sock_sendmsg", addr, addrlen, msg, msglen);
217 static int kernel_getsockname(int fd, struct sockaddr *addr, socklen_t *addrlen)
219 return sock_addr_op("kernel_getsockname", addr, addrlen, true);
222 static int kernel_getpeername(int fd, struct sockaddr *addr, socklen_t *addrlen)
224 return sock_addr_op("kernel_getpeername", addr, addrlen, true);
227 int kernel_connect_to_addr(int type, const struct sockaddr_storage *addr, socklen_t addrlen,
228 const struct network_helper_opts *opts)
232 if (!ASSERT_OK(kernel_init_sock(addr->ss_family, type, 0),
236 if (kernel_connect((struct sockaddr *)addr, addrlen) < 0)
239 /* Test code expects a "file descriptor" on success. */
244 save_errno_do(ASSERT_OK(kernel_close_sock(0), "kernel_close_sock"));
249 int kernel_start_server(int family, int type, const char *addr_str, __u16 port,
252 struct sockaddr_storage addr;
256 if (!ASSERT_OK(kernel_init_sock(family, type, 0), "kernel_init_sock"))
259 if (make_sockaddr(family, addr_str, port, &addr, &addrlen))
262 if (kernel_bind(0, (struct sockaddr *)&addr, addrlen) < 0)
265 if (type == SOCK_STREAM) {
266 if (!ASSERT_OK(kernel_listen(), "kernel_listen"))
270 /* Test code expects a "file descriptor" on success. */
275 save_errno_do(ASSERT_OK(kernel_close_sock(0), "kernel_close_sock"));
281 int (*connect_to_addr)(int type, const struct sockaddr_storage *addr,
283 const struct network_helper_opts *opts);
284 int (*start_server)(int family, int type, const char *addr_str,
285 __u16 port, int timeout_ms);
286 int (*socket)(int famil, int type, int protocol);
287 int (*bind)(int fd, struct sockaddr *addr, socklen_t addrlen);
288 int (*getsockname)(int fd, struct sockaddr *addr, socklen_t *addrlen);
289 int (*getpeername)(int fd, struct sockaddr *addr, socklen_t *addrlen);
290 int (*sendmsg)(int fd, struct sockaddr *addr, socklen_t addrlen,
291 char *msg, int msglen);
292 int (*close)(int fd);
295 static int user_sendmsg(int fd, struct sockaddr *addr, socklen_t addrlen,
296 char *msg, int msglen)
301 memset(&iov, 0, sizeof(iov));
303 iov.iov_len = msglen;
305 memset(&hdr, 0, sizeof(hdr));
306 hdr.msg_name = (void *)addr;
307 hdr.msg_namelen = addrlen;
311 return sendmsg(fd, &hdr, 0);
314 static int user_bind(int fd, struct sockaddr *addr, socklen_t addrlen)
316 return bind(fd, (const struct sockaddr *)addr, addrlen);
319 struct sock_ops user_ops = {
320 .connect_to_addr = connect_to_addr,
321 .start_server = start_server,
324 .getsockname = getsockname,
325 .getpeername = getpeername,
326 .sendmsg = user_sendmsg,
330 struct sock_ops kern_ops_sock_sendmsg = {
331 .connect_to_addr = kernel_connect_to_addr,
332 .start_server = kernel_start_server,
333 .socket = kernel_init_sock,
335 .getsockname = kernel_getsockname,
336 .getpeername = kernel_getpeername,
337 .sendmsg = sock_sendmsg,
338 .close = kernel_close_sock,
341 struct sock_ops kern_ops_kernel_sendmsg = {
342 .connect_to_addr = kernel_connect_to_addr,
343 .start_server = kernel_start_server,
344 .socket = kernel_init_sock,
346 .getsockname = kernel_getsockname,
347 .getpeername = kernel_getpeername,
348 .sendmsg = kernel_sendmsg,
349 .close = kernel_close_sock,
352 struct sock_addr_test {
353 enum sock_addr_test_type type;
355 /* BPF prog properties */
357 destroy_fn destroyfn;
358 enum bpf_attach_type attach_type;
359 /* Socket operations */
360 struct sock_ops *ops;
361 /* Socket properties */
364 /* IP:port pairs for BPF prog to override */
365 const char *requested_addr;
366 unsigned short requested_port;
367 const char *expected_addr;
368 unsigned short expected_port;
369 const char *expected_src_addr;
370 /* Expected test result */
380 #define BPF_SKEL_FUNCS_RAW(skel_name, prog_name) \
381 static void *prog_name##_load_raw(int cgroup_fd, \
382 enum bpf_attach_type attach_type, \
383 bool expect_reject) \
385 struct skel_name *skel = skel_name##__open(); \
387 if (!ASSERT_OK_PTR(skel, "skel_open")) \
389 if (!ASSERT_OK(skel_name##__load(skel), "load")) \
391 prog_fd = bpf_program__fd(skel->progs.prog_name); \
392 if (!ASSERT_GT(prog_fd, 0, "prog_fd")) \
394 if (bpf_prog_attach(prog_fd, cgroup_fd, attach_type, \
395 BPF_F_ALLOW_OVERRIDE), "bpf_prog_attach") { \
396 ASSERT_TRUE(expect_reject, "unexpected rejection"); \
399 if (!ASSERT_FALSE(expect_reject, "expected rejection")) \
403 bpf_prog_detach(cgroup_fd, attach_type); \
404 skel_name##__destroy(skel); \
407 static void prog_name##_destroy_raw(void *progfd) \
409 /* No-op. *_load_raw does all cleanup. */ \
412 #define BPF_SKEL_FUNCS(skel_name, prog_name) \
413 static void *prog_name##_load(int cgroup_fd, \
414 enum bpf_attach_type attach_type, \
415 bool expect_reject) \
417 struct skel_name *skel = skel_name##__open(); \
418 if (!ASSERT_OK_PTR(skel, "skel_open")) \
420 if (!ASSERT_OK(bpf_program__set_expected_attach_type(skel->progs.prog_name, \
422 "set_expected_attach_type")) \
424 if (skel_name##__load(skel)) { \
425 ASSERT_TRUE(expect_reject, "unexpected rejection"); \
428 if (!ASSERT_FALSE(expect_reject, "expected rejection")) \
430 skel->links.prog_name = bpf_program__attach_cgroup( \
431 skel->progs.prog_name, cgroup_fd); \
432 if (!ASSERT_OK_PTR(skel->links.prog_name, "prog_attach")) \
436 skel_name##__destroy(skel); \
439 static void prog_name##_destroy(void *skel) \
441 skel_name##__destroy(skel); \
444 BPF_SKEL_FUNCS(bind4_prog, bind_v4_prog);
445 BPF_SKEL_FUNCS_RAW(bind4_prog, bind_v4_prog);
446 BPF_SKEL_FUNCS(bind4_prog, bind_v4_deny_prog);
447 BPF_SKEL_FUNCS(bind6_prog, bind_v6_prog);
448 BPF_SKEL_FUNCS_RAW(bind6_prog, bind_v6_prog);
449 BPF_SKEL_FUNCS(bind6_prog, bind_v6_deny_prog);
450 BPF_SKEL_FUNCS(connect4_prog, connect_v4_prog);
451 BPF_SKEL_FUNCS_RAW(connect4_prog, connect_v4_prog);
452 BPF_SKEL_FUNCS(connect4_prog, connect_v4_deny_prog);
453 BPF_SKEL_FUNCS(connect6_prog, connect_v6_prog);
454 BPF_SKEL_FUNCS_RAW(connect6_prog, connect_v6_prog);
455 BPF_SKEL_FUNCS(connect6_prog, connect_v6_deny_prog);
456 BPF_SKEL_FUNCS(connect_unix_prog, connect_unix_prog);
457 BPF_SKEL_FUNCS_RAW(connect_unix_prog, connect_unix_prog);
458 BPF_SKEL_FUNCS(connect_unix_prog, connect_unix_deny_prog);
459 BPF_SKEL_FUNCS(sendmsg4_prog, sendmsg_v4_prog);
460 BPF_SKEL_FUNCS_RAW(sendmsg4_prog, sendmsg_v4_prog);
461 BPF_SKEL_FUNCS(sendmsg4_prog, sendmsg_v4_deny_prog);
462 BPF_SKEL_FUNCS(sendmsg6_prog, sendmsg_v6_prog);
463 BPF_SKEL_FUNCS_RAW(sendmsg6_prog, sendmsg_v6_prog);
464 BPF_SKEL_FUNCS(sendmsg6_prog, sendmsg_v6_deny_prog);
465 BPF_SKEL_FUNCS(sendmsg6_prog, sendmsg_v6_preserve_dst_prog);
466 BPF_SKEL_FUNCS(sendmsg6_prog, sendmsg_v6_v4mapped_prog);
467 BPF_SKEL_FUNCS(sendmsg6_prog, sendmsg_v6_wildcard_prog);
468 BPF_SKEL_FUNCS(sendmsg_unix_prog, sendmsg_unix_prog);
469 BPF_SKEL_FUNCS_RAW(sendmsg_unix_prog, sendmsg_unix_prog);
470 BPF_SKEL_FUNCS(sendmsg_unix_prog, sendmsg_unix_deny_prog);
471 BPF_SKEL_FUNCS(recvmsg4_prog, recvmsg4_prog);
472 BPF_SKEL_FUNCS_RAW(recvmsg4_prog, recvmsg4_prog);
473 BPF_SKEL_FUNCS(recvmsg6_prog, recvmsg6_prog);
474 BPF_SKEL_FUNCS_RAW(recvmsg6_prog, recvmsg6_prog);
475 BPF_SKEL_FUNCS(recvmsg_unix_prog, recvmsg_unix_prog);
476 BPF_SKEL_FUNCS_RAW(recvmsg_unix_prog, recvmsg_unix_prog);
477 BPF_SKEL_FUNCS(getsockname_unix_prog, getsockname_unix_prog);
478 BPF_SKEL_FUNCS_RAW(getsockname_unix_prog, getsockname_unix_prog);
479 BPF_SKEL_FUNCS(getsockname4_prog, getsockname_v4_prog);
480 BPF_SKEL_FUNCS_RAW(getsockname4_prog, getsockname_v4_prog);
481 BPF_SKEL_FUNCS(getsockname6_prog, getsockname_v6_prog);
482 BPF_SKEL_FUNCS_RAW(getsockname6_prog, getsockname_v6_prog);
483 BPF_SKEL_FUNCS(getpeername_unix_prog, getpeername_unix_prog);
484 BPF_SKEL_FUNCS_RAW(getpeername_unix_prog, getpeername_unix_prog);
485 BPF_SKEL_FUNCS(getpeername4_prog, getpeername_v4_prog);
486 BPF_SKEL_FUNCS_RAW(getpeername4_prog, getpeername_v4_prog);
487 BPF_SKEL_FUNCS(getpeername6_prog, getpeername_v6_prog);
488 BPF_SKEL_FUNCS_RAW(getpeername6_prog, getpeername_v6_prog);
490 static struct sock_addr_test tests[] = {
491 /* bind - system calls */
494 "bind4: bind (stream)",
496 bind_v4_prog_destroy,
497 BPF_CGROUP_INET4_BIND,
510 "bind4: bind deny (stream)",
511 bind_v4_deny_prog_load,
512 bind_v4_deny_prog_destroy,
513 BPF_CGROUP_INET4_BIND,
526 "bind4: bind (dgram)",
528 bind_v4_prog_destroy,
529 BPF_CGROUP_INET4_BIND,
542 "bind4: bind deny (dgram)",
543 bind_v4_deny_prog_load,
544 bind_v4_deny_prog_destroy,
545 BPF_CGROUP_INET4_BIND,
558 "bind4: load prog with wrong expected attach type",
560 bind_v4_prog_destroy,
561 BPF_CGROUP_INET6_BIND,
574 "bind4: attach prog with wrong attach type",
575 bind_v4_prog_load_raw,
576 bind_v4_prog_destroy_raw,
577 BPF_CGROUP_INET6_BIND,
590 "bind6: bind (stream)",
592 bind_v6_prog_destroy,
593 BPF_CGROUP_INET6_BIND,
606 "bind6: bind deny (stream)",
607 bind_v6_deny_prog_load,
608 bind_v6_deny_prog_destroy,
609 BPF_CGROUP_INET6_BIND,
622 "bind6: bind (dgram)",
624 bind_v6_prog_destroy,
625 BPF_CGROUP_INET6_BIND,
638 "bind6: bind deny (dgram)",
639 bind_v6_deny_prog_load,
640 bind_v6_deny_prog_destroy,
641 BPF_CGROUP_INET6_BIND,
654 "bind6: load prog with wrong expected attach type",
656 bind_v6_prog_destroy,
657 BPF_CGROUP_INET4_BIND,
670 "bind6: attach prog with wrong attach type",
671 bind_v6_prog_load_raw,
672 bind_v6_prog_destroy_raw,
673 BPF_CGROUP_INET4_BIND,
685 /* bind - kernel calls */
688 "bind4: kernel_bind (stream)",
690 bind_v4_prog_destroy,
691 BPF_CGROUP_INET4_BIND,
692 &kern_ops_sock_sendmsg,
704 "bind4: kernel_bind deny (stream)",
705 bind_v4_deny_prog_load,
706 bind_v4_deny_prog_destroy,
707 BPF_CGROUP_INET4_BIND,
708 &kern_ops_sock_sendmsg,
720 "bind4: kernel_bind (dgram)",
722 bind_v4_prog_destroy,
723 BPF_CGROUP_INET4_BIND,
724 &kern_ops_sock_sendmsg,
736 "bind4: kernel_bind deny (dgram)",
737 bind_v4_deny_prog_load,
738 bind_v4_deny_prog_destroy,
739 BPF_CGROUP_INET4_BIND,
740 &kern_ops_sock_sendmsg,
752 "bind6: kernel_bind (stream)",
754 bind_v6_prog_destroy,
755 BPF_CGROUP_INET6_BIND,
756 &kern_ops_sock_sendmsg,
768 "bind6: kernel_bind deny (stream)",
769 bind_v6_deny_prog_load,
770 bind_v6_deny_prog_destroy,
771 BPF_CGROUP_INET6_BIND,
772 &kern_ops_sock_sendmsg,
784 "bind6: kernel_bind (dgram)",
786 bind_v6_prog_destroy,
787 BPF_CGROUP_INET6_BIND,
788 &kern_ops_sock_sendmsg,
800 "bind6: kernel_bind deny (dgram)",
801 bind_v6_deny_prog_load,
802 bind_v6_deny_prog_destroy,
803 BPF_CGROUP_INET6_BIND,
804 &kern_ops_sock_sendmsg,
815 /* connect - system calls */
817 SOCK_ADDR_TEST_CONNECT,
818 "connect4: connect (stream)",
819 connect_v4_prog_load,
820 connect_v4_prog_destroy,
821 BPF_CGROUP_INET4_CONNECT,
833 SOCK_ADDR_TEST_CONNECT,
834 "connect4: connect deny (stream)",
835 connect_v4_deny_prog_load,
836 connect_v4_deny_prog_destroy,
837 BPF_CGROUP_INET4_CONNECT,
849 SOCK_ADDR_TEST_CONNECT,
850 "connect4: connect (dgram)",
851 connect_v4_prog_load,
852 connect_v4_prog_destroy,
853 BPF_CGROUP_INET4_CONNECT,
865 SOCK_ADDR_TEST_CONNECT,
866 "connect4: connect deny (dgram)",
867 connect_v4_deny_prog_load,
868 connect_v4_deny_prog_destroy,
869 BPF_CGROUP_INET4_CONNECT,
881 SOCK_ADDR_TEST_CONNECT,
882 "connect4: load prog with wrong expected attach type",
883 connect_v4_prog_load,
884 connect_v4_prog_destroy,
885 BPF_CGROUP_INET6_CONNECT,
897 SOCK_ADDR_TEST_CONNECT,
898 "connect4: attach prog with wrong attach type",
899 connect_v4_prog_load_raw,
900 connect_v4_prog_destroy_raw,
901 BPF_CGROUP_INET6_CONNECT,
913 SOCK_ADDR_TEST_CONNECT,
914 "connect6: connect (stream)",
915 connect_v6_prog_load,
916 connect_v6_prog_destroy,
917 BPF_CGROUP_INET6_CONNECT,
929 SOCK_ADDR_TEST_CONNECT,
930 "connect6: connect deny (stream)",
931 connect_v6_deny_prog_load,
932 connect_v6_deny_prog_destroy,
933 BPF_CGROUP_INET6_CONNECT,
945 SOCK_ADDR_TEST_CONNECT,
946 "connect6: connect (dgram)",
947 connect_v6_prog_load,
948 connect_v6_prog_destroy,
949 BPF_CGROUP_INET6_CONNECT,
961 SOCK_ADDR_TEST_CONNECT,
962 "connect6: connect deny (dgram)",
963 connect_v6_deny_prog_load,
964 connect_v6_deny_prog_destroy,
965 BPF_CGROUP_INET6_CONNECT,
977 SOCK_ADDR_TEST_CONNECT,
978 "connect6: load prog with wrong expected attach type",
979 connect_v6_prog_load,
980 connect_v6_prog_destroy,
981 BPF_CGROUP_INET4_CONNECT,
993 SOCK_ADDR_TEST_CONNECT,
994 "connect6: attach prog with wrong attach type",
995 connect_v6_prog_load_raw,
996 connect_v6_prog_destroy_raw,
997 BPF_CGROUP_INET4_CONNECT,
1009 SOCK_ADDR_TEST_CONNECT,
1010 "connect_unix: connect (stream)",
1011 connect_unix_prog_load,
1012 connect_unix_prog_destroy,
1013 BPF_CGROUP_UNIX_CONNECT,
1019 SERVUN_REWRITE_ADDRESS,
1025 SOCK_ADDR_TEST_CONNECT,
1026 "connect_unix: connect deny (stream)",
1027 connect_unix_deny_prog_load,
1028 connect_unix_deny_prog_destroy,
1029 BPF_CGROUP_UNIX_CONNECT,
1035 SERVUN_REWRITE_ADDRESS,
1041 SOCK_ADDR_TEST_CONNECT,
1042 "connect_unix: attach prog with wrong attach type",
1043 connect_unix_prog_load_raw,
1044 connect_unix_prog_destroy_raw,
1045 BPF_CGROUP_INET4_CONNECT,
1051 SERVUN_REWRITE_ADDRESS,
1057 /* connect - kernel calls */
1059 SOCK_ADDR_TEST_CONNECT,
1060 "connect4: kernel_connect (stream)",
1061 connect_v4_prog_load,
1062 connect_v4_prog_destroy,
1063 BPF_CGROUP_INET4_CONNECT,
1064 &kern_ops_sock_sendmsg,
1075 SOCK_ADDR_TEST_CONNECT,
1076 "connect4: kernel_connect deny (stream)",
1077 connect_v4_deny_prog_load,
1078 connect_v4_deny_prog_destroy,
1079 BPF_CGROUP_INET4_CONNECT,
1080 &kern_ops_sock_sendmsg,
1091 SOCK_ADDR_TEST_CONNECT,
1092 "connect4: kernel_connect (dgram)",
1093 connect_v4_prog_load,
1094 connect_v4_prog_destroy,
1095 BPF_CGROUP_INET4_CONNECT,
1096 &kern_ops_sock_sendmsg,
1107 SOCK_ADDR_TEST_CONNECT,
1108 "connect4: kernel_connect deny (dgram)",
1109 connect_v4_deny_prog_load,
1110 connect_v4_deny_prog_destroy,
1111 BPF_CGROUP_INET4_CONNECT,
1112 &kern_ops_sock_sendmsg,
1123 SOCK_ADDR_TEST_CONNECT,
1124 "connect6: kernel_connect (stream)",
1125 connect_v6_prog_load,
1126 connect_v6_prog_destroy,
1127 BPF_CGROUP_INET6_CONNECT,
1128 &kern_ops_sock_sendmsg,
1139 SOCK_ADDR_TEST_CONNECT,
1140 "connect6: kernel_connect deny (stream)",
1141 connect_v6_deny_prog_load,
1142 connect_v6_deny_prog_destroy,
1143 BPF_CGROUP_INET6_CONNECT,
1144 &kern_ops_sock_sendmsg,
1155 SOCK_ADDR_TEST_CONNECT,
1156 "connect6: kernel_connect (dgram)",
1157 connect_v6_prog_load,
1158 connect_v6_prog_destroy,
1159 BPF_CGROUP_INET6_CONNECT,
1160 &kern_ops_sock_sendmsg,
1171 SOCK_ADDR_TEST_CONNECT,
1172 "connect6: kernel_connect deny (dgram)",
1173 connect_v6_deny_prog_load,
1174 connect_v6_deny_prog_destroy,
1175 BPF_CGROUP_INET6_CONNECT,
1176 &kern_ops_sock_sendmsg,
1187 SOCK_ADDR_TEST_CONNECT,
1188 "connect_unix: kernel_connect (dgram)",
1189 connect_unix_prog_load,
1190 connect_unix_prog_destroy,
1191 BPF_CGROUP_UNIX_CONNECT,
1192 &kern_ops_sock_sendmsg,
1197 SERVUN_REWRITE_ADDRESS,
1203 SOCK_ADDR_TEST_CONNECT,
1204 "connect_unix: kernel_connect deny (dgram)",
1205 connect_unix_deny_prog_load,
1206 connect_unix_deny_prog_destroy,
1207 BPF_CGROUP_UNIX_CONNECT,
1208 &kern_ops_sock_sendmsg,
1213 SERVUN_REWRITE_ADDRESS,
1219 /* sendmsg - system calls */
1221 SOCK_ADDR_TEST_SENDMSG,
1222 "sendmsg4: sendmsg (dgram)",
1223 sendmsg_v4_prog_load,
1224 sendmsg_v4_prog_destroy,
1225 BPF_CGROUP_UDP4_SENDMSG,
1237 SOCK_ADDR_TEST_SENDMSG,
1238 "sendmsg4: sendmsg deny (dgram)",
1239 sendmsg_v4_deny_prog_load,
1240 sendmsg_v4_deny_prog_destroy,
1241 BPF_CGROUP_UDP4_SENDMSG,
1253 SOCK_ADDR_TEST_SENDMSG,
1254 "sendmsg4: load prog with wrong expected attach type",
1255 sendmsg_v4_prog_load,
1256 sendmsg_v4_prog_destroy,
1257 BPF_CGROUP_UDP6_SENDMSG,
1269 SOCK_ADDR_TEST_SENDMSG,
1270 "sendmsg4: attach prog with wrong attach type",
1271 sendmsg_v4_prog_load_raw,
1272 sendmsg_v4_prog_destroy_raw,
1273 BPF_CGROUP_UDP6_SENDMSG,
1285 SOCK_ADDR_TEST_SENDMSG,
1286 "sendmsg6: sendmsg (dgram)",
1287 sendmsg_v6_prog_load,
1288 sendmsg_v6_prog_destroy,
1289 BPF_CGROUP_UDP6_SENDMSG,
1301 SOCK_ADDR_TEST_SENDMSG,
1302 "sendmsg6: sendmsg [::] (BSD'ism) (dgram)",
1303 sendmsg_v6_preserve_dst_prog_load,
1304 sendmsg_v6_preserve_dst_prog_destroy,
1305 BPF_CGROUP_UDP6_SENDMSG,
1317 SOCK_ADDR_TEST_SENDMSG,
1318 "sendmsg6: sendmsg deny (dgram)",
1319 sendmsg_v6_deny_prog_load,
1320 sendmsg_v6_deny_prog_destroy,
1321 BPF_CGROUP_UDP6_SENDMSG,
1333 SOCK_ADDR_TEST_SENDMSG,
1334 "sendmsg6: sendmsg IPv4-mapped IPv6 (dgram)",
1335 sendmsg_v6_v4mapped_prog_load,
1336 sendmsg_v6_v4mapped_prog_destroy,
1337 BPF_CGROUP_UDP6_SENDMSG,
1349 SOCK_ADDR_TEST_SENDMSG,
1350 "sendmsg6: sendmsg dst IP = [::] (BSD'ism) (dgram)",
1351 sendmsg_v6_wildcard_prog_load,
1352 sendmsg_v6_wildcard_prog_destroy,
1353 BPF_CGROUP_UDP6_SENDMSG,
1365 SOCK_ADDR_TEST_SENDMSG,
1366 "sendmsg6: load prog with wrong expected attach type",
1367 sendmsg_v6_prog_load,
1368 sendmsg_v6_prog_destroy,
1369 BPF_CGROUP_UDP4_SENDMSG,
1381 SOCK_ADDR_TEST_SENDMSG,
1382 "sendmsg6: attach prog with wrong attach type",
1383 sendmsg_v6_prog_load_raw,
1384 sendmsg_v6_prog_destroy_raw,
1385 BPF_CGROUP_UDP4_SENDMSG,
1397 SOCK_ADDR_TEST_SENDMSG,
1398 "sendmsg_unix: sendmsg (dgram)",
1399 sendmsg_unix_prog_load,
1400 sendmsg_unix_prog_destroy,
1401 BPF_CGROUP_UNIX_SENDMSG,
1407 SERVUN_REWRITE_ADDRESS,
1413 SOCK_ADDR_TEST_SENDMSG,
1414 "sendmsg_unix: sendmsg deny (dgram)",
1415 sendmsg_unix_deny_prog_load,
1416 sendmsg_unix_deny_prog_destroy,
1417 BPF_CGROUP_UNIX_SENDMSG,
1423 SERVUN_REWRITE_ADDRESS,
1429 SOCK_ADDR_TEST_SENDMSG,
1430 "sendmsg_unix: attach prog with wrong attach type",
1431 sendmsg_unix_prog_load_raw,
1432 sendmsg_unix_prog_destroy_raw,
1433 BPF_CGROUP_UDP4_SENDMSG,
1439 SERVUN_REWRITE_ADDRESS,
1445 /* sendmsg - kernel calls (sock_sendmsg) */
1447 SOCK_ADDR_TEST_SENDMSG,
1448 "sendmsg4: sock_sendmsg (dgram)",
1449 sendmsg_v4_prog_load,
1450 sendmsg_v4_prog_destroy,
1451 BPF_CGROUP_UDP4_SENDMSG,
1452 &kern_ops_sock_sendmsg,
1463 SOCK_ADDR_TEST_SENDMSG,
1464 "sendmsg4: sock_sendmsg deny (dgram)",
1465 sendmsg_v4_deny_prog_load,
1466 sendmsg_v4_deny_prog_destroy,
1467 BPF_CGROUP_UDP4_SENDMSG,
1468 &kern_ops_sock_sendmsg,
1479 SOCK_ADDR_TEST_SENDMSG,
1480 "sendmsg6: sock_sendmsg (dgram)",
1481 sendmsg_v6_prog_load,
1482 sendmsg_v6_prog_destroy,
1483 BPF_CGROUP_UDP6_SENDMSG,
1484 &kern_ops_sock_sendmsg,
1495 SOCK_ADDR_TEST_SENDMSG,
1496 "sendmsg6: sock_sendmsg [::] (BSD'ism) (dgram)",
1497 sendmsg_v6_preserve_dst_prog_load,
1498 sendmsg_v6_preserve_dst_prog_destroy,
1499 BPF_CGROUP_UDP6_SENDMSG,
1500 &kern_ops_sock_sendmsg,
1511 SOCK_ADDR_TEST_SENDMSG,
1512 "sendmsg6: sock_sendmsg deny (dgram)",
1513 sendmsg_v6_deny_prog_load,
1514 sendmsg_v6_deny_prog_destroy,
1515 BPF_CGROUP_UDP6_SENDMSG,
1516 &kern_ops_sock_sendmsg,
1527 SOCK_ADDR_TEST_SENDMSG,
1528 "sendmsg_unix: sock_sendmsg (dgram)",
1529 sendmsg_unix_prog_load,
1530 sendmsg_unix_prog_destroy,
1531 BPF_CGROUP_UNIX_SENDMSG,
1532 &kern_ops_sock_sendmsg,
1537 SERVUN_REWRITE_ADDRESS,
1543 SOCK_ADDR_TEST_SENDMSG,
1544 "sendmsg_unix: sock_sendmsg deny (dgram)",
1545 sendmsg_unix_deny_prog_load,
1546 sendmsg_unix_deny_prog_destroy,
1547 BPF_CGROUP_UNIX_SENDMSG,
1548 &kern_ops_sock_sendmsg,
1553 SERVUN_REWRITE_ADDRESS,
1559 /* sendmsg - kernel calls (kernel_sendmsg) */
1561 SOCK_ADDR_TEST_SENDMSG,
1562 "sendmsg4: kernel_sendmsg (dgram)",
1563 sendmsg_v4_prog_load,
1564 sendmsg_v4_prog_destroy,
1565 BPF_CGROUP_UDP4_SENDMSG,
1566 &kern_ops_kernel_sendmsg,
1577 SOCK_ADDR_TEST_SENDMSG,
1578 "sendmsg4: kernel_sendmsg deny (dgram)",
1579 sendmsg_v4_deny_prog_load,
1580 sendmsg_v4_deny_prog_destroy,
1581 BPF_CGROUP_UDP4_SENDMSG,
1582 &kern_ops_kernel_sendmsg,
1593 SOCK_ADDR_TEST_SENDMSG,
1594 "sendmsg6: kernel_sendmsg (dgram)",
1595 sendmsg_v6_prog_load,
1596 sendmsg_v6_prog_destroy,
1597 BPF_CGROUP_UDP6_SENDMSG,
1598 &kern_ops_kernel_sendmsg,
1609 SOCK_ADDR_TEST_SENDMSG,
1610 "sendmsg6: kernel_sendmsg [::] (BSD'ism) (dgram)",
1611 sendmsg_v6_preserve_dst_prog_load,
1612 sendmsg_v6_preserve_dst_prog_destroy,
1613 BPF_CGROUP_UDP6_SENDMSG,
1614 &kern_ops_kernel_sendmsg,
1625 SOCK_ADDR_TEST_SENDMSG,
1626 "sendmsg6: kernel_sendmsg deny (dgram)",
1627 sendmsg_v6_deny_prog_load,
1628 sendmsg_v6_deny_prog_destroy,
1629 BPF_CGROUP_UDP6_SENDMSG,
1630 &kern_ops_kernel_sendmsg,
1641 SOCK_ADDR_TEST_SENDMSG,
1642 "sendmsg_unix: sock_sendmsg (dgram)",
1643 sendmsg_unix_prog_load,
1644 sendmsg_unix_prog_destroy,
1645 BPF_CGROUP_UNIX_SENDMSG,
1646 &kern_ops_kernel_sendmsg,
1651 SERVUN_REWRITE_ADDRESS,
1657 SOCK_ADDR_TEST_SENDMSG,
1658 "sendmsg_unix: kernel_sendmsg deny (dgram)",
1659 sendmsg_unix_deny_prog_load,
1660 sendmsg_unix_deny_prog_destroy,
1661 BPF_CGROUP_UNIX_SENDMSG,
1662 &kern_ops_kernel_sendmsg,
1667 SERVUN_REWRITE_ADDRESS,
1673 /* recvmsg - system calls */
1675 SOCK_ADDR_TEST_RECVMSG,
1676 "recvmsg4: recvfrom (dgram)",
1678 recvmsg4_prog_destroy,
1679 BPF_CGROUP_UDP4_RECVMSG,
1691 SOCK_ADDR_TEST_RECVMSG,
1692 "recvmsg4: attach prog with wrong attach type",
1693 recvmsg4_prog_load_raw,
1694 recvmsg4_prog_destroy_raw,
1695 BPF_CGROUP_UDP6_RECVMSG,
1707 SOCK_ADDR_TEST_RECVMSG,
1708 "recvmsg6: recvfrom (dgram)",
1710 recvmsg6_prog_destroy,
1711 BPF_CGROUP_UDP6_RECVMSG,
1723 SOCK_ADDR_TEST_RECVMSG,
1724 "recvmsg6: attach prog with wrong attach type",
1725 recvmsg6_prog_load_raw,
1726 recvmsg6_prog_destroy_raw,
1727 BPF_CGROUP_UDP4_RECVMSG,
1739 SOCK_ADDR_TEST_RECVMSG,
1740 "recvmsg_unix: recvfrom (dgram)",
1741 recvmsg_unix_prog_load,
1742 recvmsg_unix_prog_destroy,
1743 BPF_CGROUP_UNIX_RECVMSG,
1747 SERVUN_REWRITE_ADDRESS,
1749 SERVUN_REWRITE_ADDRESS,
1755 SOCK_ADDR_TEST_RECVMSG,
1756 "recvmsg_unix: recvfrom (stream)",
1757 recvmsg_unix_prog_load,
1758 recvmsg_unix_prog_destroy,
1759 BPF_CGROUP_UNIX_RECVMSG,
1763 SERVUN_REWRITE_ADDRESS,
1765 SERVUN_REWRITE_ADDRESS,
1771 SOCK_ADDR_TEST_RECVMSG,
1772 "recvmsg_unix: attach prog with wrong attach type",
1773 recvmsg_unix_prog_load_raw,
1774 recvmsg_unix_prog_destroy_raw,
1775 BPF_CGROUP_UDP4_RECVMSG,
1779 SERVUN_REWRITE_ADDRESS,
1781 SERVUN_REWRITE_ADDRESS,
1787 /* getsockname - system calls */
1789 SOCK_ADDR_TEST_GETSOCKNAME,
1790 "getsockname4: getsockname (stream)",
1791 getsockname_v4_prog_load,
1792 getsockname_v4_prog_destroy,
1793 BPF_CGROUP_INET4_GETSOCKNAME,
1805 SOCK_ADDR_TEST_GETSOCKNAME,
1806 "getsockname4: getsockname (dgram)",
1807 getsockname_v4_prog_load,
1808 getsockname_v4_prog_destroy,
1809 BPF_CGROUP_INET4_GETSOCKNAME,
1821 SOCK_ADDR_TEST_GETSOCKNAME,
1822 "getsockname4: attach prog with wrong attach type",
1823 getsockname_v4_prog_load_raw,
1824 getsockname_v4_prog_destroy_raw,
1825 BPF_CGROUP_INET6_GETSOCKNAME,
1837 SOCK_ADDR_TEST_GETSOCKNAME,
1838 "getsockname6: getsockname (stream)",
1839 getsockname_v6_prog_load,
1840 getsockname_v6_prog_destroy,
1841 BPF_CGROUP_INET6_GETSOCKNAME,
1853 SOCK_ADDR_TEST_GETSOCKNAME,
1854 "getsockname6: getsockname (dgram)",
1855 getsockname_v6_prog_load,
1856 getsockname_v6_prog_destroy,
1857 BPF_CGROUP_INET6_GETSOCKNAME,
1869 SOCK_ADDR_TEST_GETSOCKNAME,
1870 "getsockname6: attach prog with wrong attach type",
1871 getsockname_v6_prog_load_raw,
1872 getsockname_v6_prog_destroy_raw,
1873 BPF_CGROUP_INET4_GETSOCKNAME,
1885 SOCK_ADDR_TEST_GETSOCKNAME,
1886 "getsockname_unix: getsockname",
1887 getsockname_unix_prog_load,
1888 getsockname_unix_prog_destroy,
1889 BPF_CGROUP_UNIX_GETSOCKNAME,
1895 SERVUN_REWRITE_ADDRESS,
1901 SOCK_ADDR_TEST_GETSOCKNAME,
1902 "getsockname_unix: attach prog with wrong attach type",
1903 getsockname_unix_prog_load_raw,
1904 getsockname_unix_prog_destroy_raw,
1905 BPF_CGROUP_INET4_GETSOCKNAME,
1911 SERVUN_REWRITE_ADDRESS,
1917 /* getsockname - kernel calls */
1919 SOCK_ADDR_TEST_GETSOCKNAME,
1920 "getsockname4: kernel_getsockname (stream)",
1921 getsockname_v4_prog_load,
1922 getsockname_v4_prog_destroy,
1923 BPF_CGROUP_INET4_GETSOCKNAME,
1924 &kern_ops_kernel_sendmsg,
1935 SOCK_ADDR_TEST_GETSOCKNAME,
1936 "getsockname4: kernel_getsockname (dgram)",
1937 getsockname_v4_prog_load,
1938 getsockname_v4_prog_destroy,
1939 BPF_CGROUP_INET4_GETSOCKNAME,
1940 &kern_ops_kernel_sendmsg,
1951 SOCK_ADDR_TEST_GETSOCKNAME,
1952 "getsockname6: kernel_getsockname (stream)",
1953 getsockname_v6_prog_load,
1954 getsockname_v6_prog_destroy,
1955 BPF_CGROUP_INET6_GETSOCKNAME,
1956 &kern_ops_kernel_sendmsg,
1967 SOCK_ADDR_TEST_GETSOCKNAME,
1968 "getsockname6: kernel_getsockname (dgram)",
1969 getsockname_v6_prog_load,
1970 getsockname_v6_prog_destroy,
1971 BPF_CGROUP_INET6_GETSOCKNAME,
1972 &kern_ops_kernel_sendmsg,
1983 SOCK_ADDR_TEST_GETSOCKNAME,
1984 "getsockname_unix: kernel_getsockname",
1985 getsockname_unix_prog_load,
1986 getsockname_unix_prog_destroy,
1987 BPF_CGROUP_UNIX_GETSOCKNAME,
1988 &kern_ops_kernel_sendmsg,
1993 SERVUN_REWRITE_ADDRESS,
1999 /* getpeername - system calls */
2001 SOCK_ADDR_TEST_GETPEERNAME,
2002 "getpeername4: getpeername (stream)",
2003 getpeername_v4_prog_load,
2004 getpeername_v4_prog_destroy,
2005 BPF_CGROUP_INET4_GETPEERNAME,
2017 SOCK_ADDR_TEST_GETPEERNAME,
2018 "getpeername4: getpeername (dgram)",
2019 getpeername_v4_prog_load,
2020 getpeername_v4_prog_destroy,
2021 BPF_CGROUP_INET4_GETPEERNAME,
2033 SOCK_ADDR_TEST_GETPEERNAME,
2034 "getpeername4: attach prog with wrong attach type",
2035 getpeername_v4_prog_load_raw,
2036 getpeername_v4_prog_destroy_raw,
2037 BPF_CGROUP_INET6_GETSOCKNAME,
2049 SOCK_ADDR_TEST_GETPEERNAME,
2050 "getpeername6: getpeername (stream)",
2051 getpeername_v6_prog_load,
2052 getpeername_v6_prog_destroy,
2053 BPF_CGROUP_INET6_GETPEERNAME,
2065 SOCK_ADDR_TEST_GETPEERNAME,
2066 "getpeername6: getpeername (dgram)",
2067 getpeername_v6_prog_load,
2068 getpeername_v6_prog_destroy,
2069 BPF_CGROUP_INET6_GETPEERNAME,
2081 SOCK_ADDR_TEST_GETPEERNAME,
2082 "getpeername6: attach prog with wrong attach type",
2083 getpeername_v6_prog_load_raw,
2084 getpeername_v6_prog_destroy_raw,
2085 BPF_CGROUP_INET4_GETSOCKNAME,
2097 SOCK_ADDR_TEST_GETPEERNAME,
2098 "getpeername_unix: getpeername",
2099 getpeername_unix_prog_load,
2100 getpeername_unix_prog_destroy,
2101 BPF_CGROUP_UNIX_GETPEERNAME,
2107 SERVUN_REWRITE_ADDRESS,
2113 SOCK_ADDR_TEST_GETPEERNAME,
2114 "getpeername_unix: attach prog with wrong attach type",
2115 getpeername_unix_prog_load_raw,
2116 getpeername_unix_prog_destroy_raw,
2117 BPF_CGROUP_INET4_GETSOCKNAME,
2123 SERVUN_REWRITE_ADDRESS,
2129 /* getpeername - kernel calls */
2131 SOCK_ADDR_TEST_GETPEERNAME,
2132 "getpeername4: kernel_getpeername (stream)",
2133 getpeername_v4_prog_load,
2134 getpeername_v4_prog_destroy,
2135 BPF_CGROUP_INET4_GETPEERNAME,
2136 &kern_ops_kernel_sendmsg,
2147 SOCK_ADDR_TEST_GETPEERNAME,
2148 "getpeername4: kernel_getpeername (dgram)",
2149 getpeername_v4_prog_load,
2150 getpeername_v4_prog_destroy,
2151 BPF_CGROUP_INET4_GETPEERNAME,
2152 &kern_ops_kernel_sendmsg,
2163 SOCK_ADDR_TEST_GETPEERNAME,
2164 "getpeername6: kernel_getpeername (stream)",
2165 getpeername_v6_prog_load,
2166 getpeername_v6_prog_destroy,
2167 BPF_CGROUP_INET6_GETPEERNAME,
2168 &kern_ops_kernel_sendmsg,
2179 SOCK_ADDR_TEST_GETPEERNAME,
2180 "getpeername6: kernel_getpeername (dgram)",
2181 getpeername_v6_prog_load,
2182 getpeername_v6_prog_destroy,
2183 BPF_CGROUP_INET6_GETPEERNAME,
2184 &kern_ops_kernel_sendmsg,
2195 SOCK_ADDR_TEST_GETPEERNAME,
2196 "getpeername_unix: kernel_getpeername",
2197 getpeername_unix_prog_load,
2198 getpeername_unix_prog_destroy,
2199 BPF_CGROUP_UNIX_GETPEERNAME,
2200 &kern_ops_kernel_sendmsg,
2205 SERVUN_REWRITE_ADDRESS,
2212 typedef int (*info_fn)(int, struct sockaddr *, socklen_t *);
2214 static int cmp_addr(const struct sockaddr_storage *addr1, socklen_t addr1_len,
2215 const struct sockaddr_storage *addr2, socklen_t addr2_len,
2218 const struct sockaddr_in *four1, *four2;
2219 const struct sockaddr_in6 *six1, *six2;
2220 const struct sockaddr_un *un1, *un2;
2222 if (addr1->ss_family != addr2->ss_family)
2225 if (addr1_len != addr2_len)
2228 if (addr1->ss_family == AF_INET) {
2229 four1 = (const struct sockaddr_in *)addr1;
2230 four2 = (const struct sockaddr_in *)addr2;
2231 return !((four1->sin_port == four2->sin_port || !cmp_port) &&
2232 four1->sin_addr.s_addr == four2->sin_addr.s_addr);
2233 } else if (addr1->ss_family == AF_INET6) {
2234 six1 = (const struct sockaddr_in6 *)addr1;
2235 six2 = (const struct sockaddr_in6 *)addr2;
2236 return !((six1->sin6_port == six2->sin6_port || !cmp_port) &&
2237 !memcmp(&six1->sin6_addr, &six2->sin6_addr,
2238 sizeof(struct in6_addr)));
2239 } else if (addr1->ss_family == AF_UNIX) {
2240 un1 = (const struct sockaddr_un *)addr1;
2241 un2 = (const struct sockaddr_un *)addr2;
2242 return memcmp(un1, un2, addr1_len);
2248 static int cmp_sock_addr(info_fn fn, int sock1,
2249 const struct sockaddr_storage *addr2,
2250 socklen_t addr2_len, bool cmp_port)
2252 struct sockaddr_storage addr1;
2253 socklen_t len1 = sizeof(addr1);
2255 memset(&addr1, 0, len1);
2256 if (fn(sock1, (struct sockaddr *)&addr1, (socklen_t *)&len1) != 0)
2259 return cmp_addr(&addr1, len1, addr2, addr2_len, cmp_port);
2262 static int load_sock_addr_kern(void)
2266 skel = sock_addr_kern__open_and_load();
2267 if (!ASSERT_OK_PTR(skel, "skel"))
2278 static void unload_sock_addr_kern(void)
2280 sock_addr_kern__destroy(skel);
2283 static int test_bind(struct sock_addr_test *test)
2285 struct sockaddr_storage expected_addr;
2286 socklen_t expected_addr_len = sizeof(struct sockaddr_storage);
2287 int serv = -1, client = -1, err;
2289 serv = test->ops->start_server(test->socket_family, test->socket_type,
2290 test->requested_addr,
2291 test->requested_port, 0);
2297 err = make_sockaddr(test->socket_family,
2298 test->expected_addr, test->expected_port,
2299 &expected_addr, &expected_addr_len);
2300 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2303 err = cmp_sock_addr(test->ops->getsockname, serv, &expected_addr,
2304 expected_addr_len, true);
2305 if (!ASSERT_EQ(err, 0, "cmp_local_addr"))
2308 /* Try to connect to server just in case */
2309 client = connect_to_addr(test->socket_type, &expected_addr, expected_addr_len, NULL);
2310 if (!ASSERT_GE(client, 0, "connect_to_addr"))
2319 test->ops->close(serv);
2324 static int test_connect(struct sock_addr_test *test)
2326 struct sockaddr_storage addr, expected_addr, expected_src_addr;
2327 socklen_t addr_len = sizeof(struct sockaddr_storage),
2328 expected_addr_len = sizeof(struct sockaddr_storage),
2329 expected_src_addr_len = sizeof(struct sockaddr_storage);
2330 int serv = -1, client = -1, err;
2332 serv = start_server(test->socket_family, test->socket_type,
2333 test->expected_addr, test->expected_port, 0);
2334 if (!ASSERT_GE(serv, 0, "start_server"))
2337 err = make_sockaddr(test->socket_family, test->requested_addr, test->requested_port,
2339 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2342 client = test->ops->connect_to_addr(test->socket_type, &addr, addr_len,
2349 err = make_sockaddr(test->socket_family, test->expected_addr, test->expected_port,
2350 &expected_addr, &expected_addr_len);
2351 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2354 if (test->expected_src_addr) {
2355 err = make_sockaddr(test->socket_family, test->expected_src_addr, 0,
2356 &expected_src_addr, &expected_src_addr_len);
2357 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2361 err = cmp_sock_addr(test->ops->getpeername, client, &expected_addr,
2362 expected_addr_len, true);
2363 if (!ASSERT_EQ(err, 0, "cmp_peer_addr"))
2366 if (test->expected_src_addr) {
2367 err = cmp_sock_addr(test->ops->getsockname, client,
2368 &expected_src_addr, expected_src_addr_len,
2370 if (!ASSERT_EQ(err, 0, "cmp_local_addr"))
2377 test->ops->close(client);
2384 static int test_xmsg(struct sock_addr_test *test)
2386 struct sockaddr_storage addr, src_addr;
2387 socklen_t addr_len = sizeof(struct sockaddr_storage),
2388 src_addr_len = sizeof(struct sockaddr_storage);
2390 int serv = -1, client = -1, err;
2392 /* Unlike the other tests, here we test that we can rewrite the src addr
2393 * with a recvmsg() hook.
2396 serv = start_server(test->socket_family, test->socket_type,
2397 test->expected_addr, test->expected_port, 0);
2398 if (!ASSERT_GE(serv, 0, "start_server"))
2401 client = test->ops->socket(test->socket_family, test->socket_type, 0);
2402 if (!ASSERT_GE(client, 0, "socket"))
2405 /* AF_UNIX sockets have to be bound to something to trigger the recvmsg bpf program. */
2406 if (test->socket_family == AF_UNIX) {
2407 err = make_sockaddr(AF_UNIX, SRCUN_ADDRESS, 0, &src_addr, &src_addr_len);
2408 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2411 err = test->ops->bind(client, (struct sockaddr *)&src_addr,
2413 if (!ASSERT_OK(err, "bind"))
2417 err = make_sockaddr(test->socket_family, test->requested_addr, test->requested_port,
2419 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2422 if (test->socket_type == SOCK_DGRAM) {
2423 err = test->ops->sendmsg(client, (struct sockaddr *)&addr,
2424 addr_len, &data, sizeof(data));
2430 if (!ASSERT_EQ(err, sizeof(data), "sendmsg"))
2433 /* Testing with connection-oriented sockets is only valid for
2436 if (!ASSERT_EQ(test->type, SOCK_ADDR_TEST_RECVMSG, "recvmsg"))
2439 err = connect(client, (const struct sockaddr *)&addr, addr_len);
2440 if (!ASSERT_OK(err, "connect"))
2443 err = send(client, &data, sizeof(data), 0);
2444 if (!ASSERT_EQ(err, sizeof(data), "send"))
2447 err = listen(serv, 0);
2448 if (!ASSERT_OK(err, "listen"))
2451 err = accept(serv, NULL, NULL);
2452 if (!ASSERT_GE(err, 0, "accept"))
2459 addr_len = src_addr_len = sizeof(struct sockaddr_storage);
2461 err = recvfrom(serv, &data, sizeof(data), 0, (struct sockaddr *) &src_addr, &src_addr_len);
2462 if (!ASSERT_EQ(err, sizeof(data), "recvfrom"))
2465 ASSERT_EQ(data, 'a', "data mismatch");
2467 if (test->expected_src_addr) {
2468 err = make_sockaddr(test->socket_family, test->expected_src_addr, 0,
2470 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2473 err = cmp_addr(&src_addr, src_addr_len, &addr, addr_len, false);
2474 if (!ASSERT_EQ(err, 0, "cmp_addr"))
2482 test->ops->close(client);
2489 static int test_getsockname(struct sock_addr_test *test)
2491 struct sockaddr_storage expected_addr;
2492 socklen_t expected_addr_len = sizeof(struct sockaddr_storage);
2495 serv = test->ops->start_server(test->socket_family, test->socket_type,
2496 test->requested_addr, test->requested_port, 0);
2497 if (!ASSERT_GE(serv, 0, "start_server"))
2500 err = make_sockaddr(test->socket_family,
2501 test->expected_addr, test->expected_port,
2502 &expected_addr, &expected_addr_len);
2503 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2506 err = cmp_sock_addr(test->ops->getsockname, serv, &expected_addr, expected_addr_len, true);
2507 if (!ASSERT_EQ(err, 0, "cmp_local_addr"))
2512 test->ops->close(serv);
2517 static int test_getpeername(struct sock_addr_test *test)
2519 struct sockaddr_storage addr, expected_addr;
2520 socklen_t addr_len = sizeof(struct sockaddr_storage),
2521 expected_addr_len = sizeof(struct sockaddr_storage);
2522 int serv = -1, client = -1, err;
2524 serv = start_server(test->socket_family, test->socket_type,
2525 test->requested_addr, test->requested_port, 0);
2526 if (!ASSERT_GE(serv, 0, "start_server"))
2529 err = make_sockaddr(test->socket_family, test->requested_addr, test->requested_port,
2531 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2534 client = test->ops->connect_to_addr(test->socket_type, &addr, addr_len,
2536 if (!ASSERT_GE(client, 0, "connect_to_addr"))
2539 err = make_sockaddr(test->socket_family, test->expected_addr, test->expected_port,
2540 &expected_addr, &expected_addr_len);
2541 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2544 err = cmp_sock_addr(test->ops->getpeername, client, &expected_addr,
2545 expected_addr_len, true);
2546 if (!ASSERT_EQ(err, 0, "cmp_peer_addr"))
2551 test->ops->close(client);
2558 static int setup_test_env(struct nstoken **tok)
2562 SYS_NOFAIL("ip netns delete %s", TEST_NS);
2563 SYS(fail, "ip netns add %s", TEST_NS);
2564 *tok = open_netns(TEST_NS);
2565 if (!ASSERT_OK_PTR(*tok, "netns token"))
2568 SYS(fail, "ip link add dev %s1 type veth peer name %s2", TEST_IF_PREFIX,
2570 SYS(fail, "ip link set lo up");
2571 SYS(fail, "ip link set %s1 up", TEST_IF_PREFIX);
2572 SYS(fail, "ip link set %s2 up", TEST_IF_PREFIX);
2573 SYS(fail, "ip -4 addr add %s/8 dev %s1", TEST_IPV4, TEST_IF_PREFIX);
2574 SYS(fail, "ip -6 addr add %s/128 nodad dev %s1", TEST_IPV6, TEST_IF_PREFIX);
2582 SYS_NOFAIL("ip netns delete %s", TEST_NS);
2587 static void cleanup_test_env(struct nstoken *tok)
2590 SYS_NOFAIL("ip netns delete %s", TEST_NS);
2593 void test_sock_addr(void)
2595 struct nstoken *tok = NULL;
2599 cgroup_fd = test__join_cgroup("/sock_addr");
2600 if (!ASSERT_GE(cgroup_fd, 0, "join_cgroup"))
2603 if (!ASSERT_OK(setup_test_env(&tok), "setup_test_env"))
2606 if (!ASSERT_OK(load_sock_addr_kern(), "load_sock_addr_kern"))
2609 for (size_t i = 0; i < ARRAY_SIZE(tests); ++i) {
2610 struct sock_addr_test *test = &tests[i];
2613 if (!test__start_subtest(test->name))
2616 skel = test->loadfn(cgroup_fd, test->attach_type,
2617 test->expected_result == LOAD_REJECT ||
2618 test->expected_result == ATTACH_REJECT);
2622 switch (test->type) {
2623 /* Not exercised yet but we leave this code here for when the
2624 * INET and INET6 sockaddr tests are migrated to this file in
2627 case SOCK_ADDR_TEST_BIND:
2628 err = test_bind(test);
2630 case SOCK_ADDR_TEST_CONNECT:
2631 err = test_connect(test);
2633 case SOCK_ADDR_TEST_SENDMSG:
2634 case SOCK_ADDR_TEST_RECVMSG:
2635 err = test_xmsg(test);
2637 case SOCK_ADDR_TEST_GETSOCKNAME:
2638 err = test_getsockname(test);
2640 case SOCK_ADDR_TEST_GETPEERNAME:
2641 err = test_getpeername(test);
2644 ASSERT_TRUE(false, "Unknown sock addr test type");
2648 if (test->expected_result == SYSCALL_EPERM)
2649 ASSERT_EQ(err, EPERM, "socket operation returns EPERM");
2650 else if (test->expected_result == SYSCALL_ENOTSUPP)
2651 ASSERT_EQ(err, ENOTSUPP, "socket operation returns ENOTSUPP");
2652 else if (test->expected_result == SUCCESS)
2653 ASSERT_OK(err, "socket operation succeeds");
2655 test->destroyfn(skel);
2659 unload_sock_addr_kern();
2660 cleanup_test_env(tok);