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@xxxxxxxxxxxxxx> >> --- >> 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 >> >