From: Willem de Bruijn <will...@google.com> Allow running the test across two machines, to test nic hw offload.
Add options -A: receiver address -r: receive only -t: transmit only -T: SO_RCVTIMEO value Signed-off-by: Willem de Bruijn <will...@google.com> --- tools/testing/selftests/net/so_txtime.c | 60 ++++++++++++++++++++----- 1 file changed, 48 insertions(+), 12 deletions(-) diff --git a/tools/testing/selftests/net/so_txtime.c b/tools/testing/selftests/net/so_txtime.c index 383bac05ac32..fa748e4209c0 100644 --- a/tools/testing/selftests/net/so_txtime.c +++ b/tools/testing/selftests/net/so_txtime.c @@ -28,9 +28,13 @@ #include <time.h> #include <unistd.h> +static const char *cfg_addr; static int cfg_clockid = CLOCK_TAI; static bool cfg_do_ipv4; static bool cfg_do_ipv6; +static bool cfg_rxonly; +static int cfg_timeout_sec; +static bool cfg_txonly; static uint16_t cfg_port = 8000; static int cfg_variance_us = 4000; @@ -238,8 +242,12 @@ static int setup_rx(struct sockaddr *addr, socklen_t alen) if (fd == -1) error(1, errno, "socket r"); - if (bind(fd, addr, alen)) - error(1, errno, "bind"); + if (!cfg_txonly) + if (bind(fd, addr, alen)) + error(1, errno, "bind"); + + if (cfg_timeout_sec) + tv.tv_sec = cfg_timeout_sec; if (setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv))) error(1, errno, "setsockopt rcv timeout"); @@ -260,13 +268,18 @@ static void do_test(struct sockaddr *addr, socklen_t alen) glob_tstart = gettime_ns(); - for (i = 0; i < cfg_num_pkt; i++) - do_send_one(fdt, &cfg_in[i]); - for (i = 0; i < cfg_num_pkt; i++) - if (do_recv_one(fdr, &cfg_out[i])) - do_recv_errqueue_timeout(fdt); + if (!cfg_rxonly) { + for (i = 0; i < cfg_num_pkt; i++) + do_send_one(fdt, &cfg_in[i]); + } - do_recv_verify_empty(fdr); + if (!cfg_txonly) { + for (i = 0; i < cfg_num_pkt; i++) + if (do_recv_one(fdr, &cfg_out[i])) + do_recv_errqueue_timeout(fdt); + + do_recv_verify_empty(fdr); + } if (close(fdr)) error(1, errno, "close r"); @@ -308,7 +321,7 @@ static void parse_opts(int argc, char **argv) { int c, ilen, olen; - while ((c = getopt(argc, argv, "46c:")) != -1) { + while ((c = getopt(argc, argv, "46A:c:rtT:")) != -1) { switch (c) { case '4': cfg_do_ipv4 = true; @@ -316,6 +329,9 @@ static void parse_opts(int argc, char **argv) case '6': cfg_do_ipv6 = true; break; + case 'A': + cfg_addr = optarg; + break; case 'c': if (!strcmp(optarg, "tai")) cfg_clockid = CLOCK_TAI; @@ -325,13 +341,27 @@ static void parse_opts(int argc, char **argv) else error(1, 0, "unknown clock id %s", optarg); break; + case 'r': + cfg_rxonly = true; + break; + case 't': + cfg_txonly = true; + break; + case 'T': + cfg_timeout_sec = strtol(optarg, NULL, 0); + break; default: error(1, 0, "parse error at %d", optind); } } if (argc - optind != 2) - error(1, 0, "Usage: %s [-46] -c <clock> <in> <out>", argv[0]); + error(1, 0, "Usage: %s [-46rt] [-A addr] [-c clock] [-T timeout] <in> <out>", argv[0]); + + if (cfg_rxonly && cfg_txonly) + error(1, 0, "Select rx-only or tx-only, not both"); + if (cfg_addr && cfg_do_ipv4 && cfg_do_ipv6) + error(1, 0, "Cannot run both IPv4 and IPv6 when passing address"); ilen = parse_io(argv[optind], cfg_in); olen = parse_io(argv[optind + 1], cfg_out); @@ -349,7 +379,10 @@ int main(int argc, char **argv) addr6.sin6_family = AF_INET6; addr6.sin6_port = htons(cfg_port); - addr6.sin6_addr = in6addr_loopback; + if (!cfg_addr) + addr6.sin6_addr = in6addr_loopback; + else if (inet_pton(AF_INET6, cfg_addr, &addr6.sin6_addr) != 1) + error(1, 0, "ipv6 parse error: %s", cfg_addr); cfg_errq_level = SOL_IPV6; cfg_errq_type = IPV6_RECVERR; @@ -362,7 +395,10 @@ int main(int argc, char **argv) addr4.sin_family = AF_INET; addr4.sin_port = htons(cfg_port); - addr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + if (!cfg_addr) + addr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + else if (inet_pton(AF_INET, cfg_addr, &addr4.sin_addr) != 1) + error(1, 0, "ipv4 parse error: %s", cfg_addr); cfg_errq_level = SOL_IP; cfg_errq_type = IP_RECVERR; -- 2.27.0.278.ge193c7cf3a9-goog