regression_2004: add case for truncated datagram reception
Adds a case to test reception of a truncated datagram.
Acked-by: Etienne Carriere <etienne.carriere@linaro.org>
Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
diff --git a/host/xtest/regression_2000.c b/host/xtest/regression_2000.c
index 4f89d12..600b18c 100644
--- a/host/xtest/regression_2000.c
+++ b/host/xtest/regression_2000.c
@@ -663,6 +663,62 @@
return sendto(fd, buf, l, 0, sa, slen) != -1;
}
+static bool test_2004_send_recv(ADBG_Case_t *c,
+ struct test_200x_io_state *srv_ios,
+ struct test_200x_io_state *local_ios,
+ TEEC_Session *session, struct socket_handle *sh,
+ size_t send_sz, size_t recv_sz)
+{
+ bool ret = false;
+ uint32_t ret_orig = 0;
+ uint8_t *buf = calloc(1, send_sz);
+ uint8_t *buf2 = calloc(1, send_sz);
+ size_t blen = 0;
+
+ /* If recv_sz < send_sz we're receiving a truncated datagram */
+
+ if (!ADBG_EXPECT_NOT_NULL(c, buf) || !ADBG_EXPECT_NOT_NULL(c, buf2) ||
+ !ADBG_EXPECT_COMPARE_UNSIGNED(c, send_sz, >=, recv_sz))
+ goto out;
+
+ /* First we're sending the packet to the echo server */
+ Do_ADBG_BeginSubCase(c, "UDP Socket send");
+ blen = send_sz;
+ rand_stream_read(local_ios->write_rs, buf, blen);
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_send(session, sh,
+ buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+ goto out;
+ ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, send_sz);
+ Do_ADBG_EndSubCase(c, "UDP Socket send");
+
+ /* Then we're receiving the packet from the echo server */
+ Do_ADBG_BeginSubCase(c, "UDP Socket recv");
+ blen = 0;
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_recv(session, sh,
+ buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+ goto out;
+ ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, send_sz);
+ blen = recv_sz;
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_recv(session, sh,
+ buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+ goto out;
+ if (recv_sz < send_sz)
+ ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, >=, recv_sz);
+ else
+ ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, send_sz);
+ rand_stream_read(local_ios->read_rs, buf2, send_sz);
+ ADBG_EXPECT_BUFFER(c, buf2, recv_sz, buf, recv_sz);
+ ADBG_EXPECT_TRUE(c, !srv_ios->rfail);
+ Do_ADBG_EndSubCase(c, "UDP Socket recv");
+
+ ret = true;
+out:
+ free(buf);
+ free(buf2);
+
+ return ret;
+}
+
static void xtest_tee_test_2004(ADBG_Case_t *c)
{
struct sock_server ts = { };
@@ -676,7 +732,6 @@
uint32_t proto_error = 0;
struct socket_handle sh = { };
uint8_t buf[64] = { };
- uint8_t buf2[64] = { };
size_t blen = 0;
uint16_t port = 0;
struct test_200x_io_state server_iostate = { };
@@ -713,25 +768,19 @@
Do_ADBG_EndSubCase(c, "UDP Socket open");
- Do_ADBG_BeginSubCase(c, "UDP Socket send");
- blen = sizeof(buf);
- rand_stream_read(local_iostate.write_rs, buf, blen);
- if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_send(&session, &sh,
- buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+ Do_ADBG_BeginSubCase(c, "Normal send and receive");
+ if (!ADBG_EXPECT_TRUE(c, test_2004_send_recv(c, &server_iostate,
+ &local_iostate, &session,
+ &sh, 64, 64)))
goto out_close_session;
- ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
- Do_ADBG_EndSubCase(c, "UDP Socket send");
+ Do_ADBG_EndSubCase(c, "Normal send and receive");
- Do_ADBG_BeginSubCase(c, "UDP Socket recv");
- blen = sizeof(buf);
- if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_recv(&session, &sh,
- buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+ Do_ADBG_BeginSubCase(c, "UDP Socket truncated recv");
+ if (!ADBG_EXPECT_TRUE(c, test_2004_send_recv(c, &server_iostate,
+ &local_iostate, &session,
+ &sh, 64, 32)))
goto out_close_session;
- ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
- rand_stream_read(local_iostate.read_rs, buf2, blen);
- ADBG_EXPECT_BUFFER(c, buf2, blen, buf, blen);
- ADBG_EXPECT_TRUE(c, !server_iostate.rfail);
- Do_ADBG_EndSubCase(c, "UDP Socket recv");
+ Do_ADBG_EndSubCase(c, "UDP Socket truncated recv");
Do_ADBG_BeginSubCase(c, "UDP Socket get error");
if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_get_error(&session, &sh,
@@ -812,25 +861,11 @@
TEE_UDP_CHANGEPORT, &port, &blen, &ret_orig)))
goto out_close_session;
- Do_ADBG_BeginSubCase(c, "UDP Socket send");
- blen = sizeof(buf);
- rand_stream_read(local_iostate.write_rs, buf, blen);
- if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_send(&session, &sh,
- buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
- goto out_close_session;
- ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
- Do_ADBG_EndSubCase(c, "UDP Socket send");
- Do_ADBG_BeginSubCase(c, "UDP Socket recv");
- blen = sizeof(buf);
- if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_recv(&session, &sh,
- buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+ if (!ADBG_EXPECT_TRUE(c, test_2004_send_recv(c, &server_iostate,
+ &local_iostate, &session,
+ &sh, 64, 64)))
goto out_close_session;
- ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
- rand_stream_read(local_iostate.read_rs, buf2, blen);
- ADBG_EXPECT_BUFFER(c, buf2, blen, buf, blen);
- ADBG_EXPECT_TRUE(c, !server_iostate.rfail);
- Do_ADBG_EndSubCase(c, "UDP Socket recv");
TEEC_CloseSession(&session);
Do_ADBG_EndSubCase(c, "UDP Socket change port");
@@ -859,25 +894,10 @@
TEE_UDP_CHANGEADDR, ts3.bind->host, &blen, &ret_orig)))
goto out_close_session;
- Do_ADBG_BeginSubCase(c, "UDP Socket send");
- blen = sizeof(buf);
- rand_stream_read(local_iostate.write_rs, buf, blen);
- if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_send(&session, &sh,
- buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+ if (!ADBG_EXPECT_TRUE(c, test_2004_send_recv(c, &server_iostate,
+ &local_iostate, &session,
+ &sh, 64, 64)))
goto out_close_session;
- ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
- Do_ADBG_EndSubCase(c, "UDP Socket send");
-
- Do_ADBG_BeginSubCase(c, "UDP Socket recv");
- blen = sizeof(buf);
- if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_recv(&session, &sh,
- buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
- goto out_close_session;
- ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
- rand_stream_read(local_iostate.read_rs, buf2, blen);
- ADBG_EXPECT_BUFFER(c, buf2, blen, buf, blen);
- ADBG_EXPECT_TRUE(c, !server_iostate.rfail);
- Do_ADBG_EndSubCase(c, "UDP Socket recv");
Do_ADBG_EndSubCase(c, "UDP Socket change addr");