This adds test for sending message, bigger than peer's buffer size.
For SOCK_SEQPACKET socket it must fail, as this type of socket has
message size limit.
Signed-off-by: Arseniy Krasnov <AVKrasnov@sberdevices.ru>
---
tools/testing/vsock/vsock_test.c | 69 ++++++++++++++++++++++++++++++++
1 file changed, 69 insertions(+)
diff --git a/tools/testing/vsock/vsock_test.c b/tools/testing/vsock/vsock_test.c
index 12ef0cca6f93..a8e43424fb32 100644
--- a/tools/testing/vsock/vsock_test.c
+++ b/tools/testing/vsock/vsock_test.c
@@ -569,6 +569,70 @@ static void test_seqpacket_timeout_server(const struct test_opts *opts)
close(fd);
}
+static void test_seqpacket_bigmsg_client(const struct test_opts *opts)
+{
+ unsigned long sock_buf_size;
+ ssize_t send_size;
+ socklen_t len;
+ void *data;
+ int fd;
+
+ len = sizeof(sock_buf_size);
+
+ fd = vsock_seqpacket_connect(opts->peer_cid, 1234);
+ if (fd < 0) {
+ perror("connect");
+ exit(EXIT_FAILURE);
+ }
+
+ if (getsockopt(fd, AF_VSOCK, SO_VM_SOCKETS_BUFFER_SIZE,
+ &sock_buf_size, &len)) {
+ perror("getsockopt");
+ exit(EXIT_FAILURE);
+ }
+
+ sock_buf_size++;
+
+ data = malloc(sock_buf_size);
+ if (!data) {
+ perror("malloc");
+ exit(EXIT_FAILURE);
+ }
+
+ send_size = send(fd, data, sock_buf_size, 0);
+ if (send_size != -1) {
+ fprintf(stderr, "expected 'send(2)' failure, got %zi\n",
+ send_size);
+ exit(EXIT_FAILURE);
+ }
+
+ if (errno != EMSGSIZE) {
+ fprintf(stderr, "expected EMSGSIZE in 'errno', got %i\n",
+ errno);
+ exit(EXIT_FAILURE);
+ }
+
+ control_writeln("CLISENT");
+
+ free(data);
+ close(fd);
+}
+
+static void test_seqpacket_bigmsg_server(const struct test_opts *opts)
+{
+ int fd;
+
+ fd = vsock_seqpacket_accept(VMADDR_CID_ANY, 1234, NULL);
+ if (fd < 0) {
+ perror("accept");
+ exit(EXIT_FAILURE);
+ }
+
+ control_expectln("CLISENT");
+
+ close(fd);
+}
+
#define BUF_PATTERN_1 'a'
#define BUF_PATTERN_2 'b'
@@ -851,6 +915,11 @@ static struct test_case test_cases[] = {
.run_client = test_stream_poll_rcvlowat_client,
.run_server = test_stream_poll_rcvlowat_server,
},
+ {
+ .name = "SOCK_SEQPACKET big message",
+ .run_client = test_seqpacket_bigmsg_client,
+ .run_server = test_seqpacket_bigmsg_server,
+ },
{},
};
--
2.25.1
On Fri, Nov 25, 2022 at 05:13:06PM +0000, Arseniy Krasnov wrote: >This adds test for sending message, bigger than peer's buffer size. >For SOCK_SEQPACKET socket it must fail, as this type of socket has >message size limit. > >Signed-off-by: Arseniy Krasnov <AVKrasnov@sberdevices.ru> >--- > tools/testing/vsock/vsock_test.c | 69 ++++++++++++++++++++++++++++++++ > 1 file changed, 69 insertions(+) > >diff --git a/tools/testing/vsock/vsock_test.c b/tools/testing/vsock/vsock_test.c >index 12ef0cca6f93..a8e43424fb32 100644 >--- a/tools/testing/vsock/vsock_test.c >+++ b/tools/testing/vsock/vsock_test.c >@@ -569,6 +569,70 @@ static void test_seqpacket_timeout_server(const struct test_opts *opts) > close(fd); > } > >+static void test_seqpacket_bigmsg_client(const struct test_opts *opts) >+{ >+ unsigned long sock_buf_size; >+ ssize_t send_size; >+ socklen_t len; >+ void *data; >+ int fd; >+ >+ len = sizeof(sock_buf_size); >+ >+ fd = vsock_seqpacket_connect(opts->peer_cid, 1234); >+ if (fd < 0) { >+ perror("connect"); >+ exit(EXIT_FAILURE); >+ } >+ >+ if (getsockopt(fd, AF_VSOCK, SO_VM_SOCKETS_BUFFER_SIZE, >+ &sock_buf_size, &len)) { >+ perror("getsockopt"); >+ exit(EXIT_FAILURE); >+ } >+ >+ sock_buf_size++; >+ >+ data = malloc(sock_buf_size); >+ if (!data) { >+ perror("malloc"); >+ exit(EXIT_FAILURE); >+ } >+ >+ send_size = send(fd, data, sock_buf_size, 0); >+ if (send_size != -1) { >+ fprintf(stderr, "expected 'send(2)' failure, got %zi\n", >+ send_size); >+ exit(EXIT_FAILURE); >+ } >+ >+ if (errno != EMSGSIZE) { >+ fprintf(stderr, "expected EMSGSIZE in 'errno', got %i\n", >+ errno); >+ exit(EXIT_FAILURE); >+ } We should make sure that this is true for all transports, but since now only virtio-vsock supports it, we should be okay. >+ >+ control_writeln("CLISENT"); >+ >+ free(data); >+ close(fd); >+} >+ >+static void test_seqpacket_bigmsg_server(const struct test_opts *opts) >+{ >+ int fd; >+ >+ fd = vsock_seqpacket_accept(VMADDR_CID_ANY, 1234, NULL); >+ if (fd < 0) { >+ perror("accept"); >+ exit(EXIT_FAILURE); >+ } >+ >+ control_expectln("CLISENT"); >+ >+ close(fd); >+} >+ > #define BUF_PATTERN_1 'a' > #define BUF_PATTERN_2 'b' > >@@ -851,6 +915,11 @@ static struct test_case test_cases[] = { > .run_client = test_stream_poll_rcvlowat_client, > .run_server = test_stream_poll_rcvlowat_server, > }, >+ { >+ .name = "SOCK_SEQPACKET big message", >+ .run_client = test_seqpacket_bigmsg_client, >+ .run_server = test_seqpacket_bigmsg_server, >+ }, > {}, > }; > >-- >2.25.1 LGTM! Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
On 01.12.2022 12:45, Stefano Garzarella wrote: > On Fri, Nov 25, 2022 at 05:13:06PM +0000, Arseniy Krasnov wrote: >> This adds test for sending message, bigger than peer's buffer size. >> For SOCK_SEQPACKET socket it must fail, as this type of socket has >> message size limit. >> >> Signed-off-by: Arseniy Krasnov <AVKrasnov@sberdevices.ru> >> --- >> tools/testing/vsock/vsock_test.c | 69 ++++++++++++++++++++++++++++++++ >> 1 file changed, 69 insertions(+) >> >> diff --git a/tools/testing/vsock/vsock_test.c b/tools/testing/vsock/vsock_test.c >> index 12ef0cca6f93..a8e43424fb32 100644 >> --- a/tools/testing/vsock/vsock_test.c >> +++ b/tools/testing/vsock/vsock_test.c >> @@ -569,6 +569,70 @@ static void test_seqpacket_timeout_server(const struct test_opts *opts) >> close(fd); >> } >> >> +static void test_seqpacket_bigmsg_client(const struct test_opts *opts) >> +{ >> + unsigned long sock_buf_size; >> + ssize_t send_size; >> + socklen_t len; >> + void *data; >> + int fd; >> + >> + len = sizeof(sock_buf_size); >> + >> + fd = vsock_seqpacket_connect(opts->peer_cid, 1234); >> + if (fd < 0) { >> + perror("connect"); >> + exit(EXIT_FAILURE); >> + } >> + >> + if (getsockopt(fd, AF_VSOCK, SO_VM_SOCKETS_BUFFER_SIZE, >> + &sock_buf_size, &len)) { >> + perror("getsockopt"); >> + exit(EXIT_FAILURE); >> + } >> + >> + sock_buf_size++; >> + >> + data = malloc(sock_buf_size); >> + if (!data) { >> + perror("malloc"); >> + exit(EXIT_FAILURE); >> + } >> + >> + send_size = send(fd, data, sock_buf_size, 0); >> + if (send_size != -1) { >> + fprintf(stderr, "expected 'send(2)' failure, got %zi\n", >> + send_size); >> + exit(EXIT_FAILURE); >> + } >> + >> + if (errno != EMSGSIZE) { >> + fprintf(stderr, "expected EMSGSIZE in 'errno', got %i\n", >> + errno); >> + exit(EXIT_FAILURE); >> + } > > We should make sure that this is true for all transports, but since now only virtio-vsock supports it, we should be okay. Hm, in general: I've tested this test suite for vmci may be several months ago, and found, that some tests didn't work. I'm thinking about reworking this test suite a little bit: each transport must have own set of tests for features that it supports. I had feeling, that all these tests are run only with virtio transport :) Because for example SEQPACKET mode is suported only for virtio. Thanks > >> + >> + control_writeln("CLISENT"); >> + >> + free(data); >> + close(fd); >> +} >> + >> +static void test_seqpacket_bigmsg_server(const struct test_opts *opts) >> +{ >> + int fd; >> + >> + fd = vsock_seqpacket_accept(VMADDR_CID_ANY, 1234, NULL); >> + if (fd < 0) { >> + perror("accept"); >> + exit(EXIT_FAILURE); >> + } >> + >> + control_expectln("CLISENT"); >> + >> + close(fd); >> +} >> + >> #define BUF_PATTERN_1 'a' >> #define BUF_PATTERN_2 'b' >> >> @@ -851,6 +915,11 @@ static struct test_case test_cases[] = { >> .run_client = test_stream_poll_rcvlowat_client, >> .run_server = test_stream_poll_rcvlowat_server, >> }, >> + { >> + .name = "SOCK_SEQPACKET big message", >> + .run_client = test_seqpacket_bigmsg_client, >> + .run_server = test_seqpacket_bigmsg_server, >> + }, >> {}, >> }; >> >> -- >> 2.25.1 > > LGTM! > > Reviewed-by: Stefano Garzarella <sgarzare@redhat.com> >
On Thu, Dec 01, 2022 at 11:44:39AM +0000, Arseniy Krasnov wrote: >On 01.12.2022 12:45, Stefano Garzarella wrote: >> On Fri, Nov 25, 2022 at 05:13:06PM +0000, Arseniy Krasnov wrote: >>> This adds test for sending message, bigger than peer's buffer size. >>> For SOCK_SEQPACKET socket it must fail, as this type of socket has >>> message size limit. >>> >>> Signed-off-by: Arseniy Krasnov <AVKrasnov@sberdevices.ru> >>> --- >>> tools/testing/vsock/vsock_test.c | 69 ++++++++++++++++++++++++++++++++ >>> 1 file changed, 69 insertions(+) >>> >>> diff --git a/tools/testing/vsock/vsock_test.c b/tools/testing/vsock/vsock_test.c >>> index 12ef0cca6f93..a8e43424fb32 100644 >>> --- a/tools/testing/vsock/vsock_test.c >>> +++ b/tools/testing/vsock/vsock_test.c >>> @@ -569,6 +569,70 @@ static void test_seqpacket_timeout_server(const struct test_opts *opts) >>> close(fd); >>> } >>> >>> +static void test_seqpacket_bigmsg_client(const struct test_opts *opts) >>> +{ >>> + unsigned long sock_buf_size; >>> + ssize_t send_size; >>> + socklen_t len; >>> + void *data; >>> + int fd; >>> + >>> + len = sizeof(sock_buf_size); >>> + >>> + fd = vsock_seqpacket_connect(opts->peer_cid, 1234); >>> + if (fd < 0) { >>> + perror("connect"); >>> + exit(EXIT_FAILURE); >>> + } >>> + >>> + if (getsockopt(fd, AF_VSOCK, SO_VM_SOCKETS_BUFFER_SIZE, >>> + &sock_buf_size, &len)) { >>> + perror("getsockopt"); >>> + exit(EXIT_FAILURE); >>> + } >>> + >>> + sock_buf_size++; >>> + >>> + data = malloc(sock_buf_size); >>> + if (!data) { >>> + perror("malloc"); >>> + exit(EXIT_FAILURE); >>> + } >>> + >>> + send_size = send(fd, data, sock_buf_size, 0); >>> + if (send_size != -1) { >>> + fprintf(stderr, "expected 'send(2)' failure, got %zi\n", >>> + send_size); >>> + exit(EXIT_FAILURE); >>> + } >>> + >>> + if (errno != EMSGSIZE) { >>> + fprintf(stderr, "expected EMSGSIZE in 'errno', got %i\n", >>> + errno); >>> + exit(EXIT_FAILURE); >>> + } >> >> We should make sure that this is true for all transports, but since now only virtio-vsock supports it, we should be okay. >Hm, in general: I've tested this test suite for vmci may be several months ago, and found, that some tests >didn't work. I'm thinking about reworking this test suite a little bit: each transport must have own set of >tests for features that it supports. I had feeling, that all these tests are run only with virtio transport :) >Because for example SEQPACKET mode is suported only for virtio. Yep, when we developed it, we added the "--skip" param for that. Ideally there should be no difference, but I remember VMCI had a different behavior and we couldn't change it for backward compatibility, so we added "--skip". Thanks, Steano
© 2016 - 2025 Red Hat, Inc.