All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arseny Krasnov <arseny.krasnov@kaspersky.com>
To: Stefan Hajnoczi <stefanha@redhat.com>,
	Stefano Garzarella <sgarzare@redhat.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	Jason Wang <jasowang@redhat.com>,
	"David S. Miller" <davem@davemloft.net>,
	Jakub Kicinski <kuba@kernel.org>,
	Arseny Krasnov <arseny.krasnov@kaspersky.com>,
	Jorgen Hansen <jhansen@vmware.com>,
	Colin Ian King <colin.king@canonical.com>,
	Norbert Slusarek <nslusarek@gmx.net>,
	Andra Paraschiv <andraprs@amazon.com>
Cc: <kvm@vger.kernel.org>,
	<virtualization@lists.linux-foundation.org>,
	<netdev@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<oxffffaa@gmail.com>
Subject: [PATCH v10 17/18] vsock_test: add SOCK_SEQPACKET tests
Date: Thu, 20 May 2021 22:19:50 +0300	[thread overview]
Message-ID: <20210520191953.1272798-1-arseny.krasnov@kaspersky.com> (raw)
In-Reply-To: <20210520191357.1270473-1-arseny.krasnov@kaspersky.com>

Implement two tests of SOCK_SEQPACKET socket: first sends data by
several 'write()'s and checks that number of 'read()' were same.
Second test checks MSG_TRUNC flag. Cases for connect(), bind(),
etc. are not tested, because it is same as for stream socket.

Signed-off-by: Arseny Krasnov <arseny.krasnov@kaspersky.com>
---
 v9 -> v10:
 1) Commit message updated.
 2) Add second test for message bounds.

 tools/testing/vsock/util.c       |  32 +++++++--
 tools/testing/vsock/util.h       |   3 +
 tools/testing/vsock/vsock_test.c | 116 +++++++++++++++++++++++++++++++
 3 files changed, 146 insertions(+), 5 deletions(-)

diff --git a/tools/testing/vsock/util.c b/tools/testing/vsock/util.c
index 93cbd6f603f9..2acbb7703c6a 100644
--- a/tools/testing/vsock/util.c
+++ b/tools/testing/vsock/util.c
@@ -84,7 +84,7 @@ void vsock_wait_remote_close(int fd)
 }
 
 /* Connect to <cid, port> and return the file descriptor. */
