Skip to content

Commit

Permalink
tools: testing: vsock: Test when server is bound but not listening
Browse files Browse the repository at this point in the history
Whenever the server side of vsock is binding to the socket, but not
listening yet, we expect the behavior from the client to be identical to
what happens when the server is not even started.

This new test runs the server side so that it binds to the socket
without ever listening to it. The client side will try to connect and
should receive an ECONNRESET error.

This new test provides a way to validate the previously introduced patch
for making sure the server side will always answer with a RST packet in
case the client requested a new connection.

Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Sebastien Boeuf authored and David S. Miller committed Feb 17, 2020
1 parent df12eb6 commit 9de9f7d
Showing 1 changed file with 77 additions and 0 deletions.
77 changes: 77 additions & 0 deletions tools/testing/vsock/vsock_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,78 @@ static void test_stream_connection_reset(const struct test_opts *opts)
close(fd);
}

static void test_stream_bind_only_client(const struct test_opts *opts)
{
union {
struct sockaddr sa;
struct sockaddr_vm svm;
} addr = {
.svm = {
.svm_family = AF_VSOCK,
.svm_port = 1234,
.svm_cid = opts->peer_cid,
},
};
int ret;
int fd;

/* Wait for the server to be ready */
control_expectln("BIND");

fd = socket(AF_VSOCK, SOCK_STREAM, 0);

timeout_begin(TIMEOUT);
do {
ret = connect(fd, &addr.sa, sizeof(addr.svm));
timeout_check("connect");
} while (ret < 0 && errno == EINTR);
timeout_end();

if (ret != -1) {
fprintf(stderr, "expected connect(2) failure, got %d\n", ret);
exit(EXIT_FAILURE);
}
if (errno != ECONNRESET) {
fprintf(stderr, "unexpected connect(2) errno %d\n", errno);
exit(EXIT_FAILURE);
}

/* Notify the server that the client has finished */
control_writeln("DONE");

close(fd);
}

static void test_stream_bind_only_server(const struct test_opts *opts)
{
union {
struct sockaddr sa;
struct sockaddr_vm svm;
} addr = {
.svm = {
.svm_family = AF_VSOCK,
.svm_port = 1234,
.svm_cid = VMADDR_CID_ANY,
},
};
int fd;

fd = socket(AF_VSOCK, SOCK_STREAM, 0);

if (bind(fd, &addr.sa, sizeof(addr.svm)) < 0) {
perror("bind");
exit(EXIT_FAILURE);
}

/* Notify the client that the server is ready */
control_writeln("BIND");

/* Wait for the client to finish */
control_expectln("DONE");

close(fd);
}

static void test_stream_client_close_client(const struct test_opts *opts)
{
int fd;
Expand Down Expand Up @@ -212,6 +284,11 @@ static struct test_case test_cases[] = {
.name = "SOCK_STREAM connection reset",
.run_client = test_stream_connection_reset,
},
{
.name = "SOCK_STREAM bind only",
.run_client = test_stream_bind_only_client,
.run_server = test_stream_bind_only_server,
},
{
.name = "SOCK_STREAM client close",
.run_client = test_stream_client_close_client,
Expand Down

0 comments on commit 9de9f7d

Please sign in to comment.