Skip to content

Commit

Permalink
vsock/test: add '--peer-port' input argument
Browse files Browse the repository at this point in the history
Implement port for given CID as input argument instead of using
hardcoded value '1234'. This allows to run different test instances
on a single CID. Port argument is not required parameter and if it is
not set, then default value will be '1234' - thus we preserve previous
behaviour.

Signed-off-by: Arseniy Krasnov <avkrasnov@salutedevices.com>
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Link: https://lore.kernel.org/r/20240123072750.4084181-1-avkrasnov@salutedevices.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Arseniy Krasnov authored and Jakub Kicinski committed Jan 25, 2024
1 parent 16c595a commit e18c709
Show file tree
Hide file tree
Showing 6 changed files with 115 additions and 58 deletions.
17 changes: 14 additions & 3 deletions tools/testing/vsock/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,21 +33,32 @@ void init_signals(void)
signal(SIGPIPE, SIG_IGN);
}

/* Parse a CID in string representation */
unsigned int parse_cid(const char *str)
static unsigned int parse_uint(const char *str, const char *err_str)
{
char *endptr = NULL;
unsigned long n;

errno = 0;
n = strtoul(str, &endptr, 10);
if (errno || *endptr != '\0') {
fprintf(stderr, "malformed CID \"%s\"\n", str);
fprintf(stderr, "malformed %s \"%s\"\n", err_str, str);
exit(EXIT_FAILURE);
}
return n;
}

/* Parse a CID in string representation */
unsigned int parse_cid(const char *str)
{
return parse_uint(str, "CID");
}

/* Parse a port in string representation */
unsigned int parse_port(const char *str)
{
return parse_uint(str, "port");
}

/* Wait for the remote to close the connection */
void vsock_wait_remote_close(int fd)
{
Expand Down
4 changes: 4 additions & 0 deletions tools/testing/vsock/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,13 @@ enum test_mode {
TEST_MODE_SERVER
};

#define DEFAULT_PEER_PORT 1234

/* Test runner options */
struct test_opts {
enum test_mode mode;
unsigned int peer_cid;
unsigned int peer_port;
};

/* A test case definition. Test functions must print failures to stderr and
Expand All @@ -35,6 +38,7 @@ struct test_case {

void init_signals(void);
unsigned int parse_cid(const char *str);
unsigned int parse_port(const char *str);
int vsock_stream_connect(unsigned int cid, unsigned int port);
int vsock_bind_connect(unsigned int cid, unsigned int port,
unsigned int bind_port, int type);
Expand Down
21 changes: 16 additions & 5 deletions tools/testing/vsock/vsock_diag_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,7 @@ static void test_listen_socket_server(const struct test_opts *opts)
} addr = {
.svm = {
.svm_family = AF_VSOCK,
.svm_port = 1234,
.svm_port = opts->peer_port,
.svm_cid = VMADDR_CID_ANY,
},
};
Expand Down Expand Up @@ -378,7 +378,7 @@ static void test_connect_client(const struct test_opts *opts)
LIST_HEAD(sockets);
struct vsock_stat *st;

fd = vsock_stream_connect(opts->peer_cid, 1234);
fd = vsock_stream_connect(opts->peer_cid, opts->peer_port);
if (fd < 0) {
perror("connect");
exit(EXIT_FAILURE);
Expand All @@ -403,7 +403,7 @@ static void test_connect_server(const struct test_opts *opts)
LIST_HEAD(sockets);
int client_fd;

client_fd = vsock_stream_accept(VMADDR_CID_ANY, 1234, NULL);
client_fd = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
if (client_fd < 0) {
perror("accept");
exit(EXIT_FAILURE);
Expand Down Expand Up @@ -461,6 +461,11 @@ static const struct option longopts[] = {
.has_arg = required_argument,
.val = 'p',
},
{
.name = "peer-port",
.has_arg = required_argument,
.val = 'q',
},
{
.name = "list",
.has_arg = no_argument,
Expand All @@ -481,7 +486,7 @@ static const struct option longopts[] = {

static void usage(void)
{
fprintf(stderr, "Usage: vsock_diag_test [--help] [--control-host=<host>] --control-port=<port> --mode=client|server --peer-cid=<cid> [--list] [--skip=<test_id>]\n"
fprintf(stderr, "Usage: vsock_diag_test [--help] [--control-host=<host>] --control-port=<port> --mode=client|server --peer-cid=<cid> [--peer-port=<port>] [--list] [--skip=<test_id>]\n"
"\n"
" Server: vsock_diag_test --control-port=1234 --mode=server --peer-cid=3\n"
" Client: vsock_diag_test --control-host=192.168.0.1 --control-port=1234 --mode=client --peer-cid=2\n"
Expand All @@ -503,9 +508,11 @@ static void usage(void)
" --control-port <port> Server port to listen on/connect to\n"
" --mode client|server Server or client mode\n"
" --peer-cid <cid> CID of the other side\n"
" --peer-port <port> AF_VSOCK port used for the test [default: %d]\n"
" --list List of tests that will be executed\n"
" --skip <test_id> Test ID to skip;\n"
" use multiple --skip options to skip more tests\n"
" use multiple --skip options to skip more tests\n",
DEFAULT_PEER_PORT
);
exit(EXIT_FAILURE);
}
Expand All @@ -517,6 +524,7 @@ int main(int argc, char **argv)
struct test_opts opts = {
.mode = TEST_MODE_UNSET,
.peer_cid = VMADDR_CID_ANY,
.peer_port = DEFAULT_PEER_PORT,
};

init_signals();
Expand Down Expand Up @@ -544,6 +552,9 @@ int main(int argc, char **argv)
case 'p':
opts.peer_cid = parse_cid(optarg);
break;
case 'q':
opts.peer_port = parse_port(optarg);
break;
case 'P':
control_port = optarg;
break;
Expand Down
Loading

0 comments on commit e18c709

Please sign in to comment.