-int vsock_stream_connect(unsigned int cid, unsigned int port)
+static int vsock_connect(unsigned int cid, unsigned int port, int type)
 {
 	union {
 		struct sockaddr sa;
@@ -101,7 +101,7 @@ int vsock_stream_connect(unsigned int cid, unsigned int port)
 
 	control_expectln("LISTENING");
 
-	fd = socket(AF_VSOCK, SOCK_STREAM, 0);
+	fd = socket(AF_VSOCK, type, 0);
 
 	timeout_begin(TIMEOUT);
 	do {
@@ -120,11 +120,21 @@ int vsock_stream_connect(unsigned int cid, unsigned int port)
 	return fd;
 }
 
+int vsock_stream_connect(unsigned int cid, unsigned int port)
+{
+	return vsock_connect(cid, port, SOCK_STREAM);
+}
+
+int vsock_seqpacket_connect(unsigned int cid, unsigned int port)
+{
+	return vsock_connect(cid, port, SOCK_SEQPACKET);
+}
+
 /* Listen on <cid, port> and return the first incoming connection.  The remote
  * address is stored to clientaddrp.  clientaddrp may be NULL.
  */
-int vsock_stream_accept(unsigned int cid, unsigned int port,
-			struct sockaddr_vm *clientaddrp)
+static int vsock_accept(unsigned int cid, unsigned int port,
+			struct sockaddr_vm *clientaddrp, int type)
 {
 	union {
 		struct sockaddr sa;
@@ -145,7 +155,7 @@ int vsock_stream_accept(unsigned int cid, unsigned int port,
 	int client_fd;
 	int old_errno;
 
-	fd = socket(AF_VSOCK, SOCK_STREAM, 0);
+	fd = socket(AF_VSOCK, type, 0);
 
 	if (bind(fd, &addr.sa, sizeof(addr.svm)) < 0) {
 		perror("bind");
@@ -189,6 +199,18 @@ int vsock_stream_accept(unsigned int cid, unsigned int port,
 	return client_fd;
 }
 
+int vsock_stream_accept(unsigned int cid, unsigned int port,
+			struct sockaddr_vm *clientaddrp)
+{
+	return vsock_accept(cid, port, clientaddrp, SOCK_STREAM);
+}
+
+int vsock_seqpacket_accept(unsigned int cid, unsigned int port,
+			   struct sockaddr_vm *clientaddrp)
+{
+	return vsock_accept(cid, port, clientaddrp, SOCK_SEQPACKET);
+}
+
 /* Transmit one byte and check the return value.
  *
  * expected_ret:
diff --git a/tools/testing/vsock/util.h b/tools/testing/vsock/util.h
index e53dd09d26d9..a3375ad2fb7f 100644
--- a/tools/testing/vsock/util.h
+++ b/tools/testing/vsock/util.h
@@ -36,8 +36,11 @@ struct test_case {
 void init_signals(void);
 unsigned int parse_cid(const char *str);
 int vsock_stream_connect(unsigned int cid, unsigned int port);
+int vsock_seqpacket_connect(unsigned int cid, unsigned int port);
 int vsock_stream_accept(unsigned int cid, unsigned int port,
 			struct sockaddr_vm *clientaddrp);
+int vsock_seqpacket_accept(unsigned int cid, unsigned int port,
+			   struct sockaddr_vm *clientaddrp);
 void vsock_wait_remote_close(int fd);
 void send_byte(int fd, int expected_ret, int flags);
 void recv_byte(int fd, int expected_ret, int flags);
diff --git a/tools/testing/vsock/vsock_test.c b/tools/testing/vsock/vsock_test.c
index 5a4fb80fa832..67766bfe176f 100644
--- a/tools/testing/vsock/vsock_test.c
+++ b/tools/testing/vsock/vsock_test.c
@@ -14,6 +14,8 @@
 #include <errno.h>
 #include <unistd.h>
 #include <linux/kernel.h>
+#include <sys/types.h>
+#include <sys/socket.h>
 
 #include "timeout.h"
 #include "control.h"
@@ -279,6 +281,110 @@ static void test_stream_msg_peek_server(const struct test_opts *opts)
 	close(fd);
 }
 
+#define MESSAGES_CNT 7
+static void test_seqpacket_msg_bounds_client(const struct test_opts *opts)
+{
+	int fd;
+
+	fd = vsock_seqpacket_connect(opts->peer_cid, 1234);
+	if (fd < 0) {
+		perror("connect");
+		exit(EXIT_FAILURE);
+	}
+
+	/* Send several messages, one with MSG_EOR flag */
+	for (int i = 0; i < MESSAGES_CNT; i++)
+		send_byte(fd, 1, 0);
+
+	control_writeln("SENDDONE");
+	close(fd);
+}
+
+static void test_seqpacket_msg_bounds_server(const struct test_opts *opts)
+{
+	int fd;
+	char buf[16];
+	struct msghdr msg = {0};
+	struct iovec iov = {0};
+
+	fd = vsock_seqpacket_accept(VMADDR_CID_ANY, 1234, NULL);
+	if (fd < 0) {
+		perror("accept");
+		exit(EXIT_FAILURE);
+	}
+
+	control_expectln("SENDDONE");
+	iov.iov_base = buf;
+	iov.iov_len = sizeof(buf);
+	msg.msg_iov = &iov;
+	msg.msg_iovlen = 1;
+
+	for (int i = 0; i < MESSAGES_CNT; i++) {
+		if (recvmsg(fd, &msg, 0) != 1) {
+			perror("message bound violated");
+			exit(EXIT_FAILURE);
+		}
+	}
+
+	close(fd);
+}
+
+#define MESSAGE_TRUNC_SZ 32
+static void test_seqpacket_msg_trunc_client(const struct test_opts *opts)
+{
+	int fd;
+	char buf[MESSAGE_TRUNC_SZ];
+
+	fd = vsock_seqpacket_connect(opts->peer_cid, 1234);
+	if (fd < 0) {
+		perror("connect");
+		exit(EXIT_FAILURE);
+	}
+
+	if (send(fd, buf, sizeof(buf), 0) != sizeof(buf)) {
+		perror("send failed");
+		exit(EXIT_FAILURE);
+	}
+
+	control_writeln("SENDDONE");
+	close(fd);
+}
+
+static void test_seqpacket_msg_trunc_server(const struct test_opts *opts)
+{
+	int fd;
+	char buf[MESSAGE_TRUNC_SZ / 2];
+	struct msghdr msg = {0};
+	struct iovec iov = {0};
+
+	fd = vsock_seqpacket_accept(VMADDR_CID_ANY, 1234, NULL);
+	if (fd < 0) {
+		perror("accept");
+		exit(EXIT_FAILURE);
+	}
+
+	control_expectln("SENDDONE");
+	iov.iov_base = buf;
+	iov.iov_len = sizeof(buf);
+	msg.msg_iov = &iov;
+	msg.msg_iovlen = 1;
+
+	ssize_t ret = recvmsg(fd, &msg, MSG_TRUNC);
+
+	if (ret != MESSAGE_TRUNC_SZ) {
+		printf("%zi\n", ret);
+		perror("MSG_TRUNC doesn't work");
+		exit(EXIT_FAILURE);
+	}
+
+	if (!(msg.msg_flags & MSG_TRUNC)) {
+		fprintf(stderr, "MSG_TRUNC expected\n");
+		exit(EXIT_FAILURE);
+	}
+
+	close(fd);
+}
+
 static struct test_case test_cases[] = {
 	{
 		.name = "SOCK_STREAM connection reset",
@@ -309,6 +415,16 @@ static struct test_case test_cases[] = {
 		.run_client = test_stream_msg_peek_client,
 		.run_server = test_stream_msg_peek_server,
 	},
+	{
+		.name = "SOCK_SEQPACKET msg bounds",
+		.run_client = test_seqpacket_msg_bounds_client,
+		.run_server = test_seqpacket_msg_bounds_server,
+	},
+	{
+		.name = "SOCK_SEQPACKET MSG_TRUNC flag",
+		.run_client = test_seqpacket_msg_trunc_client,
+		.run_server = test_seqpacket_msg_trunc_server,
+	},
 	{},
 };
 
-- 
2.25.1


  parent reply	other threads:[~2021-05-20 19:20 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-20 19:13 [PATCH v10 00/18] virtio/vsock: introduce SOCK_SEQPACKET support Arseny Krasnov
2021-05-20 19:14 ` [PATCH v10 01/18] af_vsock: update functions for connectible socket Arseny Krasnov
2021-05-20 19:15 ` [PATCH v10 02/18] af_vsock: separate wait data loop Arseny Krasnov
2021-05-20 19:15 ` [PATCH v10 03/18] af_vsock: separate receive " Arseny Krasnov
2021-05-20 19:16 ` [PATCH v10 04/18] af_vsock: implement SEQPACKET receive loop Arseny Krasnov
2021-05-25 14:08   ` Stefano Garzarella
2021-05-25 14:08     ` Stefano Garzarella
2021-06-04 15:06   ` Stefano Garzarella
2021-06-04 15:06     ` Stefano Garzarella
2021-06-04 18:00     ` [MASSMAIL KLMS] " Arseny Krasnov
2021-06-07 10:48       ` Stefano Garzarella
2021-06-07 10:48         ` Stefano Garzarella
2021-06-07 11:29         ` Arseny Krasnov
2021-06-07 12:28           ` Stefano Garzarella
2021-06-07 12:28             ` Stefano Garzarella
2021-05-20 19:16 ` [PATCH v10 05/18] af_vsock: implement send logic for SEQPACKET Arseny Krasnov
2021-05-20 19:16 ` [PATCH v10 06/18] af_vsock: rest of SEQPACKET support Arseny Krasnov
2021-05-25 14:17   ` Stefano Garzarella
2021-05-25 14:17     ` Stefano Garzarella
2021-05-20 19:16 ` [PATCH v10 07/18] af_vsock: update comments for stream sockets Arseny Krasnov
2021-05-20 19:17 ` [PATCH v10 08/18] virtio/vsock: set packet's type in virtio_transport_send_pkt_info() Arseny Krasnov
2021-05-20 19:17 ` [PATCH v10 09/18] virtio/vsock: simplify credit update function API Arseny Krasnov
2021-05-20 19:17 ` [PATCH v10 10/18] virtio/vsock: defines and constants for SEQPACKET Arseny Krasnov
2021-05-20 19:17 ` [PATCH v10 11/18] virtio/vsock: dequeue callback for SOCK_SEQPACKET Arseny Krasnov
2021-06-03 14:45   ` Stefano Garzarella
2021-06-03 14:45     ` Stefano Garzarella
2021-06-04 13:12     ` Arseny Krasnov
2021-06-04 15:03       ` Stefano Garzarella
2021-06-04 15:03         ` Stefano Garzarella
2021-06-04 18:03         ` Arseny Krasnov
2021-06-07 11:04           ` Stefano Garzarella
2021-06-07 11:04             ` Stefano Garzarella
2021-06-07 13:18             ` Arseny Krasnov
2021-06-08  8:23               ` Stefano Garzarella
2021-06-08  8:23                 ` Stefano Garzarella
2021-06-08  9:40                 ` Arseny Krasnov
2021-06-08 10:19                   ` Stefano Garzarella
2021-06-08 10:19                     ` Stefano Garzarella
2021-06-08 10:24                     ` Arseny Krasnov
2021-06-08 10:39                       ` Stefano Garzarella
2021-06-08 10:39                         ` Stefano Garzarella
2021-05-20 19:18 ` [PATCH v10 12/18] virtio/vsock: add SEQPACKET receive logic Arseny Krasnov
2021-06-03 14:56   ` Stefano Garzarella
2021-06-03 14:56     ` Stefano Garzarella
2021-05-20 19:18 ` [PATCH v10 13/18] virtio/vsock: rest of SOCK_SEQPACKET support Arseny Krasnov
2021-06-03 15:14   ` Stefano Garzarella
2021-06-03 15:14     ` Stefano Garzarella
2021-05-20 19:18 ` [PATCH v10 14/18] virtio/vsock: enable SEQPACKET for transport Arseny Krasnov
2021-06-03 15:22   ` Stefano Garzarella
2021-06-03 15:22     ` Stefano Garzarella
2021-05-20 19:19 ` [PATCH v10 15/18] vhost/vsock: support " Arseny Krasnov
2021-06-03 15:34   ` Stefano Garzarella
2021-06-03 15:34     ` Stefano Garzarella
2021-06-04 13:13     ` Arseny Krasnov
2021-05-20 19:19 ` [PATCH v10 16/18] vsock/loopback: enable " Arseny Krasnov
2021-05-20 19:19 ` Arseny Krasnov [this message]
2021-06-03 15:38   ` [PATCH v10 17/18] vsock_test: add SOCK_SEQPACKET tests Stefano Garzarella
2021-06-03 15:38     ` Stefano Garzarella
2021-05-20 19:20 ` [PATCH v10 18/18] virtio/vsock: update trace event for SEQPACKET Arseny Krasnov
2021-06-03 15:40   ` Stefano Garzarella
2021-06-03 15:40     ` Stefano Garzarella
2021-05-21  7:55 ` [PATCH v10 00/18] virtio/vsock: introduce SOCK_SEQPACKET support Stefano Garzarella
2021-05-21  7:55   ` Stefano Garzarella
2021-05-23 12:14   ` Arseny Krasnov
2021-05-25  8:22     ` Arseny Krasnov
2021-05-25 14:52       ` Stefano Garzarella
2021-05-25 14:52         ` Stefano Garzarella
2021-05-26 12:16         ` Arseny Krasnov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210520191953.1272798-1-arseny.krasnov@kaspersky.com \
    --to=arseny.krasnov@kaspersky.com \
    --cc=andraprs@amazon.com \
    --cc=colin.king@canonical.com \
    --cc=davem@davemloft.net \
    --cc=jasowang@redhat.com \
    --cc=jhansen@vmware.com \
    --cc=kuba@kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mst@redhat.com \
    --cc=netdev@vger.kernel.org \
    --cc=nslusarek@gmx.net \
    --cc=oxffffaa@gmail.com \
    --cc=sgarzare@redhat.com \
    --cc=stefanha@redhat.com \
    --cc=virtualization@lists.linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.