Lines Matching +full:multi +full:- +full:port

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
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.
39 /* External (address, port) pairs the client sends packets to. */
44 /* Internal (address, port) pairs the server listens/receives at. */
65 unsigned short port; member
93 errno = -prog_fd; in attach_reuseport()
94 return -1; in attach_reuseport()
100 return -1; in attach_reuseport()
107 return (addr->ss_family == AF_INET ? sizeof(struct sockaddr_in) : in inetaddr_len()
108 addr->ss_family == AF_INET6 ? sizeof(struct sockaddr_in6) : 0); in inetaddr_len()
111 static int make_socket(int sotype, const char *ip, int port, in make_socket() argument
118 err = make_sockaddr(family, ip, port, addr, NULL); in make_socket()
120 return -1; in make_socket()
122 fd = socket(addr->ss_family, sotype, 0); in make_socket()
125 return -1; in make_socket()
132 return -1; in make_socket()
139 return -1; in make_socket()
145 static int make_server(int sotype, const char *ip, int port, in make_server() argument
150 int err, fd = -1; in make_server()
152 fd = make_socket(sotype, ip, port, &addr); in make_server()
154 return -1; in make_server()
156 /* Enabled for UDPv6 sockets for IPv4-mapped IPv6 to work. */ in make_server()
202 log_err("failed to listen on port %d", port); in make_server()
219 return -1; in make_server()
222 static int make_client(int sotype, const char *ip, int port) in make_client() argument
227 fd = make_socket(sotype, ip, port, &addr); in make_client()
229 return -1; in make_client()
240 return -1; in make_client()
261 ctx->local_port = local_port; in fill_sk_lookup_ctx()
262 ctx->remote_port = htons(remote_port); in fill_sk_lookup_ctx()
265 ctx->family = AF_INET6; in fill_sk_lookup_ctx()
266 local = &ctx->local_ip6[0]; in fill_sk_lookup_ctx()
267 remote = &ctx->remote_ip6[0]; in fill_sk_lookup_ctx()
269 ctx->family = AF_INET; in fill_sk_lookup_ctx()
270 local = &ctx->local_ip4; in fill_sk_lookup_ctx()
271 remote = &ctx->remote_ip4; in fill_sk_lookup_ctx()
274 err = inet_pton(ctx->family, local_ip, local); in fill_sk_lookup_ctx()
278 err = inet_pton(ctx->family, remote_ip, remote); in fill_sk_lookup_ctx()
293 return -1; in send_byte()
306 return -1; in recv_byte()
320 return -1; in tcp_recv_send()
326 ret = -1; in tcp_recv_send()
333 ret = -1; in tcp_recv_send()
348 v6->sin6_family = AF_INET6; in v4_to_v6()
349 v6->sin6_port = v4.sin_port; in v4_to_v6()
350 v6->sin6_addr.s6_addr[10] = 0xff; in v4_to_v6()
351 v6->sin6_addr.s6_addr[11] = 0xff; in v4_to_v6()
352 memcpy(&v6->sin6_addr.s6_addr[12], &v4.sin_addr.s_addr, 4); in v4_to_v6()
353 memset(&v6->sin6_addr.s6_addr[0], 0, 10); in v4_to_v6()
383 return -1; in udp_recv_send()
386 return -1; in udp_recv_send()
389 if ((cm->cmsg_level == SOL_IP && in udp_recv_send()
390 cm->cmsg_type == IP_ORIGDSTADDR) || in udp_recv_send()
391 (cm->cmsg_level == SOL_IPV6 && in udp_recv_send()
392 cm->cmsg_type == IPV6_ORIGDSTADDR)) { in udp_recv_send()
397 cm->cmsg_level, cm->cmsg_type); in udp_recv_send()
400 return -1; in udp_recv_send()
402 /* Server socket bound to IPv4-mapped IPv6 address */ in udp_recv_send()
403 if (src_addr->ss_family == AF_INET6 && in udp_recv_send()
404 dst_addr->ss_family == AF_INET) { in udp_recv_send()
409 fd = socket(dst_addr->ss_family, SOCK_DGRAM, 0); in udp_recv_send()
412 return -1; in udp_recv_send()
426 ret = -1; in udp_recv_send()
442 return -1; in tcp_echo_test()
445 return -1; in tcp_echo_test()
448 return -1; in tcp_echo_test()
459 return -1; in udp_echo_test()
462 return -1; in udp_echo_test()
465 return -1; in udp_echo_test()
483 errno = -PTR_ERR(link); in attach_lookup_prog()
500 errno = -map_fd; in update_lookup_map()
502 return -1; in update_lookup_map()
509 return -1; in update_lookup_map()
532 link[0] = attach_lookup_prog(skel->progs.lookup_pass); in query_lookup_prog()
535 link[1] = attach_lookup_prog(skel->progs.lookup_pass); in query_lookup_prog()
538 link[2] = attach_lookup_prog(skel->progs.lookup_drop); in query_lookup_prog()
600 int server_fds[] = { [0 ... MAX_SERVERS - 1] = -1 }; in run_lookup_prog()
601 int client_fd, reuse_conn_fd = -1; in run_lookup_prog()
605 lookup_link = attach_lookup_prog(t->lookup_prog); in run_lookup_prog()
610 server_fds[i] = make_server(t->sotype, t->listen_at.ip, in run_lookup_prog()
611 t->listen_at.port, in run_lookup_prog()
612 t->reuseport_prog); in run_lookup_prog()
616 err = update_lookup_map(t->sock_map, i, server_fds[i]); in run_lookup_prog()
620 /* want just one server for non-reuseport test */ in run_lookup_prog()
621 if (!t->reuseport_prog) in run_lookup_prog()
631 if (t->reuseport_has_conns) { in run_lookup_prog()
636 reuse_conn_fd = make_server(t->sotype, t->listen_at.ip, in run_lookup_prog()
637 t->listen_at.port, in run_lookup_prog()
638 t->reuseport_prog); in run_lookup_prog()
651 client_fd = make_client(t->sotype, t->connect_to.ip, t->connect_to.port); in run_lookup_prog()
655 if (t->sotype == SOCK_STREAM) in run_lookup_prog()
656 tcp_echo_test(client_fd, server_fds[t->accept_on]); in run_lookup_prog()
658 udp_echo_test(client_fd, server_fds[t->accept_on]); in run_lookup_prog()
662 if (reuse_conn_fd != -1) in run_lookup_prog()
665 if (server_fds[i] != -1) in run_lookup_prog()
675 .desc = "TCP IPv4 redir port", in test_redirect_lookup()
676 .lookup_prog = skel->progs.redir_port, in test_redirect_lookup()
677 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
684 .lookup_prog = skel->progs.redir_ip4, in test_redirect_lookup()
685 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
692 .lookup_prog = skel->progs.select_sock_a, in test_redirect_lookup()
693 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
694 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
702 .lookup_prog = skel->progs.select_sock_a_no_reuseport, in test_redirect_lookup()
703 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
704 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
711 .desc = "TCP IPv6 redir port", in test_redirect_lookup()
712 .lookup_prog = skel->progs.redir_port, in test_redirect_lookup()
713 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
720 .lookup_prog = skel->progs.redir_ip6, in test_redirect_lookup()
721 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
727 .desc = "TCP IPv4->IPv6 redir port", in test_redirect_lookup()
728 .lookup_prog = skel->progs.redir_port, in test_redirect_lookup()
729 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
736 .lookup_prog = skel->progs.select_sock_a, in test_redirect_lookup()
737 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
738 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
746 .lookup_prog = skel->progs.select_sock_a_no_reuseport, in test_redirect_lookup()
747 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
748 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
755 .desc = "UDP IPv4 redir port", in test_redirect_lookup()
756 .lookup_prog = skel->progs.redir_port, in test_redirect_lookup()
757 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
764 .lookup_prog = skel->progs.redir_ip4, in test_redirect_lookup()
765 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
772 .lookup_prog = skel->progs.select_sock_a, in test_redirect_lookup()
773 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
774 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
782 .lookup_prog = skel->progs.select_sock_a, in test_redirect_lookup()
783 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
784 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
793 .lookup_prog = skel->progs.select_sock_a_no_reuseport, in test_redirect_lookup()
794 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
795 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
802 .desc = "UDP IPv6 redir port", in test_redirect_lookup()
803 .lookup_prog = skel->progs.redir_port, in test_redirect_lookup()
804 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
811 .lookup_prog = skel->progs.redir_ip6, in test_redirect_lookup()
812 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
818 .desc = "UDP IPv4->IPv6 redir port", in test_redirect_lookup()
819 .lookup_prog = skel->progs.redir_port, in test_redirect_lookup()
820 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
827 .lookup_prog = skel->progs.select_sock_a, in test_redirect_lookup()
828 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
829 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
837 .lookup_prog = skel->progs.select_sock_a, in test_redirect_lookup()
838 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
839 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
848 .lookup_prog = skel->progs.select_sock_a_no_reuseport, in test_redirect_lookup()
849 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
850 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
860 if (test__start_subtest(t->desc)) in test_redirect_lookup()
872 lookup_link = attach_lookup_prog(t->lookup_prog); in drop_on_lookup()
876 server_fd = make_server(t->sotype, t->listen_at.ip, t->listen_at.port, in drop_on_lookup()
877 t->reuseport_prog); in drop_on_lookup()
881 client_fd = make_socket(t->sotype, t->connect_to.ip, in drop_on_lookup()
882 t->connect_to.port, &dst); in drop_on_lookup()
887 if (t->sotype == SOCK_DGRAM) { in drop_on_lookup()
894 err = n == -1; in drop_on_lookup()
913 .lookup_prog = skel->progs.lookup_drop, in test_drop_on_lookup()
920 .lookup_prog = skel->progs.lookup_drop, in test_drop_on_lookup()
927 .lookup_prog = skel->progs.lookup_drop, in test_drop_on_lookup()
934 .lookup_prog = skel->progs.lookup_drop, in test_drop_on_lookup()
944 .lookup_prog = skel->progs.check_ifindex, in test_drop_on_lookup()
951 .lookup_prog = skel->progs.check_ifindex, in test_drop_on_lookup()
958 .lookup_prog = skel->progs.check_ifindex, in test_drop_on_lookup()
965 .lookup_prog = skel->progs.check_ifindex, in test_drop_on_lookup()
974 if (test__start_subtest(t->desc)) in test_drop_on_lookup()
986 lookup_link = attach_lookup_prog(t->lookup_prog); in drop_on_reuseport()
990 server1 = make_server(t->sotype, t->listen_at.ip, t->listen_at.port, in drop_on_reuseport()
991 t->reuseport_prog); in drop_on_reuseport()
995 err = update_lookup_map(t->sock_map, SERVER_A, server1); in drop_on_reuseport()
1000 server2 = make_server(t->sotype, t->connect_to.ip, t->connect_to.port, in drop_on_reuseport()
1005 client = make_socket(t->sotype, t->connect_to.ip, in drop_on_reuseport()
1006 t->connect_to.port, &dst); in drop_on_reuseport()
1011 if (t->sotype == SOCK_DGRAM) { in drop_on_reuseport()
1018 err = n == -1; in drop_on_reuseport()
1039 .lookup_prog = skel->progs.select_sock_a, in test_drop_on_reuseport()
1040 .reuseport_prog = skel->progs.reuseport_drop, in test_drop_on_reuseport()
1041 .sock_map = skel->maps.redir_map, in test_drop_on_reuseport()
1048 .lookup_prog = skel->progs.select_sock_a, in test_drop_on_reuseport()
1049 .reuseport_prog = skel->progs.reuseport_drop, in test_drop_on_reuseport()
1050 .sock_map = skel->maps.redir_map, in test_drop_on_reuseport()
1057 .lookup_prog = skel->progs.select_sock_a, in test_drop_on_reuseport()
1058 .reuseport_prog = skel->progs.reuseport_drop, in test_drop_on_reuseport()
1059 .sock_map = skel->maps.redir_map, in test_drop_on_reuseport()
1066 .lookup_prog = skel->progs.select_sock_a, in test_drop_on_reuseport()
1067 .reuseport_prog = skel->progs.reuseport_drop, in test_drop_on_reuseport()
1068 .sock_map = skel->maps.redir_map, in test_drop_on_reuseport()
1077 if (test__start_subtest(t->desc)) in test_drop_on_reuseport()
1086 int server_fds[] = { [0 ... MAX_SERVERS - 1] = -1 }; in run_sk_assign()
1108 err = update_lookup_map(skel->maps.redir_map, i, in run_sk_assign()
1130 if (server_fds[i] != -1) in run_sk_assign()
1162 err = update_lookup_map(skel->maps.redir_map, SERVER_A, connected_fd); in run_sk_assign_connected()
1166 lookup_link = attach_lookup_prog(skel->progs.sk_assign_esocknosupport); in run_sk_assign_connected()
1191 run_sk_assign_v4(skel, skel->progs.sk_assign_eexist); in test_sk_assign_helper()
1193 run_sk_assign_v4(skel, skel->progs.sk_assign_replace_flag); in test_sk_assign_helper()
1195 run_sk_assign_v4(skel, skel->progs.sk_assign_null); in test_sk_assign_helper()
1196 if (test__start_subtest("access ctx->sk")) in test_sk_assign_helper()
1197 run_sk_assign_v4(skel, skel->progs.access_ctx_sk); in test_sk_assign_helper()
1199 run_sk_assign_v4(skel, skel->progs.ctx_narrow_access); in test_sk_assign_helper()
1201 run_sk_assign_v6(skel, skel->progs.ctx_narrow_access); in test_sk_assign_helper()
1225 map_fd = bpf_map__fd(t->run_map); in run_multi_prog_lookup()
1237 link1 = attach_lookup_prog(t->prog1); in run_multi_prog_lookup()
1240 link2 = attach_lookup_prog(t->prog2); in run_multi_prog_lookup()
1244 server_fd = make_server(SOCK_STREAM, t->listen_at.ip, in run_multi_prog_lookup()
1245 t->listen_at.port, NULL); in run_multi_prog_lookup()
1249 err = update_lookup_map(t->redir_map, SERVER_A, server_fd); in run_multi_prog_lookup()
1258 if (CHECK(err && !t->expect_errno, "connect", in run_multi_prog_lookup()
1261 if (CHECK(err && t->expect_errno && errno != t->expect_errno, in run_multi_prog_lookup()
1291 .desc = "multi prog - pass, pass", in test_multi_prog_lookup()
1292 .prog1 = skel->progs.multi_prog_pass1, in test_multi_prog_lookup()
1293 .prog2 = skel->progs.multi_prog_pass2, in test_multi_prog_lookup()
1297 .desc = "multi prog - drop, drop", in test_multi_prog_lookup()
1298 .prog1 = skel->progs.multi_prog_drop1, in test_multi_prog_lookup()
1299 .prog2 = skel->progs.multi_prog_drop2, in test_multi_prog_lookup()
1304 .desc = "multi prog - pass, drop", in test_multi_prog_lookup()
1305 .prog1 = skel->progs.multi_prog_pass1, in test_multi_prog_lookup()
1306 .prog2 = skel->progs.multi_prog_drop2, in test_multi_prog_lookup()
1311 .desc = "multi prog - drop, pass", in test_multi_prog_lookup()
1312 .prog1 = skel->progs.multi_prog_drop1, in test_multi_prog_lookup()
1313 .prog2 = skel->progs.multi_prog_pass2, in test_multi_prog_lookup()
1318 .desc = "multi prog - pass, redir", in test_multi_prog_lookup()
1319 .prog1 = skel->progs.multi_prog_pass1, in test_multi_prog_lookup()
1320 .prog2 = skel->progs.multi_prog_redir2, in test_multi_prog_lookup()
1324 .desc = "multi prog - redir, pass", in test_multi_prog_lookup()
1325 .prog1 = skel->progs.multi_prog_redir1, in test_multi_prog_lookup()
1326 .prog2 = skel->progs.multi_prog_pass2, in test_multi_prog_lookup()
1330 .desc = "multi prog - drop, redir", in test_multi_prog_lookup()
1331 .prog1 = skel->progs.multi_prog_drop1, in test_multi_prog_lookup()
1332 .prog2 = skel->progs.multi_prog_redir2, in test_multi_prog_lookup()
1336 .desc = "multi prog - redir, drop", in test_multi_prog_lookup()
1337 .prog1 = skel->progs.multi_prog_redir1, in test_multi_prog_lookup()
1338 .prog2 = skel->progs.multi_prog_drop2, in test_multi_prog_lookup()
1342 .desc = "multi prog - redir, redir", in test_multi_prog_lookup()
1343 .prog1 = skel->progs.multi_prog_redir1, in test_multi_prog_lookup()
1344 .prog2 = skel->progs.multi_prog_redir2, in test_multi_prog_lookup()
1351 t->redir_map = skel->maps.redir_map; in test_multi_prog_lookup()
1352 t->run_map = skel->maps.run_map; in test_multi_prog_lookup()
1353 if (test__start_subtest(t->desc)) in test_multi_prog_lookup()
1372 "ip -6 addr add dev lo " EXT_IP6 "/128", in switch_netns()
1373 "ip -6 addr add dev lo " INT_IP6 "/128", in switch_netns()
1383 return -1; in switch_netns()
1390 return -1; in switch_netns()