Lines Matching +full:ip +full:- +full:76

1 // SPDX-License-Identifier: GPL-2.0
2 /* nettest - used for functional tests of networking APIs
4 * Copyright (c) 2013-2019 David Ahern <dsahern@gmail.com>. All rights reserved.
18 #include <netinet/ip.h>
38 #define IPV6_UNICAST_IF 76
109 /* 0: default, -1: force off, +1: force on */
154 strncpy(timebuf, "00:00:00", buflen-1); in timestamp()
222 if (sa->sa_family == AF_INET) { in log_address()
227 inet_ntop(AF_INET, &s->sin_addr, addrstr, in log_address()
229 ntohs(s->sin_port)); in log_address()
231 } else if (sa->sa_family == AF_INET6) { in log_address()
236 inet_ntop(AF_INET6, &s6->sin6_addr, addrstr, in log_address()
238 ntohs(s6->sin6_port)); in log_address()
267 int keylen = strlen(args->password); in tcp_md5sig()
273 memcpy(md5sig.tcpm_key, args->password, keylen); in tcp_md5sig()
275 if (args->prefix_len) { in tcp_md5sig()
279 md5sig.tcpm_prefixlen = args->prefix_len; in tcp_md5sig()
280 addr = &args->md5_prefix; in tcp_md5sig()
284 if ((args->ifindex && args->bind_key_ifindex >= 0) || args->bind_key_ifindex >= 1) { in tcp_md5sig()
288 md5sig.tcpm_ifindex = args->ifindex; in tcp_md5sig()
317 switch (args->version) { in tcp_md5_remote()
319 sin.sin_port = htons(args->port); in tcp_md5_remote()
320 sin.sin_addr = args->md5_prefix.v4.sin_addr; in tcp_md5_remote()
325 sin6.sin6_port = htons(args->port); in tcp_md5_remote()
326 sin6.sin6_addr = args->md5_prefix.v6.sin6_addr; in tcp_md5_remote()
336 return -1; in tcp_md5_remote()
347 return -1; in get_ifidx()
356 return -1; in get_ifidx()
363 return -1; in get_ifidx()
406 if (!args->expected_ifindex) in check_device()
409 if (args->expected_ifindex != ifindex) { in check_device()
411 args->expected_ifindex, ifindex); in check_device()
416 args->expected_ifindex, ifindex); in check_device()
427 if (rc < 0 && rc != -ENOTSUP) in set_pktinfo_v4()
439 if (rc < 0 && rc != -ENOTSUP) in set_recvpktinfo_v6()
451 if (rc < 0 && rc != -ENOTSUP) in set_recverr_v4()
463 if (rc < 0 && rc != -ENOTSUP) in set_recverr_v6()
508 return -1; in set_membership()
518 return -1; in set_membership()
533 rc = -1; in set_freebind()
539 rc = -1; in set_freebind()
554 rc = -1; in set_broadcast()
567 rc = -1; in set_reuseport()
580 rc = -1; in set_reuseaddr()
596 return -1; in set_dsfield()
604 return -1; in set_dsfield()
610 return -1; in set_dsfield()
622 return -1; in set_dontroute()
645 return -1; in str_to_uint()
650 if (args->dev) { in resolve_devices()
651 args->ifindex = get_ifidx(args->dev); in resolve_devices()
652 if (args->ifindex < 0) { in resolve_devices()
658 if (args->expected_dev) { in resolve_devices()
661 if (str_to_uint(args->expected_dev, 0, INT_MAX, &tmp) == 0) { in resolve_devices()
662 args->expected_ifindex = (int)tmp; in resolve_devices()
664 args->expected_ifindex = get_ifidx(args->expected_dev); in resolve_devices()
665 if (args->expected_ifindex < 0) { in resolve_devices()
681 if (sa->sa_family == AF_INET) { in expected_addr_match()
685 if (s->sin_addr.s_addr != exp_in->s_addr) { in expected_addr_match()
692 } else if (sa->sa_family == AF_INET6) { in expected_addr_match()
696 if (memcmp(&s6->sin6_addr, exp_in, sizeof(*exp_in))) { in expected_addr_match()
704 log_error("%s address does not match expected - unknown family\n", in expected_addr_match()
728 if (args->has_expected_laddr) { in show_sockstat()
729 rc = expected_addr_match(sa, &args->expected_laddr, in show_sockstat()
741 if (args->has_expected_raddr) { in show_sockstat()
742 rc |= expected_addr_match(sa, &args->expected_raddr, in show_sockstat()
764 int pfx_len_max = args->version == AF_INET6 ? 128 : 32; in convert_addr()
765 int family = args->version; in convert_addr()
775 return -ENOMEM; in convert_addr()
780 addr = &args->local_addr; in convert_addr()
784 addr = &args->remote_addr; in convert_addr()
788 addr = &args->grp; in convert_addr()
792 addr = &args->expected_laddr; in convert_addr()
796 addr = &args->expected_raddr; in convert_addr()
801 args->md5_prefix.v4.sin_family = AF_INET; in convert_addr()
802 addr = &args->md5_prefix.v4.sin_addr; in convert_addr()
804 args->md5_prefix.v6.sin6_family = AF_INET6; in convert_addr()
805 addr = &args->md5_prefix.v6.sin6_addr; in convert_addr()
814 &args->prefix_len) != 0) { in convert_addr()
819 args->prefix_len = 0; in convert_addr()
832 log_error("Invalid %s IP address\n", desc); in convert_addr()
833 rc = -1; in convert_addr()
837 in->s_addr = htonl(INADDR_ANY); in convert_addr()
852 rc = -1; in convert_addr()
859 args->scope_id = get_ifidx(dev); in convert_addr()
860 if (args->scope_id < 0) { in convert_addr()
863 rc = -1; in convert_addr()
880 if (args->local_addr_str && in validate_addresses()
881 convert_addr(args, args->local_addr_str, ADDR_TYPE_LOCAL) < 0) in validate_addresses()
884 if (args->remote_addr_str && in validate_addresses()
885 convert_addr(args, args->remote_addr_str, ADDR_TYPE_REMOTE) < 0) in validate_addresses()
888 if (args->md5_prefix_str && in validate_addresses()
889 convert_addr(args, args->md5_prefix_str, in validate_addresses()
893 if (args->expected_laddr_str && in validate_addresses()
894 convert_addr(args, args->expected_laddr_str, in validate_addresses()
898 if (args->expected_raddr_str && in validate_addresses()
899 convert_addr(args, args->expected_raddr_str, in validate_addresses()
913 m->msg_controllen != 0 && cm; in get_index_from_cmsg()
916 if (cm->cmsg_level == SOL_IP && in get_index_from_cmsg()
917 cm->cmsg_type == IP_PKTINFO) { in get_index_from_cmsg()
921 inet_ntop(AF_INET, &pi->ipi_addr, buf, sizeof(buf)); in get_index_from_cmsg()
922 ifindex = pi->ipi_ifindex; in get_index_from_cmsg()
923 } else if (cm->cmsg_level == SOL_IPV6 && in get_index_from_cmsg()
924 cm->cmsg_type == IPV6_PKTINFO) { in get_index_from_cmsg()
928 inet_ntop(AF_INET6, &pi6->ipi6_addr, buf, sizeof(buf)); in get_index_from_cmsg()
929 ifindex = pi6->ipi6_ifindex; in get_index_from_cmsg()
984 cm->cmsg_level = SOL_IP; in send_msg_cmsg()
985 cm->cmsg_type = IP_PKTINFO; in send_msg_cmsg()
986 cm->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo)); in send_msg_cmsg()
988 pi->ipi_ifindex = ifindex; in send_msg_cmsg()
990 m.msg_controllen = cm->cmsg_len; in send_msg_cmsg()
995 cm->cmsg_level = SOL_IPV6; in send_msg_cmsg()
996 cm->cmsg_type = IPV6_PKTINFO; in send_msg_cmsg()
997 cm->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo)); in send_msg_cmsg()
1000 pi6->ipi6_ifindex = ifindex; in send_msg_cmsg()
1002 m.msg_controllen = cm->cmsg_len; in send_msg_cmsg()
1025 if (args->type == SOCK_STREAM) { in send_msg()
1030 } else if (args->datagram_connect) { in send_msg()
1035 } else if (args->ifindex && args->use_cmsg) { in send_msg()
1036 if (send_msg_cmsg(sd, addr, alen, args->ifindex, args->version)) in send_msg()
1081 return -1; in socket_read_dgram()
1090 if (args->expected_ifindex) { in socket_read_dgram()
1091 if (args->expected_ifindex != ifindex) { in socket_read_dgram()
1093 args->expected_ifindex, ifindex); in socket_read_dgram()
1094 return -1; in socket_read_dgram()
1097 args->expected_ifindex, ifindex); in socket_read_dgram()
1101 if (sa->sa_family == AF_INET6) { in socket_read_dgram()
1103 struct in6_addr *in6 = &s6->sin6_addr; in socket_read_dgram()
1106 const uint32_t *pa = (uint32_t *) &in6->s6_addr; in socket_read_dgram()
1113 sin->sin_addr = in4; in socket_read_dgram()
1114 sin->sin_family = AF_INET; in socket_read_dgram()
1123 if (args->version == AF_INET6) { in socket_read_dgram()
1126 if (args->dev) { in socket_read_dgram()
1136 s6->sin6_scope_id = ifindex; in socket_read_dgram()
1161 return -1; in socket_read_dgram()
1169 len = read(sd, buf, sizeof(buf)-1); in socket_read_stream()
1175 return -1; in socket_read_stream()
1185 return -1; in socket_read_stream()
1196 if (args->type == SOCK_STREAM) in socket_read()
1214 return -1; in stdin_to_socket()
1229 return -1; in stdin_to_socket()
1257 if (args->type != SOCK_STREAM) in msg_loop()
1258 set_recv_attr(sd, args->version); in msg_loop()
1309 if (stdin_to_socket(sd, args->type, addr, alen) <= 0) in msg_loop()
1316 if (iter != -1) { in msg_loop()
1317 --iter; in msg_loop()
1341 .sin_port = htons(args->port), in msock_init()
1346 if (!server && args->has_local_ip) in msock_init()
1347 if_addr = args->local_addr.in.s_addr; in msock_init()
1352 return -1; in msock_init()
1365 if (set_dsfield(sd, AF_INET, args->dsfield) != 0) in msock_init()
1369 if (args->server_dontroute && set_dontroute(sd) != 0) in msock_init()
1372 if (args->client_dontroute && set_dontroute(sd) != 0) in msock_init()
1376 if (args->dev && bind_to_device(sd, args->dev) != 0) in msock_init()
1378 else if (args->use_setsockopt && in msock_init()
1379 set_multicast_if(sd, args->ifindex)) in msock_init()
1390 set_membership(sd, args->grp.s_addr, in msock_init()
1391 args->local_addr.in.s_addr, args->ifindex)) in msock_init()
1397 return -1; in msock_init()
1421 if (!args->has_local_ip && args->type == SOCK_RAW) in bind_socket()
1424 switch (args->version) { in bind_socket()
1426 serv_addr.sin_port = htons(args->port); in bind_socket()
1427 serv_addr.sin_addr = args->local_addr.in; in bind_socket()
1433 serv6_addr.sin6_port = htons(args->port); in bind_socket()
1434 serv6_addr.sin6_addr = args->local_addr.in6; in bind_socket()
1441 return -1; in bind_socket()
1446 return -1; in bind_socket()
1459 if (args->type != SOCK_DGRAM) { in config_xfrm_policy()
1465 policy.sel.family = args->version; in config_xfrm_policy()
1466 if (args->version == AF_INET6) { in config_xfrm_policy()
1492 sd = socket(args->version, args->type, args->protocol); in lsock_init()
1495 return -1; in lsock_init()
1504 if (set_dsfield(sd, args->version, args->dsfield) != 0) in lsock_init()
1507 if (args->server_dontroute && set_dontroute(sd) != 0) in lsock_init()
1510 if (args->dev && bind_to_device(sd, args->dev) != 0) in lsock_init()
1512 else if (args->use_setsockopt && in lsock_init()
1513 set_unicast_if(sd, args->ifindex, args->version)) in lsock_init()
1516 if (args->use_freebind && set_freebind(sd, args->version)) in lsock_init()
1522 if (args->bind_test_only) in lsock_init()
1525 if (args->type == SOCK_STREAM && listen(sd, 1) < 0) { in lsock_init()
1532 log_err_errno("Failed to set non-blocking option"); in lsock_init()
1537 log_err_errno("Failed to set close-on-exec flag"); in lsock_init()
1539 if (args->use_xfrm && config_xfrm_policy(sd, args)) { in lsock_init()
1549 return -1; in lsock_init()
1564 /* ipc_fd = -1 if no parent process to signal */ in do_server()
1568 int lsd, csd = -1; in do_server()
1573 if (args->serverns) { in do_server()
1574 if (switch_ns(args->serverns)) { in do_server()
1576 args->serverns); in do_server()
1582 args->dev = args->server_dev; in do_server()
1583 args->expected_dev = args->expected_server_dev; in do_server()
1590 if (args->has_grp) in do_server()
1598 if (args->bind_test_only) { in do_server()
1604 if (args->type != SOCK_STREAM) { in do_server()
1611 if (args->password && tcp_md5_remote(lsd, args)) { in do_server()
1684 return -2; in wait_for_connect()
1687 return -3; in wait_for_connect()
1692 return -4; in wait_for_connect()
1697 return -1; in wait_for_connect()
1705 int sd, rc = -1; in connectsock()
1708 sd = socket(args->version, args->type, args->protocol); in connectsock()
1711 return -1; in connectsock()
1716 log_err_errno("Failed to set non-blocking option"); in connectsock()
1723 if (set_dsfield(sd, args->version, args->dsfield) != 0) in connectsock()
1726 if (args->client_dontroute && set_dontroute(sd) != 0) in connectsock()
1729 if (args->dev && bind_to_device(sd, args->dev) != 0) in connectsock()
1731 else if (args->use_setsockopt && in connectsock()
1732 set_unicast_if(sd, args->ifindex, args->version)) in connectsock()
1735 if (args->has_local_ip && bind_socket(sd, args)) in connectsock()
1738 if (args->type != SOCK_STREAM && !args->datagram_connect) in connectsock()
1741 if (args->password && tcp_md5sig(sd, addr, alen, args)) in connectsock()
1744 if (args->bind_test_only) in connectsock()
1750 rc = -1; in connectsock()
1778 if (!args->has_remote_ip && !args->has_grp) { in do_client()
1779 fprintf(stderr, "remote IP or multicast group not given\n"); in do_client()
1783 if (args->clientns) { in do_client()
1784 if (switch_ns(args->clientns)) { in do_client()
1786 args->clientns); in do_client()
1792 args->local_addr_str = args->client_local_addr_str; in do_client()
1796 if ((args->use_setsockopt || args->use_cmsg) && !args->ifindex) { in do_client()
1800 if (args->use_setsockopt || args->use_cmsg) in do_client()
1801 args->dev = NULL; in do_client()
1803 switch (args->version) { in do_client()
1805 sin.sin_port = htons(args->port); in do_client()
1806 if (args->has_grp) in do_client()
1807 sin.sin_addr = args->grp; in do_client()
1809 sin.sin_addr = args->remote_addr.in; in do_client()
1814 sin6.sin6_port = htons(args->port); in do_client()
1815 sin6.sin6_addr = args->remote_addr.in6; in do_client()
1816 sin6.sin6_scope_id = args->scope_id; in do_client()
1822 args->password = args->client_pw; in do_client()
1824 if (args->has_grp) in do_client()
1830 return -sd; in do_client()
1832 if (args->bind_test_only) in do_client()
1835 if (args->type == SOCK_STREAM) { in do_client()
1862 i = snprintf(m + n, olen - n, "%.26s", in random_msg()
1865 len -= i; in random_msg()
1868 snprintf(m + n, olen - n, "%.*s", len, in random_msg()
1893 args->has_expected_laddr = 0; in ipc_child()
1894 args->has_expected_raddr = 0; in ipc_child()
1911 /* do the client-side function here in the parent process, in ipc_parent()
1941 {"force-bind-key-ifindex", 0, 0, OPT_FORCE_BIND_KEY_IFINDEX},
1942 {"no-bind-key-ifindex", 0, 0, OPT_NO_BIND_KEY_IFINDEX},
1943 {"client-dontroute", 0, 0, OPT_CLIENT_DONTROUTE},
1944 {"server-dontroute", 0, 0, OPT_SERVER_DONTROUTE},
1953 " -r addr remote address to connect to (client mode only)\n" in print_usage()
1954 " -p port port to connect to (client mode)/listen on (server mode)\n" in print_usage()
1956 " -s server mode (default: client mode)\n" in print_usage()
1957 " -t timeout seconds (default: none)\n" in print_usage()
1960 " -B do both client and server via fork and IPC\n" in print_usage()
1961 " -N ns set client to network namespace ns (requires root)\n" in print_usage()
1962 " -O ns set server to network namespace ns (requires root)\n" in print_usage()
1963 " -F Restart server loop\n" in print_usage()
1964 " -6 IPv6 (default is IPv4)\n" in print_usage()
1965 " -P proto protocol for socket: icmp, ospf (default: none)\n" in print_usage()
1966 " -D|R datagram (D) / raw (R) socket (default stream)\n" in print_usage()
1967 " -l addr local address to bind to in server mode\n" in print_usage()
1968 " -c addr local address to bind to in client mode\n" in print_usage()
1969 " -Q dsfield DS Field value of the socket (the IP_TOS or\n" in print_usage()
1971 " -x configure XFRM policy on socket\n" in print_usage()
1973 " -d dev bind socket to given device name\n" in print_usage()
1974 " -I dev bind socket to given device name - server mode\n" in print_usage()
1975 " -S use setsockopt (IP_UNICAST_IF or IP_MULTICAST_IF)\n" in print_usage()
1977 " -U Use connect() and send() for datagram sockets\n" in print_usage()
1978 " -f bind socket with the IP[V6]_FREEBIND option\n" in print_usage()
1979 " -C use cmsg and IP_PKTINFO to specify device binding\n" in print_usage()
1981 " -L len send random message of given length\n" in print_usage()
1982 " -n num number of times to send message\n" in print_usage()
1984 " -M password use MD5 sum protection\n" in print_usage()
1985 " -X password MD5 password for client mode\n" in print_usage()
1986 " -m prefix/len prefix and length to use for MD5 key\n" in print_usage()
1987 " --no-bind-key-ifindex: Force TCP_MD5SIG_FLAG_IFINDEX off\n" in print_usage()
1988 " --force-bind-key-ifindex: Force TCP_MD5SIG_FLAG_IFINDEX on\n" in print_usage()
1989 " (default: only if -I is passed)\n" in print_usage()
1990 " --client-dontroute: don't use gateways for client socket: send\n" in print_usage()
1993 " --server-dontroute: don't use gateways for server socket: send\n" in print_usage()
1997 " -g grp multicast group (e.g., 239.1.1.1)\n" in print_usage()
1998 " -i interactive mode (default is echo and terminate)\n" in print_usage()
2000 " -0 addr Expected local address\n" in print_usage()
2001 " -1 addr Expected remote address\n" in print_usage()
2002 " -2 dev Expected device name (or index) to receive packet\n" in print_usage()
2003 " -3 dev Expected device name (or index) to receive packets - server mode\n" in print_usage()
2005 " -b Bind test only.\n" in print_usage()
2006 " -q Be quiet. Run test without printing anything.\n" in print_usage()
2032 while ((rc = getopt_long(argc, argv, GETOPT_STR, long_opts, NULL)) != -1) { in main()
2088 args.protocol = pe->p_proto; in main()
2116 args.bind_key_ifindex = -1; in main()
2192 log_error("MD5 passwords apply to TCP only and require a remote ip for the password\n"); in main()
2220 "Local (server mode) or remote IP (client IP) required\n"); in main()
2248 rc = do_server(&args, -1); in main()