[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20200609140934.110785-5-willemdebruijn.kernel@gmail.com>
Date: Tue, 9 Jun 2020 10:09:32 -0400
From: Willem de Bruijn <willemdebruijn.kernel@...il.com>
To: netdev@...r.kernel.org
Cc: Willem de Bruijn <willemb@...gle.com>
Subject: [PATCH RFC net-next 4/6] selftests/net: so_txtime: support txonly/rxonly modes
From: Willem de Bruijn <willemb@...gle.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 <willemb@...gle.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
Powered by blists - more mailing lists