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"
26 #define TEST_NS "sock_addr"
27 #define TEST_IF_PREFIX "test_sock_addr"
28 #define TEST_IPV4 "127.0.0.4"
29 #define TEST_IPV6 "::6"
31 #define SERV4_IP "192.168.1.254"
32 #define SERV4_REWRITE_IP "127.0.0.1"
33 #define SRC4_IP "172.16.0.1"
34 #define SRC4_REWRITE_IP TEST_IPV4
35 #define SERV4_PORT 4040
36 #define SERV4_REWRITE_PORT 4444
38 #define SERV6_IP "face:b00c:1234:5678::abcd"
39 #define SERV6_REWRITE_IP "::1"
40 #define SERV6_V4MAPPED_IP "::ffff:192.168.0.4"
42 #define SRC6_REWRITE_IP TEST_IPV6
43 #define WILDCARD6_IP "::"
44 #define SERV6_PORT 6060
45 #define SERV6_REWRITE_PORT 6666
47 #define SERVUN_ADDRESS "bpf_cgroup_unix_test"
48 #define SERVUN_REWRITE_ADDRESS "bpf_cgroup_unix_test_rewrite"
49 #define SRCUN_ADDRESS "bpf_cgroup_unix_test_src"
51 #define save_errno_do(op) ({ int __save = errno; op; errno = __save; })
53 enum sock_addr_test_type {
55 SOCK_ADDR_TEST_CONNECT,
56 SOCK_ADDR_TEST_SENDMSG,
57 SOCK_ADDR_TEST_RECVMSG,
58 SOCK_ADDR_TEST_GETSOCKNAME,
59 SOCK_ADDR_TEST_GETPEERNAME,
62 typedef void *(*load_fn)(int cgroup_fd,
63 enum bpf_attach_type attach_type,
65 typedef void (*destroy_fn)(void *skel);
67 static int cmp_addr(const struct sockaddr_storage *addr1, socklen_t addr1_len,
68 const struct sockaddr_storage *addr2, socklen_t addr2_len,
71 struct init_sock_args {
77 char addr[sizeof(struct sockaddr_storage)];
82 struct addr_args addr;
87 static struct sock_addr_kern *skel;
89 static int run_bpf_prog(const char *prog_name, void *ctx, int ctx_size)
91 LIBBPF_OPTS(bpf_test_run_opts, topts);
92 struct bpf_program *prog;
96 topts.ctx_size_in = ctx_size;
98 prog = bpf_object__find_program_by_name(skel->obj, prog_name);
99 if (!ASSERT_OK_PTR(prog, "bpf_object__find_program_by_name"))
102 prog_fd = bpf_program__fd(prog);
103 err = bpf_prog_test_run_opts(prog_fd, &topts);
104 if (!ASSERT_OK(err, prog_name))
108 errno = -topts.retval;
116 static int kernel_init_sock(int af, int type, int protocol)
118 struct init_sock_args args = {
123 return run_bpf_prog("init_sock", &args, sizeof(args));
126 static int kernel_close_sock(int fd)
128 return run_bpf_prog("close_sock", NULL, 0);
131 static int sock_addr_op(const char *name, struct sockaddr *addr,
132 socklen_t *addrlen, bool expect_change)
134 struct addr_args args;
138 args.addrlen = *addrlen;
141 memcpy(&args.addr, addr, *addrlen);
143 err = run_bpf_prog(name, &args, sizeof(args));
145 if (!expect_change && addr)
146 if (!ASSERT_EQ(cmp_addr((struct sockaddr_storage *)addr,
148 (struct sockaddr_storage *)&args.addr,
150 0, "address_param_modified"))
154 *addrlen = args.addrlen;
157 memcpy(addr, &args.addr, *addrlen);
162 static int send_msg_op(const char *name, struct sockaddr *addr,
163 socklen_t addrlen, const char *msg, int msglen)
165 struct sendmsg_args args;
168 memset(&args, 0, sizeof(args));
169 memcpy(&args.addr.addr, addr, addrlen);
170 args.addr.addrlen = addrlen;
171 memcpy(args.msg, msg, msglen);
172 args.msglen = msglen;
174 err = run_bpf_prog(name, &args, sizeof(args));
176 if (!ASSERT_EQ(cmp_addr((struct sockaddr_storage *)addr,
178 (struct sockaddr_storage *)&args.addr.addr,
179 args.addr.addrlen, 1),
180 0, "address_param_modified"))
186 static int kernel_connect(struct sockaddr *addr, socklen_t addrlen)
188 return sock_addr_op("kernel_connect", addr, &addrlen, false);
191 static int kernel_bind(int fd, struct sockaddr *addr, socklen_t addrlen)
193 return sock_addr_op("kernel_bind", addr, &addrlen, false);
196 static int kernel_listen(void)
198 return sock_addr_op("kernel_listen", NULL, NULL, false);
201 static int kernel_sendmsg(int fd, struct sockaddr *addr, socklen_t addrlen,
202 char *msg, int msglen)
204 return send_msg_op("kernel_sendmsg", addr, addrlen, msg, msglen);
207 static int sock_sendmsg(int fd, struct sockaddr *addr, socklen_t addrlen,
208 char *msg, int msglen)
210 return send_msg_op("sock_sendmsg", addr, addrlen, msg, msglen);
213 static int kernel_getsockname(int fd, struct sockaddr *addr, socklen_t *addrlen)
215 return sock_addr_op("kernel_getsockname", addr, addrlen, true);
218 static int kernel_getpeername(int fd, struct sockaddr *addr, socklen_t *addrlen)
220 return sock_addr_op("kernel_getpeername", addr, addrlen, true);
223 int kernel_connect_to_addr(int type, const struct sockaddr_storage *addr, socklen_t addrlen,
224 const struct network_helper_opts *opts)
228 if (!ASSERT_OK(kernel_init_sock(addr->ss_family, type, 0),
232 if (kernel_connect((struct sockaddr *)addr, addrlen) < 0)
235 /* Test code expects a "file descriptor" on success. */
240 save_errno_do(ASSERT_OK(kernel_close_sock(0), "kernel_close_sock"));
245 int kernel_start_server(int family, int type, const char *addr_str, __u16 port,
248 struct sockaddr_storage addr;
252 if (!ASSERT_OK(kernel_init_sock(family, type, 0), "kernel_init_sock"))
255 if (make_sockaddr(family, addr_str, port, &addr, &addrlen))
258 if (kernel_bind(0, (struct sockaddr *)&addr, addrlen) < 0)
261 if (type == SOCK_STREAM) {
262 if (!ASSERT_OK(kernel_listen(), "kernel_listen"))
266 /* Test code expects a "file descriptor" on success. */
271 save_errno_do(ASSERT_OK(kernel_close_sock(0), "kernel_close_sock"));
277 int (*connect_to_addr)(int type, const struct sockaddr_storage *addr,
279 const struct network_helper_opts *opts);
280 int (*start_server)(int family, int type, const char *addr_str,
281 __u16 port, int timeout_ms);
282 int (*socket)(int famil, int type, int protocol);
283 int (*bind)(int fd, struct sockaddr *addr, socklen_t addrlen);
284 int (*getsockname)(int fd, struct sockaddr *addr, socklen_t *addrlen);
285 int (*getpeername)(int fd, struct sockaddr *addr, socklen_t *addrlen);
286 int (*sendmsg)(int fd, struct sockaddr *addr, socklen_t addrlen,
287 char *msg, int msglen);
288 int (*close)(int fd);
291 static int user_sendmsg(int fd, struct sockaddr *addr, socklen_t addrlen,
292 char *msg, int msglen)
297 memset(&iov, 0, sizeof(iov));
299 iov.iov_len = msglen;
301 memset(&hdr, 0, sizeof(hdr));
302 hdr.msg_name = (void *)addr;
303 hdr.msg_namelen = addrlen;
307 return sendmsg(fd, &hdr, 0);
310 static int user_bind(int fd, struct sockaddr *addr, socklen_t addrlen)
312 return bind(fd, (const struct sockaddr *)addr, addrlen);
315 struct sock_ops user_ops = {
316 .connect_to_addr = connect_to_addr,
317 .start_server = start_server,
320 .getsockname = getsockname,
321 .getpeername = getpeername,
322 .sendmsg = user_sendmsg,
326 struct sock_ops kern_ops_sock_sendmsg = {
327 .connect_to_addr = kernel_connect_to_addr,
328 .start_server = kernel_start_server,
329 .socket = kernel_init_sock,
331 .getsockname = kernel_getsockname,
332 .getpeername = kernel_getpeername,
333 .sendmsg = sock_sendmsg,
334 .close = kernel_close_sock,
337 struct sock_ops kern_ops_kernel_sendmsg = {
338 .connect_to_addr = kernel_connect_to_addr,
339 .start_server = kernel_start_server,
340 .socket = kernel_init_sock,
342 .getsockname = kernel_getsockname,
343 .getpeername = kernel_getpeername,
344 .sendmsg = kernel_sendmsg,
345 .close = kernel_close_sock,
348 struct sock_addr_test {
349 enum sock_addr_test_type type;
351 /* BPF prog properties */
353 destroy_fn destroyfn;
354 enum bpf_attach_type attach_type;
355 /* Socket operations */
356 struct sock_ops *ops;
357 /* Socket properties */
360 /* IP:port pairs for BPF prog to override */
361 const char *requested_addr;
362 unsigned short requested_port;
363 const char *expected_addr;
364 unsigned short expected_port;
365 const char *expected_src_addr;
366 /* Expected test result */
376 #define BPF_SKEL_FUNCS_RAW(skel_name, prog_name) \
377 static void *prog_name##_load_raw(int cgroup_fd, \
378 enum bpf_attach_type attach_type, \
379 bool expect_reject) \
381 struct skel_name *skel = skel_name##__open(); \
383 if (!ASSERT_OK_PTR(skel, "skel_open")) \
385 if (!ASSERT_OK(skel_name##__load(skel), "load")) \
387 prog_fd = bpf_program__fd(skel->progs.prog_name); \
388 if (!ASSERT_GT(prog_fd, 0, "prog_fd")) \
390 if (bpf_prog_attach(prog_fd, cgroup_fd, attach_type, \
391 BPF_F_ALLOW_OVERRIDE), "bpf_prog_attach") { \
392 ASSERT_TRUE(expect_reject, "unexpected rejection"); \
395 if (!ASSERT_FALSE(expect_reject, "expected rejection")) \
399 bpf_prog_detach(cgroup_fd, attach_type); \
400 skel_name##__destroy(skel); \
403 static void prog_name##_destroy_raw(void *progfd) \
405 /* No-op. *_load_raw does all cleanup. */ \
408 #define BPF_SKEL_FUNCS(skel_name, prog_name) \
409 static void *prog_name##_load(int cgroup_fd, \
410 enum bpf_attach_type attach_type, \
411 bool expect_reject) \
413 struct skel_name *skel = skel_name##__open(); \
414 if (!ASSERT_OK_PTR(skel, "skel_open")) \
416 if (!ASSERT_OK(bpf_program__set_expected_attach_type(skel->progs.prog_name, \
418 "set_expected_attach_type")) \
420 if (skel_name##__load(skel)) { \
421 ASSERT_TRUE(expect_reject, "unexpected rejection"); \
424 if (!ASSERT_FALSE(expect_reject, "expected rejection")) \
426 skel->links.prog_name = bpf_program__attach_cgroup( \
427 skel->progs.prog_name, cgroup_fd); \
428 if (!ASSERT_OK_PTR(skel->links.prog_name, "prog_attach")) \
432 skel_name##__destroy(skel); \
435 static void prog_name##_destroy(void *skel) \
437 skel_name##__destroy(skel); \
440 BPF_SKEL_FUNCS(bind4_prog, bind_v4_prog);
441 BPF_SKEL_FUNCS_RAW(bind4_prog, bind_v4_prog);
442 BPF_SKEL_FUNCS(bind4_prog, bind_v4_deny_prog);
443 BPF_SKEL_FUNCS(bind6_prog, bind_v6_prog);
444 BPF_SKEL_FUNCS_RAW(bind6_prog, bind_v6_prog);
445 BPF_SKEL_FUNCS(bind6_prog, bind_v6_deny_prog);
446 BPF_SKEL_FUNCS(connect4_prog, connect_v4_prog);
447 BPF_SKEL_FUNCS_RAW(connect4_prog, connect_v4_prog);
448 BPF_SKEL_FUNCS(connect4_prog, connect_v4_deny_prog);
449 BPF_SKEL_FUNCS(connect6_prog, connect_v6_prog);
450 BPF_SKEL_FUNCS_RAW(connect6_prog, connect_v6_prog);
451 BPF_SKEL_FUNCS(connect6_prog, connect_v6_deny_prog);
452 BPF_SKEL_FUNCS(connect_unix_prog, connect_unix_prog);
453 BPF_SKEL_FUNCS_RAW(connect_unix_prog, connect_unix_prog);
454 BPF_SKEL_FUNCS(connect_unix_prog, connect_unix_deny_prog);
455 BPF_SKEL_FUNCS(sendmsg4_prog, sendmsg_v4_prog);
456 BPF_SKEL_FUNCS_RAW(sendmsg4_prog, sendmsg_v4_prog);
457 BPF_SKEL_FUNCS(sendmsg4_prog, sendmsg_v4_deny_prog);
458 BPF_SKEL_FUNCS(sendmsg6_prog, sendmsg_v6_prog);
459 BPF_SKEL_FUNCS_RAW(sendmsg6_prog, sendmsg_v6_prog);
460 BPF_SKEL_FUNCS(sendmsg6_prog, sendmsg_v6_deny_prog);
461 BPF_SKEL_FUNCS(sendmsg6_prog, sendmsg_v6_preserve_dst_prog);
462 BPF_SKEL_FUNCS(sendmsg6_prog, sendmsg_v6_v4mapped_prog);
463 BPF_SKEL_FUNCS(sendmsg6_prog, sendmsg_v6_wildcard_prog);
464 BPF_SKEL_FUNCS(sendmsg_unix_prog, sendmsg_unix_prog);
465 BPF_SKEL_FUNCS_RAW(sendmsg_unix_prog, sendmsg_unix_prog);
466 BPF_SKEL_FUNCS(sendmsg_unix_prog, sendmsg_unix_deny_prog);
467 BPF_SKEL_FUNCS(recvmsg4_prog, recvmsg4_prog);
468 BPF_SKEL_FUNCS_RAW(recvmsg4_prog, recvmsg4_prog);
469 BPF_SKEL_FUNCS(recvmsg6_prog, recvmsg6_prog);
470 BPF_SKEL_FUNCS_RAW(recvmsg6_prog, recvmsg6_prog);
471 BPF_SKEL_FUNCS(recvmsg_unix_prog, recvmsg_unix_prog);
472 BPF_SKEL_FUNCS_RAW(recvmsg_unix_prog, recvmsg_unix_prog);
473 BPF_SKEL_FUNCS(getsockname_unix_prog, getsockname_unix_prog);
474 BPF_SKEL_FUNCS_RAW(getsockname_unix_prog, getsockname_unix_prog);
475 BPF_SKEL_FUNCS(getsockname4_prog, getsockname_v4_prog);
476 BPF_SKEL_FUNCS_RAW(getsockname4_prog, getsockname_v4_prog);
477 BPF_SKEL_FUNCS(getsockname6_prog, getsockname_v6_prog);
478 BPF_SKEL_FUNCS_RAW(getsockname6_prog, getsockname_v6_prog);
479 BPF_SKEL_FUNCS(getpeername_unix_prog, getpeername_unix_prog);
480 BPF_SKEL_FUNCS_RAW(getpeername_unix_prog, getpeername_unix_prog);
481 BPF_SKEL_FUNCS(getpeername4_prog, getpeername_v4_prog);
482 BPF_SKEL_FUNCS_RAW(getpeername4_prog, getpeername_v4_prog);
483 BPF_SKEL_FUNCS(getpeername6_prog, getpeername_v6_prog);
484 BPF_SKEL_FUNCS_RAW(getpeername6_prog, getpeername_v6_prog);
486 static struct sock_addr_test tests[] = {
487 /* bind - system calls */
490 "bind4: bind (stream)",
492 bind_v4_prog_destroy,
493 BPF_CGROUP_INET4_BIND,
506 "bind4: bind deny (stream)",
507 bind_v4_deny_prog_load,
508 bind_v4_deny_prog_destroy,
509 BPF_CGROUP_INET4_BIND,
522 "bind4: bind (dgram)",
524 bind_v4_prog_destroy,
525 BPF_CGROUP_INET4_BIND,
538 "bind4: bind deny (dgram)",
539 bind_v4_deny_prog_load,
540 bind_v4_deny_prog_destroy,
541 BPF_CGROUP_INET4_BIND,
554 "bind4: load prog with wrong expected attach type",
556 bind_v4_prog_destroy,
557 BPF_CGROUP_INET6_BIND,
570 "bind4: attach prog with wrong attach type",
571 bind_v4_prog_load_raw,
572 bind_v4_prog_destroy_raw,
573 BPF_CGROUP_INET6_BIND,
586 "bind6: bind (stream)",
588 bind_v6_prog_destroy,
589 BPF_CGROUP_INET6_BIND,
602 "bind6: bind deny (stream)",
603 bind_v6_deny_prog_load,
604 bind_v6_deny_prog_destroy,
605 BPF_CGROUP_INET6_BIND,
618 "bind6: bind (dgram)",
620 bind_v6_prog_destroy,
621 BPF_CGROUP_INET6_BIND,
634 "bind6: bind deny (dgram)",
635 bind_v6_deny_prog_load,
636 bind_v6_deny_prog_destroy,
637 BPF_CGROUP_INET6_BIND,
650 "bind6: load prog with wrong expected attach type",
652 bind_v6_prog_destroy,
653 BPF_CGROUP_INET4_BIND,
666 "bind6: attach prog with wrong attach type",
667 bind_v6_prog_load_raw,
668 bind_v6_prog_destroy_raw,
669 BPF_CGROUP_INET4_BIND,
681 /* bind - kernel calls */
684 "bind4: kernel_bind (stream)",
686 bind_v4_prog_destroy,
687 BPF_CGROUP_INET4_BIND,
688 &kern_ops_sock_sendmsg,
700 "bind4: kernel_bind deny (stream)",
701 bind_v4_deny_prog_load,
702 bind_v4_deny_prog_destroy,
703 BPF_CGROUP_INET4_BIND,
704 &kern_ops_sock_sendmsg,
716 "bind4: kernel_bind (dgram)",
718 bind_v4_prog_destroy,
719 BPF_CGROUP_INET4_BIND,
720 &kern_ops_sock_sendmsg,
732 "bind4: kernel_bind deny (dgram)",
733 bind_v4_deny_prog_load,
734 bind_v4_deny_prog_destroy,
735 BPF_CGROUP_INET4_BIND,
736 &kern_ops_sock_sendmsg,
748 "bind6: kernel_bind (stream)",
750 bind_v6_prog_destroy,
751 BPF_CGROUP_INET6_BIND,
752 &kern_ops_sock_sendmsg,
764 "bind6: kernel_bind deny (stream)",
765 bind_v6_deny_prog_load,
766 bind_v6_deny_prog_destroy,
767 BPF_CGROUP_INET6_BIND,
768 &kern_ops_sock_sendmsg,
780 "bind6: kernel_bind (dgram)",
782 bind_v6_prog_destroy,
783 BPF_CGROUP_INET6_BIND,
784 &kern_ops_sock_sendmsg,
796 "bind6: kernel_bind deny (dgram)",
797 bind_v6_deny_prog_load,
798 bind_v6_deny_prog_destroy,
799 BPF_CGROUP_INET6_BIND,
800 &kern_ops_sock_sendmsg,
811 /* connect - system calls */
813 SOCK_ADDR_TEST_CONNECT,
814 "connect4: connect (stream)",
815 connect_v4_prog_load,
816 connect_v4_prog_destroy,
817 BPF_CGROUP_INET4_CONNECT,
829 SOCK_ADDR_TEST_CONNECT,
830 "connect4: connect deny (stream)",
831 connect_v4_deny_prog_load,
832 connect_v4_deny_prog_destroy,
833 BPF_CGROUP_INET4_CONNECT,
845 SOCK_ADDR_TEST_CONNECT,
846 "connect4: connect (dgram)",
847 connect_v4_prog_load,
848 connect_v4_prog_destroy,
849 BPF_CGROUP_INET4_CONNECT,
861 SOCK_ADDR_TEST_CONNECT,
862 "connect4: connect deny (dgram)",
863 connect_v4_deny_prog_load,
864 connect_v4_deny_prog_destroy,
865 BPF_CGROUP_INET4_CONNECT,
877 SOCK_ADDR_TEST_CONNECT,
878 "connect4: load prog with wrong expected attach type",
879 connect_v4_prog_load,
880 connect_v4_prog_destroy,
881 BPF_CGROUP_INET6_CONNECT,
893 SOCK_ADDR_TEST_CONNECT,
894 "connect4: attach prog with wrong attach type",
895 connect_v4_prog_load_raw,
896 connect_v4_prog_destroy_raw,
897 BPF_CGROUP_INET6_CONNECT,
909 SOCK_ADDR_TEST_CONNECT,
910 "connect6: connect (stream)",
911 connect_v6_prog_load,
912 connect_v6_prog_destroy,
913 BPF_CGROUP_INET6_CONNECT,
925 SOCK_ADDR_TEST_CONNECT,
926 "connect6: connect deny (stream)",
927 connect_v6_deny_prog_load,
928 connect_v6_deny_prog_destroy,
929 BPF_CGROUP_INET6_CONNECT,
941 SOCK_ADDR_TEST_CONNECT,
942 "connect6: connect (dgram)",
943 connect_v6_prog_load,
944 connect_v6_prog_destroy,
945 BPF_CGROUP_INET6_CONNECT,
957 SOCK_ADDR_TEST_CONNECT,
958 "connect6: connect deny (dgram)",
959 connect_v6_deny_prog_load,
960 connect_v6_deny_prog_destroy,
961 BPF_CGROUP_INET6_CONNECT,
973 SOCK_ADDR_TEST_CONNECT,
974 "connect6: load prog with wrong expected attach type",
975 connect_v6_prog_load,
976 connect_v6_prog_destroy,
977 BPF_CGROUP_INET4_CONNECT,
989 SOCK_ADDR_TEST_CONNECT,
990 "connect6: attach prog with wrong attach type",
991 connect_v6_prog_load_raw,
992 connect_v6_prog_destroy_raw,
993 BPF_CGROUP_INET4_CONNECT,
1005 SOCK_ADDR_TEST_CONNECT,
1006 "connect_unix: connect (stream)",
1007 connect_unix_prog_load,
1008 connect_unix_prog_destroy,
1009 BPF_CGROUP_UNIX_CONNECT,
1015 SERVUN_REWRITE_ADDRESS,
1021 SOCK_ADDR_TEST_CONNECT,
1022 "connect_unix: connect deny (stream)",
1023 connect_unix_deny_prog_load,
1024 connect_unix_deny_prog_destroy,
1025 BPF_CGROUP_UNIX_CONNECT,
1031 SERVUN_REWRITE_ADDRESS,
1037 SOCK_ADDR_TEST_CONNECT,
1038 "connect_unix: attach prog with wrong attach type",
1039 connect_unix_prog_load_raw,
1040 connect_unix_prog_destroy_raw,
1041 BPF_CGROUP_INET4_CONNECT,
1047 SERVUN_REWRITE_ADDRESS,
1053 /* connect - kernel calls */
1055 SOCK_ADDR_TEST_CONNECT,
1056 "connect4: kernel_connect (stream)",
1057 connect_v4_prog_load,
1058 connect_v4_prog_destroy,
1059 BPF_CGROUP_INET4_CONNECT,
1060 &kern_ops_sock_sendmsg,
1071 SOCK_ADDR_TEST_CONNECT,
1072 "connect4: kernel_connect deny (stream)",
1073 connect_v4_deny_prog_load,
1074 connect_v4_deny_prog_destroy,
1075 BPF_CGROUP_INET4_CONNECT,
1076 &kern_ops_sock_sendmsg,
1087 SOCK_ADDR_TEST_CONNECT,
1088 "connect4: kernel_connect (dgram)",
1089 connect_v4_prog_load,
1090 connect_v4_prog_destroy,
1091 BPF_CGROUP_INET4_CONNECT,
1092 &kern_ops_sock_sendmsg,
1103 SOCK_ADDR_TEST_CONNECT,
1104 "connect4: kernel_connect deny (dgram)",
1105 connect_v4_deny_prog_load,
1106 connect_v4_deny_prog_destroy,
1107 BPF_CGROUP_INET4_CONNECT,
1108 &kern_ops_sock_sendmsg,
1119 SOCK_ADDR_TEST_CONNECT,
1120 "connect6: kernel_connect (stream)",
1121 connect_v6_prog_load,
1122 connect_v6_prog_destroy,
1123 BPF_CGROUP_INET6_CONNECT,
1124 &kern_ops_sock_sendmsg,
1135 SOCK_ADDR_TEST_CONNECT,
1136 "connect6: kernel_connect deny (stream)",
1137 connect_v6_deny_prog_load,
1138 connect_v6_deny_prog_destroy,
1139 BPF_CGROUP_INET6_CONNECT,
1140 &kern_ops_sock_sendmsg,
1151 SOCK_ADDR_TEST_CONNECT,
1152 "connect6: kernel_connect (dgram)",
1153 connect_v6_prog_load,
1154 connect_v6_prog_destroy,
1155 BPF_CGROUP_INET6_CONNECT,
1156 &kern_ops_sock_sendmsg,
1167 SOCK_ADDR_TEST_CONNECT,
1168 "connect6: kernel_connect deny (dgram)",
1169 connect_v6_deny_prog_load,
1170 connect_v6_deny_prog_destroy,
1171 BPF_CGROUP_INET6_CONNECT,
1172 &kern_ops_sock_sendmsg,
1183 SOCK_ADDR_TEST_CONNECT,
1184 "connect_unix: kernel_connect (dgram)",
1185 connect_unix_prog_load,
1186 connect_unix_prog_destroy,
1187 BPF_CGROUP_UNIX_CONNECT,
1188 &kern_ops_sock_sendmsg,
1193 SERVUN_REWRITE_ADDRESS,
1199 SOCK_ADDR_TEST_CONNECT,
1200 "connect_unix: kernel_connect deny (dgram)",
1201 connect_unix_deny_prog_load,
1202 connect_unix_deny_prog_destroy,
1203 BPF_CGROUP_UNIX_CONNECT,
1204 &kern_ops_sock_sendmsg,
1209 SERVUN_REWRITE_ADDRESS,
1215 /* sendmsg - system calls */
1217 SOCK_ADDR_TEST_SENDMSG,
1218 "sendmsg4: sendmsg (dgram)",
1219 sendmsg_v4_prog_load,
1220 sendmsg_v4_prog_destroy,
1221 BPF_CGROUP_UDP4_SENDMSG,
1233 SOCK_ADDR_TEST_SENDMSG,
1234 "sendmsg4: sendmsg deny (dgram)",
1235 sendmsg_v4_deny_prog_load,
1236 sendmsg_v4_deny_prog_destroy,
1237 BPF_CGROUP_UDP4_SENDMSG,
1249 SOCK_ADDR_TEST_SENDMSG,
1250 "sendmsg4: load prog with wrong expected attach type",
1251 sendmsg_v4_prog_load,
1252 sendmsg_v4_prog_destroy,
1253 BPF_CGROUP_UDP6_SENDMSG,
1265 SOCK_ADDR_TEST_SENDMSG,
1266 "sendmsg4: attach prog with wrong attach type",
1267 sendmsg_v4_prog_load_raw,
1268 sendmsg_v4_prog_destroy_raw,
1269 BPF_CGROUP_UDP6_SENDMSG,
1281 SOCK_ADDR_TEST_SENDMSG,
1282 "sendmsg6: sendmsg (dgram)",
1283 sendmsg_v6_prog_load,
1284 sendmsg_v6_prog_destroy,
1285 BPF_CGROUP_UDP6_SENDMSG,
1297 SOCK_ADDR_TEST_SENDMSG,
1298 "sendmsg6: sendmsg [::] (BSD'ism) (dgram)",
1299 sendmsg_v6_preserve_dst_prog_load,
1300 sendmsg_v6_preserve_dst_prog_destroy,
1301 BPF_CGROUP_UDP6_SENDMSG,
1313 SOCK_ADDR_TEST_SENDMSG,
1314 "sendmsg6: sendmsg deny (dgram)",
1315 sendmsg_v6_deny_prog_load,
1316 sendmsg_v6_deny_prog_destroy,
1317 BPF_CGROUP_UDP6_SENDMSG,
1329 SOCK_ADDR_TEST_SENDMSG,
1330 "sendmsg6: sendmsg IPv4-mapped IPv6 (dgram)",
1331 sendmsg_v6_v4mapped_prog_load,
1332 sendmsg_v6_v4mapped_prog_destroy,
1333 BPF_CGROUP_UDP6_SENDMSG,
1345 SOCK_ADDR_TEST_SENDMSG,
1346 "sendmsg6: sendmsg dst IP = [::] (BSD'ism) (dgram)",
1347 sendmsg_v6_wildcard_prog_load,
1348 sendmsg_v6_wildcard_prog_destroy,
1349 BPF_CGROUP_UDP6_SENDMSG,
1361 SOCK_ADDR_TEST_SENDMSG,
1362 "sendmsg6: load prog with wrong expected attach type",
1363 sendmsg_v6_prog_load,
1364 sendmsg_v6_prog_destroy,
1365 BPF_CGROUP_UDP4_SENDMSG,
1377 SOCK_ADDR_TEST_SENDMSG,
1378 "sendmsg6: attach prog with wrong attach type",
1379 sendmsg_v6_prog_load_raw,
1380 sendmsg_v6_prog_destroy_raw,
1381 BPF_CGROUP_UDP4_SENDMSG,
1393 SOCK_ADDR_TEST_SENDMSG,
1394 "sendmsg_unix: sendmsg (dgram)",
1395 sendmsg_unix_prog_load,
1396 sendmsg_unix_prog_destroy,
1397 BPF_CGROUP_UNIX_SENDMSG,
1403 SERVUN_REWRITE_ADDRESS,
1409 SOCK_ADDR_TEST_SENDMSG,
1410 "sendmsg_unix: sendmsg deny (dgram)",
1411 sendmsg_unix_deny_prog_load,
1412 sendmsg_unix_deny_prog_destroy,
1413 BPF_CGROUP_UNIX_SENDMSG,
1419 SERVUN_REWRITE_ADDRESS,
1425 SOCK_ADDR_TEST_SENDMSG,
1426 "sendmsg_unix: attach prog with wrong attach type",
1427 sendmsg_unix_prog_load_raw,
1428 sendmsg_unix_prog_destroy_raw,
1429 BPF_CGROUP_UDP4_SENDMSG,
1435 SERVUN_REWRITE_ADDRESS,
1441 /* sendmsg - kernel calls (sock_sendmsg) */
1443 SOCK_ADDR_TEST_SENDMSG,
1444 "sendmsg4: sock_sendmsg (dgram)",
1445 sendmsg_v4_prog_load,
1446 sendmsg_v4_prog_destroy,
1447 BPF_CGROUP_UDP4_SENDMSG,
1448 &kern_ops_sock_sendmsg,
1459 SOCK_ADDR_TEST_SENDMSG,
1460 "sendmsg4: sock_sendmsg deny (dgram)",
1461 sendmsg_v4_deny_prog_load,
1462 sendmsg_v4_deny_prog_destroy,
1463 BPF_CGROUP_UDP4_SENDMSG,
1464 &kern_ops_sock_sendmsg,
1475 SOCK_ADDR_TEST_SENDMSG,
1476 "sendmsg6: sock_sendmsg (dgram)",
1477 sendmsg_v6_prog_load,
1478 sendmsg_v6_prog_destroy,
1479 BPF_CGROUP_UDP6_SENDMSG,
1480 &kern_ops_sock_sendmsg,
1491 SOCK_ADDR_TEST_SENDMSG,
1492 "sendmsg6: sock_sendmsg [::] (BSD'ism) (dgram)",
1493 sendmsg_v6_preserve_dst_prog_load,
1494 sendmsg_v6_preserve_dst_prog_destroy,
1495 BPF_CGROUP_UDP6_SENDMSG,
1496 &kern_ops_sock_sendmsg,
1507 SOCK_ADDR_TEST_SENDMSG,
1508 "sendmsg6: sock_sendmsg deny (dgram)",
1509 sendmsg_v6_deny_prog_load,
1510 sendmsg_v6_deny_prog_destroy,
1511 BPF_CGROUP_UDP6_SENDMSG,
1512 &kern_ops_sock_sendmsg,
1523 SOCK_ADDR_TEST_SENDMSG,
1524 "sendmsg_unix: sock_sendmsg (dgram)",
1525 sendmsg_unix_prog_load,
1526 sendmsg_unix_prog_destroy,
1527 BPF_CGROUP_UNIX_SENDMSG,
1528 &kern_ops_sock_sendmsg,
1533 SERVUN_REWRITE_ADDRESS,
1539 SOCK_ADDR_TEST_SENDMSG,
1540 "sendmsg_unix: sock_sendmsg deny (dgram)",
1541 sendmsg_unix_deny_prog_load,
1542 sendmsg_unix_deny_prog_destroy,
1543 BPF_CGROUP_UNIX_SENDMSG,
1544 &kern_ops_sock_sendmsg,
1549 SERVUN_REWRITE_ADDRESS,
1555 /* sendmsg - kernel calls (kernel_sendmsg) */
1557 SOCK_ADDR_TEST_SENDMSG,
1558 "sendmsg4: kernel_sendmsg (dgram)",
1559 sendmsg_v4_prog_load,
1560 sendmsg_v4_prog_destroy,
1561 BPF_CGROUP_UDP4_SENDMSG,
1562 &kern_ops_kernel_sendmsg,
1573 SOCK_ADDR_TEST_SENDMSG,
1574 "sendmsg4: kernel_sendmsg deny (dgram)",
1575 sendmsg_v4_deny_prog_load,
1576 sendmsg_v4_deny_prog_destroy,
1577 BPF_CGROUP_UDP4_SENDMSG,
1578 &kern_ops_kernel_sendmsg,
1589 SOCK_ADDR_TEST_SENDMSG,
1590 "sendmsg6: kernel_sendmsg (dgram)",
1591 sendmsg_v6_prog_load,
1592 sendmsg_v6_prog_destroy,
1593 BPF_CGROUP_UDP6_SENDMSG,
1594 &kern_ops_kernel_sendmsg,
1605 SOCK_ADDR_TEST_SENDMSG,
1606 "sendmsg6: kernel_sendmsg [::] (BSD'ism) (dgram)",
1607 sendmsg_v6_preserve_dst_prog_load,
1608 sendmsg_v6_preserve_dst_prog_destroy,
1609 BPF_CGROUP_UDP6_SENDMSG,
1610 &kern_ops_kernel_sendmsg,
1621 SOCK_ADDR_TEST_SENDMSG,
1622 "sendmsg6: kernel_sendmsg deny (dgram)",
1623 sendmsg_v6_deny_prog_load,
1624 sendmsg_v6_deny_prog_destroy,
1625 BPF_CGROUP_UDP6_SENDMSG,
1626 &kern_ops_kernel_sendmsg,
1637 SOCK_ADDR_TEST_SENDMSG,
1638 "sendmsg_unix: sock_sendmsg (dgram)",
1639 sendmsg_unix_prog_load,
1640 sendmsg_unix_prog_destroy,
1641 BPF_CGROUP_UNIX_SENDMSG,
1642 &kern_ops_kernel_sendmsg,
1647 SERVUN_REWRITE_ADDRESS,
1653 SOCK_ADDR_TEST_SENDMSG,
1654 "sendmsg_unix: kernel_sendmsg deny (dgram)",
1655 sendmsg_unix_deny_prog_load,
1656 sendmsg_unix_deny_prog_destroy,
1657 BPF_CGROUP_UNIX_SENDMSG,
1658 &kern_ops_kernel_sendmsg,
1663 SERVUN_REWRITE_ADDRESS,
1669 /* recvmsg - system calls */
1671 SOCK_ADDR_TEST_RECVMSG,
1672 "recvmsg4: recvfrom (dgram)",
1674 recvmsg4_prog_destroy,
1675 BPF_CGROUP_UDP4_RECVMSG,
1687 SOCK_ADDR_TEST_RECVMSG,
1688 "recvmsg4: attach prog with wrong attach type",
1689 recvmsg4_prog_load_raw,
1690 recvmsg4_prog_destroy_raw,
1691 BPF_CGROUP_UDP6_RECVMSG,
1703 SOCK_ADDR_TEST_RECVMSG,
1704 "recvmsg6: recvfrom (dgram)",
1706 recvmsg6_prog_destroy,
1707 BPF_CGROUP_UDP6_RECVMSG,
1719 SOCK_ADDR_TEST_RECVMSG,
1720 "recvmsg6: attach prog with wrong attach type",
1721 recvmsg6_prog_load_raw,
1722 recvmsg6_prog_destroy_raw,
1723 BPF_CGROUP_UDP4_RECVMSG,
1735 SOCK_ADDR_TEST_RECVMSG,
1736 "recvmsg_unix: recvfrom (dgram)",
1737 recvmsg_unix_prog_load,
1738 recvmsg_unix_prog_destroy,
1739 BPF_CGROUP_UNIX_RECVMSG,
1743 SERVUN_REWRITE_ADDRESS,
1745 SERVUN_REWRITE_ADDRESS,
1751 SOCK_ADDR_TEST_RECVMSG,
1752 "recvmsg_unix: recvfrom (stream)",
1753 recvmsg_unix_prog_load,
1754 recvmsg_unix_prog_destroy,
1755 BPF_CGROUP_UNIX_RECVMSG,
1759 SERVUN_REWRITE_ADDRESS,
1761 SERVUN_REWRITE_ADDRESS,
1767 SOCK_ADDR_TEST_RECVMSG,
1768 "recvmsg_unix: attach prog with wrong attach type",
1769 recvmsg_unix_prog_load_raw,
1770 recvmsg_unix_prog_destroy_raw,
1771 BPF_CGROUP_UDP4_RECVMSG,
1775 SERVUN_REWRITE_ADDRESS,
1777 SERVUN_REWRITE_ADDRESS,
1783 /* getsockname - system calls */
1785 SOCK_ADDR_TEST_GETSOCKNAME,
1786 "getsockname4: getsockname (stream)",
1787 getsockname_v4_prog_load,
1788 getsockname_v4_prog_destroy,
1789 BPF_CGROUP_INET4_GETSOCKNAME,
1801 SOCK_ADDR_TEST_GETSOCKNAME,
1802 "getsockname4: getsockname (dgram)",
1803 getsockname_v4_prog_load,
1804 getsockname_v4_prog_destroy,
1805 BPF_CGROUP_INET4_GETSOCKNAME,
1817 SOCK_ADDR_TEST_GETSOCKNAME,
1818 "getsockname4: attach prog with wrong attach type",
1819 getsockname_v4_prog_load_raw,
1820 getsockname_v4_prog_destroy_raw,
1821 BPF_CGROUP_INET6_GETSOCKNAME,
1833 SOCK_ADDR_TEST_GETSOCKNAME,
1834 "getsockname6: getsockname (stream)",
1835 getsockname_v6_prog_load,
1836 getsockname_v6_prog_destroy,
1837 BPF_CGROUP_INET6_GETSOCKNAME,
1849 SOCK_ADDR_TEST_GETSOCKNAME,
1850 "getsockname6: getsockname (dgram)",
1851 getsockname_v6_prog_load,
1852 getsockname_v6_prog_destroy,
1853 BPF_CGROUP_INET6_GETSOCKNAME,
1865 SOCK_ADDR_TEST_GETSOCKNAME,
1866 "getsockname6: attach prog with wrong attach type",
1867 getsockname_v6_prog_load_raw,
1868 getsockname_v6_prog_destroy_raw,
1869 BPF_CGROUP_INET4_GETSOCKNAME,
1881 SOCK_ADDR_TEST_GETSOCKNAME,
1882 "getsockname_unix: getsockname",
1883 getsockname_unix_prog_load,
1884 getsockname_unix_prog_destroy,
1885 BPF_CGROUP_UNIX_GETSOCKNAME,
1891 SERVUN_REWRITE_ADDRESS,
1897 SOCK_ADDR_TEST_GETSOCKNAME,
1898 "getsockname_unix: attach prog with wrong attach type",
1899 getsockname_unix_prog_load_raw,
1900 getsockname_unix_prog_destroy_raw,
1901 BPF_CGROUP_INET4_GETSOCKNAME,
1907 SERVUN_REWRITE_ADDRESS,
1913 /* getsockname - kernel calls */
1915 SOCK_ADDR_TEST_GETSOCKNAME,
1916 "getsockname4: kernel_getsockname (stream)",
1917 getsockname_v4_prog_load,
1918 getsockname_v4_prog_destroy,
1919 BPF_CGROUP_INET4_GETSOCKNAME,
1920 &kern_ops_kernel_sendmsg,
1931 SOCK_ADDR_TEST_GETSOCKNAME,
1932 "getsockname4: kernel_getsockname (dgram)",
1933 getsockname_v4_prog_load,
1934 getsockname_v4_prog_destroy,
1935 BPF_CGROUP_INET4_GETSOCKNAME,
1936 &kern_ops_kernel_sendmsg,
1947 SOCK_ADDR_TEST_GETSOCKNAME,
1948 "getsockname6: kernel_getsockname (stream)",
1949 getsockname_v6_prog_load,
1950 getsockname_v6_prog_destroy,
1951 BPF_CGROUP_INET6_GETSOCKNAME,
1952 &kern_ops_kernel_sendmsg,
1963 SOCK_ADDR_TEST_GETSOCKNAME,
1964 "getsockname6: kernel_getsockname (dgram)",
1965 getsockname_v6_prog_load,
1966 getsockname_v6_prog_destroy,
1967 BPF_CGROUP_INET6_GETSOCKNAME,
1968 &kern_ops_kernel_sendmsg,
1979 SOCK_ADDR_TEST_GETSOCKNAME,
1980 "getsockname_unix: kernel_getsockname",
1981 getsockname_unix_prog_load,
1982 getsockname_unix_prog_destroy,
1983 BPF_CGROUP_UNIX_GETSOCKNAME,
1984 &kern_ops_kernel_sendmsg,
1989 SERVUN_REWRITE_ADDRESS,
1995 /* getpeername - system calls */
1997 SOCK_ADDR_TEST_GETPEERNAME,
1998 "getpeername4: getpeername (stream)",
1999 getpeername_v4_prog_load,
2000 getpeername_v4_prog_destroy,
2001 BPF_CGROUP_INET4_GETPEERNAME,
2013 SOCK_ADDR_TEST_GETPEERNAME,
2014 "getpeername4: getpeername (dgram)",
2015 getpeername_v4_prog_load,
2016 getpeername_v4_prog_destroy,
2017 BPF_CGROUP_INET4_GETPEERNAME,
2029 SOCK_ADDR_TEST_GETPEERNAME,
2030 "getpeername4: attach prog with wrong attach type",
2031 getpeername_v4_prog_load_raw,
2032 getpeername_v4_prog_destroy_raw,
2033 BPF_CGROUP_INET6_GETSOCKNAME,
2045 SOCK_ADDR_TEST_GETPEERNAME,
2046 "getpeername6: getpeername (stream)",
2047 getpeername_v6_prog_load,
2048 getpeername_v6_prog_destroy,
2049 BPF_CGROUP_INET6_GETPEERNAME,
2061 SOCK_ADDR_TEST_GETPEERNAME,
2062 "getpeername6: getpeername (dgram)",
2063 getpeername_v6_prog_load,
2064 getpeername_v6_prog_destroy,
2065 BPF_CGROUP_INET6_GETPEERNAME,
2077 SOCK_ADDR_TEST_GETPEERNAME,
2078 "getpeername6: attach prog with wrong attach type",
2079 getpeername_v6_prog_load_raw,
2080 getpeername_v6_prog_destroy_raw,
2081 BPF_CGROUP_INET4_GETSOCKNAME,
2093 SOCK_ADDR_TEST_GETPEERNAME,
2094 "getpeername_unix: getpeername",
2095 getpeername_unix_prog_load,
2096 getpeername_unix_prog_destroy,
2097 BPF_CGROUP_UNIX_GETPEERNAME,
2103 SERVUN_REWRITE_ADDRESS,
2109 SOCK_ADDR_TEST_GETPEERNAME,
2110 "getpeername_unix: attach prog with wrong attach type",
2111 getpeername_unix_prog_load_raw,
2112 getpeername_unix_prog_destroy_raw,
2113 BPF_CGROUP_INET4_GETSOCKNAME,
2119 SERVUN_REWRITE_ADDRESS,
2125 /* getpeername - kernel calls */
2127 SOCK_ADDR_TEST_GETPEERNAME,
2128 "getpeername4: kernel_getpeername (stream)",
2129 getpeername_v4_prog_load,
2130 getpeername_v4_prog_destroy,
2131 BPF_CGROUP_INET4_GETPEERNAME,
2132 &kern_ops_kernel_sendmsg,
2143 SOCK_ADDR_TEST_GETPEERNAME,
2144 "getpeername4: kernel_getpeername (dgram)",
2145 getpeername_v4_prog_load,
2146 getpeername_v4_prog_destroy,
2147 BPF_CGROUP_INET4_GETPEERNAME,
2148 &kern_ops_kernel_sendmsg,
2159 SOCK_ADDR_TEST_GETPEERNAME,
2160 "getpeername6: kernel_getpeername (stream)",
2161 getpeername_v6_prog_load,
2162 getpeername_v6_prog_destroy,
2163 BPF_CGROUP_INET6_GETPEERNAME,
2164 &kern_ops_kernel_sendmsg,
2175 SOCK_ADDR_TEST_GETPEERNAME,
2176 "getpeername6: kernel_getpeername (dgram)",
2177 getpeername_v6_prog_load,
2178 getpeername_v6_prog_destroy,
2179 BPF_CGROUP_INET6_GETPEERNAME,
2180 &kern_ops_kernel_sendmsg,
2191 SOCK_ADDR_TEST_GETPEERNAME,
2192 "getpeername_unix: kernel_getpeername",
2193 getpeername_unix_prog_load,
2194 getpeername_unix_prog_destroy,
2195 BPF_CGROUP_UNIX_GETPEERNAME,
2196 &kern_ops_kernel_sendmsg,
2201 SERVUN_REWRITE_ADDRESS,
2208 typedef int (*info_fn)(int, struct sockaddr *, socklen_t *);
2210 static int cmp_addr(const struct sockaddr_storage *addr1, socklen_t addr1_len,
2211 const struct sockaddr_storage *addr2, socklen_t addr2_len,
2214 const struct sockaddr_in *four1, *four2;
2215 const struct sockaddr_in6 *six1, *six2;
2216 const struct sockaddr_un *un1, *un2;
2218 if (addr1->ss_family != addr2->ss_family)
2221 if (addr1_len != addr2_len)
2224 if (addr1->ss_family == AF_INET) {
2225 four1 = (const struct sockaddr_in *)addr1;
2226 four2 = (const struct sockaddr_in *)addr2;
2227 return !((four1->sin_port == four2->sin_port || !cmp_port) &&
2228 four1->sin_addr.s_addr == four2->sin_addr.s_addr);
2229 } else if (addr1->ss_family == AF_INET6) {
2230 six1 = (const struct sockaddr_in6 *)addr1;
2231 six2 = (const struct sockaddr_in6 *)addr2;
2232 return !((six1->sin6_port == six2->sin6_port || !cmp_port) &&
2233 !memcmp(&six1->sin6_addr, &six2->sin6_addr,
2234 sizeof(struct in6_addr)));
2235 } else if (addr1->ss_family == AF_UNIX) {
2236 un1 = (const struct sockaddr_un *)addr1;
2237 un2 = (const struct sockaddr_un *)addr2;
2238 return memcmp(un1, un2, addr1_len);
2244 static int cmp_sock_addr(info_fn fn, int sock1,
2245 const struct sockaddr_storage *addr2,
2246 socklen_t addr2_len, bool cmp_port)
2248 struct sockaddr_storage addr1;
2249 socklen_t len1 = sizeof(addr1);
2251 memset(&addr1, 0, len1);
2252 if (fn(sock1, (struct sockaddr *)&addr1, (socklen_t *)&len1) != 0)
2255 return cmp_addr(&addr1, len1, addr2, addr2_len, cmp_port);
2258 static int load_sock_addr_kern(void)
2262 skel = sock_addr_kern__open_and_load();
2263 if (!ASSERT_OK_PTR(skel, "skel"))
2274 static void unload_sock_addr_kern(void)
2276 sock_addr_kern__destroy(skel);
2279 static int test_bind(struct sock_addr_test *test)
2281 struct sockaddr_storage expected_addr;
2282 socklen_t expected_addr_len = sizeof(struct sockaddr_storage);
2283 int serv = -1, client = -1, err;
2285 serv = test->ops->start_server(test->socket_family, test->socket_type,
2286 test->requested_addr,
2287 test->requested_port, 0);
2293 err = make_sockaddr(test->socket_family,
2294 test->expected_addr, test->expected_port,
2295 &expected_addr, &expected_addr_len);
2296 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2299 err = cmp_sock_addr(test->ops->getsockname, serv, &expected_addr,
2300 expected_addr_len, true);
2301 if (!ASSERT_EQ(err, 0, "cmp_local_addr"))
2304 /* Try to connect to server just in case */
2305 client = connect_to_addr(test->socket_type, &expected_addr, expected_addr_len, NULL);
2306 if (!ASSERT_GE(client, 0, "connect_to_addr"))
2315 test->ops->close(serv);
2320 static int test_connect(struct sock_addr_test *test)
2322 struct sockaddr_storage addr, expected_addr, expected_src_addr;
2323 socklen_t addr_len = sizeof(struct sockaddr_storage),
2324 expected_addr_len = sizeof(struct sockaddr_storage),
2325 expected_src_addr_len = sizeof(struct sockaddr_storage);
2326 int serv = -1, client = -1, err;
2328 serv = start_server(test->socket_family, test->socket_type,
2329 test->expected_addr, test->expected_port, 0);
2330 if (!ASSERT_GE(serv, 0, "start_server"))
2333 err = make_sockaddr(test->socket_family, test->requested_addr, test->requested_port,
2335 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2338 client = test->ops->connect_to_addr(test->socket_type, &addr, addr_len,
2345 err = make_sockaddr(test->socket_family, test->expected_addr, test->expected_port,
2346 &expected_addr, &expected_addr_len);
2347 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2350 if (test->expected_src_addr) {
2351 err = make_sockaddr(test->socket_family, test->expected_src_addr, 0,
2352 &expected_src_addr, &expected_src_addr_len);
2353 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2357 err = cmp_sock_addr(test->ops->getpeername, client, &expected_addr,
2358 expected_addr_len, true);
2359 if (!ASSERT_EQ(err, 0, "cmp_peer_addr"))
2362 if (test->expected_src_addr) {
2363 err = cmp_sock_addr(test->ops->getsockname, client,
2364 &expected_src_addr, expected_src_addr_len,
2366 if (!ASSERT_EQ(err, 0, "cmp_local_addr"))
2373 test->ops->close(client);
2380 static int test_xmsg(struct sock_addr_test *test)
2382 struct sockaddr_storage addr, src_addr;
2383 socklen_t addr_len = sizeof(struct sockaddr_storage),
2384 src_addr_len = sizeof(struct sockaddr_storage);
2386 int serv = -1, client = -1, err;
2388 /* Unlike the other tests, here we test that we can rewrite the src addr
2389 * with a recvmsg() hook.
2392 serv = start_server(test->socket_family, test->socket_type,
2393 test->expected_addr, test->expected_port, 0);
2394 if (!ASSERT_GE(serv, 0, "start_server"))
2397 client = test->ops->socket(test->socket_family, test->socket_type, 0);
2398 if (!ASSERT_GE(client, 0, "socket"))
2401 /* AF_UNIX sockets have to be bound to something to trigger the recvmsg bpf program. */
2402 if (test->socket_family == AF_UNIX) {
2403 err = make_sockaddr(AF_UNIX, SRCUN_ADDRESS, 0, &src_addr, &src_addr_len);
2404 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2407 err = test->ops->bind(client, (struct sockaddr *)&src_addr,
2409 if (!ASSERT_OK(err, "bind"))
2413 err = make_sockaddr(test->socket_family, test->requested_addr, test->requested_port,
2415 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2418 if (test->socket_type == SOCK_DGRAM) {
2419 err = test->ops->sendmsg(client, (struct sockaddr *)&addr,
2420 addr_len, &data, sizeof(data));
2426 if (!ASSERT_EQ(err, sizeof(data), "sendmsg"))
2429 /* Testing with connection-oriented sockets is only valid for
2432 if (!ASSERT_EQ(test->type, SOCK_ADDR_TEST_RECVMSG, "recvmsg"))
2435 err = connect(client, (const struct sockaddr *)&addr, addr_len);
2436 if (!ASSERT_OK(err, "connect"))
2439 err = send(client, &data, sizeof(data), 0);
2440 if (!ASSERT_EQ(err, sizeof(data), "send"))
2443 err = listen(serv, 0);
2444 if (!ASSERT_OK(err, "listen"))
2447 err = accept(serv, NULL, NULL);
2448 if (!ASSERT_GE(err, 0, "accept"))
2455 addr_len = src_addr_len = sizeof(struct sockaddr_storage);
2457 err = recvfrom(serv, &data, sizeof(data), 0, (struct sockaddr *) &src_addr, &src_addr_len);
2458 if (!ASSERT_EQ(err, sizeof(data), "recvfrom"))
2461 ASSERT_EQ(data, 'a', "data mismatch");
2463 if (test->expected_src_addr) {
2464 err = make_sockaddr(test->socket_family, test->expected_src_addr, 0,
2466 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2469 err = cmp_addr(&src_addr, src_addr_len, &addr, addr_len, false);
2470 if (!ASSERT_EQ(err, 0, "cmp_addr"))
2478 test->ops->close(client);
2485 static int test_getsockname(struct sock_addr_test *test)
2487 struct sockaddr_storage expected_addr;
2488 socklen_t expected_addr_len = sizeof(struct sockaddr_storage);
2491 serv = test->ops->start_server(test->socket_family, test->socket_type,
2492 test->requested_addr, test->requested_port, 0);
2493 if (!ASSERT_GE(serv, 0, "start_server"))
2496 err = make_sockaddr(test->socket_family,
2497 test->expected_addr, test->expected_port,
2498 &expected_addr, &expected_addr_len);
2499 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2502 err = cmp_sock_addr(test->ops->getsockname, serv, &expected_addr, expected_addr_len, true);
2503 if (!ASSERT_EQ(err, 0, "cmp_local_addr"))
2508 test->ops->close(serv);
2513 static int test_getpeername(struct sock_addr_test *test)
2515 struct sockaddr_storage addr, expected_addr;
2516 socklen_t addr_len = sizeof(struct sockaddr_storage),
2517 expected_addr_len = sizeof(struct sockaddr_storage);
2518 int serv = -1, client = -1, err;
2520 serv = start_server(test->socket_family, test->socket_type,
2521 test->requested_addr, test->requested_port, 0);
2522 if (!ASSERT_GE(serv, 0, "start_server"))
2525 err = make_sockaddr(test->socket_family, test->requested_addr, test->requested_port,
2527 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2530 client = test->ops->connect_to_addr(test->socket_type, &addr, addr_len,
2532 if (!ASSERT_GE(client, 0, "connect_to_addr"))
2535 err = make_sockaddr(test->socket_family, test->expected_addr, test->expected_port,
2536 &expected_addr, &expected_addr_len);
2537 if (!ASSERT_EQ(err, 0, "make_sockaddr"))
2540 err = cmp_sock_addr(test->ops->getpeername, client, &expected_addr,
2541 expected_addr_len, true);
2542 if (!ASSERT_EQ(err, 0, "cmp_peer_addr"))
2547 test->ops->close(client);
2554 static int setup_test_env(struct nstoken **tok)
2558 SYS_NOFAIL("ip netns delete %s", TEST_NS);
2559 SYS(fail, "ip netns add %s", TEST_NS);
2560 *tok = open_netns(TEST_NS);
2561 if (!ASSERT_OK_PTR(*tok, "netns token"))
2564 SYS(fail, "ip link add dev %s1 type veth peer name %s2", TEST_IF_PREFIX,
2566 SYS(fail, "ip link set lo up");
2567 SYS(fail, "ip link set %s1 up", TEST_IF_PREFIX);
2568 SYS(fail, "ip link set %s2 up", TEST_IF_PREFIX);
2569 SYS(fail, "ip -4 addr add %s/8 dev %s1", TEST_IPV4, TEST_IF_PREFIX);
2570 SYS(fail, "ip -6 addr add %s/128 nodad dev %s1", TEST_IPV6, TEST_IF_PREFIX);
2578 SYS_NOFAIL("ip netns delete %s", TEST_NS);
2583 static void cleanup_test_env(struct nstoken *tok)
2586 SYS_NOFAIL("ip netns delete %s", TEST_NS);
2589 void test_sock_addr(void)
2591 struct nstoken *tok = NULL;
2595 cgroup_fd = test__join_cgroup("/sock_addr");
2596 if (!ASSERT_GE(cgroup_fd, 0, "join_cgroup"))
2599 if (!ASSERT_OK(setup_test_env(&tok), "setup_test_env"))
2602 if (!ASSERT_OK(load_sock_addr_kern(), "load_sock_addr_kern"))
2605 for (size_t i = 0; i < ARRAY_SIZE(tests); ++i) {
2606 struct sock_addr_test *test = &tests[i];
2609 if (!test__start_subtest(test->name))
2612 skel = test->loadfn(cgroup_fd, test->attach_type,
2613 test->expected_result == LOAD_REJECT ||
2614 test->expected_result == ATTACH_REJECT);
2618 switch (test->type) {
2619 /* Not exercised yet but we leave this code here for when the
2620 * INET and INET6 sockaddr tests are migrated to this file in
2623 case SOCK_ADDR_TEST_BIND:
2624 err = test_bind(test);
2626 case SOCK_ADDR_TEST_CONNECT:
2627 err = test_connect(test);
2629 case SOCK_ADDR_TEST_SENDMSG:
2630 case SOCK_ADDR_TEST_RECVMSG:
2631 err = test_xmsg(test);
2633 case SOCK_ADDR_TEST_GETSOCKNAME:
2634 err = test_getsockname(test);
2636 case SOCK_ADDR_TEST_GETPEERNAME:
2637 err = test_getpeername(test);
2640 ASSERT_TRUE(false, "Unknown sock addr test type");
2645 if (test->expected_result == SYSCALL_EPERM)
2646 ASSERT_EQ(err, EPERM, "socket operation returns EPERM");
2647 else if (test->expected_result == SYSCALL_ENOTSUPP)
2648 ASSERT_EQ(err, ENOTSUPP, "socket operation returns ENOTSUPP");
2649 else if (test->expected_result == SUCCESS)
2650 ASSERT_OK(err, "socket operation succeeds");
2652 test->destroyfn(skel);
2656 unload_sock_addr_kern();
2657 cleanup_test_env(tok);