Skip to content

Commit

Permalink
selftests: Move device validation in nettest
Browse files Browse the repository at this point in the history
Later patch adds support for switching network namespaces before
running client, server or both. Device validations need to be
done after the network namespace switch, so add a helper to do it
and invoke in server and client code versus inline with argument
parsing. Move related argument checks as well.

Signed-off-by: David Ahern <[email protected]>
Signed-off-by: Jakub Kicinski <[email protected]>
  • Loading branch information
dsahern authored and kuba-moo committed Jan 15, 2021
1 parent c010372 commit 3a70a64
Showing 1 changed file with 42 additions and 22 deletions.
64 changes: 42 additions & 22 deletions tools/testing/selftests/net/nettest.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ struct sock_args {
unsigned int prefix_len;

/* expected addresses and device index for connection */
const char *expected_dev;
int expected_ifindex;

/* local address */
Expand Down Expand Up @@ -522,6 +523,33 @@ static int str_to_uint(const char *str, int min, int max, unsigned int *value)
return -1;
}

static int resolve_devices(struct sock_args *args)
{
if (args->dev) {
args->ifindex = get_ifidx(args->dev);
if (args->ifindex < 0) {
log_error("Invalid device name\n");
return 1;
}
}

if (args->expected_dev) {
unsigned int tmp;

if (str_to_uint(args->expected_dev, 0, INT_MAX, &tmp) == 0) {
args->expected_ifindex = (int)tmp;
} else {
args->expected_ifindex = get_ifidx(args->expected_dev);
if (args->expected_ifindex < 0) {
fprintf(stderr, "Invalid expected device\n");
return 1;
}
}
}

return 0;
}

static int expected_addr_match(struct sockaddr *sa, void *expected,
const char *desc)
{
Expand Down Expand Up @@ -1190,6 +1218,9 @@ static int do_server(struct sock_args *args)
fd_set rfds;
int rc;

if (resolve_devices(args))
return 1;

if (prog_timeout)
ptval = &timeout;

Expand Down Expand Up @@ -1375,6 +1406,16 @@ static int do_client(struct sock_args *args)
return 1;
}

if (resolve_devices(args))
return 1;

if ((args->use_setsockopt || args->use_cmsg) && !args->ifindex) {
fprintf(stderr, "Device binding not specified\n");
return 1;
}
if (args->use_setsockopt || args->use_cmsg)
args->dev = NULL;

switch (args->version) {
case AF_INET:
sin.sin_port = htons(args->port);
Expand Down Expand Up @@ -1703,11 +1744,6 @@ int main(int argc, char *argv[])
break;
case 'd':
args.dev = optarg;
args.ifindex = get_ifidx(optarg);
if (args.ifindex < 0) {
fprintf(stderr, "Invalid device name\n");
return 1;
}
break;
case 'i':
interactive = 1;
Expand Down Expand Up @@ -1738,16 +1774,7 @@ int main(int argc, char *argv[])

break;
case '2':
if (str_to_uint(optarg, 0, INT_MAX, &tmp) == 0) {
args.expected_ifindex = (int)tmp;
} else {
args.expected_ifindex = get_ifidx(optarg);
if (args.expected_ifindex < 0) {
fprintf(stderr,
"Invalid expected device\n");
return 1;
}
}
args.expected_dev = optarg;
break;
case 'q':
quiet = 1;
Expand All @@ -1769,13 +1796,6 @@ int main(int argc, char *argv[])
return 1;
}

if ((args.use_setsockopt || args.use_cmsg) && !args.ifindex) {
fprintf(stderr, "Device binding not specified\n");
return 1;
}
if (args.use_setsockopt || args.use_cmsg)
args.dev = NULL;

if (iter == 0) {
fprintf(stderr, "Invalid number of messages to send\n");
return 1;
Expand Down

0 comments on commit 3a70a64

Please sign in to comment.