[RFC,v1,3/3] test/vsock: skbuff merging test
Commit Message
This adds test which checks case when data of newly received skbuff is
appended to the last skbuff in the socket's queue.
This test is actual only for virtio transport.
Signed-off-by: Arseniy Krasnov <AVKrasnov@sberdevices.ru>
---
tools/testing/vsock/vsock_test.c | 81 ++++++++++++++++++++++++++++++++
1 file changed, 81 insertions(+)
Comments
On Sun, Mar 19, 2023 at 09:53:54PM +0300, Arseniy Krasnov wrote:
>This adds test which checks case when data of newly received skbuff is
>appended to the last skbuff in the socket's queue.
>
>This test is actual only for virtio transport.
>
>Signed-off-by: Arseniy Krasnov <AVKrasnov@sberdevices.ru>
>---
> tools/testing/vsock/vsock_test.c | 81 ++++++++++++++++++++++++++++++++
> 1 file changed, 81 insertions(+)
>
>diff --git a/tools/testing/vsock/vsock_test.c b/tools/testing/vsock/vsock_test.c
>index 3de10dbb50f5..00216c52d8b6 100644
>--- a/tools/testing/vsock/vsock_test.c
>+++ b/tools/testing/vsock/vsock_test.c
>@@ -968,6 +968,82 @@ static void test_seqpacket_inv_buf_server(const struct test_opts *opts)
> test_inv_buf_server(opts, false);
> }
>
>+static void test_stream_virtio_skb_merge_client(const struct test_opts *opts)
>+{
>+ ssize_t res;
>+ int fd;
>+
>+ fd = vsock_stream_connect(opts->peer_cid, 1234);
>+ if (fd < 0) {
>+ perror("connect");
>+ exit(EXIT_FAILURE);
>+ }
>+
Please use a macro for "HELLO" or a variabile, e.g.
char *buf;
...
buf = "HELLO";
res = send(fd, buf, strlen(buf), 0);
...
>+ res = send(fd, "HELLO", strlen("HELLO"), 0);
>+ if (res != strlen("HELLO")) {
>+ fprintf(stderr, "unexpected send(2) result %zi\n", res);
>+ exit(EXIT_FAILURE);
>+ }
>+
>+ control_writeln("SEND0");
>+ /* Peer reads part of first packet. */
>+ control_expectln("REPLY0");
>+
>+ /* Send second skbuff, it will be merged. */
>+ res = send(fd, "WORLD", strlen("WORLD"), 0);
Ditto.
>+ if (res != strlen("WORLD")) {
>+ fprintf(stderr, "unexpected send(2) result %zi\n", res);
>+ exit(EXIT_FAILURE);
>+ }
>+
>+ control_writeln("SEND1");
>+ /* Peer reads merged skbuff packet. */
>+ control_expectln("REPLY1");
>+
>+ close(fd);
>+}
>+
>+static void test_stream_virtio_skb_merge_server(const struct test_opts *opts)
>+{
>+ unsigned char buf[64];
>+ ssize_t res;
>+ int fd;
>+
>+ fd = vsock_stream_accept(VMADDR_CID_ANY, 1234, NULL);
>+ if (fd < 0) {
>+ perror("accept");
>+ exit(EXIT_FAILURE);
>+ }
>+
>+ control_expectln("SEND0");
>+
>+ /* Read skbuff partially. */
>+ res = recv(fd, buf, 2, 0);
>+ if (res != 2) {
>+ fprintf(stderr, "expected recv(2) failure, got %zi\n", res);
We don't expect a failure, so please update the error message and make
it easy to figure out which recv() is failing. For example by saying
how many bytes you expected and how many you received.
>+ exit(EXIT_FAILURE);
>+ }
>+
>+ control_writeln("REPLY0");
>+ control_expectln("SEND1");
>+
>+
>+ res = recv(fd, buf, sizeof(buf), 0);
Perhaps a comment here to explain why we expect only 8 bytes.
>+ if (res != 8) {
>+ fprintf(stderr, "expected recv(2) failure, got %zi\n", res);
Ditto.
>+ exit(EXIT_FAILURE);
>+ }
>+
>+ res = recv(fd, buf, sizeof(buf), MSG_DONTWAIT);
>+ if (res != -1) {
>+ fprintf(stderr, "expected recv(2) success, got %zi\n", res);
It's the other way around, isn't it?
Here you expect it to fail instead it is not failing.
>+ exit(EXIT_FAILURE);
>+ }
Moving the pointer correctly, I would also check that there is
HELLOWORLD in the buffer.
Thanks for adding tests in this suite!
Stefano
>+
>+ control_writeln("REPLY1");
>+
>+ close(fd);
>+}
>+
> static struct test_case test_cases[] = {
> {
> .name = "SOCK_STREAM connection reset",
>@@ -1038,6 +1114,11 @@ static struct test_case test_cases[] = {
> .run_client = test_seqpacket_inv_buf_client,
> .run_server = test_seqpacket_inv_buf_server,
> },
>+ {
>+ .name = "SOCK_STREAM virtio skb merge",
>+ .run_client = test_stream_virtio_skb_merge_client,
>+ .run_server = test_stream_virtio_skb_merge_server,
>+ },
> {},
> };
>
>--
>2.25.1
>
On 20.03.2023 18:31, Stefano Garzarella wrote:
> On Sun, Mar 19, 2023 at 09:53:54PM +0300, Arseniy Krasnov wrote:
>> This adds test which checks case when data of newly received skbuff is
>> appended to the last skbuff in the socket's queue.
>>
>> This test is actual only for virtio transport.
>>
>> Signed-off-by: Arseniy Krasnov <AVKrasnov@sberdevices.ru>
>> ---
>> tools/testing/vsock/vsock_test.c | 81 ++++++++++++++++++++++++++++++++
>> 1 file changed, 81 insertions(+)
>>
>> diff --git a/tools/testing/vsock/vsock_test.c b/tools/testing/vsock/vsock_test.c
>> index 3de10dbb50f5..00216c52d8b6 100644
>> --- a/tools/testing/vsock/vsock_test.c
>> +++ b/tools/testing/vsock/vsock_test.c
>> @@ -968,6 +968,82 @@ static void test_seqpacket_inv_buf_server(const struct test_opts *opts)
>> test_inv_buf_server(opts, false);
>> }
>>
>> +static void test_stream_virtio_skb_merge_client(const struct test_opts *opts)
>> +{
>> + ssize_t res;
>> + int fd;
>> +
>> + fd = vsock_stream_connect(opts->peer_cid, 1234);
>> + if (fd < 0) {
>> + perror("connect");
>> + exit(EXIT_FAILURE);
>> + }
>> +
>
> Please use a macro for "HELLO" or a variabile, e.g.
>
> char *buf;
> ...
>
> buf = "HELLO";
> res = send(fd, buf, strlen(buf), 0);
> ...
>
>> + res = send(fd, "HELLO", strlen("HELLO"), 0);
>> + if (res != strlen("HELLO")) {
>> + fprintf(stderr, "unexpected send(2) result %zi\n", res);
>> + exit(EXIT_FAILURE);
>> + }
>> +
>> + control_writeln("SEND0");
>> + /* Peer reads part of first packet. */
>> + control_expectln("REPLY0");
>> +
>> + /* Send second skbuff, it will be merged. */
>> + res = send(fd, "WORLD", strlen("WORLD"), 0);
>
> Ditto.
>
>> + if (res != strlen("WORLD")) {
>> + fprintf(stderr, "unexpected send(2) result %zi\n", res);
>> + exit(EXIT_FAILURE);
>> + }
>> +
>> + control_writeln("SEND1");
>> + /* Peer reads merged skbuff packet. */
>> + control_expectln("REPLY1");
>> +
>> + close(fd);
>> +}
>> +
>> +static void test_stream_virtio_skb_merge_server(const struct test_opts *opts)
>> +{
>> + unsigned char buf[64];
>> + ssize_t res;
>> + int fd;
>> +
>> + fd = vsock_stream_accept(VMADDR_CID_ANY, 1234, NULL);
>> + if (fd < 0) {
>> + perror("accept");
>> + exit(EXIT_FAILURE);
>> + }
>> +
>> + control_expectln("SEND0");
>> +
>> + /* Read skbuff partially. */
>> + res = recv(fd, buf, 2, 0);
>> + if (res != 2) {
>> + fprintf(stderr, "expected recv(2) failure, got %zi\n", res);
>
> We don't expect a failure, so please update the error message and make
> it easy to figure out which recv() is failing. For example by saying
> how many bytes you expected and how many you received.
>
>> + exit(EXIT_FAILURE);
>> + }
>> +
>> + control_writeln("REPLY0");
>> + control_expectln("SEND1");
>> +
>> +
>> + res = recv(fd, buf, sizeof(buf), 0);
>
> Perhaps a comment here to explain why we expect only 8 bytes.
>
>> + if (res != 8) {
>> + fprintf(stderr, "expected recv(2) failure, got %zi\n", res);
>
> Ditto.
>
>> + exit(EXIT_FAILURE);
>> + }
>> +
>> + res = recv(fd, buf, sizeof(buf), MSG_DONTWAIT);
>> + if (res != -1) {
>> + fprintf(stderr, "expected recv(2) success, got %zi\n", res);
>
> It's the other way around, isn't it?
> Here you expect it to fail instead it is not failing.
>
>> + exit(EXIT_FAILURE);
>> + }
>
> Moving the pointer correctly, I would also check that there is
> HELLOWORLD in the buffer.
>
> Thanks for adding tests in this suite!
> Stefano
Thanks for review, i didn't pay any attention on this test, because it is
just bug reproducer. But if we are going to add it, of course i'll clean
it's code.
Thanks, Arseniy
>
>> +
>> + control_writeln("REPLY1");
>> +
>> + close(fd);
>> +}
>> +
>> static struct test_case test_cases[] = {
>> {
>> .name = "SOCK_STREAM connection reset",
>> @@ -1038,6 +1114,11 @@ static struct test_case test_cases[] = {
>> .run_client = test_seqpacket_inv_buf_client,
>> .run_server = test_seqpacket_inv_buf_server,
>> },
>> + {
>> + .name = "SOCK_STREAM virtio skb merge",
>> + .run_client = test_stream_virtio_skb_merge_client,
>> + .run_server = test_stream_virtio_skb_merge_server,
>> + },
>> {},
>> };
>>
>> --
>> 2.25.1
>>
>
@@ -968,6 +968,82 @@ static void test_seqpacket_inv_buf_server(const struct test_opts *opts)
test_inv_buf_server(opts, false);
}
+static void test_stream_virtio_skb_merge_client(const struct test_opts *opts)
+{
+ ssize_t res;
+ int fd;
+
+ fd = vsock_stream_connect(opts->peer_cid, 1234);
+ if (fd < 0) {
+ perror("connect");
+ exit(EXIT_FAILURE);
+ }
+
+ res = send(fd, "HELLO", strlen("HELLO"), 0);
+ if (res != strlen("HELLO")) {
+ fprintf(stderr, "unexpected send(2) result %zi\n", res);
+ exit(EXIT_FAILURE);
+ }
+
+ control_writeln("SEND0");
+ /* Peer reads part of first packet. */
+ control_expectln("REPLY0");
+
+ /* Send second skbuff, it will be merged. */
+ res = send(fd, "WORLD", strlen("WORLD"), 0);
+ if (res != strlen("WORLD")) {
+ fprintf(stderr, "unexpected send(2) result %zi\n", res);
+ exit(EXIT_FAILURE);
+ }
+
+ control_writeln("SEND1");
+ /* Peer reads merged skbuff packet. */
+ control_expectln("REPLY1");
+
+ close(fd);
+}
+
+static void test_stream_virtio_skb_merge_server(const struct test_opts *opts)
+{
+ unsigned char buf[64];
+ ssize_t res;
+ int fd;
+
+ fd = vsock_stream_accept(VMADDR_CID_ANY, 1234, NULL);
+ if (fd < 0) {
+ perror("accept");
+ exit(EXIT_FAILURE);
+ }
+
+ control_expectln("SEND0");
+
+ /* Read skbuff partially. */
+ res = recv(fd, buf, 2, 0);
+ if (res != 2) {
+ fprintf(stderr, "expected recv(2) failure, got %zi\n", res);
+ exit(EXIT_FAILURE);
+ }
+
+ control_writeln("REPLY0");
+ control_expectln("SEND1");
+
+ res = recv(fd, buf, sizeof(buf), 0);
+ if (res != 8) {
+ fprintf(stderr, "expected recv(2) failure, got %zi\n", res);
+ exit(EXIT_FAILURE);
+ }
+
+ res = recv(fd, buf, sizeof(buf), MSG_DONTWAIT);
+ if (res != -1) {
+ fprintf(stderr, "expected recv(2) success, got %zi\n", res);
+ exit(EXIT_FAILURE);
+ }
+
+ control_writeln("REPLY1");
+
+ close(fd);
+}
+
static struct test_case test_cases[] = {
{
.name = "SOCK_STREAM connection reset",
@@ -1038,6 +1114,11 @@ static struct test_case test_cases[] = {
.run_client = test_seqpacket_inv_buf_client,
.run_server = test_seqpacket_inv_buf_server,
},
+ {
+ .name = "SOCK_STREAM virtio skb merge",
+ .run_client = test_stream_virtio_skb_merge_client,
+ .run_server = test_stream_virtio_skb_merge_server,
+ },
{},
};