1 /*
2 * Copyright (c) 2017 Linaro Limited
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <zephyr/logging/log.h>
8 LOG_MODULE_REGISTER(net_test, CONFIG_NET_SOCKETS_LOG_LEVEL);
9
10 #include <zephyr/ztest_assert.h>
11 #include <zephyr/posix/fcntl.h>
12 #include <zephyr/net/net_context.h>
13 #include <zephyr/net/socket.h>
14 #include <zephyr/net/loopback.h>
15
16 #include "../../socket_helpers.h"
17
18 #define TEST_STR_SMALL "test"
19
20 #define TEST_STR_LONG \
21 "The Zephyr Project, a Linux Foundation hosted Collaboration " \
22 "Project, is an open source collaborative effort uniting leaders " \
23 "from across the industry to build a best-in-breed small, scalable, " \
24 "real-time operating system (RTOS) optimized for resource-" \
25 "constrained devices, across multiple architectures."
26
27 #define MY_IPV4_ADDR "127.0.0.1"
28 #define MY_IPV6_ADDR "::1"
29
30 #define ANY_PORT 0
31 #define SERVER_PORT 4242
32
33 #define MAX_CONNS 5
34
35 #define TCP_TEARDOWN_TIMEOUT K_SECONDS(3)
36 #define THREAD_SLEEP 50 /* ms */
37
test_bind(int sock,struct sockaddr * addr,socklen_t addrlen)38 static void test_bind(int sock, struct sockaddr *addr, socklen_t addrlen)
39 {
40 zassert_equal(zsock_bind(sock, addr, addrlen),
41 0,
42 "bind failed with error %d", errno);
43 }
44
test_listen(int sock)45 static void test_listen(int sock)
46 {
47 zassert_equal(zsock_listen(sock, MAX_CONNS),
48 0,
49 "listen failed with error %d", errno);
50 }
51
test_connect(int sock,struct sockaddr * addr,socklen_t addrlen)52 static void test_connect(int sock, struct sockaddr *addr, socklen_t addrlen)
53 {
54 zassert_equal(zsock_connect(sock, addr, addrlen),
55 0,
56 "connect failed with error %d", errno);
57
58 if (IS_ENABLED(CONFIG_NET_TC_THREAD_PREEMPTIVE)) {
59 /* Let the connection proceed */
60 k_msleep(THREAD_SLEEP);
61 }
62 }
63
test_send(int sock,const void * buf,size_t len,int flags)64 static void test_send(int sock, const void *buf, size_t len, int flags)
65 {
66 zassert_equal(zsock_send(sock, buf, len, flags),
67 len,
68 "send failed");
69 }
70
test_sendto(int sock,const void * buf,size_t len,int flags,const struct sockaddr * addr,socklen_t addrlen)71 static void test_sendto(int sock, const void *buf, size_t len, int flags,
72 const struct sockaddr *addr, socklen_t addrlen)
73 {
74 zassert_equal(zsock_sendto(sock, buf, len, flags, addr, addrlen),
75 len,
76 "send failed");
77 }
78
test_accept(int sock,int * new_sock,struct sockaddr * addr,socklen_t * addrlen)79 static void test_accept(int sock, int *new_sock, struct sockaddr *addr,
80 socklen_t *addrlen)
81 {
82 zassert_not_null(new_sock, "null newsock");
83
84 *new_sock = zsock_accept(sock, addr, addrlen);
85 zassert_true(*new_sock >= 0, "accept failed");
86 }
87
test_accept_timeout(int sock,int * new_sock,struct sockaddr * addr,socklen_t * addrlen)88 static void test_accept_timeout(int sock, int *new_sock, struct sockaddr *addr,
89 socklen_t *addrlen)
90 {
91 zassert_not_null(new_sock, "null newsock");
92
93 *new_sock = zsock_accept(sock, addr, addrlen);
94 zassert_equal(*new_sock, -1, "accept succeed");
95 zassert_equal(errno, EAGAIN, "");
96 }
97
test_fcntl(int sock,int cmd,int val)98 static void test_fcntl(int sock, int cmd, int val)
99 {
100 zassert_equal(zsock_fcntl(sock, cmd, val), 0, "fcntl failed");
101 }
102
test_recv(int sock,int flags)103 static void test_recv(int sock, int flags)
104 {
105 ssize_t recved = 0;
106 char rx_buf[30] = {0};
107
108 recved = zsock_recv(sock, rx_buf, sizeof(rx_buf), flags);
109 zassert_equal(recved,
110 strlen(TEST_STR_SMALL),
111 "unexpected received bytes");
112 zassert_equal(strncmp(rx_buf, TEST_STR_SMALL, strlen(TEST_STR_SMALL)),
113 0,
114 "unexpected data");
115 }
116
test_recvfrom(int sock,int flags,struct sockaddr * addr,socklen_t * addrlen)117 static void test_recvfrom(int sock,
118 int flags,
119 struct sockaddr *addr,
120 socklen_t *addrlen)
121 {
122 ssize_t recved = 0;
123 char rx_buf[30] = {0};
124
125 recved = zsock_recvfrom(sock, rx_buf, sizeof(rx_buf), flags, addr, addrlen);
126 zassert_equal(recved,
127 strlen(TEST_STR_SMALL),
128 "unexpected received bytes");
129 zassert_equal(strncmp(rx_buf, TEST_STR_SMALL, strlen(TEST_STR_SMALL)),
130 0,
131 "unexpected data");
132 }
133
test_recvmsg(int sock,struct msghdr * msg,int flags,size_t expected,int line)134 static void test_recvmsg(int sock,
135 struct msghdr *msg,
136 int flags,
137 size_t expected,
138 int line)
139 {
140 ssize_t recved;
141
142 recved = zsock_recvmsg(sock, msg, flags);
143
144 zassert_equal(recved, expected,
145 "line %d, unexpected received bytes (%d vs %d)",
146 line, recved, expected);
147 }
148
test_shutdown(int sock,int how)149 static void test_shutdown(int sock, int how)
150 {
151 zassert_equal(zsock_shutdown(sock, how),
152 0,
153 "shutdown failed");
154 }
155
test_close(int sock)156 static void test_close(int sock)
157 {
158 zassert_equal(zsock_close(sock),
159 0,
160 "close failed");
161 }
162
163 /* Test that EOF handling works correctly. Should be called with socket
164 * whose peer socket was closed.
165 */
test_eof(int sock)166 static void test_eof(int sock)
167 {
168 char rx_buf[1];
169 ssize_t recved;
170
171 /* Test that EOF properly detected. */
172 recved = zsock_recv(sock, rx_buf, sizeof(rx_buf), 0);
173 zassert_equal(recved, 0, "");
174
175 /* Calling again should be OK. */
176 recved = zsock_recv(sock, rx_buf, sizeof(rx_buf), 0);
177 zassert_equal(recved, 0, "");
178
179 /* Calling when TCP connection is fully torn down should be still OK. */
180 k_sleep(TCP_TEARDOWN_TIMEOUT);
181 recved = zsock_recv(sock, rx_buf, sizeof(rx_buf), 0);
182 zassert_equal(recved, 0, "");
183 }
184
calc_net_context(struct net_context * context,void * user_data)185 static void calc_net_context(struct net_context *context, void *user_data)
186 {
187 int *count = user_data;
188
189 (*count)++;
190 }
191
192 /* Wait until the number of TCP contexts reaches a certain level
193 * exp_num_contexts : The number of contexts to wait for
194 * timeout : The time to wait for
195 */
wait_for_n_tcp_contexts(int exp_num_contexts,k_timeout_t timeout)196 int wait_for_n_tcp_contexts(int exp_num_contexts, k_timeout_t timeout)
197 {
198 uint32_t start_time = k_uptime_get_32();
199 uint32_t time_diff;
200 int context_count = 0;
201
202 /* After the client socket closing, the context count should be 1 less */
203 net_context_foreach(calc_net_context, &context_count);
204
205 time_diff = k_uptime_get_32() - start_time;
206
207 /* Eventually the client socket should be cleaned up */
208 while (context_count != exp_num_contexts) {
209 context_count = 0;
210 net_context_foreach(calc_net_context, &context_count);
211 k_sleep(K_MSEC(50));
212 time_diff = k_uptime_get_32() - start_time;
213
214 if (K_MSEC(time_diff).ticks > timeout.ticks) {
215 return -ETIMEDOUT;
216 }
217 }
218
219 return 0;
220 }
221
test_context_cleanup(void)222 static void test_context_cleanup(void)
223 {
224 zassert_equal(wait_for_n_tcp_contexts(0, TCP_TEARDOWN_TIMEOUT),
225 0,
226 "Not all TCP contexts properly cleaned up");
227 }
228
229
ZTEST_USER(net_socket_tcp,test_v4_send_recv)230 ZTEST_USER(net_socket_tcp, test_v4_send_recv)
231 {
232 /* Test if send() and recv() work on a ipv4 stream socket. */
233 int c_sock;
234 int s_sock;
235 int new_sock;
236 struct sockaddr_in c_saddr;
237 struct sockaddr_in s_saddr;
238 struct sockaddr addr;
239 socklen_t addrlen = sizeof(addr);
240
241 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr);
242 prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &s_sock, &s_saddr);
243
244 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
245 test_listen(s_sock);
246
247 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
248 test_send(c_sock, TEST_STR_SMALL, strlen(TEST_STR_SMALL), 0);
249
250 test_accept(s_sock, &new_sock, &addr, &addrlen);
251 zassert_equal(addrlen, sizeof(struct sockaddr_in), "wrong addrlen");
252
253 test_recv(new_sock, ZSOCK_MSG_PEEK);
254 test_recv(new_sock, 0);
255
256 test_close(c_sock);
257 test_eof(new_sock);
258
259 test_close(new_sock);
260 test_close(s_sock);
261
262 k_sleep(TCP_TEARDOWN_TIMEOUT);
263 }
264
ZTEST_USER(net_socket_tcp,test_v6_send_recv)265 ZTEST_USER(net_socket_tcp, test_v6_send_recv)
266 {
267 /* Test if send() and recv() work on a ipv6 stream socket. */
268 int c_sock;
269 int s_sock;
270 int new_sock;
271 struct sockaddr_in6 c_saddr;
272 struct sockaddr_in6 s_saddr;
273 struct sockaddr addr;
274 socklen_t addrlen = sizeof(addr);
275
276 prepare_sock_tcp_v6(MY_IPV6_ADDR, ANY_PORT, &c_sock, &c_saddr);
277 prepare_sock_tcp_v6(MY_IPV6_ADDR, SERVER_PORT, &s_sock, &s_saddr);
278
279 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
280 test_listen(s_sock);
281
282 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
283 test_send(c_sock, TEST_STR_SMALL, strlen(TEST_STR_SMALL), 0);
284
285 test_accept(s_sock, &new_sock, &addr, &addrlen);
286 zassert_equal(addrlen, sizeof(struct sockaddr_in6), "wrong addrlen");
287
288 test_recv(new_sock, ZSOCK_MSG_PEEK);
289 test_recv(new_sock, 0);
290
291 test_close(c_sock);
292 test_eof(new_sock);
293
294 test_close(new_sock);
295 test_close(s_sock);
296
297 k_sleep(TCP_TEARDOWN_TIMEOUT);
298 }
299
300 /* Test the stack behavior with a resonable sized block data, be sure to have multiple packets */
301 #define TEST_LARGE_TRANSFER_SIZE 60000
302 #define TEST_PRIME 811
303
304 #define TCP_SERVER_STACK_SIZE 2048
305
306 K_THREAD_STACK_DEFINE(tcp_server_stack_area, TCP_SERVER_STACK_SIZE);
307 struct k_thread tcp_server_thread_data;
308
309 /* A thread that receives, while the other part transmits */
tcp_server_block_thread(void * vps_sock,void * unused2,void * unused3)310 void tcp_server_block_thread(void *vps_sock, void *unused2, void *unused3)
311 {
312 int new_sock;
313 struct sockaddr addr;
314 int *ps_sock = (int *)vps_sock;
315 socklen_t addrlen = sizeof(addr);
316
317 test_accept(*ps_sock, &new_sock, &addr, &addrlen);
318 zassert_true(addrlen == sizeof(struct sockaddr_in)
319 || addrlen == sizeof(struct sockaddr_in6), "wrong addrlen");
320
321 /* Check the received data */
322 ssize_t recved = 0;
323 ssize_t total_received = 0;
324 int iteration = 0;
325 uint8_t buffer[256];
326
327 while (total_received < TEST_LARGE_TRANSFER_SIZE) {
328 /* Compute the remaining contents */
329 size_t chunk_size = sizeof(buffer);
330 size_t remain = TEST_LARGE_TRANSFER_SIZE - total_received;
331
332 if (chunk_size > remain) {
333 chunk_size = remain;
334 }
335
336 recved = zsock_recv(new_sock, buffer, chunk_size, 0);
337
338 zassert(recved > 0, "received bigger then 0",
339 "Error receiving bytes %i bytes, got %i on top of %i in iteration %i, errno %i",
340 chunk_size, recved, total_received, iteration, errno);
341
342 /* Validate the contents */
343 for (int i = 0; i < recved; i++) {
344 int total_idx = i + total_received;
345 uint8_t expValue = (total_idx * TEST_PRIME) & 0xff;
346
347 zassert_equal(buffer[i], expValue, "Unexpected data at %i", total_idx);
348 }
349
350 total_received += recved;
351 iteration++;
352 }
353
354 test_close(new_sock);
355 }
356
test_send_recv_large_common(int tcp_nodelay,int family)357 void test_send_recv_large_common(int tcp_nodelay, int family)
358 {
359 int rv;
360 int c_sock = 0;
361 int s_sock = 0;
362 struct sockaddr *c_saddr = NULL;
363 struct sockaddr *s_saddr = NULL;
364 size_t addrlen = 0;
365
366 struct sockaddr_in c_saddr_in;
367 struct sockaddr_in s_saddr_in;
368 struct sockaddr_in6 c_saddr_in6;
369 struct sockaddr_in6 s_saddr_in6;
370
371 if (family == AF_INET) {
372 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr_in);
373 c_saddr = (struct sockaddr *) &c_saddr_in;
374 prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &s_sock, &s_saddr_in);
375 s_saddr = (struct sockaddr *) &s_saddr_in;
376 addrlen = sizeof(s_saddr_in);
377 } else if (family == AF_INET6) {
378 prepare_sock_tcp_v6(MY_IPV6_ADDR, ANY_PORT, &c_sock, &c_saddr_in6);
379 c_saddr = (struct sockaddr *) &c_saddr_in6;
380 prepare_sock_tcp_v6(MY_IPV6_ADDR, SERVER_PORT, &s_sock, &s_saddr_in6);
381 s_saddr = (struct sockaddr *) &s_saddr_in6;
382 addrlen = sizeof(s_saddr_in6);
383 } else {
384 zassert_unreachable();
385 }
386
387 test_bind(s_sock, s_saddr, addrlen);
388 test_listen(s_sock);
389
390 (void)k_thread_create(&tcp_server_thread_data, tcp_server_stack_area,
391 K_THREAD_STACK_SIZEOF(tcp_server_stack_area),
392 tcp_server_block_thread,
393 &s_sock, NULL, NULL,
394 k_thread_priority_get(k_current_get()), 0, K_NO_WAIT);
395
396 test_connect(c_sock, s_saddr, addrlen);
397
398 rv = zsock_setsockopt(c_sock, IPPROTO_TCP, TCP_NODELAY, (char *) &tcp_nodelay, sizeof(int));
399 zassert_equal(rv, 0, "setsockopt failed (%d)", rv);
400
401 /* send piece by piece */
402 ssize_t total_send = 0;
403 int iteration = 0;
404 uint8_t buffer[256];
405
406 while (total_send < TEST_LARGE_TRANSFER_SIZE) {
407 /* Fill the buffer with a known pattern */
408 for (int i = 0; i < sizeof(buffer); i++) {
409 int total_idx = i + total_send;
410
411 buffer[i] = (total_idx * TEST_PRIME) & 0xff;
412 }
413
414 size_t chunk_size = sizeof(buffer);
415 size_t remain = TEST_LARGE_TRANSFER_SIZE - total_send;
416
417 if (chunk_size > remain) {
418 chunk_size = remain;
419 }
420
421 int send_bytes = zsock_send(c_sock, buffer, chunk_size, 0);
422
423 zassert(send_bytes > 0, "send_bytes bigger then 0",
424 "Error sending %i bytes on top of %i, got %i in iteration %i, errno %i",
425 chunk_size, total_send, send_bytes, iteration, errno);
426 total_send += send_bytes;
427 iteration++;
428 }
429
430 /* join the thread, to wait for the receiving part */
431 zassert_equal(k_thread_join(&tcp_server_thread_data, K_SECONDS(60)), 0,
432 "Not successfully wait for TCP thread to finish");
433
434 test_close(s_sock);
435 test_close(c_sock);
436
437 k_sleep(TCP_TEARDOWN_TIMEOUT);
438 }
439
440 /* Control the packet drop ratio at the loopback adapter 8 */
set_packet_loss_ratio(void)441 static void set_packet_loss_ratio(void)
442 {
443 /* drop one every 8 packets */
444 zassert_equal(loopback_set_packet_drop_ratio(0.125f), 0,
445 "Error setting packet drop rate");
446 }
447
restore_packet_loss_ratio(void)448 static void restore_packet_loss_ratio(void)
449 {
450 /* no packet dropping any more */
451 zassert_equal(loopback_set_packet_drop_ratio(0.0f), 0,
452 "Error setting packet drop rate");
453 }
454
ZTEST(net_socket_tcp,test_v4_send_recv_large_normal)455 ZTEST(net_socket_tcp, test_v4_send_recv_large_normal)
456 {
457 test_send_recv_large_common(0, AF_INET);
458 }
459
ZTEST(net_socket_tcp,test_v4_send_recv_large_packet_loss)460 ZTEST(net_socket_tcp, test_v4_send_recv_large_packet_loss)
461 {
462 set_packet_loss_ratio();
463 test_send_recv_large_common(0, AF_INET);
464 restore_packet_loss_ratio();
465 }
466
ZTEST(net_socket_tcp,test_v4_send_recv_large_no_delay)467 ZTEST(net_socket_tcp, test_v4_send_recv_large_no_delay)
468 {
469 set_packet_loss_ratio();
470 test_send_recv_large_common(1, AF_INET);
471 restore_packet_loss_ratio();
472 }
473
ZTEST(net_socket_tcp,test_v6_send_recv_large_normal)474 ZTEST(net_socket_tcp, test_v6_send_recv_large_normal)
475 {
476 test_send_recv_large_common(0, AF_INET6);
477 }
478
ZTEST(net_socket_tcp,test_v6_send_recv_large_packet_loss)479 ZTEST(net_socket_tcp, test_v6_send_recv_large_packet_loss)
480 {
481 set_packet_loss_ratio();
482 test_send_recv_large_common(0, AF_INET6);
483 restore_packet_loss_ratio();
484 }
485
ZTEST(net_socket_tcp,test_v6_send_recv_large_no_delay)486 ZTEST(net_socket_tcp, test_v6_send_recv_large_no_delay)
487 {
488 set_packet_loss_ratio();
489 test_send_recv_large_common(1, AF_INET6);
490 restore_packet_loss_ratio();
491 }
492
ZTEST(net_socket_tcp,test_v4_broken_link)493 ZTEST(net_socket_tcp, test_v4_broken_link)
494 {
495 /* Test if the data stops transmitting after the send returned with a timeout. */
496 int c_sock;
497 int s_sock;
498 int new_sock;
499 struct sockaddr_in c_saddr;
500 struct sockaddr_in s_saddr;
501 struct sockaddr addr;
502 socklen_t addrlen = sizeof(addr);
503
504 struct timeval optval = {
505 .tv_sec = 0,
506 .tv_usec = 500000,
507 };
508
509 struct net_stats before;
510 struct net_stats after;
511 uint32_t start_time, time_diff;
512 ssize_t recved;
513 int rv;
514 uint8_t rx_buf[10];
515
516 restore_packet_loss_ratio();
517
518 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr);
519 prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &s_sock, &s_saddr);
520
521 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
522 test_listen(s_sock);
523
524 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
525 test_send(c_sock, TEST_STR_SMALL, strlen(TEST_STR_SMALL), 0);
526
527 test_accept(s_sock, &new_sock, &addr, &addrlen);
528 zassert_equal(addrlen, sizeof(struct sockaddr_in), "wrong addrlen");
529
530 rv = zsock_setsockopt(new_sock, SOL_SOCKET, SO_RCVTIMEO, &optval,
531 sizeof(optval));
532 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
533
534 test_recv(new_sock, ZSOCK_MSG_PEEK);
535 test_recv(new_sock, 0);
536
537 /* At this point break the interface */
538 zassert_equal(loopback_set_packet_drop_ratio(1.0f), 0,
539 "Error setting packet drop rate");
540
541 test_send(c_sock, TEST_STR_SMALL, strlen(TEST_STR_SMALL), 0);
542
543 /* At this point break the interface */
544 start_time = k_uptime_get_32();
545
546 /* Test the loopback packet loss: message should never arrive */
547 recved = zsock_recv(new_sock, rx_buf, sizeof(rx_buf), 0);
548 time_diff = k_uptime_get_32() - start_time;
549
550 zassert_equal(recved, -1, "Unexpected return code");
551 zassert_equal(errno, EAGAIN, "Unexpected errno value: %d", errno);
552 zassert_true(time_diff >= 500, "Expected timeout after 500ms but "
553 "was %dms", time_diff);
554
555 /* Reading from client should indicate the socket has been closed */
556 recved = zsock_recv(c_sock, rx_buf, sizeof(rx_buf), 0);
557 zassert_equal(recved, -1, "Unexpected return code");
558 zassert_equal(errno, ETIMEDOUT, "Unexpected errno value: %d", errno);
559
560 /* At this point there should be no traffic any more, get the current counters */
561 net_mgmt(NET_REQUEST_STATS_GET_ALL, NULL, &before, sizeof(before));
562
563 k_sleep(K_MSEC(CONFIG_NET_TCP_INIT_RETRANSMISSION_TIMEOUT));
564 k_sleep(K_MSEC(CONFIG_NET_TCP_INIT_RETRANSMISSION_TIMEOUT));
565
566 net_mgmt(NET_REQUEST_STATS_GET_ALL, NULL, &after, sizeof(after));
567
568 zassert_equal(before.ipv4.sent, after.ipv4.sent, "Data sent afer connection timeout");
569
570 test_close(c_sock);
571 test_close(new_sock);
572 test_close(s_sock);
573
574 restore_packet_loss_ratio();
575
576 k_sleep(TCP_TEARDOWN_TIMEOUT);
577 }
578
ZTEST_USER(net_socket_tcp,test_v4_sendto_recvfrom)579 ZTEST_USER(net_socket_tcp, test_v4_sendto_recvfrom)
580 {
581 int c_sock;
582 int s_sock;
583 int new_sock;
584 struct sockaddr_in c_saddr;
585 struct sockaddr_in s_saddr;
586 struct sockaddr addr;
587 socklen_t addrlen = sizeof(addr);
588
589 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr);
590 prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &s_sock, &s_saddr);
591
592 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
593 test_listen(s_sock);
594
595 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
596 test_sendto(c_sock, TEST_STR_SMALL, strlen(TEST_STR_SMALL), 0,
597 (struct sockaddr *)&s_saddr, sizeof(s_saddr));
598
599 test_accept(s_sock, &new_sock, &addr, &addrlen);
600 zassert_equal(addrlen, sizeof(struct sockaddr_in), "wrong addrlen");
601
602 test_recvfrom(new_sock, ZSOCK_MSG_PEEK, &addr, &addrlen);
603 zassert_equal(addrlen, sizeof(struct sockaddr_in), "wrong addrlen");
604
605 test_recvfrom(new_sock, 0, &addr, &addrlen);
606 zassert_equal(addrlen, sizeof(struct sockaddr_in), "wrong addrlen");
607
608 test_close(new_sock);
609 test_close(s_sock);
610 test_close(c_sock);
611
612 k_sleep(TCP_TEARDOWN_TIMEOUT);
613 }
614
ZTEST_USER(net_socket_tcp,test_v6_sendto_recvfrom)615 ZTEST_USER(net_socket_tcp, test_v6_sendto_recvfrom)
616 {
617 int c_sock;
618 int s_sock;
619 int new_sock;
620 struct sockaddr_in6 c_saddr;
621 struct sockaddr_in6 s_saddr;
622 struct sockaddr addr;
623 socklen_t addrlen = sizeof(addr);
624
625 prepare_sock_tcp_v6(MY_IPV6_ADDR, ANY_PORT, &c_sock, &c_saddr);
626
627 prepare_sock_tcp_v6(MY_IPV6_ADDR, SERVER_PORT, &s_sock, &s_saddr);
628
629 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
630 test_listen(s_sock);
631
632 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
633 test_sendto(c_sock, TEST_STR_SMALL, strlen(TEST_STR_SMALL), 0,
634 (struct sockaddr *)&s_saddr, sizeof(s_saddr));
635
636 test_accept(s_sock, &new_sock, &addr, &addrlen);
637 zassert_equal(addrlen, sizeof(struct sockaddr_in6), "wrong addrlen");
638
639 test_recvfrom(new_sock, ZSOCK_MSG_PEEK, &addr, &addrlen);
640 zassert_equal(addrlen, sizeof(struct sockaddr_in6), "wrong addrlen");
641
642 test_recvfrom(new_sock, 0, &addr, &addrlen);
643 zassert_equal(addrlen, sizeof(struct sockaddr_in6), "wrong addrlen");
644
645 test_close(new_sock);
646 test_close(s_sock);
647 test_close(c_sock);
648
649 k_sleep(TCP_TEARDOWN_TIMEOUT);
650 }
651
ZTEST_USER(net_socket_tcp,test_v4_sendto_recvfrom_null_dest)652 ZTEST_USER(net_socket_tcp, test_v4_sendto_recvfrom_null_dest)
653 {
654 /* For a stream socket, sendto() should ignore NULL dest address */
655 int c_sock;
656 int s_sock;
657 int new_sock;
658 struct sockaddr_in c_saddr;
659 struct sockaddr_in s_saddr;
660 struct sockaddr addr;
661 socklen_t addrlen = sizeof(addr);
662
663 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr);
664 prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &s_sock, &s_saddr);
665
666 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
667 test_listen(s_sock);
668
669 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
670 test_sendto(c_sock, TEST_STR_SMALL, strlen(TEST_STR_SMALL), 0,
671 (struct sockaddr *)&s_saddr, sizeof(s_saddr));
672
673 test_accept(s_sock, &new_sock, &addr, &addrlen);
674 zassert_equal(addrlen, sizeof(struct sockaddr_in), "wrong addrlen");
675
676 test_recvfrom(new_sock, 0, NULL, NULL);
677
678 test_close(new_sock);
679 test_close(s_sock);
680 test_close(c_sock);
681
682 k_sleep(TCP_TEARDOWN_TIMEOUT);
683 }
684
ZTEST_USER(net_socket_tcp,test_v6_sendto_recvfrom_null_dest)685 ZTEST_USER(net_socket_tcp, test_v6_sendto_recvfrom_null_dest)
686 {
687 /* For a stream socket, sendto() should ignore NULL dest address */
688 int c_sock;
689 int s_sock;
690 int new_sock;
691 struct sockaddr_in6 c_saddr;
692 struct sockaddr_in6 s_saddr;
693 struct sockaddr addr;
694 socklen_t addrlen = sizeof(addr);
695
696 prepare_sock_tcp_v6(MY_IPV6_ADDR, ANY_PORT, &c_sock, &c_saddr);
697 prepare_sock_tcp_v6(MY_IPV6_ADDR, SERVER_PORT, &s_sock, &s_saddr);
698
699 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
700 test_listen(s_sock);
701
702 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
703 test_sendto(c_sock, TEST_STR_SMALL, strlen(TEST_STR_SMALL), 0,
704 (struct sockaddr *)&s_saddr, sizeof(s_saddr));
705
706 test_accept(s_sock, &new_sock, &addr, &addrlen);
707 zassert_equal(addrlen, sizeof(struct sockaddr_in6), "wrong addrlen");
708
709 test_recvfrom(new_sock, 0, NULL, NULL);
710
711 test_close(new_sock);
712 test_close(s_sock);
713 test_close(c_sock);
714
715 k_sleep(TCP_TEARDOWN_TIMEOUT);
716 }
717
ZTEST_USER(net_socket_tcp,test_v4_sendto_recvmsg)718 ZTEST_USER(net_socket_tcp, test_v4_sendto_recvmsg)
719 {
720 int c_sock;
721 int s_sock;
722 int new_sock;
723 struct sockaddr_in c_saddr;
724 struct sockaddr_in s_saddr;
725 struct sockaddr addr;
726 socklen_t addrlen = sizeof(addr);
727 #define MAX_BUF_LEN 64
728 #define SMALL_BUF_LEN (sizeof(TEST_STR_SMALL) - 1 - 2)
729 char buf[MAX_BUF_LEN];
730 char buf2[SMALL_BUF_LEN];
731 char buf3[MAX_BUF_LEN];
732 struct iovec io_vector[3];
733 struct msghdr msg;
734 int i, len;
735
736 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr);
737 prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &s_sock, &s_saddr);
738
739 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
740 test_listen(s_sock);
741
742 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
743 test_sendto(c_sock, TEST_STR_SMALL, strlen(TEST_STR_SMALL), 0,
744 (struct sockaddr *)&s_saddr, sizeof(s_saddr));
745
746 test_accept(s_sock, &new_sock, &addr, &addrlen);
747 zassert_equal(addrlen, sizeof(struct sockaddr_in), "wrong addrlen");
748
749 /* Read data first in one chunk */
750 io_vector[0].iov_base = buf;
751 io_vector[0].iov_len = sizeof(buf);
752
753 memset(&msg, 0, sizeof(msg));
754 msg.msg_iov = io_vector;
755 msg.msg_iovlen = 1;
756 msg.msg_name = &addr;
757 msg.msg_namelen = addrlen;
758
759 len = strlen(TEST_STR_SMALL);
760 test_recvmsg(new_sock, &msg, ZSOCK_MSG_PEEK, len, __LINE__);
761 zassert_equal(msg.msg_iovlen, 1, "recvmsg should not modify msg_iovlen");
762 zassert_equal(msg.msg_iov[0].iov_len, sizeof(buf),
763 "recvmsg should not modify buffer length");
764 zassert_mem_equal(buf, TEST_STR_SMALL, len, "wrong data (%s)", buf);
765
766 /* Then in two chunks */
767 io_vector[0].iov_base = buf2;
768 io_vector[0].iov_len = sizeof(buf2);
769 io_vector[1].iov_base = buf;
770 io_vector[1].iov_len = sizeof(buf);
771
772 memset(&msg, 0, sizeof(msg));
773 msg.msg_iov = io_vector;
774 msg.msg_iovlen = 2;
775 msg.msg_name = &addr;
776 msg.msg_namelen = addrlen;
777
778 len = strlen(TEST_STR_SMALL);
779 test_recvmsg(new_sock, &msg, 0, len, __LINE__);
780 zassert_equal(msg.msg_iovlen, 2, "recvmsg should not modify msg_iovlen");
781 zassert_equal(msg.msg_iov[0].iov_len, sizeof(buf2),
782 "recvmsg should not modify buffer length");
783 zassert_equal(msg.msg_iov[1].iov_len, sizeof(buf),
784 "recvmsg should not modify buffer length");
785 zassert_mem_equal(msg.msg_iov[0].iov_base, TEST_STR_SMALL, msg.msg_iov[0].iov_len,
786 "wrong data in %s", "iov[0]");
787 len -= msg.msg_iov[0].iov_len;
788 zassert_mem_equal(msg.msg_iov[1].iov_base, &TEST_STR_SMALL[msg.msg_iov[0].iov_len],
789 len, "wrong data in %s", "iov[1]");
790
791 /* Send larger test buffer */
792 test_sendto(c_sock, TEST_STR_LONG, strlen(TEST_STR_LONG), 0,
793 (struct sockaddr *)&s_saddr, sizeof(s_saddr));
794
795 /* Verify that the data is truncated */
796 io_vector[0].iov_base = buf;
797 io_vector[0].iov_len = sizeof(buf);
798 io_vector[1].iov_base = buf2;
799 io_vector[1].iov_len = sizeof(buf2);
800 io_vector[2].iov_base = buf3;
801 io_vector[2].iov_len = sizeof(buf3);
802
803 memset(&msg, 0, sizeof(msg));
804 msg.msg_iov = io_vector;
805 msg.msg_iovlen = 3;
806 msg.msg_name = &addr;
807 msg.msg_namelen = addrlen;
808
809 for (i = 0, len = 0; i < msg.msg_iovlen; i++) {
810 len += msg.msg_iov[i].iov_len;
811 }
812
813 test_recvmsg(new_sock, &msg, 0, len, __LINE__);
814 zassert_equal(msg.msg_iovlen, 3, "recvmsg should not modify msg_iovlen");
815 zassert_equal(msg.msg_iov[0].iov_len, sizeof(buf),
816 "recvmsg should not modify buffer length");
817 zassert_equal(msg.msg_iov[1].iov_len, sizeof(buf2),
818 "recvmsg should not modify buffer length");
819 zassert_equal(msg.msg_iov[2].iov_len, sizeof(buf3),
820 "recvmsg should not modify buffer length");
821 zassert_mem_equal(msg.msg_iov[0].iov_base, TEST_STR_LONG, msg.msg_iov[0].iov_len,
822 "wrong data in %s", "iov[0]");
823 zassert_mem_equal(msg.msg_iov[1].iov_base, &TEST_STR_LONG[msg.msg_iov[0].iov_len],
824 msg.msg_iov[1].iov_len,
825 "wrong data in %s", "iov[1]");
826 zassert_mem_equal(msg.msg_iov[2].iov_base,
827 &TEST_STR_LONG[msg.msg_iov[0].iov_len + msg.msg_iov[1].iov_len],
828 msg.msg_iov[2].iov_len,
829 "wrong data in %s", "iov[2]");
830
831 test_close(new_sock);
832 test_close(s_sock);
833 test_close(c_sock);
834
835 k_sleep(TCP_TEARDOWN_TIMEOUT);
836 }
837
_test_recv_enotconn(int c_sock,int s_sock)838 void _test_recv_enotconn(int c_sock, int s_sock)
839 {
840 char rx_buf[1] = {0};
841 int res;
842
843 test_listen(s_sock);
844
845 /* Check "client" socket, just created. */
846 res = zsock_recv(c_sock, rx_buf, sizeof(rx_buf), 0);
847 zassert_equal(res, -1, "recv() on not connected sock didn't fail");
848 zassert_equal(errno, ENOTCONN, "recv() on not connected sock didn't "
849 "lead to ENOTCONN");
850
851 /* Check "server" socket, bound and listen()ed . */
852 res = zsock_recv(s_sock, rx_buf, sizeof(rx_buf), 0);
853 zassert_equal(res, -1, "recv() on not connected sock didn't fail");
854 zassert_equal(errno, ENOTCONN, "recv() on not connected sock didn't "
855 "lead to ENOTCONN");
856
857 test_close(s_sock);
858 test_close(c_sock);
859
860 k_sleep(TCP_TEARDOWN_TIMEOUT);
861 }
862
ZTEST_USER(net_socket_tcp,test_v4_recv_enotconn)863 ZTEST_USER(net_socket_tcp, test_v4_recv_enotconn)
864 {
865 /* For a stream socket, recv() without connect() or accept()
866 * should lead to ENOTCONN.
867 */
868 int c_sock, s_sock;
869 struct sockaddr_in c_saddr, s_saddr;
870
871 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr);
872 prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &s_sock, &s_saddr);
873
874 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
875
876 _test_recv_enotconn(c_sock, s_sock);
877 }
878
ZTEST_USER(net_socket_tcp,test_v6_recv_enotconn)879 ZTEST_USER(net_socket_tcp, test_v6_recv_enotconn)
880 {
881 /* For a stream socket, recv() without connect() or accept()
882 * should lead to ENOTCONN.
883 */
884 int c_sock, s_sock;
885 struct sockaddr_in6 c_saddr, s_saddr;
886
887 prepare_sock_tcp_v6(MY_IPV6_ADDR, ANY_PORT, &c_sock, &c_saddr);
888 prepare_sock_tcp_v6(MY_IPV6_ADDR, SERVER_PORT, &s_sock, &s_saddr);
889
890 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
891
892 _test_recv_enotconn(c_sock, s_sock);
893 }
894
ZTEST_USER(net_socket_tcp,test_shutdown_rd_synchronous)895 ZTEST_USER(net_socket_tcp, test_shutdown_rd_synchronous)
896 {
897 /* recv() after shutdown(..., ZSOCK_SHUT_RD) should return 0 (EOF).
898 */
899 int c_sock;
900 int s_sock;
901 int new_sock;
902 struct sockaddr_in6 c_saddr, s_saddr;
903 struct sockaddr addr;
904 socklen_t addrlen = sizeof(addr);
905
906 prepare_sock_tcp_v6(MY_IPV6_ADDR, ANY_PORT, &c_sock, &c_saddr);
907 prepare_sock_tcp_v6(MY_IPV6_ADDR, SERVER_PORT, &s_sock, &s_saddr);
908
909 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
910 test_listen(s_sock);
911
912 /* Connect and accept that connection */
913 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
914
915 test_accept(s_sock, &new_sock, &addr, &addrlen);
916
917 /* Shutdown reception */
918 test_shutdown(c_sock, ZSOCK_SHUT_RD);
919
920 /* EOF should be notified by recv() */
921 test_eof(c_sock);
922
923 test_close(new_sock);
924 test_close(s_sock);
925 test_close(c_sock);
926
927 k_sleep(TCP_TEARDOWN_TIMEOUT);
928 }
929
930 struct shutdown_data {
931 struct k_work_delayable work;
932 int fd;
933 int how;
934 };
935
shutdown_work(struct k_work * work)936 static void shutdown_work(struct k_work *work)
937 {
938 struct k_work_delayable *dwork = k_work_delayable_from_work(work);
939 struct shutdown_data *data = CONTAINER_OF(dwork, struct shutdown_data,
940 work);
941
942 zsock_shutdown(data->fd, data->how);
943 }
944
ZTEST(net_socket_tcp,test_shutdown_rd_while_recv)945 ZTEST(net_socket_tcp, test_shutdown_rd_while_recv)
946 {
947 /* Blocking recv() should return EOF after shutdown(..., ZSOCK_SHUT_RD) is
948 * called from another thread.
949 */
950 int c_sock;
951 int s_sock;
952 int new_sock;
953 struct sockaddr_in6 c_saddr, s_saddr;
954 struct sockaddr addr;
955 socklen_t addrlen = sizeof(addr);
956 struct shutdown_data shutdown_work_data;
957
958 prepare_sock_tcp_v6(MY_IPV6_ADDR, ANY_PORT, &c_sock, &c_saddr);
959 prepare_sock_tcp_v6(MY_IPV6_ADDR, SERVER_PORT, &s_sock, &s_saddr);
960
961 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
962 test_listen(s_sock);
963
964 /* Connect and accept that connection */
965 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
966
967 test_accept(s_sock, &new_sock, &addr, &addrlen);
968
969 /* Schedule reception shutdown from workqueue */
970 k_work_init_delayable(&shutdown_work_data.work, shutdown_work);
971 shutdown_work_data.fd = c_sock;
972 shutdown_work_data.how = ZSOCK_SHUT_RD;
973 k_work_schedule(&shutdown_work_data.work, K_MSEC(10));
974
975 /* Start blocking recv(), which should be unblocked by shutdown() from
976 * another thread and return EOF (0).
977 */
978 test_eof(c_sock);
979
980 test_close(new_sock);
981 test_close(s_sock);
982 test_close(c_sock);
983
984 test_context_cleanup();
985 }
986
ZTEST(net_socket_tcp,test_open_close_immediately)987 ZTEST(net_socket_tcp, test_open_close_immediately)
988 {
989 /* Test if socket closing works if done immediately after
990 * receiving SYN.
991 */
992 int count_before = 0, count_after = 0;
993 struct sockaddr_in c_saddr;
994 struct sockaddr_in s_saddr;
995 int c_sock;
996 int s_sock;
997
998 test_context_cleanup();
999
1000 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr);
1001 prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &s_sock, &s_saddr);
1002
1003 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1004 test_listen(s_sock);
1005
1006 /* We should have two contexts open now */
1007 net_context_foreach(calc_net_context, &count_before);
1008
1009 /* Try to connect to a port that is not accepting connections.
1010 * The end result should be that we do not leak net_context.
1011 */
1012 s_saddr.sin_port = htons(SERVER_PORT + 1);
1013
1014 zassert_not_equal(zsock_connect(c_sock, (struct sockaddr *)&s_saddr,
1015 sizeof(s_saddr)),
1016 0, "connect succeed");
1017
1018 test_close(c_sock);
1019
1020 /* Allow for the close communication to finish,
1021 * this makes the test success, no longer scheduling dependent
1022 */
1023 k_sleep(K_MSEC(CONFIG_NET_TCP_INIT_RETRANSMISSION_TIMEOUT / 2));
1024
1025 /* After the client socket closing, the context count should be 1 */
1026 net_context_foreach(calc_net_context, &count_after);
1027
1028 test_close(s_sock);
1029
1030 /* Although closing a server socket does not require communication,
1031 * wait a little to make the test robust to scheduling order
1032 */
1033 k_sleep(K_MSEC(CONFIG_NET_TCP_INIT_RETRANSMISSION_TIMEOUT / 2));
1034
1035 zassert_equal(count_before - 1, count_after,
1036 "net_context still in use (before %d vs after %d)",
1037 count_before - 1, count_after);
1038
1039 /* No need to wait here, as the test success depends on the socket being closed */
1040 test_context_cleanup();
1041 }
1042
ZTEST(net_socket_tcp,test_connect_timeout)1043 ZTEST(net_socket_tcp, test_connect_timeout)
1044 {
1045 /* Test if socket connect fails when there is not communication
1046 * possible.
1047 */
1048 int count_after = 0;
1049 struct sockaddr_in c_saddr;
1050 struct sockaddr_in s_saddr;
1051 int c_sock;
1052 int rv;
1053
1054 restore_packet_loss_ratio();
1055
1056 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr);
1057
1058 s_saddr.sin_family = AF_INET;
1059 s_saddr.sin_port = htons(SERVER_PORT);
1060 rv = zsock_inet_pton(AF_INET, MY_IPV4_ADDR, &s_saddr.sin_addr);
1061 zassert_equal(rv, 1, "inet_pton failed");
1062
1063 loopback_set_packet_drop_ratio(1.0f);
1064
1065 zassert_equal(zsock_connect(c_sock, (struct sockaddr *)&s_saddr,
1066 sizeof(s_saddr)),
1067 -1, "connect succeed");
1068
1069 zassert_equal(errno, ETIMEDOUT,
1070 "connect should be timed out, got %i", errno);
1071
1072 test_close(c_sock);
1073
1074 /* Sleep here in order to allow other part of the system to run and
1075 * update itself.
1076 */
1077 k_sleep(K_MSEC(10));
1078
1079 /* After the client socket closing, the context count should be 0 */
1080 net_context_foreach(calc_net_context, &count_after);
1081
1082 zassert_equal(count_after, 0,
1083 "net_context %d still in use", count_after);
1084
1085 restore_packet_loss_ratio();
1086 }
1087
1088 #define ASYNC_POLL_TIMEOUT 2000
1089 #define POLL_FDS_NUM 1
1090
1091
ZTEST(net_socket_tcp,test_async_connect_timeout)1092 ZTEST(net_socket_tcp, test_async_connect_timeout)
1093 {
1094 /* Test if asynchronous socket connect fails when there is no communication
1095 * possible.
1096 */
1097 struct sockaddr_in c_saddr;
1098 struct sockaddr_in s_saddr;
1099 int c_sock;
1100 int rv;
1101 struct zsock_pollfd poll_fds[POLL_FDS_NUM];
1102
1103 loopback_set_packet_drop_ratio(1.0f);
1104
1105 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr);
1106 test_fcntl(c_sock, F_SETFL, O_NONBLOCK);
1107 s_saddr.sin_family = AF_INET;
1108 s_saddr.sin_port = htons(SERVER_PORT);
1109 rv = zsock_inet_pton(AF_INET, MY_IPV4_ADDR, &s_saddr.sin_addr);
1110 zassert_equal(rv, 1, "inet_pton failed");
1111
1112 rv = zsock_connect(c_sock, (struct sockaddr *)&s_saddr,
1113 sizeof(s_saddr));
1114 zassert_equal(rv, -1, "connect should not succeed");
1115 zassert_equal(errno, EINPROGRESS,
1116 "connect should be in progress, got %i", errno);
1117
1118 poll_fds[0].fd = c_sock;
1119 poll_fds[0].events = ZSOCK_POLLOUT;
1120 int poll_rc = zsock_poll(poll_fds, POLL_FDS_NUM, ASYNC_POLL_TIMEOUT);
1121
1122 zassert_equal(poll_rc, 1, "poll should return 1, got %i", poll_rc);
1123 zassert_equal(poll_fds[0].revents, ZSOCK_POLLERR,
1124 "poll should set error event");
1125
1126 test_close(c_sock);
1127
1128 test_context_cleanup();
1129
1130 restore_packet_loss_ratio();
1131 }
1132
ZTEST(net_socket_tcp,test_async_connect)1133 ZTEST(net_socket_tcp, test_async_connect)
1134 {
1135 int c_sock;
1136 int s_sock;
1137 int new_sock;
1138 struct sockaddr_in c_saddr;
1139 struct sockaddr_in s_saddr;
1140 struct sockaddr addr;
1141 socklen_t addrlen = sizeof(addr);
1142 struct zsock_pollfd poll_fds[1];
1143 int poll_rc;
1144
1145 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr);
1146 prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &s_sock, &s_saddr);
1147 test_fcntl(c_sock, F_SETFL, O_NONBLOCK);
1148
1149 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1150 test_listen(s_sock);
1151
1152 zassert_equal(zsock_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr)),
1153 -1,
1154 "connect shouldn't complete right away");
1155
1156 zassert_equal(errno, EINPROGRESS,
1157 "connect should be in progress, got %i", errno);
1158
1159 poll_fds[0].fd = c_sock;
1160 poll_fds[0].events = ZSOCK_POLLOUT;
1161 poll_rc = zsock_poll(poll_fds, 1, ASYNC_POLL_TIMEOUT);
1162 zassert_equal(poll_rc, 1, "poll should return 1, got %i", poll_rc);
1163 zassert_equal(poll_fds[0].revents, ZSOCK_POLLOUT,
1164 "poll should set POLLOUT");
1165
1166 test_accept(s_sock, &new_sock, &addr, &addrlen);
1167 zassert_equal(addrlen, sizeof(struct sockaddr_in), "Wrong addrlen");
1168
1169 test_close(c_sock);
1170 test_close(s_sock);
1171 test_close(new_sock);
1172
1173 test_context_cleanup();
1174 }
1175
1176 #define TCP_CLOSE_FAILURE_TIMEOUT 90000
1177
ZTEST(net_socket_tcp,test_z_close_obstructed)1178 ZTEST(net_socket_tcp, test_z_close_obstructed)
1179 {
1180 /* Test if socket closing even when there is not communication
1181 * possible any more
1182 */
1183 int count_before = 0, count_after = 0;
1184 struct sockaddr_in c_saddr;
1185 struct sockaddr_in s_saddr;
1186 struct sockaddr addr;
1187 socklen_t addrlen = sizeof(addr);
1188 int c_sock;
1189 int s_sock;
1190 int new_sock;
1191 int dropped_packets_before = 0;
1192 int dropped_packets_after = 0;
1193
1194 restore_packet_loss_ratio();
1195
1196 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr);
1197 prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &s_sock, &s_saddr);
1198
1199 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1200 test_listen(s_sock);
1201
1202 zassert_equal(zsock_connect(c_sock, (struct sockaddr *)&s_saddr,
1203 sizeof(s_saddr)),
1204 0, "connect not succeed");
1205 test_accept(s_sock, &new_sock, &addr, &addrlen);
1206
1207 /* We should have two contexts open now */
1208 net_context_foreach(calc_net_context, &count_before);
1209
1210 /* Break the communication */
1211 loopback_set_packet_drop_ratio(1.0f);
1212
1213 dropped_packets_before = loopback_get_num_dropped_packets();
1214
1215 test_close(c_sock);
1216
1217 wait_for_n_tcp_contexts(count_before-1, K_MSEC(TCP_CLOSE_FAILURE_TIMEOUT));
1218
1219 net_context_foreach(calc_net_context, &count_after);
1220
1221 zassert_equal(count_before - 1, count_after,
1222 "net_context still in use (before %d vs after %d)",
1223 count_before - 1, count_after);
1224
1225 dropped_packets_after = loopback_get_num_dropped_packets();
1226 int dropped_packets = dropped_packets_after - dropped_packets_before;
1227
1228 /* At least some packet should have been dropped */
1229 zassert_equal(dropped_packets,
1230 CONFIG_NET_TCP_RETRY_COUNT + 1,
1231 "Incorrect number of FIN retries, got %i, expected %i",
1232 dropped_packets, CONFIG_NET_TCP_RETRY_COUNT+1);
1233
1234 test_close(new_sock);
1235 test_close(s_sock);
1236
1237 test_context_cleanup();
1238
1239 /* After everything is closed, we expect no more dropped packets */
1240 dropped_packets_before = loopback_get_num_dropped_packets();
1241 k_sleep(K_SECONDS(2));
1242 dropped_packets_after = loopback_get_num_dropped_packets();
1243
1244 zassert_equal(dropped_packets_before, dropped_packets_after,
1245 "packets after close");
1246
1247 restore_packet_loss_ratio();
1248 }
1249
ZTEST_USER(net_socket_tcp,test_v4_accept_timeout)1250 ZTEST_USER(net_socket_tcp, test_v4_accept_timeout)
1251 {
1252 /* Test if accept() will timeout properly */
1253 int s_sock;
1254 int new_sock;
1255 uint32_t tstamp;
1256 struct sockaddr_in s_saddr;
1257 struct sockaddr addr;
1258 socklen_t addrlen = sizeof(addr);
1259
1260 prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &s_sock, &s_saddr);
1261
1262 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1263 test_listen(s_sock);
1264
1265 test_fcntl(s_sock, F_SETFL, O_NONBLOCK);
1266
1267 tstamp = k_uptime_get_32();
1268 test_accept_timeout(s_sock, &new_sock, &addr, &addrlen);
1269 zassert_true(k_uptime_get_32() - tstamp <= 100, "");
1270
1271 test_close(s_sock);
1272
1273 k_sleep(TCP_TEARDOWN_TIMEOUT);
1274 }
1275
ZTEST(net_socket_tcp,test_so_type)1276 ZTEST(net_socket_tcp, test_so_type)
1277 {
1278 struct sockaddr_in bind_addr4;
1279 struct sockaddr_in6 bind_addr6;
1280 int sock1, sock2, rv;
1281 int optval;
1282 socklen_t optlen = sizeof(optval);
1283
1284 zassert_equal(wait_for_n_tcp_contexts(0, TCP_TEARDOWN_TIMEOUT),
1285 0,
1286 "Not all TCP contexts properly cleaned up");
1287
1288 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &sock1, &bind_addr4);
1289 prepare_sock_tcp_v6(MY_IPV6_ADDR, ANY_PORT, &sock2, &bind_addr6);
1290
1291 rv = zsock_getsockopt(sock1, SOL_SOCKET, SO_TYPE, &optval, &optlen);
1292 zassert_equal(rv, 0, "getsockopt failed (%d)", errno);
1293 zassert_equal(optval, SOCK_STREAM, "getsockopt got invalid type");
1294 zassert_equal(optlen, sizeof(optval), "getsockopt got invalid size");
1295
1296 rv = zsock_getsockopt(sock2, SOL_SOCKET, SO_TYPE, &optval, &optlen);
1297 zassert_equal(rv, 0, "getsockopt failed (%d)", errno);
1298 zassert_equal(optval, SOCK_STREAM, "getsockopt got invalid type");
1299 zassert_equal(optlen, sizeof(optval), "getsockopt got invalid size");
1300
1301 test_close(sock1);
1302 test_close(sock2);
1303
1304 zassert_equal(wait_for_n_tcp_contexts(0, TCP_TEARDOWN_TIMEOUT),
1305 0,
1306 "Not all TCP contexts properly cleaned up");
1307 }
1308
ZTEST(net_socket_tcp,test_so_protocol)1309 ZTEST(net_socket_tcp, test_so_protocol)
1310 {
1311 struct sockaddr_in bind_addr4;
1312 struct sockaddr_in6 bind_addr6;
1313 int sock1, sock2, rv;
1314 int optval;
1315 socklen_t optlen = sizeof(optval);
1316
1317 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &sock1, &bind_addr4);
1318 prepare_sock_tcp_v6(MY_IPV6_ADDR, ANY_PORT, &sock2, &bind_addr6);
1319
1320 rv = zsock_getsockopt(sock1, SOL_SOCKET, SO_PROTOCOL, &optval, &optlen);
1321 zassert_equal(rv, 0, "getsockopt failed (%d)", errno);
1322 zassert_equal(optval, IPPROTO_TCP, "getsockopt got invalid protocol");
1323 zassert_equal(optlen, sizeof(optval), "getsockopt got invalid size");
1324
1325 rv = zsock_getsockopt(sock2, SOL_SOCKET, SO_PROTOCOL, &optval, &optlen);
1326 zassert_equal(rv, 0, "getsockopt failed (%d)", errno);
1327 zassert_equal(optval, IPPROTO_TCP, "getsockopt got invalid protocol");
1328 zassert_equal(optlen, sizeof(optval), "getsockopt got invalid size");
1329
1330 test_close(sock1);
1331 test_close(sock2);
1332
1333 test_context_cleanup();
1334 }
1335
ZTEST(net_socket_tcp,test_so_rcvbuf)1336 ZTEST(net_socket_tcp, test_so_rcvbuf)
1337 {
1338 struct sockaddr_in bind_addr4;
1339 struct sockaddr_in6 bind_addr6;
1340 int sock1, sock2, rv;
1341 int retval;
1342 int optval = UINT16_MAX;
1343 socklen_t optlen = sizeof(optval);
1344
1345 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &sock1, &bind_addr4);
1346 prepare_sock_tcp_v6(MY_IPV6_ADDR, ANY_PORT, &sock2, &bind_addr6);
1347
1348 rv = zsock_setsockopt(sock1, SOL_SOCKET, SO_RCVBUF, &optval, sizeof(optval));
1349 zassert_equal(rv, 0, "setsockopt failed (%d)", rv);
1350 rv = zsock_getsockopt(sock1, SOL_SOCKET, SO_RCVBUF, &retval, &optlen);
1351 zassert_equal(rv, 0, "getsockopt failed (%d)", rv);
1352 zassert_equal(retval, optval, "getsockopt got invalid rcvbuf");
1353 zassert_equal(optlen, sizeof(optval), "getsockopt got invalid size");
1354
1355 rv = zsock_setsockopt(sock2, SOL_SOCKET, SO_RCVBUF, &optval, sizeof(optval));
1356 zassert_equal(rv, 0, "setsockopt failed (%d)", rv);
1357 rv = zsock_getsockopt(sock2, SOL_SOCKET, SO_RCVBUF, &retval, &optlen);
1358 zassert_equal(rv, 0, "getsockopt failed (%d)", rv);
1359 zassert_equal(retval, optval, "getsockopt got invalid rcvbuf");
1360 zassert_equal(optlen, sizeof(optval), "getsockopt got invalid size");
1361
1362 optval = -1;
1363 rv = zsock_setsockopt(sock2, SOL_SOCKET, SO_RCVBUF, &optval, sizeof(optval));
1364 zassert_equal(rv, -1, "setsockopt failed (%d)", rv);
1365
1366 optval = UINT16_MAX + 1;
1367 rv = zsock_setsockopt(sock2, SOL_SOCKET, SO_RCVBUF, &optval, sizeof(optval));
1368 zassert_equal(rv, -1, "setsockopt failed (%d)", rv);
1369
1370 test_close(sock1);
1371 test_close(sock2);
1372
1373 test_context_cleanup();
1374 }
1375
ZTEST(net_socket_tcp,test_so_rcvbuf_win_size)1376 ZTEST(net_socket_tcp, test_so_rcvbuf_win_size)
1377 {
1378 int rv;
1379 int c_sock;
1380 int s_sock;
1381 int new_sock;
1382 struct sockaddr_in c_saddr;
1383 struct sockaddr_in s_saddr;
1384 struct sockaddr addr;
1385 socklen_t addrlen = sizeof(addr);
1386 char tx_buf[] = TEST_STR_SMALL;
1387 int buf_optval = sizeof(TEST_STR_SMALL);
1388
1389 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr);
1390 prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &s_sock, &s_saddr);
1391
1392 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1393 test_listen(s_sock);
1394
1395 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1396
1397 test_accept(s_sock, &new_sock, &addr, &addrlen);
1398 zassert_equal(addrlen, sizeof(struct sockaddr_in), "wrong addrlen");
1399
1400 /* Lower server-side RX window size. */
1401 rv = zsock_setsockopt(new_sock, SOL_SOCKET, SO_RCVBUF, &buf_optval,
1402 sizeof(buf_optval));
1403 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
1404
1405 rv = zsock_send(c_sock, tx_buf, sizeof(tx_buf), ZSOCK_MSG_DONTWAIT);
1406 zassert_equal(rv, sizeof(tx_buf), "Unexpected return code %d", rv);
1407
1408 /* Window should've dropped to 0, so the ACK will be delayed - wait for
1409 * it to arrive, so that the client is aware of the new window size.
1410 */
1411 k_msleep(150);
1412
1413 /* Client should not be able to send now (RX window full). */
1414 rv = zsock_send(c_sock, tx_buf, 1, ZSOCK_MSG_DONTWAIT);
1415 zassert_equal(rv, -1, "Unexpected return code %d", rv);
1416 zassert_equal(errno, EAGAIN, "Unexpected errno value: %d", errno);
1417
1418 test_close(c_sock);
1419 test_close(new_sock);
1420 test_close(s_sock);
1421
1422 test_context_cleanup();
1423 }
1424
ZTEST(net_socket_tcp,test_so_sndbuf)1425 ZTEST(net_socket_tcp, test_so_sndbuf)
1426 {
1427 struct sockaddr_in bind_addr4;
1428 struct sockaddr_in6 bind_addr6;
1429 int sock1, sock2, rv;
1430 int retval;
1431 int optval = UINT16_MAX;
1432 socklen_t optlen = sizeof(optval);
1433
1434 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &sock1, &bind_addr4);
1435 prepare_sock_tcp_v6(MY_IPV6_ADDR, ANY_PORT, &sock2, &bind_addr6);
1436
1437 rv = zsock_setsockopt(sock1, SOL_SOCKET, SO_SNDBUF, &optval, sizeof(optval));
1438 zassert_equal(rv, 0, "setsockopt failed (%d)", rv);
1439 rv = zsock_getsockopt(sock1, SOL_SOCKET, SO_SNDBUF, &retval, &optlen);
1440 zassert_equal(rv, 0, "getsockopt failed (%d)", rv);
1441 zassert_equal(retval, optval, "getsockopt got invalid rcvbuf");
1442 zassert_equal(optlen, sizeof(optval), "getsockopt got invalid size");
1443
1444 rv = zsock_setsockopt(sock2, SOL_SOCKET, SO_SNDBUF, &optval, sizeof(optval));
1445 zassert_equal(rv, 0, "setsockopt failed (%d)", rv);
1446 rv = zsock_getsockopt(sock2, SOL_SOCKET, SO_SNDBUF, &retval, &optlen);
1447 zassert_equal(rv, 0, "getsockopt failed (%d)", rv);
1448 zassert_equal(retval, optval, "getsockopt got invalid rcvbuf");
1449 zassert_equal(optlen, sizeof(optval), "getsockopt got invalid size");
1450
1451 optval = -1;
1452 rv = zsock_setsockopt(sock2, SOL_SOCKET, SO_SNDBUF, &optval, sizeof(optval));
1453 zassert_equal(rv, -1, "setsockopt failed (%d)", rv);
1454
1455 optval = UINT16_MAX + 1;
1456 rv = zsock_setsockopt(sock2, SOL_SOCKET, SO_RCVBUF, &optval, sizeof(optval));
1457 zassert_equal(rv, -1, "setsockopt failed (%d)", rv);
1458
1459 test_close(sock1);
1460 test_close(sock2);
1461
1462 test_context_cleanup();
1463 }
1464
ZTEST(net_socket_tcp,test_so_sndbuf_win_size)1465 ZTEST(net_socket_tcp, test_so_sndbuf_win_size)
1466 {
1467 int rv;
1468 int c_sock;
1469 int s_sock;
1470 int new_sock;
1471 struct sockaddr_in c_saddr;
1472 struct sockaddr_in s_saddr;
1473 struct sockaddr addr;
1474 socklen_t addrlen = sizeof(addr);
1475 char tx_buf[] = TEST_STR_SMALL;
1476 int buf_optval = sizeof(TEST_STR_SMALL);
1477
1478 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr);
1479 prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &s_sock, &s_saddr);
1480
1481 /* Lower client-side TX window size. */
1482 rv = zsock_setsockopt(c_sock, SOL_SOCKET, SO_SNDBUF, &buf_optval,
1483 sizeof(buf_optval));
1484 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
1485
1486 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1487 test_listen(s_sock);
1488
1489 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1490
1491 test_accept(s_sock, &new_sock, &addr, &addrlen);
1492 zassert_equal(addrlen, sizeof(struct sockaddr_in), "wrong addrlen");
1493
1494 /* Make sure the ACK from the server does not arrive. */
1495 loopback_set_packet_drop_ratio(1.0f);
1496
1497 rv = zsock_send(c_sock, tx_buf, sizeof(tx_buf), ZSOCK_MSG_DONTWAIT);
1498 zassert_equal(rv, sizeof(tx_buf), "Unexpected return code %d", rv);
1499
1500 /* Client should not be able to send now (TX window full). */
1501 rv = zsock_send(c_sock, tx_buf, 1, ZSOCK_MSG_DONTWAIT);
1502 zassert_equal(rv, -1, "Unexpected return code %d", rv);
1503 zassert_equal(errno, EAGAIN, "Unexpected errno value: %d", errno);
1504
1505 restore_packet_loss_ratio();
1506
1507 test_close(c_sock);
1508 test_close(new_sock);
1509 test_close(s_sock);
1510
1511 test_context_cleanup();
1512 }
1513
ZTEST(net_socket_tcp,test_v4_so_rcvtimeo)1514 ZTEST(net_socket_tcp, test_v4_so_rcvtimeo)
1515 {
1516 int c_sock;
1517 int s_sock;
1518 int new_sock;
1519 struct sockaddr_in c_saddr;
1520 struct sockaddr_in s_saddr;
1521 struct sockaddr addr;
1522 socklen_t addrlen = sizeof(addr);
1523
1524 int rv;
1525 uint32_t start_time, time_diff;
1526 ssize_t recved = 0;
1527 char rx_buf[30] = {0};
1528
1529 struct timeval optval = {
1530 .tv_sec = 2,
1531 .tv_usec = 500000,
1532 };
1533
1534 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr);
1535 prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &s_sock, &s_saddr);
1536
1537 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1538 test_listen(s_sock);
1539
1540 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1541
1542 test_accept(s_sock, &new_sock, &addr, &addrlen);
1543 zassert_equal(addrlen, sizeof(struct sockaddr_in), "wrong addrlen");
1544
1545 rv = zsock_setsockopt(c_sock, SOL_SOCKET, SO_RCVTIMEO, &optval,
1546 sizeof(optval));
1547 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
1548
1549 optval.tv_usec = 0;
1550 rv = zsock_setsockopt(new_sock, SOL_SOCKET, SO_RCVTIMEO, &optval,
1551 sizeof(optval));
1552 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
1553
1554 start_time = k_uptime_get_32();
1555 recved = zsock_recv(c_sock, rx_buf, sizeof(rx_buf), 0);
1556 time_diff = k_uptime_get_32() - start_time;
1557
1558 zassert_equal(recved, -1, "Unexpected return code");
1559 zassert_equal(errno, EAGAIN, "Unexpected errno value: %d", errno);
1560 zassert_true(time_diff >= 2500, "Expected timeout after 2500ms but "
1561 "was %dms", time_diff);
1562
1563 start_time = k_uptime_get_32();
1564 recved = zsock_recv(new_sock, rx_buf, sizeof(rx_buf), 0);
1565 time_diff = k_uptime_get_32() - start_time;
1566
1567 zassert_equal(recved, -1, "Unexpected return code");
1568 zassert_equal(errno, EAGAIN, "Unexpected errno value: %d", errno);
1569 zassert_true(time_diff >= 2000, "Expected timeout after 2000ms but "
1570 "was %dms", time_diff);
1571
1572 test_close(c_sock);
1573 test_eof(new_sock);
1574
1575 test_close(new_sock);
1576 test_close(s_sock);
1577
1578 test_context_cleanup();
1579 }
1580
ZTEST(net_socket_tcp,test_v6_so_rcvtimeo)1581 ZTEST(net_socket_tcp, test_v6_so_rcvtimeo)
1582 {
1583 int c_sock;
1584 int s_sock;
1585 int new_sock;
1586 struct sockaddr_in6 c_saddr;
1587 struct sockaddr_in6 s_saddr;
1588 struct sockaddr addr;
1589 socklen_t addrlen = sizeof(addr);
1590
1591 int rv;
1592 uint32_t start_time, time_diff;
1593 ssize_t recved = 0;
1594 char rx_buf[30] = {0};
1595
1596 struct timeval optval = {
1597 .tv_sec = 2,
1598 .tv_usec = 500000,
1599 };
1600
1601 prepare_sock_tcp_v6(MY_IPV6_ADDR, ANY_PORT, &c_sock, &c_saddr);
1602 prepare_sock_tcp_v6(MY_IPV6_ADDR, SERVER_PORT, &s_sock, &s_saddr);
1603
1604 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1605 test_listen(s_sock);
1606
1607 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1608
1609 test_accept(s_sock, &new_sock, &addr, &addrlen);
1610 zassert_equal(addrlen, sizeof(struct sockaddr_in6), "wrong addrlen");
1611
1612 rv = zsock_setsockopt(c_sock, SOL_SOCKET, SO_RCVTIMEO, &optval,
1613 sizeof(optval));
1614 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
1615
1616 optval.tv_usec = 0;
1617 rv = zsock_setsockopt(new_sock, SOL_SOCKET, SO_RCVTIMEO, &optval,
1618 sizeof(optval));
1619 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
1620
1621 start_time = k_uptime_get_32();
1622 recved = zsock_recv(c_sock, rx_buf, sizeof(rx_buf), 0);
1623 time_diff = k_uptime_get_32() - start_time;
1624
1625 zassert_equal(recved, -1, "Unexpected return code");
1626 zassert_equal(errno, EAGAIN, "Unexpected errno value: %d", errno);
1627 zassert_true(time_diff >= 2500, "Expected timeout after 2500ms but "
1628 "was %dms", time_diff);
1629
1630 start_time = k_uptime_get_32();
1631 recved = zsock_recv(new_sock, rx_buf, sizeof(rx_buf), 0);
1632 time_diff = k_uptime_get_32() - start_time;
1633
1634 zassert_equal(recved, -1, "Unexpected return code");
1635 zassert_equal(errno, EAGAIN, "Unexpected errno value: %d", errno);
1636 zassert_true(time_diff >= 2000, "Expected timeout after 2000ms but "
1637 "was %dms", time_diff);
1638
1639 test_close(c_sock);
1640 test_eof(new_sock);
1641
1642 test_close(new_sock);
1643 test_close(s_sock);
1644
1645 test_context_cleanup();
1646 }
1647
ZTEST(net_socket_tcp,test_v4_so_sndtimeo)1648 ZTEST(net_socket_tcp, test_v4_so_sndtimeo)
1649 {
1650 int rv;
1651 int c_sock;
1652 int s_sock;
1653 int new_sock;
1654 struct sockaddr_in c_saddr;
1655 struct sockaddr_in s_saddr;
1656 struct sockaddr addr;
1657 socklen_t addrlen = sizeof(addr);
1658 uint32_t start_time, time_diff;
1659 char tx_buf[] = TEST_STR_SMALL;
1660 int buf_optval = sizeof(TEST_STR_SMALL);
1661 struct timeval timeo_optval = {
1662 .tv_sec = 0,
1663 .tv_usec = 200000,
1664 };
1665
1666 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr);
1667 prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &s_sock, &s_saddr);
1668
1669 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1670 test_listen(s_sock);
1671
1672 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1673
1674 test_accept(s_sock, &new_sock, &addr, &addrlen);
1675 zassert_equal(addrlen, sizeof(struct sockaddr_in), "wrong addrlen");
1676
1677 rv = zsock_setsockopt(c_sock, SOL_SOCKET, SO_SNDTIMEO, &timeo_optval,
1678 sizeof(timeo_optval));
1679 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
1680
1681 /* Simulate window full scenario with SO_RCVBUF option. */
1682 rv = zsock_setsockopt(new_sock, SOL_SOCKET, SO_RCVBUF, &buf_optval,
1683 sizeof(buf_optval));
1684 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
1685
1686 rv = zsock_send(c_sock, tx_buf, sizeof(tx_buf), ZSOCK_MSG_DONTWAIT);
1687 zassert_equal(rv, sizeof(tx_buf), "Unexpected return code %d", rv);
1688
1689 /* Wait for ACK (empty window). */
1690 k_msleep(150);
1691
1692 /* Client should not be able to send now and time out after SO_SNDTIMEO */
1693 start_time = k_uptime_get_32();
1694 rv = zsock_send(c_sock, tx_buf, 1, 0);
1695 time_diff = k_uptime_get_32() - start_time;
1696
1697 zassert_equal(rv, -1, "Unexpected return code %d", rv);
1698 zassert_equal(errno, EAGAIN, "Unexpected errno value: %d", errno);
1699 zassert_true(time_diff >= 200, "Expected timeout after 200ms but "
1700 "was %dms", time_diff);
1701
1702 test_close(c_sock);
1703 test_close(new_sock);
1704 test_close(s_sock);
1705
1706 test_context_cleanup();
1707 }
1708
ZTEST(net_socket_tcp,test_v6_so_sndtimeo)1709 ZTEST(net_socket_tcp, test_v6_so_sndtimeo)
1710 {
1711 int rv;
1712 int c_sock;
1713 int s_sock;
1714 int new_sock;
1715 struct sockaddr_in6 c_saddr;
1716 struct sockaddr_in6 s_saddr;
1717 struct sockaddr addr;
1718 socklen_t addrlen = sizeof(addr);
1719 uint32_t start_time, time_diff;
1720 char tx_buf[] = TEST_STR_SMALL;
1721 int buf_optval = sizeof(TEST_STR_SMALL);
1722 struct timeval timeo_optval = {
1723 .tv_sec = 0,
1724 .tv_usec = 500000,
1725 };
1726
1727 prepare_sock_tcp_v6(MY_IPV6_ADDR, ANY_PORT, &c_sock, &c_saddr);
1728 prepare_sock_tcp_v6(MY_IPV6_ADDR, SERVER_PORT, &s_sock, &s_saddr);
1729
1730 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1731 test_listen(s_sock);
1732
1733 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1734
1735 test_accept(s_sock, &new_sock, &addr, &addrlen);
1736 zassert_equal(addrlen, sizeof(struct sockaddr_in6), "wrong addrlen");
1737
1738 rv = zsock_setsockopt(c_sock, SOL_SOCKET, SO_SNDTIMEO, &timeo_optval,
1739 sizeof(timeo_optval));
1740 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
1741
1742 /* Simulate window full scenario with SO_RCVBUF option. */
1743 rv = zsock_setsockopt(new_sock, SOL_SOCKET, SO_RCVBUF, &buf_optval,
1744 sizeof(buf_optval));
1745 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
1746
1747 rv = zsock_send(c_sock, tx_buf, sizeof(tx_buf), ZSOCK_MSG_DONTWAIT);
1748 zassert_equal(rv, sizeof(tx_buf), "Unexpected return code %d", rv);
1749
1750 /* Wait for ACK (empty window). */
1751 k_msleep(150);
1752
1753 /* Client should not be able to send now and time out after SO_SNDTIMEO */
1754 start_time = k_uptime_get_32();
1755 rv = zsock_send(c_sock, tx_buf, 1, 0);
1756 time_diff = k_uptime_get_32() - start_time;
1757
1758 zassert_equal(rv, -1, "Unexpected return code %d", rv);
1759 zassert_equal(errno, EAGAIN, "Unexpected errno value: %d", errno);
1760 zassert_true(time_diff >= 500, "Expected timeout after 500ms but "
1761 "was %dms", time_diff);
1762
1763 test_close(c_sock);
1764 test_close(new_sock);
1765 test_close(s_sock);
1766
1767 test_context_cleanup();
1768 }
1769
1770 struct test_msg_waitall_data {
1771 struct k_work_delayable tx_work;
1772 int sock;
1773 const uint8_t *data;
1774 size_t offset;
1775 int retries;
1776 };
1777
test_msg_waitall_tx_work_handler(struct k_work * work)1778 static void test_msg_waitall_tx_work_handler(struct k_work *work)
1779 {
1780 struct k_work_delayable *dwork = k_work_delayable_from_work(work);
1781 struct test_msg_waitall_data *test_data =
1782 CONTAINER_OF(dwork, struct test_msg_waitall_data, tx_work);
1783
1784 if (test_data->retries > 0) {
1785 test_send(test_data->sock, test_data->data + test_data->offset, 1, 0);
1786 test_data->offset++;
1787 test_data->retries--;
1788 k_work_reschedule(&test_data->tx_work, K_MSEC(10));
1789 }
1790 }
1791
ZTEST(net_socket_tcp,test_v4_msg_waitall)1792 ZTEST(net_socket_tcp, test_v4_msg_waitall)
1793 {
1794 struct test_msg_waitall_data test_data = {
1795 .data = TEST_STR_SMALL,
1796 };
1797 int c_sock;
1798 int s_sock;
1799 int new_sock;
1800 struct sockaddr_in c_saddr;
1801 struct sockaddr_in s_saddr;
1802 struct sockaddr addr;
1803 socklen_t addrlen = sizeof(addr);
1804 int ret;
1805 uint8_t rx_buf[sizeof(TEST_STR_SMALL) - 1] = { 0 };
1806 struct timeval timeo_optval = {
1807 .tv_sec = 0,
1808 .tv_usec = 100000,
1809 };
1810
1811 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr);
1812 prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &s_sock, &s_saddr);
1813
1814 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1815 test_listen(s_sock);
1816
1817 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1818
1819 test_accept(s_sock, &new_sock, &addr, &addrlen);
1820 zassert_equal(addrlen, sizeof(struct sockaddr_in), "Wrong addrlen");
1821
1822
1823 /* Regular MSG_WAITALL - make sure recv returns only after
1824 * requested amount is received.
1825 */
1826 test_data.offset = 0;
1827 test_data.retries = sizeof(rx_buf);
1828 test_data.sock = c_sock;
1829 k_work_init_delayable(&test_data.tx_work,
1830 test_msg_waitall_tx_work_handler);
1831 k_work_reschedule(&test_data.tx_work, K_MSEC(10));
1832
1833 ret = zsock_recv(new_sock, rx_buf, sizeof(rx_buf), ZSOCK_MSG_WAITALL);
1834 zassert_equal(ret, sizeof(rx_buf), "Invalid length received");
1835 zassert_mem_equal(rx_buf, TEST_STR_SMALL, sizeof(rx_buf),
1836 "Invalid data received");
1837 k_work_cancel_delayable(&test_data.tx_work);
1838
1839 /* MSG_WAITALL + SO_RCVTIMEO - make sure recv returns the amount of data
1840 * received so far
1841 */
1842 ret = zsock_setsockopt(new_sock, SOL_SOCKET, SO_RCVTIMEO, &timeo_optval,
1843 sizeof(timeo_optval));
1844 zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
1845
1846 memset(rx_buf, 0, sizeof(rx_buf));
1847 test_data.offset = 0;
1848 test_data.retries = sizeof(rx_buf) - 1;
1849 test_data.sock = c_sock;
1850 k_work_init_delayable(&test_data.tx_work,
1851 test_msg_waitall_tx_work_handler);
1852 k_work_reschedule(&test_data.tx_work, K_MSEC(10));
1853
1854 ret = zsock_recv(new_sock, rx_buf, sizeof(rx_buf) - 1, ZSOCK_MSG_WAITALL);
1855 if (ret < 0) {
1856 LOG_ERR("receive return val %i", ret);
1857 }
1858 zassert_equal(ret, sizeof(rx_buf) - 1, "Invalid length received");
1859 zassert_mem_equal(rx_buf, TEST_STR_SMALL, sizeof(rx_buf) - 1,
1860 "Invalid data received");
1861 k_work_cancel_delayable(&test_data.tx_work);
1862
1863 test_close(new_sock);
1864 test_close(s_sock);
1865 test_close(c_sock);
1866
1867 test_context_cleanup();
1868 }
1869
ZTEST(net_socket_tcp,test_v6_msg_waitall)1870 ZTEST(net_socket_tcp, test_v6_msg_waitall)
1871 {
1872 struct test_msg_waitall_data test_data = {
1873 .data = TEST_STR_SMALL,
1874 };
1875 int c_sock;
1876 int s_sock;
1877 int new_sock;
1878 struct sockaddr_in6 c_saddr;
1879 struct sockaddr_in6 s_saddr;
1880 struct sockaddr addr;
1881 socklen_t addrlen = sizeof(addr);
1882 int ret;
1883 uint8_t rx_buf[sizeof(TEST_STR_SMALL) - 1] = { 0 };
1884 struct timeval timeo_optval = {
1885 .tv_sec = 0,
1886 .tv_usec = 100000,
1887 };
1888
1889 prepare_sock_tcp_v6(MY_IPV6_ADDR, ANY_PORT, &c_sock, &c_saddr);
1890 prepare_sock_tcp_v6(MY_IPV6_ADDR, SERVER_PORT, &s_sock, &s_saddr);
1891
1892 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1893 test_listen(s_sock);
1894
1895 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
1896
1897 test_accept(s_sock, &new_sock, &addr, &addrlen);
1898 zassert_equal(addrlen, sizeof(struct sockaddr_in6), "Wrong addrlen");
1899
1900 /* Regular MSG_WAITALL - make sure recv returns only after
1901 * requested amount is received.
1902 */
1903 test_data.offset = 0;
1904 test_data.retries = sizeof(rx_buf);
1905 test_data.sock = c_sock;
1906 k_work_init_delayable(&test_data.tx_work,
1907 test_msg_waitall_tx_work_handler);
1908 k_work_reschedule(&test_data.tx_work, K_MSEC(10));
1909
1910 ret = zsock_recv(new_sock, rx_buf, sizeof(rx_buf), ZSOCK_MSG_WAITALL);
1911 zassert_equal(ret, sizeof(rx_buf), "Invalid length received");
1912 zassert_mem_equal(rx_buf, TEST_STR_SMALL, sizeof(rx_buf),
1913 "Invalid data received");
1914 k_work_cancel_delayable(&test_data.tx_work);
1915
1916 /* MSG_WAITALL + SO_RCVTIMEO - make sure recv returns the amount of data
1917 * received so far
1918 */
1919 ret = zsock_setsockopt(new_sock, SOL_SOCKET, SO_RCVTIMEO, &timeo_optval,
1920 sizeof(timeo_optval));
1921 zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
1922
1923 memset(rx_buf, 0, sizeof(rx_buf));
1924 test_data.offset = 0;
1925 test_data.retries = sizeof(rx_buf) - 1;
1926 test_data.sock = c_sock;
1927 k_work_init_delayable(&test_data.tx_work,
1928 test_msg_waitall_tx_work_handler);
1929 k_work_reschedule(&test_data.tx_work, K_MSEC(10));
1930
1931 ret = zsock_recv(new_sock, rx_buf, sizeof(rx_buf) - 1, ZSOCK_MSG_WAITALL);
1932 zassert_equal(ret, sizeof(rx_buf) - 1, "Invalid length received");
1933 zassert_mem_equal(rx_buf, TEST_STR_SMALL, sizeof(rx_buf) - 1,
1934 "Invalid data received");
1935 k_work_cancel_delayable(&test_data.tx_work);
1936
1937 test_close(new_sock);
1938 test_close(s_sock);
1939 test_close(c_sock);
1940
1941 test_context_cleanup();
1942 }
1943
1944 #ifdef CONFIG_USERSPACE
1945 #define CHILD_STACK_SZ (2048 + CONFIG_TEST_EXTRA_STACK_SIZE)
1946 struct k_thread child_thread;
1947 K_THREAD_STACK_DEFINE(child_stack, CHILD_STACK_SZ);
1948 ZTEST_BMEM volatile int result;
1949
child_entry(void * p1,void * p2,void * p3)1950 static void child_entry(void *p1, void *p2, void *p3)
1951 {
1952 int sock = POINTER_TO_INT(p1);
1953
1954 result = zsock_close(sock);
1955 }
1956
spawn_child(int sock)1957 static void spawn_child(int sock)
1958 {
1959 k_thread_create(&child_thread, child_stack,
1960 K_THREAD_STACK_SIZEOF(child_stack), child_entry,
1961 INT_TO_POINTER(sock), NULL, NULL, 0, K_USER,
1962 K_FOREVER);
1963 }
1964 #endif
1965
ZTEST(net_socket_tcp,test_socket_permission)1966 ZTEST(net_socket_tcp, test_socket_permission)
1967 {
1968 #ifdef CONFIG_USERSPACE
1969 int sock;
1970 struct sockaddr_in saddr;
1971 struct net_context *ctx;
1972
1973 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &sock, &saddr);
1974
1975 ctx = zsock_get_context_object(sock);
1976 zassert_not_null(ctx, "zsock_get_context_object() failed");
1977
1978 /* Spawn a child thread which doesn't inherit our permissions,
1979 * it will try to perform a socket operation and fail due to lack
1980 * of permissions on it.
1981 */
1982 spawn_child(sock);
1983 k_thread_start(&child_thread);
1984 k_thread_join(&child_thread, K_FOREVER);
1985
1986 zassert_not_equal(result, 0, "child succeeded with no permission");
1987
1988 /* Now spawn the same child thread again, but this time we grant
1989 * permission on the net_context before we start it, and the
1990 * child should now succeed.
1991 */
1992 spawn_child(sock);
1993 k_object_access_grant(ctx, &child_thread);
1994 k_thread_start(&child_thread);
1995 k_thread_join(&child_thread, K_FOREVER);
1996
1997 zassert_equal(result, 0, "child failed with permissions");
1998 #else
1999 ztest_test_skip();
2000 #endif /* CONFIG_USERSPACE */
2001 }
2002
setup(void)2003 static void *setup(void)
2004 {
2005 #ifdef CONFIG_USERSPACE
2006 /* ztest thread inherit permissions from main */
2007 k_thread_access_grant(k_current_get(), &child_thread, child_stack);
2008 #endif
2009
2010 if (IS_ENABLED(CONFIG_NET_TC_THREAD_COOPERATIVE)) {
2011 k_thread_priority_set(k_current_get(),
2012 K_PRIO_COOP(CONFIG_NUM_COOP_PRIORITIES - 1));
2013 } else {
2014 k_thread_priority_set(k_current_get(), K_PRIO_PREEMPT(8));
2015 }
2016
2017 return NULL;
2018 }
2019
2020 struct close_data {
2021 struct k_work_delayable work;
2022 int fd;
2023 };
2024
close_work(struct k_work * work)2025 static void close_work(struct k_work *work)
2026 {
2027 struct k_work_delayable *dwork = k_work_delayable_from_work(work);
2028 struct close_data *data = CONTAINER_OF(dwork, struct close_data, work);
2029
2030 zsock_close(data->fd);
2031 }
2032
ZTEST(net_socket_tcp,test_close_while_recv)2033 ZTEST(net_socket_tcp, test_close_while_recv)
2034 {
2035 /* Blocking recv() should return an error after close() is
2036 * called from another thread.
2037 */
2038 int c_sock;
2039 int s_sock;
2040 int new_sock;
2041 struct sockaddr_in6 c_saddr, s_saddr;
2042 struct sockaddr addr;
2043 socklen_t addrlen = sizeof(addr);
2044 struct close_data close_work_data;
2045 char rx_buf[1];
2046 ssize_t ret;
2047
2048 prepare_sock_tcp_v6(MY_IPV6_ADDR, ANY_PORT, &c_sock, &c_saddr);
2049 prepare_sock_tcp_v6(MY_IPV6_ADDR, SERVER_PORT, &s_sock, &s_saddr);
2050
2051 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
2052 test_listen(s_sock);
2053
2054 /* Connect and accept that connection */
2055 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
2056
2057 test_accept(s_sock, &new_sock, &addr, &addrlen);
2058
2059 /* Schedule close() from workqueue */
2060 k_work_init_delayable(&close_work_data.work, close_work);
2061 close_work_data.fd = c_sock;
2062 k_work_schedule(&close_work_data.work, K_MSEC(10));
2063
2064 /* Start blocking recv(), which should be unblocked by close() from
2065 * another thread and return an error.
2066 */
2067 ret = zsock_recv(c_sock, rx_buf, sizeof(rx_buf), 0);
2068 zassert_equal(ret, -1, "recv did not return error");
2069 zassert_equal(errno, EINTR, "Unexpected errno value: %d", errno);
2070
2071 test_close(new_sock);
2072 test_close(s_sock);
2073
2074 test_context_cleanup();
2075 }
2076
ZTEST(net_socket_tcp,test_close_while_accept)2077 ZTEST(net_socket_tcp, test_close_while_accept)
2078 {
2079 /* Blocking accept() should return an error after close() is
2080 * called from another thread.
2081 */
2082 int s_sock;
2083 int new_sock;
2084 struct sockaddr_in6 s_saddr;
2085 struct sockaddr addr;
2086 socklen_t addrlen = sizeof(addr);
2087 struct close_data close_work_data;
2088
2089 prepare_sock_tcp_v6(MY_IPV6_ADDR, SERVER_PORT, &s_sock, &s_saddr);
2090
2091 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
2092 test_listen(s_sock);
2093
2094 /* Schedule close() from workqueue */
2095 k_work_init_delayable(&close_work_data.work, close_work);
2096 close_work_data.fd = s_sock;
2097 k_work_schedule(&close_work_data.work, K_MSEC(10));
2098
2099 /* Start blocking accept(), which should be unblocked by close() from
2100 * another thread and return an error.
2101 */
2102 new_sock = zsock_accept(s_sock, &addr, &addrlen);
2103 zassert_equal(new_sock, -1, "accept did not return error");
2104 zassert_equal(errno, EINTR, "Unexpected errno value: %d", errno);
2105
2106 test_context_cleanup();
2107 }
2108
2109 #undef read
2110 #define read(fd, buf, len) zsock_recv(fd, buf, len, 0)
2111
2112 #undef write
2113 #define write(fd, buf, len) zsock_send(fd, buf, len, 0)
2114
2115 enum test_ioctl_fionread_sockid {
2116 CLIENT, SERVER, ACCEPT,
2117 };
2118
test_ioctl_fionread_setup(int af,int fd[3])2119 static void test_ioctl_fionread_setup(int af, int fd[3])
2120 {
2121 socklen_t addrlen;
2122 socklen_t addrlen2;
2123 struct sockaddr_in6 addr;
2124 struct sockaddr_in6 c_saddr;
2125 struct sockaddr_in6 s_saddr;
2126
2127 fd[0] = -1;
2128 fd[1] = -1;
2129 fd[2] = -1;
2130
2131 switch (af) {
2132 case AF_INET: {
2133 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &fd[CLIENT],
2134 (struct sockaddr_in *)&c_saddr);
2135 prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &fd[ACCEPT],
2136 (struct sockaddr_in *)&s_saddr);
2137 addrlen = sizeof(struct sockaddr_in);
2138 } break;
2139
2140 case AF_INET6: {
2141 prepare_sock_tcp_v6(MY_IPV6_ADDR, ANY_PORT, &fd[CLIENT], &c_saddr);
2142 prepare_sock_tcp_v6(MY_IPV6_ADDR, SERVER_PORT, &fd[ACCEPT], &s_saddr);
2143 addrlen = sizeof(struct sockaddr_in6);
2144 } break;
2145
2146 default:
2147 zassert_true(false);
2148 return;
2149 }
2150
2151 addrlen2 = addrlen;
2152
2153 test_bind(fd[ACCEPT], (struct sockaddr *)&s_saddr, addrlen);
2154 test_listen(fd[ACCEPT]);
2155
2156 test_connect(fd[CLIENT], (struct sockaddr *)&s_saddr, addrlen);
2157 test_accept(fd[ACCEPT], &fd[SERVER], (struct sockaddr *)&addr, &addrlen2);
2158 }
2159
2160 /* note: this is duplicated from tests/net/socket/socketpair/src/fionread.c */
test_ioctl_fionread_common(int af)2161 static void test_ioctl_fionread_common(int af)
2162 {
2163 int avail;
2164 uint8_t bytes[2];
2165 /* server fd := 0, client fd := 1, accept fd := 2 */
2166 enum fde {
2167 SERVER,
2168 CLIENT,
2169 ACCEPT,
2170 };
2171 int fd[] = {-1, -1, -1};
2172
2173 test_ioctl_fionread_setup(af, fd);
2174
2175 /* both ends should have zero bytes available after being newly created */
2176 for (enum fde i = SERVER; i <= CLIENT; ++i) {
2177 avail = 42;
2178 zassert_ok(zsock_ioctl(fd[i], ZFD_IOCTL_FIONREAD, &avail));
2179 zassert_equal(0, avail, "exp: %d: act: %d", 0, avail);
2180 }
2181
2182 /* write something to one end, check availability from the other end */
2183 for (enum fde i = SERVER; i <= CLIENT; ++i) {
2184 enum fde j = (i + 1) % (CLIENT + 1);
2185
2186 zassert_equal(1, write(fd[i], "\x42", 1));
2187 zassert_equal(1, write(fd[i], "\x73", 1));
2188 k_msleep(100);
2189 zassert_ok(zsock_ioctl(fd[j], ZFD_IOCTL_FIONREAD, &avail));
2190 zassert_equal(ARRAY_SIZE(bytes), avail, "exp: %d: act: %d", ARRAY_SIZE(bytes),
2191 avail);
2192 }
2193
2194 /* read the other end, ensure availability is zero again */
2195 for (enum fde i = SERVER; i <= CLIENT; ++i) {
2196 int ex = ARRAY_SIZE(bytes);
2197 int act = read(fd[i], bytes, ARRAY_SIZE(bytes));
2198
2199 zassert_equal(ex, act, "read() failed: errno: %d exp: %d act: %d", errno, ex, act);
2200 zassert_ok(zsock_ioctl(fd[i], ZFD_IOCTL_FIONREAD, &avail));
2201 zassert_equal(0, avail, "exp: %d: act: %d", 0, avail);
2202 }
2203
2204 zsock_close(fd[SERVER]);
2205 zsock_close(fd[CLIENT]);
2206 zsock_close(fd[ACCEPT]);
2207
2208 test_context_cleanup();
2209 }
2210
ZTEST(net_socket_tcp,test_ioctl_fionread_v4)2211 ZTEST(net_socket_tcp, test_ioctl_fionread_v4)
2212 {
2213 test_ioctl_fionread_common(AF_INET);
2214 }
ZTEST(net_socket_tcp,test_ioctl_fionread_v6)2215 ZTEST(net_socket_tcp, test_ioctl_fionread_v6)
2216 {
2217 test_ioctl_fionread_common(AF_INET6);
2218 }
2219
2220 /* Connect to peer which is not listening the test port and
2221 * make sure select() returns proper error for the closed
2222 * connection.
2223 */
ZTEST(net_socket_tcp,test_connect_and_wait_for_v4_select)2224 ZTEST(net_socket_tcp, test_connect_and_wait_for_v4_select)
2225 {
2226 struct sockaddr_in addr = { 0 };
2227 struct in_addr v4addr;
2228 int fd, flags, ret, optval;
2229 socklen_t optlen = sizeof(optval);
2230
2231 fd = zsock_socket(AF_INET, SOCK_STREAM, 0);
2232
2233 flags = zsock_fcntl(fd, F_GETFL, 0);
2234 zsock_fcntl(fd, F_SETFL, flags | O_NONBLOCK);
2235
2236 zsock_inet_pton(AF_INET, "127.0.0.1", (void *)&v4addr);
2237
2238 addr.sin_family = AF_INET;
2239 net_ipaddr_copy(&addr.sin_addr, &v4addr);
2240
2241 /* There should be nobody serving this port */
2242 addr.sin_port = htons(8088);
2243
2244 ret = zsock_connect(fd, (const struct sockaddr *)&addr, sizeof(addr));
2245 zassert_equal(ret, -1, "connect succeed, %d", errno);
2246 zassert_equal(errno, EINPROGRESS, "connect succeed, %d", errno);
2247
2248 /* Wait for the connection (this should fail eventually) */
2249 while (1) {
2250 zsock_fd_set wfds;
2251 struct timeval tv = {
2252 .tv_sec = 1,
2253 .tv_usec = 0
2254 };
2255
2256 ZSOCK_FD_ZERO(&wfds);
2257 ZSOCK_FD_SET(fd, &wfds);
2258
2259 /* Check if the connection is there, this should timeout */
2260 ret = zsock_select(fd + 1, NULL, &wfds, NULL, &tv);
2261 if (ret < 0) {
2262 break;
2263 }
2264
2265 if (ret > 0) {
2266 if (ZSOCK_FD_ISSET(fd, &wfds)) {
2267 break;
2268 }
2269 }
2270 }
2271
2272 zassert_true(ret > 0, "select failed, %d", errno);
2273
2274 /* Get the reason for the connect */
2275 ret = zsock_getsockopt(fd, SOL_SOCKET, SO_ERROR, &optval, &optlen);
2276 zassert_equal(ret, 0, "getsockopt failed, %d", errno);
2277
2278 /* If SO_ERROR is 0, then it means that connect succeed. Any
2279 * other value (errno) means that it failed.
2280 */
2281 zassert_equal(optval, ECONNREFUSED, "unexpected connect status, %d", optval);
2282
2283 ret = zsock_close(fd);
2284 zassert_equal(ret, 0, "close failed, %d", errno);
2285 }
2286
2287 /* Connect to peer which is not listening the test port and
2288 * make sure poll() returns proper error for the closed
2289 * connection.
2290 */
ZTEST(net_socket_tcp,test_connect_and_wait_for_v4_poll)2291 ZTEST(net_socket_tcp, test_connect_and_wait_for_v4_poll)
2292 {
2293 struct sockaddr_in addr = { 0 };
2294 struct zsock_pollfd fds[1];
2295 struct in_addr v4addr;
2296 int fd, flags, ret, optval;
2297 bool closed = false;
2298 socklen_t optlen = sizeof(optval);
2299
2300 fd = zsock_socket(AF_INET, SOCK_STREAM, 0);
2301
2302 flags = zsock_fcntl(fd, F_GETFL, 0);
2303 zsock_fcntl(fd, F_SETFL, flags | O_NONBLOCK);
2304
2305 zsock_inet_pton(AF_INET, "127.0.0.1", (void *)&v4addr);
2306
2307 addr.sin_family = AF_INET;
2308 net_ipaddr_copy(&addr.sin_addr, &v4addr);
2309
2310 /* There should be nobody serving this port */
2311 addr.sin_port = htons(8088);
2312
2313 ret = zsock_connect(fd, (const struct sockaddr *)&addr, sizeof(addr));
2314 zassert_equal(ret, -1, "connect succeed, %d", errno);
2315 zassert_equal(errno, EINPROGRESS, "connect succeed, %d", errno);
2316
2317 /* Wait for the connection (this should fail eventually) */
2318 while (1) {
2319 memset(fds, 0, sizeof(fds));
2320 fds[0].fd = fd;
2321 fds[0].events = ZSOCK_POLLOUT;
2322
2323 /* Check if the connection is there, this should timeout */
2324 ret = zsock_poll(fds, 1, 10);
2325 if (ret < 0) {
2326 break;
2327 }
2328
2329 if (fds[0].revents > 0) {
2330 if (fds[0].revents & ZSOCK_POLLERR) {
2331 closed = true;
2332 break;
2333 }
2334 }
2335 }
2336
2337 zassert_true(closed, "poll failed, %d", errno);
2338
2339 /* Get the reason for the connect */
2340 ret = zsock_getsockopt(fd, SOL_SOCKET, SO_ERROR, &optval, &optlen);
2341 zassert_equal(ret, 0, "getsockopt failed, %d", errno);
2342
2343 /* If SO_ERROR is 0, then it means that connect succeed. Any
2344 * other value (errno) means that it failed.
2345 */
2346 zassert_equal(optval, ECONNREFUSED, "unexpected connect status, %d", optval);
2347
2348 ret = zsock_close(fd);
2349 zassert_equal(ret, 0, "close failed, %d", errno);
2350 }
2351
ZTEST(net_socket_tcp,test_so_keepalive)2352 ZTEST(net_socket_tcp, test_so_keepalive)
2353 {
2354 struct sockaddr_in bind_addr4;
2355 int sock, ret;
2356 int optval;
2357 socklen_t optlen = sizeof(optval);
2358
2359 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &sock, &bind_addr4);
2360
2361 /* Keep-alive should be disabled by default. */
2362 ret = zsock_getsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &optval, &optlen);
2363 zassert_equal(ret, 0, "getsockopt failed (%d)", errno);
2364 zassert_equal(optval, 0, "getsockopt got invalid value");
2365 zassert_equal(optlen, sizeof(optval), "getsockopt got invalid size");
2366
2367 /* Enable keep-alive. */
2368 optval = 1;
2369 ret = zsock_setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE,
2370 &optval, sizeof(optval));
2371 zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2372
2373 ret = zsock_getsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &optval, &optlen);
2374 zassert_equal(ret, 0, "getsockopt failed (%d)", errno);
2375 zassert_equal(optval, 1, "getsockopt got invalid value");
2376 zassert_equal(optlen, sizeof(optval), "getsockopt got invalid size");
2377
2378 /* Check keep-alive parameters defaults. */
2379 ret = zsock_getsockopt(sock, IPPROTO_TCP, TCP_KEEPIDLE, &optval, &optlen);
2380 zassert_equal(ret, 0, "getsockopt failed (%d)", errno);
2381 zassert_equal(optval, CONFIG_NET_TCP_KEEPIDLE_DEFAULT,
2382 "getsockopt got invalid value");
2383 zassert_equal(optlen, sizeof(optval), "getsockopt got invalid size");
2384
2385 ret = zsock_getsockopt(sock, IPPROTO_TCP, TCP_KEEPINTVL, &optval, &optlen);
2386 zassert_equal(ret, 0, "getsockopt failed (%d)", errno);
2387 zassert_equal(optval, CONFIG_NET_TCP_KEEPINTVL_DEFAULT,
2388 "getsockopt got invalid value");
2389 zassert_equal(optlen, sizeof(optval), "getsockopt got invalid size");
2390
2391 ret = zsock_getsockopt(sock, IPPROTO_TCP, TCP_KEEPCNT, &optval, &optlen);
2392 zassert_equal(ret, 0, "getsockopt failed (%d)", errno);
2393 zassert_equal(optval, CONFIG_NET_TCP_KEEPCNT_DEFAULT,
2394 "getsockopt got invalid value");
2395 zassert_equal(optlen, sizeof(optval), "getsockopt got invalid size");
2396
2397 /* Check keep-alive parameters update. */
2398 optval = 123;
2399 ret = zsock_setsockopt(sock, IPPROTO_TCP, TCP_KEEPIDLE,
2400 &optval, sizeof(optval));
2401 zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2402
2403 optval = 10;
2404 ret = zsock_setsockopt(sock, IPPROTO_TCP, TCP_KEEPINTVL,
2405 &optval, sizeof(optval));
2406 zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2407
2408 optval = 2;
2409 ret = zsock_setsockopt(sock, IPPROTO_TCP, TCP_KEEPCNT,
2410 &optval, sizeof(optval));
2411 zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2412
2413 ret = zsock_getsockopt(sock, IPPROTO_TCP, TCP_KEEPIDLE, &optval, &optlen);
2414 zassert_equal(ret, 0, "getsockopt failed (%d)", errno);
2415 zassert_equal(optval, 123, "getsockopt got invalid value");
2416 zassert_equal(optlen, sizeof(optval), "getsockopt got invalid size");
2417
2418 ret = zsock_getsockopt(sock, IPPROTO_TCP, TCP_KEEPINTVL, &optval, &optlen);
2419 zassert_equal(ret, 0, "getsockopt failed (%d)", errno);
2420 zassert_equal(optval, 10, "getsockopt got invalid value");
2421 zassert_equal(optlen, sizeof(optval), "getsockopt got invalid size");
2422
2423 ret = zsock_getsockopt(sock, IPPROTO_TCP, TCP_KEEPCNT, &optval, &optlen);
2424 zassert_equal(ret, 0, "getsockopt failed (%d)", errno);
2425 zassert_equal(optval, 2, "getsockopt got invalid value");
2426 zassert_equal(optlen, sizeof(optval), "getsockopt got invalid size");
2427
2428 test_close(sock);
2429
2430 test_context_cleanup();
2431 }
2432
ZTEST(net_socket_tcp,test_keepalive_timeout)2433 ZTEST(net_socket_tcp, test_keepalive_timeout)
2434 {
2435 struct sockaddr_in c_saddr, s_saddr;
2436 int c_sock, s_sock, new_sock;
2437 uint8_t rx_buf;
2438 int optval;
2439 int ret;
2440
2441 prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr);
2442 prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &s_sock, &s_saddr);
2443
2444 /* Enable keep-alive on both ends and set timeouts/retries to minimum */
2445 optval = 1;
2446 ret = zsock_setsockopt(c_sock, SOL_SOCKET, SO_KEEPALIVE,
2447 &optval, sizeof(optval));
2448 zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2449 ret = zsock_setsockopt(s_sock, SOL_SOCKET, SO_KEEPALIVE,
2450 &optval, sizeof(optval));
2451 zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2452
2453 optval = 1;
2454 ret = zsock_setsockopt(c_sock, IPPROTO_TCP, TCP_KEEPIDLE,
2455 &optval, sizeof(optval));
2456 zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2457 ret = zsock_setsockopt(s_sock, IPPROTO_TCP, TCP_KEEPIDLE,
2458 &optval, sizeof(optval));
2459 zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2460
2461 optval = 1;
2462 ret = zsock_setsockopt(c_sock, IPPROTO_TCP, TCP_KEEPINTVL,
2463 &optval, sizeof(optval));
2464 zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2465 ret = zsock_setsockopt(s_sock, IPPROTO_TCP, TCP_KEEPINTVL,
2466 &optval, sizeof(optval));
2467 zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2468
2469 optval = 1;
2470 ret = zsock_setsockopt(c_sock, IPPROTO_TCP, TCP_KEEPCNT,
2471 &optval, sizeof(optval));
2472 zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2473 ret = zsock_setsockopt(s_sock, IPPROTO_TCP, TCP_KEEPCNT,
2474 &optval, sizeof(optval));
2475 zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2476
2477 /* Establish connection */
2478 test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
2479 test_listen(s_sock);
2480 test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
2481 test_accept(s_sock, &new_sock, NULL, NULL);
2482
2483 /* Kill communication - expect that connection will be closed after
2484 * a timeout period.
2485 */
2486 loopback_set_packet_drop_ratio(1.0f);
2487
2488 ret = zsock_recv(c_sock, &rx_buf, sizeof(rx_buf), 0);
2489 zassert_equal(ret, -1, "recv() should've failed");
2490 zassert_equal(errno, ETIMEDOUT, "wrong errno value, %d", errno);
2491
2492 /* Same on the other end. */
2493 ret = zsock_recv(new_sock, &rx_buf, sizeof(rx_buf), 0);
2494 zassert_equal(ret, -1, "recv() should've failed");
2495 zassert_equal(errno, ETIMEDOUT, "wrong errno value, %d", errno);
2496
2497 test_close(c_sock);
2498 test_close(new_sock);
2499 test_close(s_sock);
2500
2501 loopback_set_packet_drop_ratio(0.0f);
2502 test_context_cleanup();
2503 }
2504
after(void * arg)2505 static void after(void *arg)
2506 {
2507 ARG_UNUSED(arg);
2508
2509 for (int i = 0; i < CONFIG_ZVFS_OPEN_MAX; ++i) {
2510 (void)zsock_close(i);
2511 }
2512 }
2513
2514 ZTEST_SUITE(net_socket_tcp, NULL, setup, NULL, after, NULL);
2515