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.
38 /* External (address, port) pairs the client sends packets to. */
43 /* Internal (address, port) pairs the server listens/receives at. */
62 unsigned short port; member
96 errno = -prog_fd; in attach_reuseport()
97 return -1; in attach_reuseport()
103 return -1; in attach_reuseport()
114 /* Enabled for UDPv6 sockets for IPv4-mapped IPv6 to work. */ in setsockopts()
115 if (co->sotype == SOCK_DGRAM) { in setsockopts()
124 if (co->sotype == SOCK_DGRAM && co->family == AF_INET6) { in setsockopts()
133 if (co->sotype == SOCK_STREAM) { in setsockopts()
142 if (co->reuseport) { in setsockopts()
155 static int make_server(int sotype, const char *ip, int port, in make_server() argument
170 fd = start_server_str(cb_opts.family, sotype, ip, port, &opts); in make_server()
172 return -1; in make_server()
186 return -1; in make_server()
207 ctx->local_port = local_port; in fill_sk_lookup_ctx()
208 ctx->remote_port = htons(remote_port); in fill_sk_lookup_ctx()
211 ctx->family = AF_INET6; in fill_sk_lookup_ctx()
212 local = &ctx->local_ip6[0]; in fill_sk_lookup_ctx()
213 remote = &ctx->remote_ip6[0]; in fill_sk_lookup_ctx()
215 ctx->family = AF_INET; in fill_sk_lookup_ctx()
216 local = &ctx->local_ip4; in fill_sk_lookup_ctx()
217 remote = &ctx->remote_ip4; in fill_sk_lookup_ctx()
220 err = inet_pton(ctx->family, local_ip, local); in fill_sk_lookup_ctx()
224 err = inet_pton(ctx->family, remote_ip, remote); in fill_sk_lookup_ctx()
239 return -1; in send_byte()
252 return -1; in recv_byte()
266 return -1; in tcp_recv_send()
272 ret = -1; in tcp_recv_send()
279 ret = -1; in tcp_recv_send()
294 v6->sin6_family = AF_INET6; in v4_to_v6()
295 v6->sin6_port = v4.sin_port; in v4_to_v6()
296 v6->sin6_addr.s6_addr[10] = 0xff; in v4_to_v6()
297 v6->sin6_addr.s6_addr[11] = 0xff; in v4_to_v6()
298 memcpy(&v6->sin6_addr.s6_addr[12], &v4.sin_addr.s_addr, 4); in v4_to_v6()
299 memset(&v6->sin6_addr.s6_addr[0], 0, 10); in v4_to_v6()
329 return -1; in udp_recv_send()
332 return -1; in udp_recv_send()
335 if ((cm->cmsg_level == SOL_IP && in udp_recv_send()
336 cm->cmsg_type == IP_ORIGDSTADDR) || in udp_recv_send()
337 (cm->cmsg_level == SOL_IPV6 && in udp_recv_send()
338 cm->cmsg_type == IPV6_ORIGDSTADDR)) { in udp_recv_send()
343 cm->cmsg_level, cm->cmsg_type); in udp_recv_send()
346 return -1; in udp_recv_send()
348 /* Server socket bound to IPv4-mapped IPv6 address */ in udp_recv_send()
349 if (src_addr->ss_family == AF_INET6 && in udp_recv_send()
350 dst_addr->ss_family == AF_INET) { in udp_recv_send()
358 return -1; in udp_recv_send()
366 ret = -1; in udp_recv_send()
382 return -1; in tcp_echo_test()
385 return -1; in tcp_echo_test()
388 return -1; in tcp_echo_test()
399 return -1; in udp_echo_test()
402 return -1; in udp_echo_test()
405 return -1; in udp_echo_test()
423 errno = -PTR_ERR(link); in attach_lookup_prog()
440 errno = -map_fd; in update_lookup_map()
442 return -1; in update_lookup_map()
449 return -1; in update_lookup_map()
472 link[0] = attach_lookup_prog(skel->progs.lookup_pass); in query_lookup_prog()
475 link[1] = attach_lookup_prog(skel->progs.lookup_pass); in query_lookup_prog()
478 link[2] = attach_lookup_prog(skel->progs.lookup_drop); in query_lookup_prog()
540 int server_fds[] = { [0 ... MAX_SERVERS - 1] = -1 }; in run_lookup_prog()
541 int client_fd, reuse_conn_fd = -1; in run_lookup_prog()
545 lookup_link = attach_lookup_prog(t->lookup_prog); in run_lookup_prog()
550 server_fds[i] = make_server(t->sotype, t->listen_at.ip, in run_lookup_prog()
551 t->listen_at.port, in run_lookup_prog()
552 t->reuseport_prog); in run_lookup_prog()
556 err = update_lookup_map(t->sock_map, i, server_fds[i]); in run_lookup_prog()
560 /* want just one server for non-reuseport test */ in run_lookup_prog()
561 if (!t->reuseport_prog) in run_lookup_prog()
571 if (t->reuseport_has_conns) { in run_lookup_prog()
573 reuse_conn_fd = make_server(t->sotype, t->listen_at.ip, in run_lookup_prog()
574 t->listen_at.port, in run_lookup_prog()
575 t->reuseport_prog); in run_lookup_prog()
585 client_fd = connect_to_addr_str(is_ipv6(t->connect_to.ip) ? AF_INET6 : AF_INET, in run_lookup_prog()
586 t->sotype, t->connect_to.ip, t->connect_to.port, NULL); in run_lookup_prog()
590 if (t->sotype == SOCK_STREAM) in run_lookup_prog()
591 tcp_echo_test(client_fd, server_fds[t->accept_on]); in run_lookup_prog()
593 udp_echo_test(client_fd, server_fds[t->accept_on]); in run_lookup_prog()
597 if (reuse_conn_fd != -1) in run_lookup_prog()
600 if (server_fds[i] != -1) in run_lookup_prog()
610 .desc = "TCP IPv4 redir port", in test_redirect_lookup()
611 .lookup_prog = skel->progs.redir_port, in test_redirect_lookup()
612 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
619 .lookup_prog = skel->progs.redir_ip4, in test_redirect_lookup()
620 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
627 .lookup_prog = skel->progs.select_sock_a, in test_redirect_lookup()
628 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
629 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
637 .lookup_prog = skel->progs.select_sock_a_no_reuseport, in test_redirect_lookup()
638 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
639 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
646 .desc = "TCP IPv6 redir port", in test_redirect_lookup()
647 .lookup_prog = skel->progs.redir_port, in test_redirect_lookup()
648 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
655 .lookup_prog = skel->progs.redir_ip6, in test_redirect_lookup()
656 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
662 .desc = "TCP IPv4->IPv6 redir port", in test_redirect_lookup()
663 .lookup_prog = skel->progs.redir_port, in test_redirect_lookup()
664 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
671 .lookup_prog = skel->progs.select_sock_a, in test_redirect_lookup()
672 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
673 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
681 .lookup_prog = skel->progs.select_sock_a_no_reuseport, in test_redirect_lookup()
682 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
683 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
690 .desc = "UDP IPv4 redir port", in test_redirect_lookup()
691 .lookup_prog = skel->progs.redir_port, in test_redirect_lookup()
692 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
699 .lookup_prog = skel->progs.redir_ip4, in test_redirect_lookup()
700 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
707 .lookup_prog = skel->progs.select_sock_a, in test_redirect_lookup()
708 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
709 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
717 .lookup_prog = skel->progs.select_sock_a, in test_redirect_lookup()
718 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
719 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
728 .lookup_prog = skel->progs.select_sock_a_no_reuseport, in test_redirect_lookup()
729 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
730 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
737 .desc = "UDP IPv6 redir port", in test_redirect_lookup()
738 .lookup_prog = skel->progs.redir_port, in test_redirect_lookup()
739 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
746 .lookup_prog = skel->progs.redir_ip6, in test_redirect_lookup()
747 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
753 .desc = "UDP IPv4->IPv6 redir port", in test_redirect_lookup()
754 .lookup_prog = skel->progs.redir_port, in test_redirect_lookup()
755 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
762 .lookup_prog = skel->progs.select_sock_a, in test_redirect_lookup()
763 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
764 .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()
783 .lookup_prog = skel->progs.select_sock_a_no_reuseport, in test_redirect_lookup()
784 .reuseport_prog = skel->progs.select_sock_b, in test_redirect_lookup()
785 .sock_map = skel->maps.redir_map, in test_redirect_lookup()
795 if (test__start_subtest(t->desc)) in test_redirect_lookup()
802 int family = is_ipv6(t->connect_to.ip) ? AF_INET6 : AF_INET; in drop_on_lookup()
809 lookup_link = attach_lookup_prog(t->lookup_prog); in drop_on_lookup()
813 server_fd = make_server(t->sotype, t->listen_at.ip, t->listen_at.port, in drop_on_lookup()
814 t->reuseport_prog); in drop_on_lookup()
818 client_fd = client_socket(family, t->sotype, NULL); in drop_on_lookup()
822 err = make_sockaddr(family, t->connect_to.ip, t->connect_to.port, &dst, &len); in drop_on_lookup()
826 if (t->sotype == SOCK_DGRAM) { in drop_on_lookup()
833 err = n == -1; in drop_on_lookup()
852 .lookup_prog = skel->progs.lookup_drop, in test_drop_on_lookup()
859 .lookup_prog = skel->progs.lookup_drop, in test_drop_on_lookup()
866 .lookup_prog = skel->progs.lookup_drop, in test_drop_on_lookup()
873 .lookup_prog = skel->progs.lookup_drop, in test_drop_on_lookup()
883 .lookup_prog = skel->progs.check_ifindex, in test_drop_on_lookup()
890 .lookup_prog = skel->progs.check_ifindex, in test_drop_on_lookup()
897 .lookup_prog = skel->progs.check_ifindex, in test_drop_on_lookup()
904 .lookup_prog = skel->progs.check_ifindex, in test_drop_on_lookup()
913 if (test__start_subtest(t->desc)) in test_drop_on_lookup()
920 int family = is_ipv6(t->connect_to.ip) ? AF_INET6 : AF_INET; in drop_on_reuseport()
927 lookup_link = attach_lookup_prog(t->lookup_prog); in drop_on_reuseport()
931 server1 = make_server(t->sotype, t->listen_at.ip, t->listen_at.port, in drop_on_reuseport()
932 t->reuseport_prog); in drop_on_reuseport()
936 err = update_lookup_map(t->sock_map, SERVER_A, server1); in drop_on_reuseport()
941 server2 = make_server(t->sotype, t->connect_to.ip, t->connect_to.port, in drop_on_reuseport()
946 client = client_socket(family, t->sotype, NULL); in drop_on_reuseport()
950 err = make_sockaddr(family, t->connect_to.ip, t->connect_to.port, &dst, &len); in drop_on_reuseport()
954 if (t->sotype == SOCK_DGRAM) { in drop_on_reuseport()
961 err = n == -1; in drop_on_reuseport()
982 .lookup_prog = skel->progs.select_sock_a, in test_drop_on_reuseport()
983 .reuseport_prog = skel->progs.reuseport_drop, in test_drop_on_reuseport()
984 .sock_map = skel->maps.redir_map, in test_drop_on_reuseport()
991 .lookup_prog = skel->progs.select_sock_a, in test_drop_on_reuseport()
992 .reuseport_prog = skel->progs.reuseport_drop, in test_drop_on_reuseport()
993 .sock_map = skel->maps.redir_map, in test_drop_on_reuseport()
1000 .lookup_prog = skel->progs.select_sock_a, in test_drop_on_reuseport()
1001 .reuseport_prog = skel->progs.reuseport_drop, in test_drop_on_reuseport()
1002 .sock_map = skel->maps.redir_map, in test_drop_on_reuseport()
1009 .lookup_prog = skel->progs.select_sock_a, in test_drop_on_reuseport()
1010 .reuseport_prog = skel->progs.reuseport_drop, in test_drop_on_reuseport()
1011 .sock_map = skel->maps.redir_map, in test_drop_on_reuseport()
1020 if (test__start_subtest(t->desc)) in test_drop_on_reuseport()
1029 int server_fds[] = { [0 ... MAX_SERVERS - 1] = -1 }; in run_sk_assign()
1051 err = update_lookup_map(skel->maps.redir_map, i, in run_sk_assign()
1073 if (server_fds[i] != -1) in run_sk_assign()
1105 err = update_lookup_map(skel->maps.redir_map, SERVER_A, connected_fd); in run_sk_assign_connected()
1109 lookup_link = attach_lookup_prog(skel->progs.sk_assign_esocknosupport); in run_sk_assign_connected()
1134 run_sk_assign_v4(skel, skel->progs.sk_assign_eexist); in test_sk_assign_helper()
1136 run_sk_assign_v4(skel, skel->progs.sk_assign_replace_flag); in test_sk_assign_helper()
1138 run_sk_assign_v4(skel, skel->progs.sk_assign_null); in test_sk_assign_helper()
1139 if (test__start_subtest("access ctx->sk")) in test_sk_assign_helper()
1140 run_sk_assign_v4(skel, skel->progs.access_ctx_sk); in test_sk_assign_helper()
1142 run_sk_assign_v4(skel, skel->progs.ctx_narrow_access); in test_sk_assign_helper()
1144 run_sk_assign_v6(skel, skel->progs.ctx_narrow_access); in test_sk_assign_helper()
1169 map_fd = bpf_map__fd(t->run_map); in run_multi_prog_lookup()
1181 link1 = attach_lookup_prog(t->prog1); in run_multi_prog_lookup()
1184 link2 = attach_lookup_prog(t->prog2); in run_multi_prog_lookup()
1188 server_fd = make_server(SOCK_STREAM, t->listen_at.ip, in run_multi_prog_lookup()
1189 t->listen_at.port, NULL); in run_multi_prog_lookup()
1193 err = update_lookup_map(t->redir_map, SERVER_A, server_fd); in run_multi_prog_lookup()
1205 if (CHECK(err && !t->expect_errno, "connect", in run_multi_prog_lookup()
1208 if (CHECK(err && t->expect_errno && errno != t->expect_errno, in run_multi_prog_lookup()
1238 .desc = "multi prog - pass, pass", in test_multi_prog_lookup()
1239 .prog1 = skel->progs.multi_prog_pass1, in test_multi_prog_lookup()
1240 .prog2 = skel->progs.multi_prog_pass2, in test_multi_prog_lookup()
1244 .desc = "multi prog - drop, drop", in test_multi_prog_lookup()
1245 .prog1 = skel->progs.multi_prog_drop1, in test_multi_prog_lookup()
1246 .prog2 = skel->progs.multi_prog_drop2, in test_multi_prog_lookup()
1251 .desc = "multi prog - pass, drop", in test_multi_prog_lookup()
1252 .prog1 = skel->progs.multi_prog_pass1, in test_multi_prog_lookup()
1253 .prog2 = skel->progs.multi_prog_drop2, in test_multi_prog_lookup()
1258 .desc = "multi prog - drop, pass", in test_multi_prog_lookup()
1259 .prog1 = skel->progs.multi_prog_drop1, in test_multi_prog_lookup()
1260 .prog2 = skel->progs.multi_prog_pass2, in test_multi_prog_lookup()
1265 .desc = "multi prog - pass, redir", in test_multi_prog_lookup()
1266 .prog1 = skel->progs.multi_prog_pass1, in test_multi_prog_lookup()
1267 .prog2 = skel->progs.multi_prog_redir2, in test_multi_prog_lookup()
1271 .desc = "multi prog - redir, pass", in test_multi_prog_lookup()
1272 .prog1 = skel->progs.multi_prog_redir1, in test_multi_prog_lookup()
1273 .prog2 = skel->progs.multi_prog_pass2, in test_multi_prog_lookup()
1277 .desc = "multi prog - drop, redir", in test_multi_prog_lookup()
1278 .prog1 = skel->progs.multi_prog_drop1, in test_multi_prog_lookup()
1279 .prog2 = skel->progs.multi_prog_redir2, in test_multi_prog_lookup()
1283 .desc = "multi prog - redir, drop", in test_multi_prog_lookup()
1284 .prog1 = skel->progs.multi_prog_redir1, in test_multi_prog_lookup()
1285 .prog2 = skel->progs.multi_prog_drop2, in test_multi_prog_lookup()
1289 .desc = "multi prog - redir, redir", in test_multi_prog_lookup()
1290 .prog1 = skel->progs.multi_prog_redir1, in test_multi_prog_lookup()
1291 .prog2 = skel->progs.multi_prog_redir2, in test_multi_prog_lookup()
1298 t->redir_map = skel->maps.redir_map; in test_multi_prog_lookup()
1299 t->run_map = skel->maps.run_map; in test_multi_prog_lookup()
1300 if (test__start_subtest(t->desc)) in test_multi_prog_lookup()
1319 "ip -6 addr add dev lo " EXT_IP6 "/128", in switch_netns()
1320 "ip -6 addr add dev lo " INT_IP6 "/128", in switch_netns()
1330 return -1; in switch_netns()
1337 return -1; in switch_netns()