Lines Matching +full:multi +full:- +full:socket

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
4 * Test BPF attach point for INET socket lookup (BPF_SK_LOOKUP).
7 * - attaching/detaching/querying programs to BPF_SK_LOOKUP hook,
8 * - redirecting socket lookup to a socket selected by BPF program,
9 * - failing a socket lookup on BPF program's request,
10 * - error scenarios for selecting a socket from BPF program,
11 * - accessing BPF program context,
12 * - attaching and running multiple BPF programs.
78 bool reuseport_has_conns; /* Add a connected socket to reuseport group */
94 errno = -prog_fd; in attach_reuseport()
95 return -1; in attach_reuseport()
101 return -1; in attach_reuseport()
108 return (addr->ss_family == AF_INET ? sizeof(struct sockaddr_in) : in inetaddr_len()
109 addr->ss_family == AF_INET6 ? sizeof(struct sockaddr_in6) : 0); in inetaddr_len()
121 return -1; in make_socket()
123 fd = socket(addr->ss_family, sotype, 0); in make_socket()
124 if (CHECK(fd < 0, "socket", "failed\n")) { in make_socket()
125 log_err("failed to make socket"); in make_socket()
126 return -1; in make_socket()
133 return -1; in make_socket()
140 return -1; in make_socket()
151 int err, fd = -1; in make_server()
155 return -1; in make_server()
157 /* Enabled for UDPv6 sockets for IPv4-mapped IPv6 to work. */ in make_server()
196 log_err("failed to bind listen socket"); in make_server()
220 return -1; in make_server()
230 return -1; in make_client()
234 log_err("failed to connect client socket"); in make_client()
241 return -1; in make_client()
252 return -1; in send_byte()
265 return -1; in recv_byte()
279 return -1; in tcp_recv_send()
285 ret = -1; in tcp_recv_send()
292 ret = -1; in tcp_recv_send()
307 v6->sin6_family = AF_INET6; in v4_to_v6()
308 v6->sin6_port = v4.sin_port; in v4_to_v6()
309 v6->sin6_addr.s6_addr[10] = 0xff; in v4_to_v6()
310 v6->sin6_addr.s6_addr[11] = 0xff; in v4_to_v6()
311 memcpy(&v6->sin6_addr.s6_addr[12], &v4.sin_addr.s_addr, 4); in v4_to_v6()
312 memset(&v6->sin6_addr.s6_addr[0], 0, 10); in v4_to_v6()
342 return -1; in udp_recv_send()
345 return -1; in udp_recv_send()
348 if ((cm->cmsg_level == SOL_IP && in udp_recv_send()
349 cm->cmsg_type == IP_ORIGDSTADDR) || in udp_recv_send()
350 (cm->cmsg_level == SOL_IPV6 && in udp_recv_send()
351 cm->cmsg_type == IPV6_ORIGDSTADDR)) { in udp_recv_send()
356 cm->cmsg_level, cm->cmsg_type); in udp_recv_send()
359 return -1; in udp_recv_send()
361 /* Server socket bound to IPv4-mapped IPv6 address */ in udp_recv_send()
362 if (src_addr->ss_family == AF_INET6 && in udp_recv_send()
363 dst_addr->ss_family == AF_INET) { in udp_recv_send()
368 fd = socket(dst_addr->ss_family, SOCK_DGRAM, 0); in udp_recv_send()
369 if (CHECK(fd < 0, "socket", "failed\n")) { in udp_recv_send()
370 log_err("failed to create tx socket"); in udp_recv_send()
371 return -1; in udp_recv_send()
376 log_err("failed to bind tx socket"); in udp_recv_send()
385 ret = -1; in udp_recv_send()
401 return -1; in tcp_echo_test()
404 return -1; in tcp_echo_test()
407 return -1; in tcp_echo_test()
418 return -1; in udp_echo_test()
421 return -1; in udp_echo_test()
424 return -1; in udp_echo_test()
442 errno = -PTR_ERR(link); in attach_lookup_prog()
459 errno = -map_fd; in update_lookup_map()
461 return -1; in update_lookup_map()
468 return -1; in update_lookup_map()
491 link[0] = attach_lookup_prog(skel->progs.lookup_pass); in query_lookup_prog()
494 link[1] = attach_lookup_prog(skel->progs.lookup_pass); in query_lookup_prog()
497 link[2] = attach_lookup_prog(skel->progs.lookup_drop); in query_lookup_prog()
559 int server_fds[MAX_SERVERS] = { -1 }; in run_lookup_prog()
560 int client_fd, reuse_conn_fd = -1; in run_lookup_prog()
564 lookup_link = attach_lookup_prog(t->lookup_prog); in run_lookup_prog()
569 server_fds[i] = make_server(t->sotype, t->listen_at.ip, in run_lookup_prog()
570 t->listen_at.port, in run_lookup_prog()
571 t->reuseport_prog); in run_lookup_prog()
575 err = update_lookup_map(t->sock_map, i, server_fds[i]); in run_lookup_prog()
579 /* want just one server for non-reuseport test */ in run_lookup_prog()
580 if (!t->reuseport_prog) in run_lookup_prog()
584 /* Regular UDP socket lookup with reuseport behaves in run_lookup_prog()
586 * sockets. Check that adding a connected UDP socket to the in run_lookup_prog()
588 * BPF socket lookup. in run_lookup_prog()
590 if (t->reuseport_has_conns) { in run_lookup_prog()
594 /* Add an extra socket to reuseport group */ in run_lookup_prog()
595 reuse_conn_fd = make_server(t->sotype, t->listen_at.ip, in run_lookup_prog()
596 t->listen_at.port, in run_lookup_prog()
597 t->reuseport_prog); in run_lookup_prog()
601 /* Connect the extra socket to itself */ in run_lookup_prog()
610 client_fd = make_client(t->sotype, t->connect_to.ip, t->connect_to.port); in run_lookup_prog()
614 if (t->sotype == SOCK_STREAM) in run_lookup_prog()
615 tcp_echo_test(client_fd, server_fds[t->accept_on]); in run_lookup_prog()
617 udp_echo_test(client_fd, server_fds[t->accept_on]); in run_lookup_prog()
621 if (reuse_conn_fd != -1) in run_lookup_prog()
624 if (server_fds[i] != -1) in run_lookup_prog()
635 .lookup_prog = skel->progs.redir_port, in test_redirect_lookup()
636 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
643 .lookup_prog = skel->progs.redir_ip4, in test_redirect_lookup()
644 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
651 .lookup_prog = skel->progs.select_sock_a, in test_redirect_lookup()
652 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
653 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
661 .lookup_prog = skel->progs.select_sock_a_no_reuseport, in test_redirect_lookup()
662 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
663 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
671 .lookup_prog = skel->progs.redir_port, in test_redirect_lookup()
672 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
679 .lookup_prog = skel->progs.redir_ip6, in test_redirect_lookup()
680 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
686 .desc = "TCP IPv4->IPv6 redir port", in test_redirect_lookup()
687 .lookup_prog = skel->progs.redir_port, in test_redirect_lookup()
688 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
695 .lookup_prog = skel->progs.select_sock_a, in test_redirect_lookup()
696 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
697 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
705 .lookup_prog = skel->progs.select_sock_a_no_reuseport, in test_redirect_lookup()
706 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
707 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
715 .lookup_prog = skel->progs.redir_port, in test_redirect_lookup()
716 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
723 .lookup_prog = skel->progs.redir_ip4, in test_redirect_lookup()
724 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
731 .lookup_prog = skel->progs.select_sock_a, in test_redirect_lookup()
732 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
733 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
741 .lookup_prog = skel->progs.select_sock_a, in test_redirect_lookup()
742 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
743 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
752 .lookup_prog = skel->progs.select_sock_a_no_reuseport, in test_redirect_lookup()
753 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
754 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
762 .lookup_prog = skel->progs.redir_port, in test_redirect_lookup()
763 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
770 .lookup_prog = skel->progs.redir_ip6, in test_redirect_lookup()
771 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
777 .desc = "UDP IPv4->IPv6 redir port", in test_redirect_lookup()
778 .lookup_prog = skel->progs.redir_port, in test_redirect_lookup()
779 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
786 .lookup_prog = skel->progs.select_sock_a, in test_redirect_lookup()
787 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
788 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
796 .lookup_prog = skel->progs.select_sock_a, in test_redirect_lookup()
797 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
798 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
807 .lookup_prog = skel->progs.select_sock_a_no_reuseport, in test_redirect_lookup()
808 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
809 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
819 if (test__start_subtest(t->desc)) in test_redirect_lookup()
831 lookup_link = attach_lookup_prog(t->lookup_prog); in drop_on_lookup()
835 server_fd = make_server(t->sotype, t->listen_at.ip, t->listen_at.port, in drop_on_lookup()
836 t->reuseport_prog); in drop_on_lookup()
840 client_fd = make_socket(t->sotype, t->connect_to.ip, in drop_on_lookup()
841 t->connect_to.port, &dst); in drop_on_lookup()
846 if (t->sotype == SOCK_DGRAM) { in drop_on_lookup()
853 err = n == -1; in drop_on_lookup()
872 .lookup_prog = skel->progs.lookup_drop, in test_drop_on_lookup()
879 .lookup_prog = skel->progs.lookup_drop, in test_drop_on_lookup()
886 .lookup_prog = skel->progs.lookup_drop, in test_drop_on_lookup()
893 .lookup_prog = skel->progs.lookup_drop, in test_drop_on_lookup()
902 if (test__start_subtest(t->desc)) in test_drop_on_lookup()
914 lookup_link = attach_lookup_prog(t->lookup_prog); in drop_on_reuseport()
918 server1 = make_server(t->sotype, t->listen_at.ip, t->listen_at.port, in drop_on_reuseport()
919 t->reuseport_prog); in drop_on_reuseport()
923 err = update_lookup_map(t->sock_map, SERVER_A, server1); in drop_on_reuseport()
928 server2 = make_server(t->sotype, t->connect_to.ip, t->connect_to.port, in drop_on_reuseport()
933 client = make_socket(t->sotype, t->connect_to.ip, in drop_on_reuseport()
934 t->connect_to.port, &dst); in drop_on_reuseport()
939 if (t->sotype == SOCK_DGRAM) { in drop_on_reuseport()
946 err = n == -1; in drop_on_reuseport()
967 .lookup_prog = skel->progs.select_sock_a, in test_drop_on_reuseport()
968 .reuseport_prog = skel->progs.reuseport_drop, in test_drop_on_reuseport()
969 .sock_map = skel->maps.redir_map, in test_drop_on_reuseport()
976 .lookup_prog = skel->progs.select_sock_a, in test_drop_on_reuseport()
977 .reuseport_prog = skel->progs.reuseport_drop, in test_drop_on_reuseport()
978 .sock_map = skel->maps.redir_map, in test_drop_on_reuseport()
985 .lookup_prog = skel->progs.select_sock_a, in test_drop_on_reuseport()
986 .reuseport_prog = skel->progs.reuseport_drop, in test_drop_on_reuseport()
987 .sock_map = skel->maps.redir_map, in test_drop_on_reuseport()
994 .lookup_prog = skel->progs.select_sock_a, in test_drop_on_reuseport()
995 .reuseport_prog = skel->progs.reuseport_drop, in test_drop_on_reuseport()
996 .sock_map = skel->maps.redir_map, in test_drop_on_reuseport()
1005 if (test__start_subtest(t->desc)) in test_drop_on_reuseport()
1014 int client_fd, peer_fd, server_fds[MAX_SERVERS] = { -1 }; in run_sk_assign()
1027 err = update_lookup_map(skel->maps.redir_map, i, in run_sk_assign()
1046 if (server_fds[i] != -1) in run_sk_assign()
1078 /* Put a connected socket in redirect map */ in run_sk_assign_connected()
1079 err = update_lookup_map(skel->maps.redir_map, SERVER_A, connected_fd); in run_sk_assign_connected()
1083 lookup_link = attach_lookup_prog(skel->progs.sk_assign_esocknosupport); in run_sk_assign_connected()
1087 /* Try to redirect TCP SYN / UDP packet to a connected socket */ in run_sk_assign_connected()
1108 run_sk_assign_v4(skel, skel->progs.sk_assign_eexist); in test_sk_assign_helper()
1110 run_sk_assign_v4(skel, skel->progs.sk_assign_replace_flag); in test_sk_assign_helper()
1111 if (test__start_subtest("sk_assign accepts NULL socket")) in test_sk_assign_helper()
1112 run_sk_assign_v4(skel, skel->progs.sk_assign_null); in test_sk_assign_helper()
1113 if (test__start_subtest("access ctx->sk")) in test_sk_assign_helper()
1114 run_sk_assign_v4(skel, skel->progs.access_ctx_sk); in test_sk_assign_helper()
1116 run_sk_assign_v4(skel, skel->progs.ctx_narrow_access); in test_sk_assign_helper()
1118 run_sk_assign_v6(skel, skel->progs.ctx_narrow_access); in test_sk_assign_helper()
1142 map_fd = bpf_map__fd(t->run_map); in run_multi_prog_lookup()
1154 link1 = attach_lookup_prog(t->prog1); in run_multi_prog_lookup()
1157 link2 = attach_lookup_prog(t->prog2); in run_multi_prog_lookup()
1161 server_fd = make_server(SOCK_STREAM, t->listen_at.ip, in run_multi_prog_lookup()
1162 t->listen_at.port, NULL); in run_multi_prog_lookup()
1166 err = update_lookup_map(t->redir_map, SERVER_A, server_fd); in run_multi_prog_lookup()
1175 if (CHECK(err && !t->expect_errno, "connect", in run_multi_prog_lookup()
1178 if (CHECK(err && t->expect_errno && errno != t->expect_errno, in run_multi_prog_lookup()
1208 .desc = "multi prog - pass, pass", in test_multi_prog_lookup()
1209 .prog1 = skel->progs.multi_prog_pass1, in test_multi_prog_lookup()
1210 .prog2 = skel->progs.multi_prog_pass2, in test_multi_prog_lookup()
1214 .desc = "multi prog - drop, drop", in test_multi_prog_lookup()
1215 .prog1 = skel->progs.multi_prog_drop1, in test_multi_prog_lookup()
1216 .prog2 = skel->progs.multi_prog_drop2, in test_multi_prog_lookup()
1221 .desc = "multi prog - pass, drop", in test_multi_prog_lookup()
1222 .prog1 = skel->progs.multi_prog_pass1, in test_multi_prog_lookup()
1223 .prog2 = skel->progs.multi_prog_drop2, in test_multi_prog_lookup()
1228 .desc = "multi prog - drop, pass", in test_multi_prog_lookup()
1229 .prog1 = skel->progs.multi_prog_drop1, in test_multi_prog_lookup()
1230 .prog2 = skel->progs.multi_prog_pass2, in test_multi_prog_lookup()
1235 .desc = "multi prog - pass, redir", in test_multi_prog_lookup()
1236 .prog1 = skel->progs.multi_prog_pass1, in test_multi_prog_lookup()
1237 .prog2 = skel->progs.multi_prog_redir2, in test_multi_prog_lookup()
1241 .desc = "multi prog - redir, pass", in test_multi_prog_lookup()
1242 .prog1 = skel->progs.multi_prog_redir1, in test_multi_prog_lookup()
1243 .prog2 = skel->progs.multi_prog_pass2, in test_multi_prog_lookup()
1247 .desc = "multi prog - drop, redir", in test_multi_prog_lookup()
1248 .prog1 = skel->progs.multi_prog_drop1, in test_multi_prog_lookup()
1249 .prog2 = skel->progs.multi_prog_redir2, in test_multi_prog_lookup()
1253 .desc = "multi prog - redir, drop", in test_multi_prog_lookup()
1254 .prog1 = skel->progs.multi_prog_redir1, in test_multi_prog_lookup()
1255 .prog2 = skel->progs.multi_prog_drop2, in test_multi_prog_lookup()
1259 .desc = "multi prog - redir, redir", in test_multi_prog_lookup()
1260 .prog1 = skel->progs.multi_prog_redir1, in test_multi_prog_lookup()
1261 .prog2 = skel->progs.multi_prog_redir2, in test_multi_prog_lookup()
1268 t->redir_map = skel->maps.redir_map; in test_multi_prog_lookup()
1269 t->run_map = skel->maps.run_map; in test_multi_prog_lookup()
1270 if (test__start_subtest(t->desc)) in test_multi_prog_lookup()
1289 "ip -6 addr add dev lo " EXT_IP6 "/128", in switch_netns()
1290 "ip -6 addr add dev lo " INT_IP6 "/128", in switch_netns()
1300 return -1; in switch_netns()
1307 return -1; in switch_netns()