1 /*
2 * Copyright (c) 2017 Linaro Limited
3 * Copyright (c) 2021 Nordic Semiconductor
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8 #include <zephyr/logging/log.h>
9 LOG_MODULE_REGISTER(net_test, CONFIG_NET_SOCKETS_LOG_LEVEL);
10
11 #include <stdio.h>
12 #include <zephyr/sys/mutex.h>
13 #include <zephyr/ztest_assert.h>
14
15 #include <zephyr/net/socket.h>
16 #include <zephyr/net/ethernet.h>
17 #include <zephyr/net/net_mgmt.h>
18 #include <zephyr/net/net_event.h>
19
20 #include "ipv6.h"
21 #include "net_private.h"
22 #include "../../socket_helpers.h"
23
24 #if defined(CONFIG_NET_SOCKETS_LOG_LEVEL_DBG)
25 #define DBG(fmt, ...) printk(fmt, ##__VA_ARGS__)
26 #else
27 #define DBG(fmt, ...)
28 #endif
29
30 #define BUF_AND_SIZE(buf) buf, sizeof(buf) - 1
31 #define STRLEN(buf) (sizeof(buf) - 1)
32
33 #define TEST_STR_SMALL "test"
34 /* More than 256 bytes, to use >1 net_buf. */
35 #define TEST_STR2 \
36 "The Zephyr Project, a Linux Foundation hosted Collaboration " \
37 "Project, is an open source collaborative effort uniting leaders " \
38 "from across the industry to build a best-in-breed small, scalable, " \
39 "real-time operating system (RTOS) optimized for resource-" \
40 "constrained devices, across multiple architectures."
41 /* More than available TX buffers */
42 static const char test_str_all_tx_bufs[] =
43 #include <string_all_tx_bufs.inc>
44 "!"
45 ;
46
47 #define MY_IPV4_ADDR "127.0.0.1"
48 #define MY_IPV6_ADDR "::1"
49 #define MY_MCAST_IPV4_ADDR "224.0.0.1"
50 #define MY_MCAST_IPV6_ADDR "ff01::1"
51
52 #define ANY_PORT 0
53 #define SERVER_PORT 4242
54 #define CLIENT_PORT 9898
55
56 static ZTEST_BMEM char rx_buf[NET_ETH_MTU + 1];
57
58 /* Common routine to communicate packets over pair of sockets. */
comm_sendto_recvfrom(int client_sock,struct sockaddr * client_addr,socklen_t client_addrlen,int server_sock,struct sockaddr * server_addr,socklen_t server_addrlen)59 static void comm_sendto_recvfrom(int client_sock,
60 struct sockaddr *client_addr,
61 socklen_t client_addrlen,
62 int server_sock,
63 struct sockaddr *server_addr,
64 socklen_t server_addrlen)
65 {
66 int avail;
67 ssize_t sent = 0;
68 ssize_t recved = 0;
69 struct sockaddr addr;
70 socklen_t addrlen;
71 struct sockaddr addr2;
72 socklen_t addrlen2;
73
74 zassert_not_null(client_addr, "null client addr");
75 zassert_not_null(server_addr, "null server addr");
76
77 /*
78 * Test client -> server sending
79 */
80
81 sent = zsock_sendto(client_sock, TEST_STR_SMALL, strlen(TEST_STR_SMALL),
82 0, server_addr, server_addrlen);
83 zassert_equal(sent, strlen(TEST_STR_SMALL), "sendto failed");
84
85 k_msleep(100);
86
87 avail = 42;
88 zassert_ok(zsock_ioctl(server_sock, ZFD_IOCTL_FIONREAD, &avail));
89 zassert_equal(avail, strlen(TEST_STR_SMALL));
90
91 /* Test recvfrom(MSG_PEEK) */
92 addrlen = sizeof(addr);
93 clear_buf(rx_buf);
94 recved = zsock_recvfrom(server_sock, rx_buf, sizeof(rx_buf),
95 ZSOCK_MSG_PEEK, &addr, &addrlen);
96 zassert_true(recved >= 0, "recvfrom fail");
97 zassert_equal(recved, strlen(TEST_STR_SMALL),
98 "unexpected received bytes");
99 zassert_mem_equal(rx_buf, BUF_AND_SIZE(TEST_STR_SMALL), "wrong data");
100 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
101
102 /* Test normal recvfrom() */
103 addrlen = sizeof(addr);
104 clear_buf(rx_buf);
105 recved = zsock_recvfrom(server_sock, rx_buf, sizeof(rx_buf),
106 0, &addr, &addrlen);
107 zassert_true(recved >= 0, "recvfrom fail");
108 zassert_equal(recved, strlen(TEST_STR_SMALL),
109 "unexpected received bytes");
110 zassert_mem_equal(rx_buf, BUF_AND_SIZE(TEST_STR_SMALL), "wrong data");
111 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
112
113 /* Check the client port */
114 if (net_sin(client_addr)->sin_port != ANY_PORT) {
115 zassert_equal(net_sin(client_addr)->sin_port,
116 net_sin(&addr)->sin_port,
117 "unexpected client port");
118 }
119
120 /*
121 * Test server -> client sending
122 */
123
124 sent = zsock_sendto(server_sock, TEST_STR2, sizeof(TEST_STR2) - 1,
125 0, &addr, addrlen);
126 zassert_equal(sent, STRLEN(TEST_STR2), "sendto failed");
127
128 /* Test normal recvfrom() */
129 addrlen2 = sizeof(addr);
130 clear_buf(rx_buf);
131 recved = zsock_recvfrom(client_sock, rx_buf, sizeof(rx_buf),
132 0, &addr2, &addrlen2);
133 zassert_true(recved >= 0, "recvfrom fail");
134 zassert_equal(recved, STRLEN(TEST_STR2),
135 "unexpected received bytes");
136 zassert_mem_equal(rx_buf, BUF_AND_SIZE(TEST_STR2), "wrong data");
137 zassert_equal(addrlen2, server_addrlen, "unexpected addrlen");
138
139 /* Check the server port */
140 zassert_equal(net_sin(server_addr)->sin_port,
141 net_sin(&addr2)->sin_port,
142 "unexpected server port");
143
144 /* Test that unleft leftover data from datagram is discarded. */
145
146 /* Send 2 datagrams */
147 sent = zsock_sendto(server_sock, TEST_STR2, sizeof(TEST_STR2) - 1,
148 0, &addr, addrlen);
149 zassert_equal(sent, STRLEN(TEST_STR2), "sendto failed");
150 sent = zsock_sendto(server_sock, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1,
151 0, &addr, addrlen);
152 zassert_equal(sent, STRLEN(TEST_STR_SMALL), "sendto failed");
153
154 /* Receive just beginning of 1st datagram */
155 addrlen2 = sizeof(addr);
156 clear_buf(rx_buf);
157 recved = zsock_recvfrom(client_sock, rx_buf, 16, 0, &addr2, &addrlen2);
158 zassert_true(recved == 16, "recvfrom fail");
159 zassert_mem_equal(rx_buf, TEST_STR2, 16, "wrong data");
160
161 /* Make sure that now we receive 2nd datagram */
162 addrlen2 = sizeof(addr);
163 clear_buf(rx_buf);
164 recved = zsock_recvfrom(client_sock, rx_buf, 16, 0, &addr2, &addrlen2);
165 zassert_true(recved == STRLEN(TEST_STR_SMALL), "recvfrom fail");
166 zassert_mem_equal(rx_buf, BUF_AND_SIZE(TEST_STR_SMALL), "wrong data");
167 }
168
ZTEST(net_socket_udp,test_02_v4_sendto_recvfrom)169 ZTEST(net_socket_udp, test_02_v4_sendto_recvfrom)
170 {
171 int rv;
172 int client_sock;
173 int server_sock;
174 struct sockaddr_in client_addr;
175 struct sockaddr_in server_addr;
176
177 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
178 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
179
180 rv = zsock_bind(server_sock,
181 (struct sockaddr *)&server_addr,
182 sizeof(server_addr));
183 zassert_equal(rv, 0, "bind failed");
184
185 comm_sendto_recvfrom(client_sock,
186 (struct sockaddr *)&client_addr,
187 sizeof(client_addr),
188 server_sock,
189 (struct sockaddr *)&server_addr,
190 sizeof(server_addr));
191
192 rv = zsock_close(client_sock);
193 zassert_equal(rv, 0, "close failed");
194 rv = zsock_close(server_sock);
195 zassert_equal(rv, 0, "close failed");
196 }
197
ZTEST(net_socket_udp,test_03_v6_sendto_recvfrom)198 ZTEST(net_socket_udp, test_03_v6_sendto_recvfrom)
199 {
200 int rv;
201 int client_sock;
202 int server_sock;
203 struct sockaddr_in6 client_addr;
204 struct sockaddr_in6 server_addr;
205
206 prepare_sock_udp_v6(MY_IPV6_ADDR, ANY_PORT, &client_sock, &client_addr);
207 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
208
209 rv = zsock_bind(server_sock,
210 (struct sockaddr *)&server_addr, sizeof(server_addr));
211 zassert_equal(rv, 0, "bind failed");
212
213 comm_sendto_recvfrom(client_sock,
214 (struct sockaddr *)&client_addr,
215 sizeof(client_addr),
216 server_sock,
217 (struct sockaddr *)&server_addr,
218 sizeof(server_addr));
219
220 rv = zsock_close(client_sock);
221 zassert_equal(rv, 0, "close failed");
222 rv = zsock_close(server_sock);
223 zassert_equal(rv, 0, "close failed");
224 }
225
ZTEST(net_socket_udp,test_04_v4_bind_sendto)226 ZTEST(net_socket_udp, test_04_v4_bind_sendto)
227 {
228 int rv;
229 int client_sock;
230 int server_sock;
231 struct sockaddr_in client_addr;
232 struct sockaddr_in server_addr;
233
234 prepare_sock_udp_v4(MY_IPV4_ADDR, CLIENT_PORT, &client_sock, &client_addr);
235 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
236
237 rv = zsock_bind(client_sock,
238 (struct sockaddr *)&client_addr, sizeof(client_addr));
239 zassert_equal(rv, 0, "bind failed");
240
241 rv = zsock_bind(server_sock,
242 (struct sockaddr *)&server_addr, sizeof(server_addr));
243 zassert_equal(rv, 0, "bind failed");
244
245 comm_sendto_recvfrom(client_sock,
246 (struct sockaddr *)&client_addr,
247 sizeof(client_addr),
248 server_sock,
249 (struct sockaddr *)&server_addr,
250 sizeof(server_addr));
251
252 rv = zsock_close(client_sock);
253 zassert_equal(rv, 0, "close failed");
254 rv = zsock_close(server_sock);
255 zassert_equal(rv, 0, "close failed");
256 }
257
ZTEST(net_socket_udp,test_05_v6_bind_sendto)258 ZTEST(net_socket_udp, test_05_v6_bind_sendto)
259 {
260 int rv;
261 int client_sock;
262 int server_sock;
263 struct sockaddr_in6 client_addr;
264 struct sockaddr_in6 server_addr;
265
266 prepare_sock_udp_v6(MY_IPV6_ADDR, CLIENT_PORT, &client_sock, &client_addr);
267 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
268
269 rv = zsock_bind(client_sock,
270 (struct sockaddr *)&client_addr, sizeof(client_addr));
271 zassert_equal(rv, 0, "bind failed");
272
273 rv = zsock_bind(server_sock,
274 (struct sockaddr *)&server_addr, sizeof(server_addr));
275 zassert_equal(rv, 0, "bind failed");
276
277 comm_sendto_recvfrom(client_sock,
278 (struct sockaddr *)&client_addr,
279 sizeof(client_addr),
280 server_sock,
281 (struct sockaddr *)&server_addr,
282 sizeof(server_addr));
283
284 rv = zsock_close(client_sock);
285 zassert_equal(rv, 0, "close failed");
286 rv = zsock_close(server_sock);
287 zassert_equal(rv, 0, "close failed");
288 }
289
ZTEST(net_socket_udp,test_01_send_recv_2_sock)290 ZTEST(net_socket_udp, test_01_send_recv_2_sock)
291 {
292 int sock1, sock2;
293 struct sockaddr_in bind_addr, conn_addr;
294 char buf[10];
295 int len, rv;
296
297 prepare_sock_udp_v4(MY_IPV4_ADDR, 55555, &sock1, &bind_addr);
298 prepare_sock_udp_v4(MY_IPV4_ADDR, 55555, &sock2, &conn_addr);
299
300 rv = zsock_bind(sock1, (struct sockaddr *)&bind_addr, sizeof(bind_addr));
301 zassert_equal(rv, 0, "bind failed");
302
303 rv = zsock_connect(sock2, (struct sockaddr *)&conn_addr, sizeof(conn_addr));
304 zassert_equal(rv, 0, "connect failed");
305
306 len = zsock_send(sock2, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1, 0);
307 zassert_equal(len, STRLEN(TEST_STR_SMALL), "invalid send len");
308
309 clear_buf(buf);
310 len = zsock_recv(sock1, buf, sizeof(buf), ZSOCK_MSG_PEEK);
311 zassert_equal(len, STRLEN(TEST_STR_SMALL), "Invalid recv len");
312 zassert_mem_equal(buf, BUF_AND_SIZE(TEST_STR_SMALL), "Wrong data");
313
314 clear_buf(buf);
315 len = zsock_recv(sock1, buf, sizeof(buf), 0);
316 zassert_equal(len, STRLEN(TEST_STR_SMALL), "Invalid recv len");
317 zassert_mem_equal(buf, BUF_AND_SIZE(TEST_STR_SMALL), "Wrong data");
318
319 rv = zsock_close(sock1);
320 zassert_equal(rv, 0, "close failed");
321 rv = zsock_close(sock2);
322 zassert_equal(rv, 0, "close failed");
323 }
324
ZTEST(net_socket_udp,test_07_so_priority)325 ZTEST(net_socket_udp, test_07_so_priority)
326 {
327 struct sockaddr_in bind_addr4;
328 struct sockaddr_in6 bind_addr6;
329 int sock1, sock2, rv;
330 uint8_t optval;
331
332 prepare_sock_udp_v4(MY_IPV4_ADDR, 55555, &sock1, &bind_addr4);
333 prepare_sock_udp_v6(MY_IPV6_ADDR, 55555, &sock2, &bind_addr6);
334
335 rv = zsock_bind(sock1, (struct sockaddr *)&bind_addr4, sizeof(bind_addr4));
336 zassert_equal(rv, 0, "bind failed");
337
338 rv = zsock_bind(sock2, (struct sockaddr *)&bind_addr6, sizeof(bind_addr6));
339 zassert_equal(rv, 0, "bind failed");
340
341 optval = 2;
342 rv = zsock_setsockopt(sock1, SOL_SOCKET, SO_PRIORITY, &optval,
343 sizeof(optval));
344 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
345
346 optval = 6;
347 rv = zsock_setsockopt(sock2, SOL_SOCKET, SO_PRIORITY, &optval,
348 sizeof(optval));
349 zassert_equal(rv, 0, "setsockopt failed");
350
351 rv = zsock_close(sock1);
352 zassert_equal(rv, 0, "close failed");
353 rv = zsock_close(sock2);
354 zassert_equal(rv, 0, "close failed");
355 }
356
comm_sendmsg_recvfrom(int client_sock,struct sockaddr * client_addr,socklen_t client_addrlen,const struct msghdr * client_msg,int server_sock,struct sockaddr * server_addr,socklen_t server_addrlen)357 static void comm_sendmsg_recvfrom(int client_sock,
358 struct sockaddr *client_addr,
359 socklen_t client_addrlen,
360 const struct msghdr *client_msg,
361 int server_sock,
362 struct sockaddr *server_addr,
363 socklen_t server_addrlen)
364 {
365 ssize_t sent;
366 ssize_t recved;
367 struct sockaddr addr;
368 socklen_t addrlen;
369 int len, i;
370
371 zassert_not_null(client_addr, "null client addr");
372 zassert_not_null(server_addr, "null server addr");
373
374 /*
375 * Test client -> server sending
376 */
377
378 sent = zsock_sendmsg(client_sock, client_msg, 0);
379 zassert_true(sent > 0, "sendmsg failed (%d)", -errno);
380
381 for (i = 0, len = 0; i < client_msg->msg_iovlen; i++) {
382 len += client_msg->msg_iov[i].iov_len;
383 }
384
385 zassert_equal(sent, len, "iovec len (%d) vs sent (%d)", len, sent);
386
387 /* Test recvfrom(MSG_PEEK) */
388 addrlen = sizeof(addr);
389 clear_buf(rx_buf);
390 recved = zsock_recvfrom(server_sock, rx_buf, sizeof(rx_buf),
391 ZSOCK_MSG_PEEK, &addr, &addrlen);
392 zassert_true(recved >= 0, "recvfrom fail");
393 zassert_equal(recved, strlen(TEST_STR_SMALL),
394 "unexpected received bytes");
395 zassert_equal(sent, recved, "sent(%d)/received(%d) mismatch",
396 sent, recved);
397
398 zassert_mem_equal(rx_buf, BUF_AND_SIZE(TEST_STR_SMALL),
399 "wrong data (%s)", rx_buf);
400 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
401
402 /* Test normal recvfrom() */
403 addrlen = sizeof(addr);
404 clear_buf(rx_buf);
405 recved = zsock_recvfrom(server_sock, rx_buf, sizeof(rx_buf),
406 0, &addr, &addrlen);
407 zassert_true(recved >= 0, "recvfrom fail");
408 zassert_equal(recved, strlen(TEST_STR_SMALL),
409 "unexpected received bytes");
410 zassert_mem_equal(rx_buf, BUF_AND_SIZE(TEST_STR_SMALL), "wrong data");
411 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
412
413 /* Check the client port */
414 if (net_sin(client_addr)->sin_port != ANY_PORT) {
415 zassert_equal(net_sin(client_addr)->sin_port,
416 net_sin(&addr)->sin_port,
417 "unexpected client port");
418 }
419 }
420
ZTEST_USER(net_socket_udp,test_12_v4_sendmsg_recvfrom)421 ZTEST_USER(net_socket_udp, test_12_v4_sendmsg_recvfrom)
422 {
423 int rv;
424 int client_sock;
425 int server_sock;
426 struct sockaddr_in client_addr;
427 struct sockaddr_in server_addr;
428 struct msghdr msg;
429 struct cmsghdr *cmsg;
430 struct iovec io_vector[1];
431 union {
432 struct cmsghdr hdr;
433 unsigned char buf[CMSG_SPACE(sizeof(int))];
434 } cmsgbuf;
435
436 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
437 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
438
439 rv = zsock_bind(server_sock,
440 (struct sockaddr *)&server_addr,
441 sizeof(server_addr));
442 zassert_equal(rv, 0, "server bind failed");
443
444 rv = zsock_bind(client_sock,
445 (struct sockaddr *)&client_addr,
446 sizeof(client_addr));
447 zassert_equal(rv, 0, "client bind failed");
448
449 io_vector[0].iov_base = TEST_STR_SMALL;
450 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
451
452 memset(&msg, 0, sizeof(msg));
453 msg.msg_control = &cmsgbuf.buf;
454 msg.msg_controllen = sizeof(cmsgbuf.buf);
455 msg.msg_iov = io_vector;
456 msg.msg_iovlen = 1;
457 msg.msg_name = &server_addr;
458 msg.msg_namelen = sizeof(server_addr);
459
460 cmsg = CMSG_FIRSTHDR(&msg);
461 cmsg->cmsg_len = CMSG_LEN(sizeof(int));
462 cmsg->cmsg_level = SOL_SOCKET;
463 cmsg->cmsg_type = 1122;
464 *(int *)CMSG_DATA(cmsg) = 42;
465
466 comm_sendmsg_recvfrom(client_sock,
467 (struct sockaddr *)&client_addr,
468 sizeof(client_addr),
469 &msg,
470 server_sock,
471 (struct sockaddr *)&server_addr,
472 sizeof(server_addr));
473
474 rv = zsock_close(client_sock);
475 zassert_equal(rv, 0, "close failed");
476 rv = zsock_close(server_sock);
477 zassert_equal(rv, 0, "close failed");
478 }
479
ZTEST_USER(net_socket_udp,test_13_v4_sendmsg_recvfrom_no_aux_data)480 ZTEST_USER(net_socket_udp, test_13_v4_sendmsg_recvfrom_no_aux_data)
481 {
482 int rv;
483 int client_sock;
484 int server_sock;
485 struct sockaddr_in client_addr;
486 struct sockaddr_in server_addr;
487 struct msghdr msg;
488 struct iovec io_vector[1];
489
490 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
491 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
492
493 rv = zsock_bind(server_sock,
494 (struct sockaddr *)&server_addr,
495 sizeof(server_addr));
496 zassert_equal(rv, 0, "server bind failed");
497
498 rv = zsock_bind(client_sock,
499 (struct sockaddr *)&client_addr,
500 sizeof(client_addr));
501 zassert_equal(rv, 0, "client bind failed");
502
503 io_vector[0].iov_base = TEST_STR_SMALL;
504 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
505
506 memset(&msg, 0, sizeof(msg));
507 msg.msg_iov = io_vector;
508 msg.msg_iovlen = 1;
509 msg.msg_name = &server_addr;
510 msg.msg_namelen = sizeof(server_addr);
511
512 comm_sendmsg_recvfrom(client_sock,
513 (struct sockaddr *)&client_addr,
514 sizeof(client_addr),
515 &msg,
516 server_sock,
517 (struct sockaddr *)&server_addr,
518 sizeof(server_addr));
519
520 rv = zsock_close(client_sock);
521 zassert_equal(rv, 0, "close failed");
522 rv = zsock_close(server_sock);
523 zassert_equal(rv, 0, "close failed");
524 }
525
ZTEST_USER(net_socket_udp,test_14_v6_sendmsg_recvfrom)526 ZTEST_USER(net_socket_udp, test_14_v6_sendmsg_recvfrom)
527 {
528 int rv;
529 int client_sock;
530 int server_sock;
531 struct sockaddr_in6 client_addr;
532 struct sockaddr_in6 server_addr;
533 struct msghdr msg;
534 struct cmsghdr *cmsg;
535 struct iovec io_vector[1];
536 union {
537 struct cmsghdr hdr;
538 unsigned char buf[CMSG_SPACE(sizeof(int))];
539 } cmsgbuf;
540
541 prepare_sock_udp_v6(MY_IPV6_ADDR, ANY_PORT, &client_sock, &client_addr);
542 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
543
544 rv = zsock_bind(server_sock,
545 (struct sockaddr *)&server_addr, sizeof(server_addr));
546 zassert_equal(rv, 0, "server bind failed");
547
548 rv = zsock_bind(client_sock,
549 (struct sockaddr *)&client_addr,
550 sizeof(client_addr));
551 zassert_equal(rv, 0, "client bind failed");
552
553 io_vector[0].iov_base = TEST_STR_SMALL;
554 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
555
556 memset(&msg, 0, sizeof(msg));
557 msg.msg_control = &cmsgbuf.buf;
558 msg.msg_controllen = sizeof(cmsgbuf.buf);
559 msg.msg_iov = io_vector;
560 msg.msg_iovlen = 1;
561 msg.msg_name = &server_addr;
562 msg.msg_namelen = sizeof(server_addr);
563
564 cmsg = CMSG_FIRSTHDR(&msg);
565 cmsg->cmsg_len = CMSG_LEN(sizeof(int));
566 cmsg->cmsg_level = SOL_SOCKET;
567 cmsg->cmsg_type = 1122;
568 *(int *)CMSG_DATA(cmsg) = 42;
569
570 comm_sendmsg_recvfrom(client_sock,
571 (struct sockaddr *)&client_addr,
572 sizeof(client_addr),
573 &msg,
574 server_sock,
575 (struct sockaddr *)&server_addr,
576 sizeof(server_addr));
577
578 rv = zsock_close(client_sock);
579 zassert_equal(rv, 0, "close failed");
580 rv = zsock_close(server_sock);
581 zassert_equal(rv, 0, "close failed");
582 }
583
ZTEST_USER(net_socket_udp,test_15_v4_sendmsg_recvfrom_connected)584 ZTEST_USER(net_socket_udp, test_15_v4_sendmsg_recvfrom_connected)
585 {
586 int rv;
587 int client_sock;
588 int server_sock;
589 struct sockaddr_in client_addr;
590 struct sockaddr_in server_addr;
591 struct msghdr msg;
592 struct cmsghdr *cmsg;
593 struct iovec io_vector[1];
594 union {
595 struct cmsghdr hdr;
596 unsigned char buf[CMSG_SPACE(sizeof(int))];
597 } cmsgbuf;
598
599 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
600 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
601
602 rv = zsock_bind(server_sock,
603 (struct sockaddr *)&server_addr,
604 sizeof(server_addr));
605 zassert_equal(rv, 0, "server bind failed");
606
607 rv = zsock_bind(client_sock,
608 (struct sockaddr *)&client_addr,
609 sizeof(client_addr));
610 zassert_equal(rv, 0, "client bind failed");
611
612 rv = zsock_connect(client_sock, (struct sockaddr *)&server_addr,
613 sizeof(server_addr));
614 zassert_equal(rv, 0, "connect failed");
615
616 io_vector[0].iov_base = TEST_STR_SMALL;
617 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
618
619 memset(&msg, 0, sizeof(msg));
620 msg.msg_control = &cmsgbuf.buf;
621 msg.msg_controllen = sizeof(cmsgbuf.buf);
622 msg.msg_iov = io_vector;
623 msg.msg_iovlen = 1;
624
625 cmsg = CMSG_FIRSTHDR(&msg);
626 cmsg->cmsg_len = CMSG_LEN(sizeof(int));
627 cmsg->cmsg_level = SOL_SOCKET;
628 cmsg->cmsg_type = 1122;
629 *(int *)CMSG_DATA(cmsg) = 42;
630
631 comm_sendmsg_recvfrom(client_sock,
632 (struct sockaddr *)&client_addr,
633 sizeof(client_addr),
634 &msg,
635 server_sock,
636 (struct sockaddr *)&server_addr,
637 sizeof(server_addr));
638
639 rv = zsock_close(client_sock);
640 zassert_equal(rv, 0, "close failed");
641 rv = zsock_close(server_sock);
642 zassert_equal(rv, 0, "close failed");
643 }
644
ZTEST_USER(net_socket_udp,test_06_v6_sendmsg_recvfrom_connected)645 ZTEST_USER(net_socket_udp, test_06_v6_sendmsg_recvfrom_connected)
646 {
647 int rv;
648 int client_sock;
649 int server_sock;
650 struct sockaddr_in6 client_addr;
651 struct sockaddr_in6 server_addr;
652 struct msghdr msg;
653 struct cmsghdr *cmsg;
654 struct iovec io_vector[1];
655 union {
656 struct cmsghdr hdr;
657 unsigned char buf[CMSG_SPACE(sizeof(int))];
658 } cmsgbuf;
659
660 prepare_sock_udp_v6(MY_IPV6_ADDR, ANY_PORT, &client_sock, &client_addr);
661 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
662
663 rv = zsock_bind(server_sock,
664 (struct sockaddr *)&server_addr, sizeof(server_addr));
665 zassert_equal(rv, 0, "server bind failed");
666
667 rv = zsock_bind(client_sock,
668 (struct sockaddr *)&client_addr,
669 sizeof(client_addr));
670 zassert_equal(rv, 0, "client bind failed");
671
672 rv = zsock_connect(client_sock, (struct sockaddr *)&server_addr,
673 sizeof(server_addr));
674 zassert_equal(rv, 0, "connect failed");
675
676 io_vector[0].iov_base = TEST_STR_SMALL;
677 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
678
679 memset(&msg, 0, sizeof(msg));
680 msg.msg_control = &cmsgbuf.buf;
681 msg.msg_controllen = sizeof(cmsgbuf.buf);
682 msg.msg_iov = io_vector;
683 msg.msg_iovlen = 1;
684
685 cmsg = CMSG_FIRSTHDR(&msg);
686 cmsg->cmsg_len = CMSG_LEN(sizeof(int));
687 cmsg->cmsg_level = SOL_SOCKET;
688 cmsg->cmsg_type = 1122;
689 *(int *)CMSG_DATA(cmsg) = 42;
690
691 comm_sendmsg_recvfrom(client_sock,
692 (struct sockaddr *)&client_addr,
693 sizeof(client_addr),
694 &msg,
695 server_sock,
696 (struct sockaddr *)&server_addr,
697 sizeof(server_addr));
698
699 rv = zsock_close(client_sock);
700 zassert_equal(rv, 0, "close failed");
701 rv = zsock_close(server_sock);
702 zassert_equal(rv, 0, "close failed");
703 }
704
ZTEST(net_socket_udp,test_06_so_type)705 ZTEST(net_socket_udp, test_06_so_type)
706 {
707 struct sockaddr_in bind_addr4;
708 struct sockaddr_in6 bind_addr6;
709 int sock1, sock2, rv;
710 int optval;
711 socklen_t optsize = sizeof(optval);
712
713 prepare_sock_udp_v4(MY_IPV4_ADDR, 55555, &sock1, &bind_addr4);
714 prepare_sock_udp_v6(MY_IPV6_ADDR, 55555, &sock2, &bind_addr6);
715
716 rv = zsock_getsockopt(sock1, SOL_SOCKET, SO_TYPE, &optval, &optsize);
717 zassert_equal(rv, 0, "getsockopt failed (%d)", errno);
718 zassert_equal(optval, SOCK_DGRAM, "getsockopt got invalid type");
719 zassert_equal(optsize, sizeof(optval), "getsockopt got invalid size");
720
721 rv = zsock_getsockopt(sock2, SOL_SOCKET, SO_TYPE, &optval, &optsize);
722 zassert_equal(rv, 0, "getsockopt failed (%d)", errno);
723 zassert_equal(optval, SOCK_DGRAM, "getsockopt got invalid type");
724 zassert_equal(optsize, sizeof(optval), "getsockopt got invalid size");
725
726 rv = zsock_close(sock1);
727 zassert_equal(rv, 0, "close failed");
728 rv = zsock_close(sock2);
729 zassert_equal(rv, 0, "close failed");
730 }
731
ZTEST(net_socket_udp,test_08_so_txtime)732 ZTEST(net_socket_udp, test_08_so_txtime)
733 {
734 struct sockaddr_in bind_addr4;
735 struct sockaddr_in6 bind_addr6;
736 int sock1, sock2, rv;
737 socklen_t optlen;
738 int optval;
739
740 prepare_sock_udp_v4(MY_IPV4_ADDR, 55555, &sock1, &bind_addr4);
741 prepare_sock_udp_v6(MY_IPV6_ADDR, 55555, &sock2, &bind_addr6);
742
743 rv = zsock_bind(sock1, (struct sockaddr *)&bind_addr4, sizeof(bind_addr4));
744 zassert_equal(rv, 0, "bind failed");
745
746 rv = zsock_bind(sock2, (struct sockaddr *)&bind_addr6, sizeof(bind_addr6));
747 zassert_equal(rv, 0, "bind failed");
748
749 optval = true;
750 rv = zsock_setsockopt(sock1, SOL_SOCKET, SO_TXTIME, &optval,
751 sizeof(optval));
752 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
753
754 optval = false;
755 rv = zsock_setsockopt(sock2, SOL_SOCKET, SO_TXTIME, &optval,
756 sizeof(optval));
757 zassert_equal(rv, 0, "setsockopt failed");
758
759 optlen = sizeof(optval);
760 rv = zsock_getsockopt(sock1, SOL_SOCKET, SO_TXTIME, &optval, &optlen);
761 zassert_equal(rv, 0, "getsockopt failed (%d)", errno);
762 zassert_equal(optlen, sizeof(optval), "invalid optlen %d vs %d",
763 optlen, sizeof(optval));
764 zassert_equal(optval, true, "getsockopt txtime");
765
766 optlen = sizeof(optval);
767 rv = zsock_getsockopt(sock2, SOL_SOCKET, SO_TXTIME, &optval, &optlen);
768 zassert_equal(rv, 0, "getsockopt failed (%d)", errno);
769 zassert_equal(optlen, sizeof(optval), "invalid optlen %d vs %d",
770 optlen, sizeof(optval));
771 zassert_equal(optval, false, "getsockopt txtime");
772
773 rv = zsock_close(sock1);
774 zassert_equal(rv, 0, "close failed");
775 rv = zsock_close(sock2);
776 zassert_equal(rv, 0, "close failed");
777 }
778
ZTEST(net_socket_udp,test_09_so_rcvtimeo)779 ZTEST(net_socket_udp, test_09_so_rcvtimeo)
780 {
781 struct sockaddr_in bind_addr4;
782 struct sockaddr_in6 bind_addr6;
783 int sock1, sock2, rv;
784 ssize_t recved = 0;
785 struct sockaddr addr;
786 socklen_t addrlen;
787 uint32_t start_time, time_diff;
788
789 struct timeval optval = {
790 .tv_sec = 0,
791 .tv_usec = 300000,
792 };
793
794 prepare_sock_udp_v4(MY_IPV4_ADDR, 55555, &sock1, &bind_addr4);
795 prepare_sock_udp_v6(MY_IPV6_ADDR, 55555, &sock2, &bind_addr6);
796
797 rv = zsock_bind(sock1, (struct sockaddr *)&bind_addr4, sizeof(bind_addr4));
798 zassert_equal(rv, 0, "bind failed");
799
800 rv = zsock_bind(sock2, (struct sockaddr *)&bind_addr6, sizeof(bind_addr6));
801 zassert_equal(rv, 0, "bind failed");
802
803 rv = zsock_setsockopt(sock1, SOL_SOCKET, SO_RCVTIMEO, &optval,
804 sizeof(optval));
805 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
806
807 optval.tv_usec = 400000;
808 rv = zsock_setsockopt(sock2, SOL_SOCKET, SO_RCVTIMEO, &optval,
809 sizeof(optval));
810 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
811
812 addrlen = sizeof(addr);
813 clear_buf(rx_buf);
814 start_time = k_uptime_get_32();
815 recved = zsock_recvfrom(sock1, rx_buf, sizeof(rx_buf),
816 0, &addr, &addrlen);
817 time_diff = k_uptime_get_32() - start_time;
818
819 zassert_equal(recved, -1, "Unexpected return code");
820 zassert_equal(errno, EAGAIN, "Unexpected errno value: %d", errno);
821 zassert_true(time_diff >= 300, "Expected timeout after 300ms but "
822 "was %dms", time_diff);
823
824 start_time = k_uptime_get_32();
825 recved = zsock_recvfrom(sock2, rx_buf, sizeof(rx_buf),
826 0, &addr, &addrlen);
827 time_diff = k_uptime_get_32() - start_time;
828
829 zassert_equal(recved, -1, "Unexpected return code");
830 zassert_equal(errno, EAGAIN, "Unexpected errno value: %d", errno);
831 zassert_true(time_diff >= 400, "Expected timeout after 400ms but "
832 "was %dms", time_diff);
833
834 rv = zsock_close(sock1);
835 zassert_equal(rv, 0, "close failed");
836 rv = zsock_close(sock2);
837 zassert_equal(rv, 0, "close failed");
838 }
839
ZTEST(net_socket_udp,test_10_so_sndtimeo)840 ZTEST(net_socket_udp, test_10_so_sndtimeo)
841 {
842 struct sockaddr_in bind_addr4;
843 struct sockaddr_in6 bind_addr6;
844 int sock1, sock2, rv;
845
846 struct timeval optval = {
847 .tv_sec = 2,
848 .tv_usec = 500000,
849 };
850
851 prepare_sock_udp_v4(MY_IPV4_ADDR, 55555, &sock1, &bind_addr4);
852 prepare_sock_udp_v6(MY_IPV6_ADDR, 55555, &sock2, &bind_addr6);
853
854 rv = zsock_bind(sock1, (struct sockaddr *)&bind_addr4, sizeof(bind_addr4));
855 zassert_equal(rv, 0, "bind failed");
856
857 rv = zsock_bind(sock2, (struct sockaddr *)&bind_addr6, sizeof(bind_addr6));
858 zassert_equal(rv, 0, "bind failed");
859
860 rv = zsock_setsockopt(sock1, SOL_SOCKET, SO_SNDTIMEO, &optval,
861 sizeof(optval));
862 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
863
864 optval.tv_usec = 0;
865 rv = zsock_setsockopt(sock2, SOL_SOCKET, SO_SNDTIMEO, &optval,
866 sizeof(optval));
867 zassert_equal(rv, 0, "setsockopt failed");
868
869 rv = zsock_close(sock1);
870 zassert_equal(rv, 0, "close failed");
871 rv = zsock_close(sock2);
872 zassert_equal(rv, 0, "close failed");
873 }
874
ZTEST(net_socket_udp,test_11_so_protocol)875 ZTEST(net_socket_udp, test_11_so_protocol)
876 {
877 struct sockaddr_in bind_addr4;
878 struct sockaddr_in6 bind_addr6;
879 int sock1, sock2, rv;
880 int optval;
881 socklen_t optsize = sizeof(optval);
882
883 prepare_sock_udp_v4(MY_IPV4_ADDR, 55555, &sock1, &bind_addr4);
884 prepare_sock_udp_v6(MY_IPV6_ADDR, 55555, &sock2, &bind_addr6);
885
886 rv = zsock_getsockopt(sock1, SOL_SOCKET, SO_PROTOCOL, &optval, &optsize);
887 zassert_equal(rv, 0, "getsockopt failed (%d)", errno);
888 zassert_equal(optval, IPPROTO_UDP, "getsockopt got invalid protocol");
889 zassert_equal(optsize, sizeof(optval), "getsockopt got invalid size");
890
891 rv = zsock_getsockopt(sock2, SOL_SOCKET, SO_PROTOCOL, &optval, &optsize);
892 zassert_equal(rv, 0, "getsockopt failed (%d)", errno);
893 zassert_equal(optval, IPPROTO_UDP, "getsockopt got invalid protocol");
894 zassert_equal(optsize, sizeof(optval), "getsockopt got invalid size");
895
896 rv = zsock_close(sock1);
897 zassert_equal(rv, 0, "close failed");
898 rv = zsock_close(sock2);
899 zassert_equal(rv, 0, "close failed");
900 }
901
comm_sendmsg_with_txtime(int client_sock,struct sockaddr * client_addr,socklen_t client_addrlen,const struct msghdr * client_msg)902 static void comm_sendmsg_with_txtime(int client_sock,
903 struct sockaddr *client_addr,
904 socklen_t client_addrlen,
905 const struct msghdr *client_msg)
906 {
907 ssize_t sent;
908 int len, i;
909
910 zassert_not_null(client_addr, "null client addr");
911
912 /*
913 * Test client -> server sending
914 */
915
916 sent = zsock_sendmsg(client_sock, client_msg, 0);
917 zassert_true(sent > 0, "sendmsg failed (%d)", -errno);
918
919 for (i = 0, len = 0; i < client_msg->msg_iovlen; i++) {
920 len += client_msg->msg_iov[i].iov_len;
921 }
922
923 zassert_equal(sent, len, "iovec len (%d) vs sent (%d)", len, sent);
924 }
925
926 /* In order to verify that the network device driver is able to receive
927 * the TXTIME option, create a separate network device and catch the packets
928 * we are sending.
929 */
930 struct eth_fake_context {
931 struct net_if *iface;
932 uint8_t mac_address[6];
933 };
934
935 static struct eth_fake_context eth_fake_data;
936 static ZTEST_BMEM struct sockaddr_in6 udp_server_addr;
937
938 /* The semaphore is there to wait the data to be received. */
939 static ZTEST_BMEM SYS_MUTEX_DEFINE(wait_data);
940
941 static struct net_if *eth_iface;
942 static struct net_if *lo0;
943 static ZTEST_BMEM bool test_started;
944 static ZTEST_BMEM bool test_failed;
945 static struct in6_addr my_addr1 = { { { 0x20, 0x01, 0x0d, 0xb8, 1, 0, 0, 0,
946 0, 0, 0, 0, 0, 0, 0, 0x1 } } };
947 static struct in_addr my_addr2 = { { { 192, 0, 2, 2 } } };
948 static struct in6_addr my_addr3 = { { { 0x20, 0x01, 0x0d, 0xb8, 1, 0, 0, 0,
949 0, 0, 0, 0, 0, 0, 0, 0x3 } } };
950 static struct in6_addr my_mcast_addr1 = { { { 0xff, 0x01, 0, 0, 0, 0, 0, 0,
951 0, 0, 0, 0, 0, 0, 0, 0x1 } } };
952 static struct in_addr my_mcast_addr2 = { { { 224, 0, 0, 2 } } };
953 static struct net_linkaddr server_link_addr = {
954 .addr = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 },
955 .len = NET_ETH_ADDR_LEN,
956 };
957 #define MY_IPV6_ADDR_ETH "2001:db8:100::1"
958 #define PEER_IPV6_ADDR_ETH "2001:db8:100::2"
959 #define TEST_TXTIME INT64_MAX
960 #define WAIT_TIME K_MSEC(250)
961 #define WAIT_TIME_LONG K_MSEC(1000)
962
eth_fake_iface_init(struct net_if * iface)963 static void eth_fake_iface_init(struct net_if *iface)
964 {
965 const struct device *dev = net_if_get_device(iface);
966 struct eth_fake_context *ctx = dev->data;
967
968 ctx->iface = iface;
969
970 net_if_set_link_addr(iface, ctx->mac_address,
971 sizeof(ctx->mac_address),
972 NET_LINK_ETHERNET);
973
974 ethernet_init(iface);
975 }
976
eth_fake_send(const struct device * dev,struct net_pkt * pkt)977 static int eth_fake_send(const struct device *dev, struct net_pkt *pkt)
978 {
979 net_time_t txtime;
980
981 ARG_UNUSED(dev);
982 ARG_UNUSED(pkt);
983
984 if (!test_started) {
985 return 0;
986 }
987
988 txtime = net_pkt_timestamp_ns(pkt);
989 if (txtime != TEST_TXTIME) {
990 test_failed = true;
991 } else {
992 test_failed = false;
993 }
994
995 sys_mutex_unlock(&wait_data);
996
997 return 0;
998 }
999
1000 static struct ethernet_api eth_fake_api_funcs = {
1001 .iface_api.init = eth_fake_iface_init,
1002 .send = eth_fake_send,
1003 };
1004
1005 ETH_NET_DEVICE_INIT(eth_fake, "eth_fake", NULL, NULL, ð_fake_data, NULL,
1006 CONFIG_ETH_INIT_PRIORITY, ð_fake_api_funcs, NET_ETH_MTU);
1007
iface_cb(struct net_if * iface,void * user_data)1008 static void iface_cb(struct net_if *iface, void *user_data)
1009 {
1010 struct net_if **my_iface = user_data;
1011
1012 if (net_if_l2(iface) == &NET_L2_GET_NAME(ETHERNET)) {
1013 if (PART_OF_ARRAY(NET_IF_GET_NAME(eth_fake, 0), iface)) {
1014 *my_iface = iface;
1015 }
1016 }
1017
1018 if (net_if_l2(iface) == &NET_L2_GET_NAME(DUMMY)) {
1019 lo0 = iface;
1020 net_if_set_default(iface);
1021 }
1022 }
1023
ZTEST(net_socket_udp,test_17_setup_eth_for_ipv6)1024 ZTEST(net_socket_udp, test_17_setup_eth_for_ipv6)
1025 {
1026 struct net_if_addr *ifaddr;
1027 int ret;
1028
1029 net_if_foreach(iface_cb, ð_iface);
1030 zassert_not_null(eth_iface, "No ethernet interface found");
1031
1032 ifaddr = net_if_ipv6_addr_add(eth_iface, &my_addr1,
1033 NET_ADDR_MANUAL, 0);
1034 if (!ifaddr) {
1035 DBG("Cannot add IPv6 address %s\n",
1036 net_sprint_ipv6_addr(&my_addr1));
1037 zassert_not_null(ifaddr, "addr1");
1038 }
1039
1040 net_if_up(eth_iface);
1041
1042 (void)memset(&udp_server_addr, 0, sizeof(udp_server_addr));
1043 udp_server_addr.sin6_family = AF_INET6;
1044 udp_server_addr.sin6_port = htons(1234);
1045 ret = zsock_inet_pton(AF_INET6, PEER_IPV6_ADDR_ETH, &udp_server_addr.sin6_addr);
1046 zassert_equal(ret, 1, "inet_pton failed");
1047
1048 /* In order to avoid neighbor discovery, populate neighbor cache */
1049 net_ipv6_nbr_add(eth_iface, &udp_server_addr.sin6_addr, &server_link_addr,
1050 true, NET_IPV6_NBR_STATE_REACHABLE);
1051 }
1052
ZTEST_USER(net_socket_udp,test_18_v6_sendmsg_with_txtime)1053 ZTEST_USER(net_socket_udp, test_18_v6_sendmsg_with_txtime)
1054 {
1055 int rv;
1056 int client_sock;
1057 int optval;
1058 net_time_t txtime;
1059 struct sockaddr_in6 client_addr;
1060 struct msghdr msg;
1061 struct cmsghdr *cmsg;
1062 struct iovec io_vector[1];
1063 union {
1064 struct cmsghdr hdr;
1065 unsigned char buf[CMSG_SPACE(sizeof(uint64_t))];
1066 } cmsgbuf;
1067
1068 prepare_sock_udp_v6(MY_IPV6_ADDR_ETH, ANY_PORT, &client_sock, &client_addr);
1069
1070 rv = zsock_bind(client_sock,
1071 (struct sockaddr *)&client_addr,
1072 sizeof(client_addr));
1073 zassert_equal(rv, 0, "client bind failed");
1074
1075 io_vector[0].iov_base = TEST_STR_SMALL;
1076 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
1077
1078 memset(&msg, 0, sizeof(msg));
1079 msg.msg_control = &cmsgbuf.buf;
1080 msg.msg_controllen = sizeof(cmsgbuf.buf);
1081 msg.msg_iov = io_vector;
1082 msg.msg_iovlen = 1;
1083 msg.msg_name = &udp_server_addr;
1084 msg.msg_namelen = sizeof(udp_server_addr);
1085
1086 txtime = TEST_TXTIME;
1087
1088 cmsg = CMSG_FIRSTHDR(&msg);
1089 cmsg->cmsg_len = CMSG_LEN(sizeof(txtime));
1090 cmsg->cmsg_level = SOL_SOCKET;
1091 cmsg->cmsg_type = SCM_TXTIME;
1092 *(net_time_t *)CMSG_DATA(cmsg) = txtime;
1093
1094 optval = true;
1095 rv = zsock_setsockopt(client_sock, SOL_SOCKET, SO_TXTIME, &optval,
1096 sizeof(optval));
1097
1098 test_started = true;
1099
1100 comm_sendmsg_with_txtime(client_sock,
1101 (struct sockaddr *)&client_addr,
1102 sizeof(client_addr),
1103 &msg);
1104
1105 rv = zsock_close(client_sock);
1106 zassert_equal(rv, 0, "close failed");
1107
1108 if (sys_mutex_lock(&wait_data, WAIT_TIME)) {
1109 zassert_true(false, "Timeout DNS query not received");
1110 }
1111
1112 zassert_false(test_failed, "Invalid txtime received");
1113
1114 test_started = false;
1115 }
1116
test_msg_trunc(int sock_c,int sock_s,struct sockaddr * addr_c,socklen_t addrlen_c,struct sockaddr * addr_s,socklen_t addrlen_s)1117 void test_msg_trunc(int sock_c, int sock_s, struct sockaddr *addr_c,
1118 socklen_t addrlen_c, struct sockaddr *addr_s,
1119 socklen_t addrlen_s)
1120 {
1121 int rv;
1122 uint8_t str_buf[sizeof(TEST_STR_SMALL) - 1];
1123
1124 rv = zsock_bind(sock_s, addr_s, addrlen_s);
1125 zassert_equal(rv, 0, "server bind failed");
1126
1127 rv = zsock_bind(sock_c, addr_c, addrlen_c);
1128 zassert_equal(rv, 0, "client bind failed");
1129
1130 rv = zsock_connect(sock_c, addr_s, addrlen_s);
1131 zassert_equal(rv, 0, "connect failed");
1132
1133 /* MSG_TRUNC */
1134
1135 rv = zsock_send(sock_c, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1, 0);
1136 zassert_equal(rv, sizeof(TEST_STR_SMALL) - 1, "send failed");
1137
1138 memset(str_buf, 0, sizeof(str_buf));
1139 rv = zsock_recv(sock_s, str_buf, 2, ZSOCK_MSG_TRUNC);
1140 zassert_equal(rv, sizeof(TEST_STR_SMALL) - 1, "MSG_TRUNC flag failed");
1141 zassert_mem_equal(str_buf, TEST_STR_SMALL, 2, "invalid rx data");
1142 zassert_equal(str_buf[2], 0, "received more than requested");
1143
1144 /* The remaining data should've been discarded */
1145 rv = zsock_recv(sock_s, str_buf, sizeof(str_buf), ZSOCK_MSG_DONTWAIT);
1146 zassert_equal(rv, -1, "consecutive recv should've failed");
1147 zassert_equal(errno, EAGAIN, "incorrect errno value");
1148
1149 /* MSG_TRUNC & MSG_PEEK combo */
1150
1151 rv = zsock_send(sock_c, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1, 0);
1152 zassert_equal(rv, sizeof(TEST_STR_SMALL) - 1, "send failed");
1153
1154 memset(str_buf, 0, sizeof(str_buf));
1155 rv = zsock_recv(sock_s, str_buf, 2, ZSOCK_MSG_TRUNC | ZSOCK_MSG_PEEK);
1156 zassert_equal(rv, sizeof(TEST_STR_SMALL) - 1, "MSG_TRUNC flag failed");
1157
1158 /* The packet should still be available due to MSG_PEEK */
1159 rv = zsock_recv(sock_s, str_buf, sizeof(str_buf), ZSOCK_MSG_TRUNC);
1160 zassert_equal(rv, sizeof(TEST_STR_SMALL) - 1,
1161 "recv after MSG_PEEK failed");
1162 zassert_mem_equal(str_buf, BUF_AND_SIZE(TEST_STR_SMALL),
1163 "invalid rx data");
1164
1165 rv = zsock_close(sock_c);
1166 zassert_equal(rv, 0, "close failed");
1167 rv = zsock_close(sock_s);
1168 zassert_equal(rv, 0, "close failed");
1169 }
1170
ZTEST(net_socket_udp,test_19_v4_msg_trunc)1171 ZTEST(net_socket_udp, test_19_v4_msg_trunc)
1172 {
1173 int client_sock;
1174 int server_sock;
1175 struct sockaddr_in client_addr;
1176 struct sockaddr_in server_addr;
1177
1178 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
1179 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
1180
1181 test_msg_trunc(client_sock, server_sock,
1182 (struct sockaddr *)&client_addr, sizeof(client_addr),
1183 (struct sockaddr *)&server_addr, sizeof(server_addr));
1184 }
1185
ZTEST(net_socket_udp,test_20_v6_msg_trunc)1186 ZTEST(net_socket_udp, test_20_v6_msg_trunc)
1187 {
1188 int client_sock;
1189 int server_sock;
1190 struct sockaddr_in6 client_addr;
1191 struct sockaddr_in6 server_addr;
1192
1193 prepare_sock_udp_v6(MY_IPV6_ADDR, ANY_PORT, &client_sock, &client_addr);
1194 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
1195
1196 test_msg_trunc(client_sock, server_sock,
1197 (struct sockaddr *)&client_addr, sizeof(client_addr),
1198 (struct sockaddr *)&server_addr, sizeof(server_addr));
1199 }
1200
test_dgram_overflow(int sock_c,int sock_s,struct sockaddr * addr_c,socklen_t addrlen_c,struct sockaddr * addr_s,socklen_t addrlen_s,const void * buf,size_t buf_size)1201 static void test_dgram_overflow(int sock_c, int sock_s,
1202 struct sockaddr *addr_c, socklen_t addrlen_c,
1203 struct sockaddr *addr_s, socklen_t addrlen_s,
1204 const void *buf, size_t buf_size)
1205 {
1206 int rv;
1207
1208 rv = zsock_bind(sock_s, addr_s, addrlen_s);
1209 zassert_equal(rv, 0, "server bind failed");
1210
1211 rv = zsock_bind(sock_c, addr_c, addrlen_c);
1212 zassert_equal(rv, 0, "client bind failed");
1213
1214 rv = zsock_connect(sock_c, addr_s, addrlen_s);
1215 zassert_equal(rv, 0, "connect failed");
1216
1217 rv = zsock_send(sock_c, buf, buf_size, 0);
1218 zassert_equal(rv, -1, "send succeeded");
1219 zassert_equal(errno, ENOMEM, "incorrect errno value");
1220
1221 rv = zsock_close(sock_c);
1222 zassert_equal(rv, 0, "close failed");
1223 rv = zsock_close(sock_s);
1224 zassert_equal(rv, 0, "close failed");
1225 }
1226
test_dgram_fragmented(int sock_c,int sock_s,struct sockaddr * addr_c,socklen_t addrlen_c,struct sockaddr * addr_s,socklen_t addrlen_s,const void * buf,size_t buf_size)1227 static void test_dgram_fragmented(int sock_c, int sock_s,
1228 struct sockaddr *addr_c, socklen_t addrlen_c,
1229 struct sockaddr *addr_s, socklen_t addrlen_s,
1230 const void *buf, size_t buf_size)
1231 {
1232 int rv;
1233
1234 rv = zsock_bind(sock_s, addr_s, addrlen_s);
1235 zassert_equal(rv, 0, "server bind failed");
1236
1237 rv = zsock_bind(sock_c, addr_c, addrlen_c);
1238 zassert_equal(rv, 0, "client bind failed");
1239
1240 rv = zsock_connect(sock_c, addr_s, addrlen_s);
1241 zassert_equal(rv, 0, "connect failed");
1242
1243 rv = zsock_send(sock_c, buf, buf_size, 0);
1244 zassert_equal(rv, buf_size, "send failed");
1245
1246 memset(rx_buf, 0, sizeof(rx_buf));
1247 rv = zsock_recv(sock_s, rx_buf, sizeof(rx_buf), 0);
1248 zassert_equal(rv, buf_size, "recv failed");
1249 zassert_mem_equal(rx_buf, buf, buf_size, "wrong data");
1250
1251 rv = zsock_close(sock_c);
1252 zassert_equal(rv, 0, "close failed");
1253 rv = zsock_close(sock_s);
1254 zassert_equal(rv, 0, "close failed");
1255 }
1256
ZTEST(net_socket_udp,test_21_v4_dgram_overflow)1257 ZTEST(net_socket_udp, test_21_v4_dgram_overflow)
1258 {
1259 int client_sock;
1260 int server_sock;
1261 struct sockaddr_in client_addr;
1262 struct sockaddr_in server_addr;
1263
1264 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
1265 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
1266
1267 test_dgram_overflow(client_sock, server_sock,
1268 (struct sockaddr *)&client_addr, sizeof(client_addr),
1269 (struct sockaddr *)&server_addr, sizeof(server_addr),
1270 test_str_all_tx_bufs, NET_ETH_MTU + 1);
1271 }
1272
ZTEST(net_socket_udp,test_22_v6_dgram_fragmented_or_overflow)1273 ZTEST(net_socket_udp, test_22_v6_dgram_fragmented_or_overflow)
1274 {
1275 int client_sock;
1276 int server_sock;
1277 struct sockaddr_in6 client_addr;
1278 struct sockaddr_in6 server_addr;
1279
1280 prepare_sock_udp_v6(MY_IPV6_ADDR, ANY_PORT, &client_sock, &client_addr);
1281 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
1282
1283 if (IS_ENABLED(CONFIG_NET_IPV6_FRAGMENT)) {
1284 test_dgram_fragmented(client_sock, server_sock,
1285 (struct sockaddr *)&client_addr, sizeof(client_addr),
1286 (struct sockaddr *)&server_addr, sizeof(server_addr),
1287 test_str_all_tx_bufs, NET_ETH_MTU + 1);
1288 } else {
1289 test_dgram_overflow(client_sock, server_sock,
1290 (struct sockaddr *)&client_addr, sizeof(client_addr),
1291 (struct sockaddr *)&server_addr, sizeof(server_addr),
1292 test_str_all_tx_bufs, NET_ETH_MTU + 1);
1293 }
1294 }
1295
ZTEST(net_socket_udp,test_23_v6_dgram_overflow)1296 ZTEST(net_socket_udp, test_23_v6_dgram_overflow)
1297 {
1298 int client_sock;
1299 int server_sock;
1300 struct sockaddr_in6 client_addr;
1301 struct sockaddr_in6 server_addr;
1302
1303 prepare_sock_udp_v6(MY_IPV6_ADDR, ANY_PORT, &client_sock, &client_addr);
1304 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
1305
1306 test_dgram_overflow(client_sock, server_sock,
1307 (struct sockaddr *)&client_addr, sizeof(client_addr),
1308 (struct sockaddr *)&server_addr, sizeof(server_addr),
1309 BUF_AND_SIZE(test_str_all_tx_bufs));
1310 }
1311
test_dgram_connected(int sock_c,int sock_s1,int sock_s2,struct sockaddr * addr_c,socklen_t addrlen_c,struct sockaddr * addr_s1,socklen_t addrlen_s1,struct sockaddr * addr_s2,socklen_t addrlen_s2)1312 static void test_dgram_connected(int sock_c, int sock_s1, int sock_s2,
1313 struct sockaddr *addr_c, socklen_t addrlen_c,
1314 struct sockaddr *addr_s1, socklen_t addrlen_s1,
1315 struct sockaddr *addr_s2, socklen_t addrlen_s2)
1316 {
1317 uint8_t tx_buf = 0xab;
1318 uint8_t rx_buf;
1319 int rv;
1320
1321 rv = zsock_bind(sock_c, addr_c, addrlen_c);
1322 zassert_equal(rv, 0, "client bind failed");
1323
1324 rv = zsock_bind(sock_s1, addr_s1, addrlen_s1);
1325 zassert_equal(rv, 0, "server bind failed");
1326
1327 rv = zsock_bind(sock_s2, addr_s2, addrlen_s2);
1328 zassert_equal(rv, 0, "server bind failed");
1329
1330 rv = zsock_connect(sock_c, addr_s1, addrlen_s1);
1331 zassert_equal(rv, 0, "connect failed");
1332
1333 /* Verify that a datagram can be received from the connected address */
1334 rv = zsock_sendto(sock_s1, &tx_buf, sizeof(tx_buf), 0, addr_c, addrlen_c);
1335 zassert_equal(rv, sizeof(tx_buf), "send failed %d", errno);
1336
1337 /* Give the packet a chance to go through the net stack */
1338 k_msleep(10);
1339
1340 rx_buf = 0;
1341 rv = zsock_recv(sock_c, &rx_buf, sizeof(rx_buf), ZSOCK_MSG_DONTWAIT);
1342 zassert_equal(rv, sizeof(rx_buf), "recv failed");
1343 zassert_equal(rx_buf, tx_buf, "wrong data");
1344
1345 /* Verify that a datagram is not received from other address */
1346 rv = zsock_sendto(sock_s2, &tx_buf, sizeof(tx_buf), 0, addr_c, addrlen_c);
1347 zassert_equal(rv, sizeof(tx_buf), "send failed");
1348
1349 /* Give the packet a chance to go through the net stack */
1350 k_msleep(10);
1351
1352 rv = zsock_recv(sock_c, &rx_buf, sizeof(rx_buf), ZSOCK_MSG_DONTWAIT);
1353 zassert_equal(rv, -1, "recv should've failed");
1354 zassert_equal(errno, EAGAIN, "incorrect errno");
1355
1356 rv = zsock_close(sock_c);
1357 zassert_equal(rv, 0, "close failed");
1358 rv = zsock_close(sock_s1);
1359 zassert_equal(rv, 0, "close failed");
1360 rv = zsock_close(sock_s2);
1361 zassert_equal(rv, 0, "close failed");
1362 }
1363
ZTEST(net_socket_udp,test_24_v4_dgram_connected)1364 ZTEST(net_socket_udp, test_24_v4_dgram_connected)
1365 {
1366 int client_sock;
1367 int server_sock_1;
1368 int server_sock_2;
1369 struct sockaddr_in client_addr;
1370 struct sockaddr_in server_addr_1;
1371 struct sockaddr_in server_addr_2;
1372
1373 prepare_sock_udp_v4(MY_IPV4_ADDR, CLIENT_PORT, &client_sock, &client_addr);
1374 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock_1, &server_addr_1);
1375 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT + 1, &server_sock_2, &server_addr_2);
1376
1377 test_dgram_connected(client_sock, server_sock_1, server_sock_2,
1378 (struct sockaddr *)&client_addr, sizeof(client_addr),
1379 (struct sockaddr *)&server_addr_1, sizeof(server_addr_1),
1380 (struct sockaddr *)&server_addr_2, sizeof(server_addr_2));
1381 }
1382
ZTEST(net_socket_udp,test_25_v6_dgram_connected)1383 ZTEST(net_socket_udp, test_25_v6_dgram_connected)
1384 {
1385 int client_sock;
1386 int server_sock_1;
1387 int server_sock_2;
1388 struct sockaddr_in6 client_addr;
1389 struct sockaddr_in6 server_addr_1;
1390 struct sockaddr_in6 server_addr_2;
1391
1392 prepare_sock_udp_v6(MY_IPV6_ADDR, CLIENT_PORT, &client_sock, &client_addr);
1393 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock_1, &server_addr_1);
1394 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT + 1, &server_sock_2, &server_addr_2);
1395
1396 test_dgram_connected(client_sock, server_sock_1, server_sock_2,
1397 (struct sockaddr *)&client_addr, sizeof(client_addr),
1398 (struct sockaddr *)&server_addr_1, sizeof(server_addr_1),
1399 (struct sockaddr *)&server_addr_2, sizeof(server_addr_2));
1400 }
1401
ZTEST_USER(net_socket_udp,test_26_recvmsg_invalid)1402 ZTEST_USER(net_socket_udp, test_26_recvmsg_invalid)
1403 {
1404 struct msghdr msg;
1405 struct sockaddr_in6 server_addr;
1406 struct cmsghdr *cmsg;
1407 struct iovec io_vector[1];
1408 union {
1409 struct cmsghdr hdr;
1410 unsigned char buf[CMSG_SPACE(sizeof(int))];
1411 } cmsgbuf;
1412 int ret;
1413
1414 /* Userspace is needed for this test */
1415 Z_TEST_SKIP_IFNDEF(CONFIG_USERSPACE);
1416
1417 io_vector[0].iov_base = TEST_STR_SMALL;
1418 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
1419
1420 ret = zsock_recvmsg(0, NULL, 0);
1421 zassert_true(ret < 0 && errno == EINVAL, "Wrong errno (%d)", errno);
1422
1423 /* Set various pointers to NULL or invalid value which should cause failure */
1424 memset(&msg, 0, sizeof(msg));
1425 msg.msg_controllen = sizeof(cmsgbuf.buf);
1426
1427 ret = zsock_recvmsg(0, &msg, 0);
1428 zassert_true(ret < 0, "recvmsg() succeed");
1429
1430 msg.msg_control = &cmsgbuf.buf;
1431
1432 ret = zsock_recvmsg(0, &msg, 0);
1433 zassert_true(ret < 0 && errno == ENOMEM, "Wrong errno (%d)", errno);
1434
1435 msg.msg_iov = io_vector;
1436 msg.msg_iovlen = 1;
1437 msg.msg_name = (void *)1;
1438 msg.msg_namelen = sizeof(server_addr);
1439
1440 cmsg = CMSG_FIRSTHDR(&msg);
1441 cmsg->cmsg_len = CMSG_LEN(sizeof(int));
1442 cmsg->cmsg_level = SOL_SOCKET;
1443 cmsg->cmsg_type = 1122;
1444 *(int *)CMSG_DATA(cmsg) = 42;
1445
1446 ret = zsock_recvmsg(0, &msg, 0);
1447 zassert_true(ret < 0, "recvmsg() succeed");
1448 }
1449
comm_sendmsg_recvmsg(int client_sock,struct sockaddr * client_addr,socklen_t client_addrlen,const struct msghdr * client_msg,int server_sock,struct sockaddr * server_addr,socklen_t server_addrlen,struct msghdr * msg,void * cmsgbuf,int cmsgbuf_len,bool expect_control_data)1450 static void comm_sendmsg_recvmsg(int client_sock,
1451 struct sockaddr *client_addr,
1452 socklen_t client_addrlen,
1453 const struct msghdr *client_msg,
1454 int server_sock,
1455 struct sockaddr *server_addr,
1456 socklen_t server_addrlen,
1457 struct msghdr *msg,
1458 void *cmsgbuf, int cmsgbuf_len,
1459 bool expect_control_data)
1460 {
1461 #define MAX_BUF_LEN 64
1462 #define SMALL_BUF_LEN (sizeof(TEST_STR_SMALL) - 1 - 2)
1463 char buf[MAX_BUF_LEN];
1464 char buf2[SMALL_BUF_LEN];
1465 struct iovec io_vector[2];
1466 ssize_t sent;
1467 ssize_t recved;
1468 struct sockaddr addr;
1469 socklen_t addrlen = server_addrlen;
1470 int len, i;
1471
1472 zassert_not_null(client_addr, "null client addr");
1473 zassert_not_null(server_addr, "null server addr");
1474
1475 /*
1476 * Test client -> server sending
1477 */
1478
1479 sent = zsock_sendmsg(client_sock, client_msg, 0);
1480 zassert_true(sent > 0, "sendmsg failed, %s (%d)", strerror(errno), -errno);
1481
1482 /* One negative test with invalid msg_iov */
1483 memset(msg, 0, sizeof(*msg));
1484 recved = zsock_recvmsg(server_sock, msg, 0);
1485 zassert_true(recved < 0 && errno == ENOMEM, "Wrong errno (%d)", errno);
1486
1487 for (i = 0, len = 0; i < client_msg->msg_iovlen; i++) {
1488 len += client_msg->msg_iov[i].iov_len;
1489 }
1490
1491 zassert_equal(sent, len, "iovec len (%d) vs sent (%d)", len, sent);
1492
1493 /* Test first with one iovec */
1494 io_vector[0].iov_base = buf;
1495 io_vector[0].iov_len = sizeof(buf);
1496
1497 memset(msg, 0, sizeof(*msg));
1498 memset(cmsgbuf, 0, cmsgbuf_len);
1499 msg->msg_control = cmsgbuf;
1500 msg->msg_controllen = cmsgbuf_len;
1501 msg->msg_iov = io_vector;
1502 msg->msg_iovlen = 1;
1503 msg->msg_name = &addr;
1504 msg->msg_namelen = addrlen;
1505
1506 /* Test recvmsg(MSG_PEEK) */
1507 recved = zsock_recvmsg(server_sock, msg, ZSOCK_MSG_PEEK);
1508 zassert_true(recved > 0, "recvmsg fail, %s (%d)", strerror(errno), -errno);
1509 zassert_equal(recved, len, "unexpected received bytes (%d vs %d)",
1510 recved, len);
1511 zassert_equal(sent, recved, "sent(%d)/received(%d) mismatch",
1512 sent, recved);
1513 zassert_equal(msg->msg_iovlen, 1, "recvmsg should not modify msg_iovlen");
1514 zassert_equal(msg->msg_iov[0].iov_len, sizeof(buf),
1515 "recvmsg should not modify buffer length");
1516 zassert_mem_equal(buf, TEST_STR_SMALL, len,
1517 "wrong data (%s)", rx_buf);
1518 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
1519
1520 /* Test normal recvmsg() */
1521 clear_buf(rx_buf);
1522 recved = zsock_recvmsg(server_sock, msg, 0);
1523 zassert_true(recved > 0, "recvfrom fail");
1524 zassert_equal(recved, len, "unexpected received bytes");
1525 zassert_equal(msg->msg_iovlen, 1, "recvmsg should not modify msg_iovlen");
1526 zassert_equal(msg->msg_iov[0].iov_len, sizeof(buf),
1527 "recvmsg should not modify buffer length");
1528 zassert_mem_equal(buf, TEST_STR_SMALL, len,
1529 "wrong data (%s)", rx_buf);
1530 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
1531
1532 /* Control data should be empty */
1533 if (!expect_control_data) {
1534 zassert_equal(msg->msg_controllen, 0,
1535 "We received control data (%u vs %zu)",
1536 0U, msg->msg_controllen);
1537 }
1538
1539 /* Check the client port */
1540 if (addr.sa_family == AF_INET) {
1541 if (net_sin(client_addr)->sin_port != ANY_PORT) {
1542 zassert_equal(net_sin(client_addr)->sin_port,
1543 net_sin(&addr)->sin_port,
1544 "unexpected client port");
1545 }
1546 }
1547
1548 if (addr.sa_family == AF_INET6) {
1549 if (net_sin6(client_addr)->sin6_port != ANY_PORT) {
1550 zassert_equal(net_sin6(client_addr)->sin6_port,
1551 net_sin6(&addr)->sin6_port,
1552 "unexpected client port");
1553 }
1554 }
1555
1556 /* Then send the message again and verify that we could receive
1557 * the full message in smaller chunks too.
1558 */
1559 sent = zsock_sendmsg(client_sock, client_msg, 0);
1560 zassert_true(sent > 0, "sendmsg failed (%d)", -errno);
1561
1562 for (i = 0, len = 0; i < client_msg->msg_iovlen; i++) {
1563 len += client_msg->msg_iov[i].iov_len;
1564 }
1565
1566 zassert_equal(sent, len, "iovec len (%d) vs sent (%d)", len, sent);
1567
1568 /* and then test with two iovec */
1569 io_vector[0].iov_base = buf2;
1570 io_vector[0].iov_len = sizeof(buf2);
1571 io_vector[1].iov_base = buf;
1572 io_vector[1].iov_len = sizeof(buf);
1573
1574 memset(msg, 0, sizeof(*msg));
1575 memset(cmsgbuf, 0, cmsgbuf_len);
1576 msg->msg_control = cmsgbuf;
1577 msg->msg_controllen = cmsgbuf_len;
1578 msg->msg_iov = io_vector;
1579 msg->msg_iovlen = 2;
1580 msg->msg_name = &addr;
1581 msg->msg_namelen = addrlen;
1582
1583 /* Test recvmsg(MSG_PEEK) */
1584 recved = zsock_recvmsg(server_sock, msg, ZSOCK_MSG_PEEK);
1585 zassert_true(recved >= 0, "recvfrom fail (errno %d)", errno);
1586 zassert_equal(recved, len,
1587 "unexpected received bytes (%d vs %d)", recved, len);
1588 zassert_equal(sent, recved, "sent(%d)/received(%d) mismatch",
1589 sent, recved);
1590
1591 zassert_equal(msg->msg_iovlen, 2, "recvmsg should not modify msg_iovlen");
1592 zassert_equal(msg->msg_iov[0].iov_len, sizeof(buf2),
1593 "recvmsg should not modify buffer length");
1594 zassert_equal(msg->msg_iov[1].iov_len, sizeof(buf),
1595 "recvmsg should not modify buffer length");
1596 zassert_mem_equal(msg->msg_iov[0].iov_base, TEST_STR_SMALL, msg->msg_iov[0].iov_len,
1597 "wrong data in %s", "iov[0]");
1598 zassert_mem_equal(msg->msg_iov[1].iov_base, &TEST_STR_SMALL[msg->msg_iov[0].iov_len],
1599 len - msg->msg_iov[0].iov_len,
1600 "wrong data in %s", "iov[1]");
1601 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
1602
1603 /* Test normal recvfrom() */
1604 recved = zsock_recvmsg(server_sock, msg, ZSOCK_MSG_PEEK);
1605 zassert_true(recved >= 0, "recvfrom fail (errno %d)", errno);
1606 zassert_equal(recved, len,
1607 "unexpected received bytes (%d vs %d)", recved, len);
1608 zassert_equal(sent, recved, "sent(%d)/received(%d) mismatch",
1609 sent, recved);
1610
1611 zassert_equal(msg->msg_iovlen, 2, "recvmsg should not modify msg_iovlen");
1612 zassert_equal(msg->msg_iov[0].iov_len, sizeof(buf2),
1613 "recvmsg should not modify buffer length");
1614 zassert_equal(msg->msg_iov[1].iov_len, sizeof(buf),
1615 "recvmsg should not modify buffer length");
1616 zassert_mem_equal(msg->msg_iov[0].iov_base, TEST_STR_SMALL, msg->msg_iov[0].iov_len,
1617 "wrong data in %s", "iov[0]");
1618 zassert_mem_equal(msg->msg_iov[1].iov_base, &TEST_STR_SMALL[msg->msg_iov[0].iov_len],
1619 len - msg->msg_iov[0].iov_len,
1620 "wrong data in %s", "iov[1]");
1621 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
1622
1623 /* Control data should be empty */
1624 if (!expect_control_data) {
1625 zassert_equal(msg->msg_controllen, 0,
1626 "We received control data (%u vs %zu)",
1627 0U, msg->msg_controllen);
1628 }
1629
1630 /* Then check that the trucation flag is set correctly */
1631 sent = zsock_sendmsg(client_sock, client_msg, 0);
1632 zassert_true(sent > 0, "sendmsg failed (%d)", -errno);
1633
1634 for (i = 0, len = 0; i < client_msg->msg_iovlen; i++) {
1635 len += client_msg->msg_iov[i].iov_len;
1636 }
1637
1638 zassert_equal(sent, len, "iovec len (%d) vs sent (%d)", len, sent);
1639
1640 /* Test first with one iovec */
1641 io_vector[0].iov_base = buf2;
1642 io_vector[0].iov_len = sizeof(buf2);
1643
1644 memset(msg, 0, sizeof(*msg));
1645 memset(cmsgbuf, 0, cmsgbuf_len);
1646 msg->msg_control = cmsgbuf;
1647 msg->msg_controllen = cmsgbuf_len;
1648 msg->msg_iov = io_vector;
1649 msg->msg_iovlen = 1;
1650 msg->msg_name = &addr;
1651 msg->msg_namelen = addrlen;
1652
1653 /* Test recvmsg */
1654 recved = zsock_recvmsg(server_sock, msg, 0);
1655 zassert_true(recved > 0, "recvmsg fail, %s (%d)", strerror(errno), errno);
1656 zassert_equal(recved, sizeof(buf2),
1657 "unexpected received bytes (%d vs %d)",
1658 recved, sizeof(buf2));
1659 zassert_true(msg->msg_flags & ZSOCK_MSG_TRUNC, "Message not truncated");
1660
1661 zassert_equal(msg->msg_iovlen, 1, "recvmsg should not modify msg_iovlen");
1662 zassert_equal(msg->msg_iov[0].iov_len, sizeof(buf2),
1663 "recvmsg should not modify buffer length");
1664 zassert_mem_equal(buf2, TEST_STR_SMALL, sizeof(buf2),
1665 "wrong data (%s)", buf2);
1666 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
1667
1668 /* Control data should be empty */
1669 if (!expect_control_data) {
1670 zassert_equal(msg->msg_controllen, 0,
1671 "We received control data (%u vs %zu)",
1672 0U, msg->msg_controllen);
1673 }
1674 }
1675
ZTEST_USER(net_socket_udp,test_27_recvmsg_user)1676 ZTEST_USER(net_socket_udp, test_27_recvmsg_user)
1677 {
1678 int rv;
1679 int client_sock;
1680 int server_sock;
1681 struct sockaddr_in client_addr;
1682 struct sockaddr_in server_addr;
1683 struct msghdr msg, server_msg;
1684 struct iovec io_vector[1];
1685
1686 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
1687 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
1688
1689 rv = zsock_bind(server_sock,
1690 (struct sockaddr *)&server_addr,
1691 sizeof(server_addr));
1692 zassert_equal(rv, 0, "server bind failed");
1693
1694 rv = zsock_bind(client_sock,
1695 (struct sockaddr *)&client_addr,
1696 sizeof(client_addr));
1697 zassert_equal(rv, 0, "client bind failed");
1698
1699 io_vector[0].iov_base = TEST_STR_SMALL;
1700 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
1701
1702 memset(&msg, 0, sizeof(msg));
1703 msg.msg_iov = io_vector;
1704 msg.msg_iovlen = 1;
1705 msg.msg_name = &server_addr;
1706 msg.msg_namelen = sizeof(server_addr);
1707
1708 comm_sendmsg_recvmsg(client_sock,
1709 (struct sockaddr *)&client_addr,
1710 sizeof(client_addr),
1711 &msg,
1712 server_sock,
1713 (struct sockaddr *)&server_addr,
1714 sizeof(server_addr),
1715 &server_msg, NULL, 0, false);
1716
1717 rv = zsock_close(client_sock);
1718 zassert_equal(rv, 0, "close failed");
1719 rv = zsock_close(server_sock);
1720 zassert_equal(rv, 0, "close failed");
1721 }
1722
run_ancillary_recvmsg_test(int client_sock,struct sockaddr * client_addr,int client_addr_len,int server_sock,struct sockaddr * server_addr,int server_addr_len)1723 static void run_ancillary_recvmsg_test(int client_sock,
1724 struct sockaddr *client_addr,
1725 int client_addr_len,
1726 int server_sock,
1727 struct sockaddr *server_addr,
1728 int server_addr_len)
1729 {
1730 int rv;
1731 int opt;
1732 int ifindex = 0;
1733 socklen_t optlen;
1734 struct sockaddr addr = { 0 };
1735 struct net_if *iface;
1736 struct msghdr msg;
1737 struct msghdr server_msg;
1738 struct iovec io_vector[1];
1739 struct cmsghdr *cmsg, *prevcmsg;
1740 union {
1741 struct cmsghdr hdr;
1742 unsigned char buf[CMSG_SPACE(sizeof(struct in6_pktinfo))];
1743 } cmsgbuf;
1744 #define SMALL_BUF_LEN (sizeof(TEST_STR_SMALL) - 1 - 2)
1745 char buf[MAX_BUF_LEN];
1746
1747 Z_TEST_SKIP_IFNDEF(CONFIG_NET_CONTEXT_RECV_PKTINFO);
1748
1749 rv = zsock_bind(server_sock, server_addr, server_addr_len);
1750 zassert_equal(rv, 0, "server bind failed");
1751
1752 rv = zsock_bind(client_sock, client_addr, client_addr_len);
1753 zassert_equal(rv, 0, "client bind failed");
1754
1755 io_vector[0].iov_base = TEST_STR_SMALL;
1756 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
1757
1758 memset(&cmsgbuf, 0, sizeof(cmsgbuf));
1759
1760 memset(&msg, 0, sizeof(msg));
1761 msg.msg_iov = io_vector;
1762 msg.msg_iovlen = 1;
1763 msg.msg_name = server_addr;
1764 msg.msg_namelen = server_addr_len;
1765
1766 comm_sendmsg_recvmsg(client_sock,
1767 client_addr,
1768 client_addr_len,
1769 &msg,
1770 server_sock,
1771 server_addr,
1772 server_addr_len,
1773 &server_msg,
1774 &cmsgbuf.buf,
1775 sizeof(cmsgbuf.buf),
1776 true);
1777
1778 for (prevcmsg = NULL, cmsg = CMSG_FIRSTHDR(&server_msg);
1779 cmsg != NULL && prevcmsg != cmsg;
1780 prevcmsg = cmsg, cmsg = CMSG_NXTHDR(&server_msg, cmsg)) {
1781 if (cmsg->cmsg_level == IPPROTO_IP &&
1782 cmsg->cmsg_type == IP_PKTINFO) {
1783 net_sin(&addr)->sin_addr = ((struct in_pktinfo *)CMSG_DATA(cmsg))->ipi_addr;
1784 break;
1785 }
1786 }
1787
1788 /* As we have not set the socket option, the address should not be set */
1789 if (server_addr->sa_family == AF_INET) {
1790 zassert_equal(net_sin(&addr)->sin_addr.s_addr, INADDR_ANY, "Source address set!");
1791 }
1792
1793 if (server_addr->sa_family == AF_INET6) {
1794 zassert_true(net_sin6(&addr)->sin6_addr.s6_addr32[0] == 0 &&
1795 net_sin6(&addr)->sin6_addr.s6_addr32[1] == 0 &&
1796 net_sin6(&addr)->sin6_addr.s6_addr32[2] == 0 &&
1797 net_sin6(&addr)->sin6_addr.s6_addr32[3] == 0,
1798 "Source address set!");
1799 }
1800
1801 opt = 1;
1802 optlen = sizeof(opt);
1803 rv = zsock_setsockopt(server_sock, IPPROTO_IP, IP_PKTINFO, &opt, optlen);
1804 zassert_equal(rv, 0, "setsockopt failed (%d)", -errno);
1805
1806 memset(&cmsgbuf, 0, sizeof(cmsgbuf));
1807
1808 memset(&msg, 0, sizeof(msg));
1809 msg.msg_iov = io_vector;
1810 msg.msg_iovlen = 1;
1811 msg.msg_name = server_addr;
1812 msg.msg_namelen = server_addr_len;
1813
1814 comm_sendmsg_recvmsg(client_sock,
1815 client_addr,
1816 client_addr_len,
1817 &msg,
1818 server_sock,
1819 server_addr,
1820 server_addr_len,
1821 &server_msg,
1822 &cmsgbuf.buf,
1823 sizeof(cmsgbuf.buf),
1824 true);
1825
1826 for (cmsg = CMSG_FIRSTHDR(&server_msg); cmsg != NULL;
1827 cmsg = CMSG_NXTHDR(&server_msg, cmsg)) {
1828 if (cmsg->cmsg_level == IPPROTO_IP &&
1829 cmsg->cmsg_type == IP_PKTINFO) {
1830 net_sin(&addr)->sin_addr =
1831 ((struct in_pktinfo *)CMSG_DATA(cmsg))->ipi_addr;
1832 ifindex = ((struct in_pktinfo *)CMSG_DATA(cmsg))->ipi_ifindex;
1833 break;
1834 }
1835
1836 if (cmsg->cmsg_level == IPPROTO_IPV6 &&
1837 cmsg->cmsg_type == IPV6_RECVPKTINFO) {
1838 net_ipaddr_copy(&net_sin6(&addr)->sin6_addr,
1839 &((struct in6_pktinfo *)CMSG_DATA(cmsg))->ipi6_addr);
1840 ifindex = ((struct in6_pktinfo *)CMSG_DATA(cmsg))->ipi6_ifindex;
1841 break;
1842 }
1843 }
1844
1845 if (server_addr->sa_family == AF_INET) {
1846 zassert_equal(net_sin(&addr)->sin_addr.s_addr,
1847 net_sin(server_addr)->sin_addr.s_addr,
1848 "Source address not set properly!");
1849 }
1850
1851 if (server_addr->sa_family == AF_INET6) {
1852 zassert_mem_equal(&net_sin6(&addr)->sin6_addr,
1853 &net_sin6(server_addr)->sin6_addr,
1854 sizeof(struct in6_addr),
1855 "Source address not set properly!");
1856 }
1857
1858 if (!k_is_user_context()) {
1859 iface = net_if_get_default();
1860 zassert_equal(ifindex, net_if_get_by_iface(iface));
1861 }
1862
1863 /* Make sure that the recvmsg() fails if control area is too small */
1864 rv = zsock_sendto(client_sock, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1, 0,
1865 server_addr, server_addr_len);
1866 zassert_equal(rv, STRLEN(TEST_STR_SMALL), "sendto failed (%d)", -errno);
1867
1868 io_vector[0].iov_base = buf;
1869 io_vector[0].iov_len = sizeof(buf);
1870
1871 memset(&msg, 0, sizeof(msg));
1872 msg.msg_control = &cmsgbuf.buf;
1873 msg.msg_controllen = 1; /* making sure the control buf is always too small */
1874 msg.msg_iov = io_vector;
1875 msg.msg_iovlen = 1;
1876
1877 rv = zsock_recvmsg(server_sock, &msg, 0);
1878 zassert_true(rv, "recvmsg succeed (%d)", rv);
1879
1880 zassert_true(msg.msg_flags & ZSOCK_MSG_CTRUNC, "Control message not truncated");
1881
1882 rv = zsock_close(client_sock);
1883 zassert_equal(rv, 0, "close failed");
1884 rv = zsock_close(server_sock);
1885 zassert_equal(rv, 0, "close failed");
1886 }
1887
ZTEST_USER(net_socket_udp,test_28_recvmsg_ancillary_ipv4_pktinfo_data_user)1888 ZTEST_USER(net_socket_udp, test_28_recvmsg_ancillary_ipv4_pktinfo_data_user)
1889 {
1890 struct sockaddr_in client_addr;
1891 struct sockaddr_in server_addr;
1892 int client_sock;
1893 int server_sock;
1894
1895 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
1896 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
1897
1898 run_ancillary_recvmsg_test(client_sock,
1899 (struct sockaddr *)&client_addr,
1900 sizeof(client_addr),
1901 server_sock,
1902 (struct sockaddr *)&server_addr,
1903 sizeof(server_addr));
1904 }
1905
ZTEST_USER(net_socket_udp,test_29_recvmsg_ancillary_ipv6_pktinfo_data_user)1906 ZTEST_USER(net_socket_udp, test_29_recvmsg_ancillary_ipv6_pktinfo_data_user)
1907 {
1908 struct sockaddr_in6 client_addr;
1909 struct sockaddr_in6 server_addr;
1910 int client_sock;
1911 int server_sock;
1912
1913 prepare_sock_udp_v6(MY_IPV6_ADDR, ANY_PORT, &client_sock, &client_addr);
1914 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
1915
1916 run_ancillary_recvmsg_test(client_sock,
1917 (struct sockaddr *)&client_addr,
1918 sizeof(client_addr),
1919 server_sock,
1920 (struct sockaddr *)&server_addr,
1921 sizeof(server_addr));
1922 }
1923
ZTEST(net_socket_udp,test_30_setup_eth_for_ipv4)1924 ZTEST(net_socket_udp, test_30_setup_eth_for_ipv4)
1925 {
1926 struct net_if_addr *ifaddr;
1927
1928 net_if_foreach(iface_cb, ð_iface);
1929 zassert_not_null(eth_iface, "No ethernet interface found");
1930
1931 net_if_down(eth_iface);
1932
1933 ifaddr = net_if_ipv4_addr_add(eth_iface, &my_addr2,
1934 NET_ADDR_MANUAL, 0);
1935 if (!ifaddr) {
1936 DBG("Cannot add IPv4 address %s\n",
1937 net_sprint_ipv4_addr(&my_addr2));
1938 zassert_not_null(ifaddr, "addr2");
1939 }
1940
1941 net_if_up(eth_iface);
1942 }
1943
bind_socket(int sock,struct net_if * iface)1944 static int bind_socket(int sock, struct net_if *iface)
1945 {
1946 struct sockaddr_ll addr;
1947
1948 memset(&addr, 0, sizeof(addr));
1949
1950 addr.sll_ifindex = net_if_get_by_iface(iface);
1951 addr.sll_family = AF_PACKET;
1952
1953 return zsock_bind(sock, (struct sockaddr *)&addr, sizeof(addr));
1954 }
1955
test_check_ttl(int sock_c,int sock_s,int sock_p,struct sockaddr * addr_c,socklen_t addrlen_c,struct sockaddr * addr_s,socklen_t addrlen_s,struct sockaddr * addr_sendto,socklen_t addrlen_sendto,sa_family_t family,uint8_t expected_ttl,uint8_t expected_mcast_ttl)1956 static void test_check_ttl(int sock_c, int sock_s, int sock_p,
1957 struct sockaddr *addr_c, socklen_t addrlen_c,
1958 struct sockaddr *addr_s, socklen_t addrlen_s,
1959 struct sockaddr *addr_sendto, socklen_t addrlen_sendto,
1960 sa_family_t family, uint8_t expected_ttl,
1961 uint8_t expected_mcast_ttl)
1962 {
1963 uint8_t tx_buf = 0xab;
1964 uint8_t rx_buf;
1965 int ret, count = 10, opt;
1966 #define IPV4_HDR_SIZE sizeof(struct net_ipv4_hdr)
1967 #define IPV6_HDR_SIZE sizeof(struct net_ipv6_hdr)
1968 #define UDP_HDR_SIZE sizeof(struct net_udp_hdr)
1969 #define V4_HDR_SIZE (IPV4_HDR_SIZE + UDP_HDR_SIZE)
1970 #define V6_HDR_SIZE (IPV6_HDR_SIZE + UDP_HDR_SIZE)
1971 #define MAX_HDR_SIZE (IPV6_HDR_SIZE + UDP_HDR_SIZE)
1972 uint8_t data_to_receive[sizeof(tx_buf) + MAX_HDR_SIZE];
1973 struct sockaddr_ll src;
1974 socklen_t addrlen;
1975 char ifname[CONFIG_NET_INTERFACE_NAME_LEN];
1976 struct ifreq ifreq = { 0 };
1977 struct timeval timeo_optval = {
1978 .tv_sec = 0,
1979 .tv_usec = 100000,
1980 };
1981 #if defined(CONFIG_NET_STATISTICS)
1982 struct net_stats_ip ipv4_stats_before, ipv4_stats_after;
1983 struct net_stats_ip ipv6_stats_before, ipv6_stats_after;
1984 #endif
1985
1986 Z_TEST_SKIP_IFNDEF(CONFIG_NET_INTERFACE_NAME);
1987
1988 ret = zsock_bind(sock_c, addr_c, addrlen_c);
1989 zassert_equal(ret, 0, "client bind failed");
1990
1991 ret = net_if_get_name(lo0, ifname, sizeof(ifname));
1992 zassert_true(ret > 0, "cannot get interface name (%d)", ret);
1993
1994 strncpy(ifreq.ifr_name, ifname, sizeof(ifreq.ifr_name));
1995 ret = zsock_setsockopt(sock_c, SOL_SOCKET, SO_BINDTODEVICE, &ifreq,
1996 sizeof(ifreq));
1997 zassert_equal(ret, 0, "SO_BINDTODEVICE failed, %d", -errno);
1998
1999 ret = zsock_connect(sock_c, addr_s, addrlen_s);
2000 zassert_equal(ret, 0, "connect failed");
2001
2002 ret = zsock_setsockopt(sock_s, SOL_SOCKET, SO_RCVTIMEO,
2003 &timeo_optval, sizeof(timeo_optval));
2004 zassert_equal(ret, 0, "Cannot set receive timeout (%d)", -errno);
2005
2006 while (count > 0) {
2007 ret = zsock_sendto(sock_c, &tx_buf, sizeof(tx_buf), 0,
2008 addr_sendto, addrlen_sendto);
2009 zassert_equal(ret, sizeof(tx_buf), "send failed (%d)", -errno);
2010
2011 ret = zsock_recv(sock_s, &rx_buf, sizeof(rx_buf), ZSOCK_MSG_DONTWAIT);
2012 if (ret > 0) {
2013 zassert_equal(ret, sizeof(rx_buf), "recv failed (%d)", ret);
2014 zassert_equal(rx_buf, tx_buf, "wrong data");
2015 }
2016
2017 ret = zsock_recvfrom(sock_p, data_to_receive, sizeof(data_to_receive), 0,
2018 (struct sockaddr *)&src, &addrlen);
2019 if (ret > 0) {
2020 int hdr_size = family == AF_INET ?
2021 V4_HDR_SIZE : V6_HDR_SIZE;
2022 zassert_equal(ret, sizeof(tx_buf) + hdr_size,
2023 "Cannot receive all data (%d vs %zd) (%d)",
2024 ret, sizeof(tx_buf), -errno);
2025 zassert_mem_equal(&data_to_receive[hdr_size], &tx_buf,
2026 sizeof(tx_buf),
2027 "Sent and received buffers do not match");
2028
2029 if (family == AF_INET) {
2030 struct net_ipv4_hdr *ipv4 =
2031 (struct net_ipv4_hdr *)&data_to_receive[0];
2032
2033 if (expected_ttl > 0) {
2034 zassert_equal(ipv4->ttl, expected_ttl,
2035 "Invalid ttl (%d vs %d)",
2036 ipv4->ttl, expected_ttl);
2037 } else if (expected_mcast_ttl > 0) {
2038 zassert_equal(ipv4->ttl, expected_mcast_ttl,
2039 "Invalid mcast ttl (%d vs %d)",
2040 ipv4->ttl, expected_mcast_ttl);
2041 }
2042 } else if (family == AF_INET6) {
2043 struct net_ipv6_hdr *ipv6 =
2044 (struct net_ipv6_hdr *)&data_to_receive[0];
2045
2046 if (expected_ttl > 0) {
2047 zassert_equal(ipv6->hop_limit, expected_ttl,
2048 "Invalid hop limit (%d vs %d)",
2049 ipv6->hop_limit, expected_ttl);
2050 } else if (expected_mcast_ttl > 0) {
2051 zassert_equal(ipv6->hop_limit, expected_mcast_ttl,
2052 "Invalid mcast hop limit (%d vs %d)",
2053 ipv6->hop_limit, expected_mcast_ttl);
2054 }
2055 } else {
2056 zassert_true(false, "Invalid address family (%d)",
2057 family);
2058 }
2059
2060 break;
2061 }
2062
2063 count--;
2064 }
2065
2066 zassert_true(count > 0, "timeout while waiting data");
2067
2068 if (family == AF_INET) {
2069 /* Set TTL to 0 and make sure the packet is dropped and not
2070 * received
2071 */
2072 int option;
2073
2074 if (expected_ttl > 0) {
2075 option = IP_TTL;
2076 } else {
2077 option = IP_MULTICAST_TTL;
2078 }
2079
2080 opt = 0;
2081 ret = zsock_setsockopt(sock_c, IPPROTO_IP, option, &opt, sizeof(opt));
2082 zassert_equal(ret, 0, "Cannot set %s TTL (%d)",
2083 option == IP_TTL ? "unicast" : "multicast",
2084 -errno);
2085
2086 #if defined(CONFIG_NET_STATISTICS)
2087 /* Get IPv4 stats and verify they are updated for dropped
2088 * packets.
2089 */
2090 net_mgmt(NET_REQUEST_STATS_GET_IPV4, lo0,
2091 &ipv4_stats_before, sizeof(ipv4_stats_before));
2092 #endif
2093 ret = zsock_sendto(sock_c, &tx_buf, sizeof(tx_buf), 0,
2094 addr_sendto, addrlen_sendto);
2095 zassert_equal(ret, sizeof(tx_buf), "send failed (%d)", -errno);
2096
2097 #if defined(CONFIG_NET_STATISTICS)
2098 net_mgmt(NET_REQUEST_STATS_GET_IPV4, lo0,
2099 &ipv4_stats_after, sizeof(ipv4_stats_after));
2100
2101 zassert_equal(ipv4_stats_before.drop + 1,
2102 ipv4_stats_after.drop,
2103 "Dropped statistics not updated (%d vs %d)",
2104 ipv4_stats_before.drop + 1,
2105 ipv4_stats_after.drop);
2106 #endif
2107 ret = zsock_recv(sock_s, &rx_buf, sizeof(rx_buf), 0);
2108 zassert_true(ret < 0 && errno == EAGAIN, "recv succeed (%d)", -errno);
2109 }
2110
2111 if (family == AF_INET6) {
2112 /* Set hoplimit to 0 and make sure the packet is dropped and not
2113 * received.
2114 */
2115 int option;
2116
2117 if (expected_ttl > 0) {
2118 option = IPV6_UNICAST_HOPS;
2119 } else {
2120 option = IPV6_MULTICAST_HOPS;
2121 }
2122
2123 opt = 0;
2124 ret = zsock_setsockopt(sock_c, IPPROTO_IPV6, option,
2125 &opt, sizeof(opt));
2126 zassert_equal(ret, 0, "Cannot set %s hops (%d)",
2127 option == IPV6_UNICAST_HOPS ? "unicast" : "multicast",
2128 -errno);
2129
2130 #if defined(CONFIG_NET_STATISTICS)
2131 /* Get IPv6 stats and verify they are updated for dropped
2132 * packets.
2133 */
2134 net_mgmt(NET_REQUEST_STATS_GET_IPV6, lo0,
2135 &ipv6_stats_before, sizeof(ipv6_stats_before));
2136 #endif
2137 ret = zsock_sendto(sock_c, &tx_buf, sizeof(tx_buf), 0,
2138 addr_sendto, addrlen_sendto);
2139 zassert_equal(ret, sizeof(tx_buf), "send failed (%d)", -errno);
2140
2141 #if defined(CONFIG_NET_STATISTICS)
2142 net_mgmt(NET_REQUEST_STATS_GET_IPV6, lo0,
2143 &ipv6_stats_after, sizeof(ipv6_stats_after));
2144
2145 zassert_equal(ipv6_stats_before.drop + 1,
2146 ipv6_stats_after.drop,
2147 "Dropped statistics not updated (%d vs %d)",
2148 ipv6_stats_before.drop + 1,
2149 ipv6_stats_after.drop);
2150 #endif
2151 ret = zsock_recv(sock_s, &rx_buf, sizeof(rx_buf), 0);
2152 zassert_true(ret < 0 && errno == EAGAIN, "recv succeed (%d)", -errno);
2153
2154 }
2155
2156 ret = zsock_close(sock_c);
2157 zassert_equal(ret, 0, "close failed");
2158 ret = zsock_close(sock_s);
2159 zassert_equal(ret, 0, "close failed");
2160 ret = zsock_close(sock_p);
2161 zassert_equal(ret, 0, "close failed");
2162 }
2163
ZTEST(net_socket_udp,test_31_v4_ttl)2164 ZTEST(net_socket_udp, test_31_v4_ttl)
2165 {
2166 int ret;
2167 int client_sock;
2168 int server_sock;
2169 int packet_sock;
2170 int ttl, verify;
2171 socklen_t optlen;
2172 struct sockaddr_in client_addr;
2173 struct sockaddr_in server_addr;
2174
2175 Z_TEST_SKIP_IFNDEF(CONFIG_NET_SOCKETS_PACKET);
2176
2177 prepare_sock_udp_v4(MY_IPV4_ADDR, CLIENT_PORT, &client_sock, &client_addr);
2178 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
2179
2180 packet_sock = zsock_socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
2181 zassert_true(packet_sock >= 0, "Cannot create packet socket (%d)", -errno);
2182
2183 ret = bind_socket(packet_sock, lo0);
2184 zassert_equal(ret, 0, "packet socket bind failed");
2185
2186 zassert_not_null(lo0->config.ip.ipv4,
2187 "Interface %d (%p) no IPv4 configured",
2188 net_if_get_by_iface(lo0), lo0);
2189
2190 ttl = 16;
2191 net_if_ipv4_set_ttl(lo0, ttl);
2192 verify = net_if_ipv4_get_ttl(lo0);
2193 zassert_equal(verify, ttl, "Different TTLs (%d vs %d)", ttl, verify);
2194
2195 ttl = 128;
2196 ret = zsock_setsockopt(client_sock, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
2197 zassert_equal(ret, 0, "Cannot set unicast TTL (%d)", -errno);
2198
2199 optlen = sizeof(verify);
2200 ret = zsock_getsockopt(client_sock, IPPROTO_IP, IP_TTL, &verify, &optlen);
2201 zassert_equal(ret, 0, "Cannot get unicast TTL (%d)", -errno);
2202 zassert_equal(verify, ttl, "Different unicast TTL (%d vs %d)",
2203 ttl, verify);
2204
2205 test_check_ttl(client_sock, server_sock, packet_sock,
2206 (struct sockaddr *)&client_addr, sizeof(client_addr),
2207 (struct sockaddr *)&server_addr, sizeof(server_addr),
2208 (struct sockaddr *)&server_addr, sizeof(server_addr),
2209 AF_INET, ttl, 0);
2210 }
2211
ZTEST(net_socket_udp,test_32_v4_mcast_ttl)2212 ZTEST(net_socket_udp, test_32_v4_mcast_ttl)
2213 {
2214 int ret;
2215 int client_sock;
2216 int server_sock;
2217 int packet_sock;
2218 int mcast_ttl, verify;
2219 socklen_t optlen;
2220 struct sockaddr_in client_addr;
2221 struct sockaddr_in server_addr;
2222 struct sockaddr_in sendto_addr;
2223
2224 Z_TEST_SKIP_IFNDEF(CONFIG_NET_SOCKETS_PACKET);
2225
2226 prepare_sock_udp_v4(MY_IPV4_ADDR, CLIENT_PORT, &client_sock, &client_addr);
2227 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
2228
2229 packet_sock = zsock_socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
2230 zassert_true(packet_sock >= 0, "Cannot create packet socket (%d)", -errno);
2231
2232 ret = bind_socket(packet_sock, lo0);
2233 zassert_equal(ret, 0, "packet socket bind failed");
2234
2235 zassert_not_null(lo0->config.ip.ipv4,
2236 "Interface %d (%p) no IPv4 configured",
2237 net_if_get_by_iface(lo0), lo0);
2238
2239 mcast_ttl = 8;
2240 ret = zsock_setsockopt(client_sock, IPPROTO_IP, IP_MULTICAST_TTL, &mcast_ttl,
2241 sizeof(mcast_ttl));
2242 zassert_equal(ret, 0, "Cannot set multicast ttl (%d)", -errno);
2243
2244 optlen = sizeof(verify);
2245 ret = zsock_getsockopt(client_sock, IPPROTO_IP, IP_MULTICAST_TTL, &verify,
2246 &optlen);
2247 zassert_equal(ret, 0, "Cannot get multicast ttl (%d)", -errno);
2248 zassert_equal(verify, mcast_ttl, "Different multicast TTLs (%d vs %d)",
2249 mcast_ttl, verify);
2250
2251 ret = net_addr_pton(AF_INET, MY_MCAST_IPV4_ADDR, &sendto_addr.sin_addr);
2252 zassert_equal(ret, 0, "Cannot get IPv4 address (%d)", ret);
2253
2254 test_check_ttl(client_sock, server_sock, packet_sock,
2255 (struct sockaddr *)&client_addr, sizeof(client_addr),
2256 (struct sockaddr *)&server_addr, sizeof(server_addr),
2257 (struct sockaddr *)&sendto_addr, sizeof(sendto_addr),
2258 AF_INET, 0, mcast_ttl);
2259 }
2260
ZTEST(net_socket_udp,test_33_v6_mcast_hops)2261 ZTEST(net_socket_udp, test_33_v6_mcast_hops)
2262 {
2263 int ret;
2264 int client_sock;
2265 int server_sock;
2266 int packet_sock;
2267 int mcast_hops, if_mcast_hops;
2268 int verify, opt;
2269 socklen_t optlen;
2270 struct sockaddr_in6 client_addr;
2271 struct sockaddr_in6 server_addr;
2272 struct sockaddr_in6 sendto_addr;
2273
2274 Z_TEST_SKIP_IFNDEF(CONFIG_NET_SOCKETS_PACKET);
2275
2276 prepare_sock_udp_v6(MY_IPV6_ADDR, CLIENT_PORT, &client_sock, &client_addr);
2277 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
2278
2279 packet_sock = zsock_socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
2280 zassert_true(packet_sock >= 0, "Cannot create packet socket (%d)", -errno);
2281
2282 ret = bind_socket(packet_sock, lo0);
2283 zassert_equal(ret, 0, "packet socket bind failed");
2284
2285 zassert_not_null(lo0->config.ip.ipv6,
2286 "Interface %d (%p) no IPv6 configured",
2287 net_if_get_by_iface(lo0), lo0);
2288
2289 /* First make sure setting hop limit to -1 works as expected (route default
2290 * value should be used).
2291 */
2292 if_mcast_hops = net_if_ipv6_get_mcast_hop_limit(lo0);
2293
2294 opt = -1;
2295 ret = zsock_setsockopt(client_sock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &opt,
2296 sizeof(opt));
2297 zassert_equal(ret, 0, "Cannot set multicast hop limit (%d)", -errno);
2298
2299 optlen = sizeof(verify);
2300 ret = zsock_getsockopt(client_sock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &verify,
2301 &optlen);
2302 zassert_equal(ret, 0, "Cannot get multicast hop limit (%d)", -errno);
2303 zassert_equal(verify, if_mcast_hops, "Different multicast hop limit (%d vs %d)",
2304 if_mcast_hops, verify);
2305
2306 /* Then test the normal case where we set the value */
2307 mcast_hops = 8;
2308 ret = zsock_setsockopt(client_sock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &mcast_hops,
2309 sizeof(mcast_hops));
2310 zassert_equal(ret, 0, "Cannot set multicast hop limit (%d)", -errno);
2311
2312 optlen = sizeof(verify);
2313 ret = zsock_getsockopt(client_sock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &verify,
2314 &optlen);
2315 zassert_equal(ret, 0, "Cannot get multicast hop limit (%d)", -errno);
2316 zassert_equal(verify, mcast_hops, "Different multicast hop limit (%d vs %d)",
2317 mcast_hops, verify);
2318
2319 ret = net_addr_pton(AF_INET6, MY_MCAST_IPV6_ADDR, &sendto_addr.sin6_addr);
2320 zassert_equal(ret, 0, "Cannot get IPv6 address (%d)", ret);
2321
2322 test_check_ttl(client_sock, server_sock, packet_sock,
2323 (struct sockaddr *)&client_addr, sizeof(client_addr),
2324 (struct sockaddr *)&server_addr, sizeof(server_addr),
2325 (struct sockaddr *)&sendto_addr, sizeof(sendto_addr),
2326 AF_INET6, 0, mcast_hops);
2327 }
2328
ZTEST(net_socket_udp,test_34_v6_hops)2329 ZTEST(net_socket_udp, test_34_v6_hops)
2330 {
2331 int ret;
2332 int client_sock;
2333 int server_sock;
2334 int packet_sock;
2335 int hops, verify;
2336 socklen_t optlen;
2337 struct sockaddr_in6 client_addr;
2338 struct sockaddr_in6 server_addr;
2339
2340 Z_TEST_SKIP_IFNDEF(CONFIG_NET_SOCKETS_PACKET);
2341
2342 prepare_sock_udp_v6(MY_IPV6_ADDR, CLIENT_PORT, &client_sock, &client_addr);
2343 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
2344
2345 packet_sock = zsock_socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
2346 zassert_true(packet_sock >= 0, "Cannot create packet socket (%d)", -errno);
2347
2348 ret = bind_socket(packet_sock, lo0);
2349 zassert_equal(ret, 0, "packet socket bind failed");
2350
2351 zassert_not_null(lo0->config.ip.ipv6,
2352 "Interface %d (%p) no IPv6 configured",
2353 net_if_get_by_iface(lo0), lo0);
2354
2355 hops = 16;
2356 net_if_ipv6_set_hop_limit(lo0, hops);
2357 verify = net_if_ipv6_get_hop_limit(lo0);
2358 zassert_equal(verify, hops, "Different hop limit (%d vs %d)", hops, verify);
2359
2360 hops = 8;
2361 ret = zsock_setsockopt(client_sock, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &hops,
2362 sizeof(hops));
2363 zassert_equal(ret, 0, "Cannot set unicast hops (%d)", -errno);
2364
2365 optlen = sizeof(verify);
2366 ret = zsock_getsockopt(client_sock, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &verify,
2367 &optlen);
2368 zassert_equal(ret, 0, "Cannot get unicast hops (%d)", -errno);
2369 zassert_equal(verify, hops, "Different unicast hops (%d vs %d)",
2370 hops, verify);
2371
2372 test_check_ttl(client_sock, server_sock, packet_sock,
2373 (struct sockaddr *)&client_addr, sizeof(client_addr),
2374 (struct sockaddr *)&server_addr, sizeof(server_addr),
2375 (struct sockaddr *)&server_addr, sizeof(server_addr),
2376 AF_INET6, hops, 0);
2377 }
2378
ZTEST_USER(net_socket_udp,test_35_recvmsg_msg_controllen_update)2379 ZTEST_USER(net_socket_udp, test_35_recvmsg_msg_controllen_update)
2380 {
2381 int rv;
2382 int client_sock;
2383 int server_sock;
2384 struct sockaddr_in client_addr;
2385 struct sockaddr_in server_addr;
2386 struct msghdr msg, server_msg;
2387 struct iovec io_vector[1];
2388 union {
2389 struct cmsghdr hdr;
2390 unsigned char buf[CMSG_SPACE(sizeof(struct in6_pktinfo))];
2391 } cmsgbuf;
2392
2393 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
2394 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
2395
2396 rv = zsock_bind(server_sock,
2397 (struct sockaddr *)&server_addr,
2398 sizeof(server_addr));
2399 zassert_equal(rv, 0, "server bind failed");
2400
2401 rv = zsock_bind(client_sock,
2402 (struct sockaddr *)&client_addr,
2403 sizeof(client_addr));
2404 zassert_equal(rv, 0, "client bind failed");
2405
2406 memset(&cmsgbuf, 0, sizeof(cmsgbuf));
2407
2408 io_vector[0].iov_base = TEST_STR_SMALL;
2409 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
2410
2411 memset(&msg, 0, sizeof(msg));
2412 msg.msg_iov = io_vector;
2413 msg.msg_iovlen = 1;
2414 msg.msg_name = &server_addr;
2415 msg.msg_namelen = sizeof(server_addr);
2416
2417 comm_sendmsg_recvmsg(client_sock,
2418 (struct sockaddr *)&client_addr,
2419 sizeof(client_addr),
2420 &msg,
2421 server_sock,
2422 (struct sockaddr *)&server_addr,
2423 sizeof(server_addr),
2424 &server_msg,
2425 &cmsgbuf.buf,
2426 sizeof(cmsgbuf.buf),
2427 false);
2428
2429 rv = zsock_close(client_sock);
2430 zassert_equal(rv, 0, "close failed");
2431 rv = zsock_close(server_sock);
2432 zassert_equal(rv, 0, "close failed");
2433 }
2434
ZTEST(net_socket_udp,test_36_v6_address_removal)2435 ZTEST(net_socket_udp, test_36_v6_address_removal)
2436 {
2437 int ret;
2438 bool status;
2439 int client_sock;
2440 struct sockaddr_in6 client_addr;
2441 struct net_if_addr *ifaddr;
2442 struct net_if *iface;
2443
2444 if (!IS_ENABLED(CONFIG_NET_IPV6_PE)) {
2445 return;
2446 }
2447
2448 ifaddr = net_if_ipv6_addr_lookup(&my_addr1, &iface);
2449 zassert_equal(ifaddr->atomic_ref, 1, "Ref count is wrong (%ld vs %ld)",
2450 ifaddr->atomic_ref, 1);
2451
2452 prepare_sock_udp_v6(MY_IPV6_ADDR_ETH, CLIENT_PORT, &client_sock, &client_addr);
2453
2454 ret = zsock_bind(client_sock,
2455 (struct sockaddr *)&client_addr,
2456 sizeof(client_addr));
2457 zassert_equal(ret, 0, "client bind failed");
2458
2459 status = net_if_ipv6_addr_rm(eth_iface, &my_addr1);
2460 zassert_false(status, "Address could be removed");
2461
2462 ifaddr = net_if_ipv6_addr_lookup(&my_addr1, &iface);
2463 zassert_not_null(ifaddr, "Address %s not found",
2464 net_sprint_ipv6_addr(&my_addr1));
2465
2466 ret = zsock_close(client_sock);
2467 zassert_equal(ret, 0, "close failed");
2468
2469 ifaddr = net_if_ipv6_addr_lookup(&my_addr1, &iface);
2470 zassert_equal(iface, eth_iface, "Invalid interface %p vs %p",
2471 iface, eth_iface);
2472 zassert_is_null(ifaddr, "Address %s found",
2473 net_sprint_ipv6_addr(&my_addr1));
2474 }
2475
check_ipv6_address_preferences(struct net_if * iface,uint16_t preference,const struct in6_addr * addr,const struct in6_addr * dest)2476 static void check_ipv6_address_preferences(struct net_if *iface,
2477 uint16_t preference,
2478 const struct in6_addr *addr,
2479 const struct in6_addr *dest)
2480 {
2481 const struct in6_addr *selected;
2482 size_t optlen;
2483 int optval;
2484 int sock;
2485 int ret;
2486
2487 sock = zsock_socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
2488 zassert_true(sock >= 0, "Cannot create socket (%d)", -errno);
2489
2490 optval = preference;
2491 ret = zsock_setsockopt(sock, IPPROTO_IPV6, IPV6_ADDR_PREFERENCES,
2492 &optval, sizeof(optval));
2493 zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2494
2495 optval = 0; optlen = 0U;
2496 ret = zsock_getsockopt(sock, IPPROTO_IPV6, IPV6_ADDR_PREFERENCES,
2497 &optval, &optlen);
2498 zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2499 zassert_equal(optlen, sizeof(optval), "invalid optlen %d vs %d",
2500 optlen, sizeof(optval));
2501 zassert_equal(optval, preference,
2502 "getsockopt address preferences");
2503
2504 selected = net_if_ipv6_select_src_addr_hint(iface,
2505 dest,
2506 preference);
2507 ret = net_ipv6_addr_cmp(addr, selected);
2508 zassert_true(ret, "Wrong address %s selected, expected %s",
2509 net_sprint_ipv6_addr(selected),
2510 net_sprint_ipv6_addr(addr));
2511
2512 ret = zsock_close(sock);
2513 zassert_equal(sock, 0, "Cannot close socket (%d)", -errno);
2514 }
2515
ZTEST(net_socket_udp,test_37_ipv6_src_addr_select)2516 ZTEST(net_socket_udp, test_37_ipv6_src_addr_select)
2517 {
2518 struct net_if_addr *ifaddr;
2519 const struct in6_addr dest = { { { 0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0,
2520 0, 0, 0, 0, 0, 0, 0, 0x2 } } };
2521
2522 net_if_foreach(iface_cb, ð_iface);
2523 zassert_not_null(eth_iface, "No ethernet interface found");
2524
2525 ifaddr = net_if_ipv6_addr_add(eth_iface, &my_addr1,
2526 NET_ADDR_AUTOCONF, 0);
2527 if (!ifaddr) {
2528 DBG("Cannot add IPv6 address %s\n",
2529 net_sprint_ipv6_addr(&my_addr1));
2530 zassert_not_null(ifaddr, "addr1");
2531 }
2532
2533 ifaddr->is_temporary = false;
2534
2535 ifaddr = net_if_ipv6_addr_add(eth_iface, &my_addr3,
2536 NET_ADDR_AUTOCONF, 0);
2537 if (!ifaddr) {
2538 DBG("Cannot add IPv6 address %s\n",
2539 net_sprint_ipv6_addr(&my_addr3));
2540 zassert_not_null(ifaddr, "addr1");
2541 }
2542
2543 ifaddr->is_temporary = true;
2544
2545 net_if_up(eth_iface);
2546
2547 check_ipv6_address_preferences(NULL, IPV6_PREFER_SRC_PUBLIC,
2548 &my_addr1, &dest);
2549 check_ipv6_address_preferences(NULL, IPV6_PREFER_SRC_TMP,
2550 &my_addr3, &dest);
2551 }
2552
ZTEST(net_socket_udp,test_38_ipv6_multicast_ifindex)2553 ZTEST(net_socket_udp, test_38_ipv6_multicast_ifindex)
2554 {
2555 struct sockaddr_in6 saddr6 = {
2556 .sin6_family = AF_INET6,
2557 .sin6_port = htons(SERVER_PORT),
2558 .sin6_addr = my_mcast_addr1,
2559 };
2560 struct net_if_mcast_addr *ifmaddr;
2561 struct net_if_addr *ifaddr;
2562 int server_sock;
2563 size_t addrlen;
2564 size_t optlen;
2565 int ifindex;
2566 int optval;
2567 int sock;
2568 int ret;
2569 int err;
2570
2571 net_if_foreach(iface_cb, ð_iface);
2572 zassert_not_null(eth_iface, "No ethernet interface found");
2573
2574 ifmaddr = net_if_ipv6_maddr_add(eth_iface, &my_mcast_addr1);
2575 if (!ifmaddr) {
2576 DBG("Cannot add IPv6 multicast address %s\n",
2577 net_sprint_ipv6_addr(&my_mcast_addr1));
2578 zassert_not_null(ifmaddr, "mcast_addr1");
2579 }
2580
2581 ifaddr = net_if_ipv6_addr_add(eth_iface, &my_addr3,
2582 NET_ADDR_AUTOCONF, 0);
2583 if (!ifaddr) {
2584 DBG("Cannot add IPv6 address %s\n",
2585 net_sprint_ipv6_addr(&my_addr3));
2586 zassert_not_null(ifaddr, "addr1");
2587 }
2588
2589 net_if_up(eth_iface);
2590
2591 /* Check that we get the default interface */
2592 sock = zsock_socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
2593 zassert_true(sock >= 0, "Cannot create socket (%d)", -errno);
2594
2595 optval = 0; optlen = 0U;
2596 ret = zsock_getsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_IF,
2597 &optval, &optlen);
2598 zexpect_equal(ret, 0, "setsockopt failed (%d)", errno);
2599 zexpect_equal(optlen, sizeof(optval), "invalid optlen %d vs %d",
2600 optlen, sizeof(optval));
2601 ifindex = net_if_get_by_iface(net_if_get_default());
2602 zexpect_equal(optval, ifindex,
2603 "getsockopt multicast ifindex (expected %d got %d)",
2604 ifindex, optval);
2605
2606 ret = zsock_close(sock);
2607 zassert_equal(sock, 0, "Cannot close socket (%d)", -errno);
2608
2609 /* Check failure for IPv4 socket */
2610 sock = zsock_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
2611 zassert_true(sock >= 0, "Cannot create socket (%d)", -errno);
2612
2613 optval = 0; optlen = 0U;
2614 ret = zsock_getsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_IF,
2615 &optval, &optlen);
2616 err = -errno;
2617 zexpect_equal(ret, -1, "setsockopt failed (%d)", errno);
2618 zexpect_equal(err, -EAFNOSUPPORT, "setsockopt failed (%d)", errno);
2619 zexpect_equal(optlen, 0U, "setsockopt optlen (%d)", optlen);
2620
2621 ret = zsock_close(sock);
2622 zassert_equal(sock, 0, "Cannot close socket (%d)", -errno);
2623
2624 /* Check that we can set the interface */
2625 sock = zsock_socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
2626 zassert_true(sock >= 0, "Cannot create socket (%d)", -errno);
2627
2628 /* Clear any existing interface value by setting it to 0 */
2629 optval = 0; optlen = sizeof(int);
2630 ret = zsock_setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_IF,
2631 &optval, optlen);
2632 err = -errno;
2633 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2634 zexpect_equal(optlen, sizeof(optval), "invalid optlen %d vs %d",
2635 optlen, sizeof(optval));
2636
2637 /* Set the output multicast packet interface to the default interface */
2638 optval = net_if_get_by_iface(net_if_get_default()); optlen = sizeof(int);
2639 ret = zsock_setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_IF,
2640 &optval, optlen);
2641 zexpect_equal(ret, 0, "setsockopt failed (%d)", errno);
2642 zexpect_equal(optlen, sizeof(optval), "invalid optlen %d vs %d",
2643 optlen, sizeof(optval));
2644
2645 optval = 0; optlen = 0U;
2646 ret = zsock_getsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_IF,
2647 &optval, &optlen);
2648 err = -errno;
2649 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2650 zexpect_equal(optlen, sizeof(int), "setsockopt optlen (%d)", optlen);
2651 zexpect_equal(optval, net_if_get_by_iface(net_if_get_default()),
2652 "getsockopt multicast ifindex (expected %d got %d)",
2653 net_if_get_by_iface(net_if_get_default()), optval);
2654
2655 server_sock = prepare_listen_sock_udp_v6(&saddr6);
2656 zassert_not_equal(server_sock, -1, "Cannot create server socket (%d)", -errno);
2657
2658 test_started = true;
2659 loopback_enable_address_swap(false);
2660
2661 ret = zsock_sendto(sock, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1, 0,
2662 (struct sockaddr *)&saddr6, sizeof(saddr6));
2663 zexpect_equal(ret, STRLEN(TEST_STR_SMALL),
2664 "invalid send len (was %d expected %d) (%d)",
2665 ret, STRLEN(TEST_STR_SMALL), -errno);
2666
2667 /* Test that the sent data is received from default interface and
2668 * not the Ethernet one.
2669 */
2670 addrlen = sizeof(saddr6);
2671 ret = zsock_recvfrom(server_sock, rx_buf, sizeof(rx_buf),
2672 0, (struct sockaddr *)&saddr6, &addrlen);
2673 zexpect_true(ret >= 0, "recvfrom fail");
2674 zexpect_equal(ret, strlen(TEST_STR_SMALL),
2675 "unexpected received bytes");
2676 zexpect_mem_equal(rx_buf, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1,
2677 "wrong data");
2678
2679 ret = zsock_close(sock);
2680 zassert_equal(ret, 0, "Cannot close socket (%d)", -errno);
2681
2682 ret = zsock_close(server_sock);
2683 zassert_equal(ret, 0, "Cannot close socket (%d)", -errno);
2684
2685 test_started = false;
2686 loopback_enable_address_swap(true);
2687 }
2688
ZTEST(net_socket_udp,test_39_ipv4_multicast_ifindex)2689 ZTEST(net_socket_udp, test_39_ipv4_multicast_ifindex)
2690 {
2691 struct sockaddr_in saddr4 = {
2692 .sin_family = AF_INET,
2693 .sin_port = htons(SERVER_PORT),
2694 .sin_addr = my_mcast_addr2,
2695 };
2696 struct sockaddr_in dst_addr = {
2697 .sin_family = AF_INET,
2698 .sin_port = htons(SERVER_PORT),
2699 .sin_addr = my_mcast_addr2,
2700 };
2701 struct net_if_mcast_addr *ifmaddr;
2702 struct net_if_addr *ifaddr;
2703 struct in_addr addr = { 0 };
2704 struct ip_mreqn mreqn;
2705 struct ip_mreq mreq;
2706 struct net_if *iface;
2707 int server_sock;
2708 size_t addrlen;
2709 size_t optlen;
2710 int ifindex;
2711 int sock;
2712 int ret;
2713 int err;
2714
2715 net_if_foreach(iface_cb, ð_iface);
2716 zassert_not_null(eth_iface, "No ethernet interface found");
2717
2718 ifmaddr = net_if_ipv4_maddr_add(eth_iface, &my_mcast_addr2);
2719 if (!ifmaddr) {
2720 DBG("Cannot add IPv4 multicast address %s\n",
2721 net_sprint_ipv4_addr(&my_mcast_addr2));
2722 zassert_not_null(ifmaddr, "mcast_addr2");
2723 }
2724
2725 ifaddr = net_if_ipv4_addr_add(eth_iface, &my_addr2,
2726 NET_ADDR_MANUAL, 0);
2727 if (!ifaddr) {
2728 DBG("Cannot add IPv4 address %s\n",
2729 net_sprint_ipv4_addr(&my_addr2));
2730 zassert_not_null(ifaddr, "addr2");
2731 }
2732
2733 net_if_up(eth_iface);
2734
2735 /* Check that we get the default interface */
2736 sock = zsock_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
2737 zassert_true(sock >= 0, "Cannot create socket (%d)", -errno);
2738
2739 optlen = sizeof(addr);
2740 ret = zsock_getsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF,
2741 &addr, &optlen);
2742 zexpect_equal(ret, 0, "setsockopt failed (%d)", errno);
2743 zexpect_equal(optlen, sizeof(addr), "invalid optlen %d vs %d",
2744 optlen, sizeof(addr));
2745 ifindex = net_if_get_by_iface(net_if_get_default());
2746 ret = net_if_ipv4_addr_lookup_by_index(&addr);
2747 zexpect_equal(ret, ifindex,
2748 "getsockopt multicast ifindex (expected %d got %d)",
2749 ifindex, ret);
2750
2751 ret = zsock_close(sock);
2752 zassert_equal(sock, 0, "Cannot close socket (%d)", -errno);
2753
2754 /* Check failure for IPv6 socket */
2755 sock = zsock_socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
2756 zassert_true(sock >= 0, "Cannot create socket (%d)", -errno);
2757
2758 optlen = 0U;
2759 ret = zsock_getsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF,
2760 &addr, &optlen);
2761 err = -errno;
2762 zexpect_equal(ret, -1, "setsockopt failed (%d)", errno);
2763 zexpect_equal(err, -EAFNOSUPPORT, "setsockopt failed (%d)", errno);
2764 zexpect_equal(optlen, 0U, "setsockopt optlen (%d)", optlen);
2765
2766 ret = zsock_close(sock);
2767 zassert_equal(sock, 0, "Cannot close socket (%d)", -errno);
2768
2769 /* Check that we can set the interface */
2770 sock = zsock_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
2771 zassert_true(sock >= 0, "Cannot create socket (%d)", -errno);
2772
2773 /* Clear any existing interface value by setting it to 0 */
2774 optlen = sizeof(mreqn);
2775 mreqn.imr_ifindex = 0;
2776 mreqn.imr_address.s_addr = 0;
2777
2778 ret = zsock_setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF,
2779 &mreqn, optlen);
2780 err = -errno;
2781 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2782
2783 /* Verify that we get the empty value */
2784 optlen = sizeof(addr);
2785 ret = zsock_getsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF,
2786 &addr, &optlen);
2787 err = -errno;
2788 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2789 zexpect_equal(optlen, sizeof(addr), "setsockopt optlen (%d)", optlen);
2790
2791 /* Set the output multicast packet interface to the default interface */
2792 optlen = sizeof(mreqn);
2793 mreqn.imr_ifindex = net_if_get_by_iface(net_if_get_default());
2794 mreqn.imr_address.s_addr = 0;
2795
2796 ret = zsock_setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF,
2797 &mreqn, optlen);
2798 err = -errno;
2799 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2800
2801 /* Verify that we get the default interface */
2802 optlen = sizeof(addr);
2803 memset(&addr, 0, sizeof(addr));
2804 ret = zsock_getsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF,
2805 &addr, &optlen);
2806 err = -errno;
2807 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2808 zexpect_equal(optlen, sizeof(addr), "setsockopt optlen (%d)", optlen);
2809
2810 ifaddr = net_if_ipv4_addr_lookup(&addr, &iface);
2811 zexpect_not_null(ifaddr, "Address %s not found",
2812 net_sprint_ipv4_addr(&addr));
2813 zexpect_equal(net_if_get_by_iface(iface),
2814 net_if_get_by_iface(net_if_get_default()),
2815 "Invalid interface %d vs %d",
2816 net_if_get_by_iface(iface),
2817 net_if_get_by_iface(net_if_get_default()));
2818
2819 /* Now send a packet and verify that it is sent via the default
2820 * interface instead of the Ethernet interface.
2821 */
2822 server_sock = prepare_listen_sock_udp_v4(&saddr4);
2823 zassert_not_equal(server_sock, -1, "Cannot create server socket (%d)", -errno);
2824
2825 test_started = true;
2826 loopback_enable_address_swap(false);
2827
2828 ret = zsock_sendto(sock, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1, 0,
2829 (struct sockaddr *)&dst_addr, sizeof(dst_addr));
2830 zexpect_equal(ret, STRLEN(TEST_STR_SMALL),
2831 "invalid send len (was %d expected %d) (%d)",
2832 ret, STRLEN(TEST_STR_SMALL), -errno);
2833
2834 /* Test that the sent data is received from Ethernet interface. */
2835 addrlen = sizeof(saddr4);
2836 ret = zsock_recvfrom(server_sock, rx_buf, sizeof(rx_buf),
2837 0, (struct sockaddr *)&saddr4, &addrlen);
2838 zexpect_true(ret >= 0, "recvfrom fail");
2839 zexpect_equal(ret, strlen(TEST_STR_SMALL),
2840 "unexpected received bytes");
2841 zexpect_mem_equal(rx_buf, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1,
2842 "wrong data");
2843
2844 /* Clear the old interface value by setting it to 0 */
2845 optlen = sizeof(mreqn);
2846 mreqn.imr_ifindex = 0;
2847 mreqn.imr_address.s_addr = 0;
2848
2849 ret = zsock_setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF,
2850 &mreqn, optlen);
2851 err = -errno;
2852 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2853
2854 /* Then do it the other way around, set the address but leave the
2855 * interface number unassigned.
2856 */
2857 optlen = sizeof(mreqn);
2858 mreqn.imr_ifindex = 0;
2859
2860 /* Get the address of default interface and set it as a target
2861 * interface.
2862 */
2863 ifaddr = net_if_ipv4_addr_get_first_by_index(net_if_get_by_iface(net_if_get_default()));
2864 zexpect_not_null(ifaddr, "No address found for interface %d",
2865 net_if_get_by_iface(net_if_get_default()));
2866 mreqn.imr_address.s_addr = ifaddr->address.in_addr.s_addr;
2867
2868 ret = zsock_setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF,
2869 &mreqn, optlen);
2870 zexpect_equal(ret, 0, "setsockopt failed (%d)", errno);
2871
2872 /* Verify that we get the default interface address */
2873 optlen = sizeof(struct in_addr);
2874 ret = zsock_getsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF,
2875 &addr, &optlen);
2876 err = -errno;
2877 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2878 zexpect_equal(optlen, sizeof(struct in_addr), "setsockopt optlen (%d)", optlen);
2879 ret = net_if_ipv4_addr_lookup_by_index(&addr);
2880 zexpect_equal(ret, net_if_get_by_iface(net_if_get_default()),
2881 "getsockopt multicast ifindex (expected %d got %d)",
2882 net_if_get_by_iface(net_if_get_default()), ret);
2883 zexpect_equal(ifaddr->address.in_addr.s_addr,
2884 addr.s_addr,
2885 "getsockopt iface address mismatch (expected %s got %s)",
2886 net_sprint_ipv4_addr(&ifaddr->address.in_addr),
2887 net_sprint_ipv4_addr(&addr));
2888
2889 ret = zsock_sendto(sock, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1, 0,
2890 (struct sockaddr *)&dst_addr, sizeof(dst_addr));
2891 zexpect_equal(ret, STRLEN(TEST_STR_SMALL),
2892 "invalid send len (was %d expected %d) (%d)",
2893 ret, STRLEN(TEST_STR_SMALL), -errno);
2894
2895 /* Test that the sent data is received from default interface. */
2896 addrlen = sizeof(saddr4);
2897 ret = zsock_recvfrom(server_sock, rx_buf, sizeof(rx_buf),
2898 0, (struct sockaddr *)&saddr4, &addrlen);
2899 zexpect_true(ret >= 0, "recvfrom fail");
2900 zexpect_equal(ret, strlen(TEST_STR_SMALL),
2901 "unexpected received bytes");
2902 zexpect_mem_equal(rx_buf, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1,
2903 "wrong data");
2904
2905 /* Then use mreq structure to set the interface */
2906 optlen = sizeof(mreq);
2907 ifaddr = net_if_ipv4_addr_get_first_by_index(net_if_get_by_iface(net_if_get_default()));
2908 zexpect_not_null(ifaddr, "No address found for interface %d",
2909 net_if_get_by_iface(net_if_get_default()));
2910 mreq.imr_interface.s_addr = ifaddr->address.in_addr.s_addr;
2911
2912 ret = zsock_setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF,
2913 &mreq, optlen);
2914 zexpect_equal(ret, 0, "setsockopt failed (%d)", errno);
2915
2916 ret = zsock_sendto(sock, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1, 0,
2917 (struct sockaddr *)&dst_addr, sizeof(dst_addr));
2918 zexpect_equal(ret, STRLEN(TEST_STR_SMALL),
2919 "invalid send len (was %d expected %d) (%d)",
2920 ret, STRLEN(TEST_STR_SMALL), -errno);
2921
2922 /* Test that the sent data is received from default interface. */
2923 addrlen = sizeof(saddr4);
2924 ret = zsock_recvfrom(server_sock, rx_buf, sizeof(rx_buf),
2925 0, (struct sockaddr *)&saddr4, &addrlen);
2926 zexpect_true(ret >= 0, "recvfrom fail");
2927 zexpect_equal(ret, strlen(TEST_STR_SMALL),
2928 "unexpected received bytes");
2929 zexpect_mem_equal(rx_buf, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1,
2930 "wrong data");
2931
2932 ret = zsock_close(sock);
2933 zassert_equal(ret, 0, "Cannot close socket (%d)", -errno);
2934
2935 ret = zsock_close(server_sock);
2936 zassert_equal(ret, 0, "Cannot close socket (%d)", -errno);
2937
2938 test_started = false;
2939 loopback_enable_address_swap(true);
2940 }
2941
2942 #if defined(CONFIG_NET_CONTEXT_CLAMP_PORT_RANGE)
2943
2944 #define PORT_RANGE(lower, upper) \
2945 (uint32_t)(((uint16_t)(upper) << 16) | (uint16_t)(lower))
2946
check_port_range(struct sockaddr * my_addr,size_t my_addr_len,struct sockaddr * local_addr,size_t local_addr_len)2947 static void check_port_range(struct sockaddr *my_addr,
2948 size_t my_addr_len,
2949 struct sockaddr *local_addr,
2950 size_t local_addr_len)
2951 {
2952 sa_family_t family = AF_UNSPEC;
2953 uint32_t optval;
2954 size_t addr_len;
2955 size_t optlen;
2956 int sock;
2957 int ret, err;
2958
2959 addr_len = local_addr_len;
2960
2961 if (my_addr->sa_family == AF_INET) {
2962 family = AF_INET;
2963 } else if (my_addr->sa_family == AF_INET6) {
2964 family = AF_INET6;
2965 } else {
2966 zassert_true(false, "Invalid address family %d",
2967 my_addr->sa_family);
2968 }
2969
2970 sock = zsock_socket(family, SOCK_DGRAM, IPPROTO_UDP);
2971 zassert_true(sock >= 0, "Cannot create socket (%d)", -errno);
2972
2973 optval = PORT_RANGE(1024, 1500);
2974 ret = zsock_setsockopt(sock, IPPROTO_IP, IP_LOCAL_PORT_RANGE,
2975 &optval, sizeof(optval));
2976 err = -errno;
2977 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2978
2979 optval = 0; optlen = 0U;
2980 ret = zsock_setsockopt(sock, IPPROTO_IP, IP_LOCAL_PORT_RANGE,
2981 &optval, optlen);
2982 err = -errno;
2983 zexpect_equal(ret, -1, "setsockopt failed (%d)", err);
2984
2985 optval = 0; optlen = sizeof(uint64_t);
2986 ret = zsock_setsockopt(sock, IPPROTO_IP, IP_LOCAL_PORT_RANGE,
2987 &optval, optlen);
2988 err = -errno;
2989 zexpect_equal(ret, -1, "setsockopt failed (%d)", err);
2990
2991 optval = PORT_RANGE(0, 0);
2992 ret = zsock_setsockopt(sock, IPPROTO_IP, IP_LOCAL_PORT_RANGE,
2993 &optval, sizeof(optval));
2994 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2995
2996 /* Linux allows setting the invalid port range but that is not
2997 * then taken into use when we bind the socket.
2998 */
2999 optval = PORT_RANGE(1024, 0);
3000 ret = zsock_setsockopt(sock, IPPROTO_IP, IP_LOCAL_PORT_RANGE,
3001 &optval, sizeof(optval));
3002 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
3003
3004 optval = PORT_RANGE(0, 1024);
3005 ret = zsock_setsockopt(sock, IPPROTO_IP, IP_LOCAL_PORT_RANGE,
3006 &optval, sizeof(optval));
3007 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
3008
3009 /* Then set a valid range and verify that bound socket is using it */
3010 optval = PORT_RANGE(10000, 10010);
3011 ret = zsock_setsockopt(sock, IPPROTO_IP, IP_LOCAL_PORT_RANGE,
3012 &optval, sizeof(optval));
3013 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
3014
3015 optval = 0; optlen = sizeof(optval);
3016 ret = zsock_getsockopt(sock, IPPROTO_IP, IP_LOCAL_PORT_RANGE,
3017 &optval, &optlen);
3018 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
3019 zexpect_equal(optval, PORT_RANGE(10000, 10010), "Invalid port range");
3020
3021 ret = zsock_bind(sock, my_addr, my_addr_len);
3022 err = -errno;
3023 zexpect_equal(ret, 0, "bind failed (%d)", err);
3024
3025 ret = zsock_getsockname(sock, local_addr, &addr_len);
3026 err = -errno;
3027 zexpect_equal(ret, 0, "getsockname failed (%d)", err);
3028
3029 /* The port should be in the range */
3030 zexpect_true(ntohs(net_sin(local_addr)->sin_port) >= 10000 &&
3031 ntohs(net_sin(local_addr)->sin_port) <= 10010,
3032 "Invalid port %d", ntohs(net_sin(local_addr)->sin_port));
3033
3034 (void)zsock_close(sock);
3035
3036 /* Try setting invalid range and verify that we do not net a port from that
3037 * range.
3038 */
3039 sock = zsock_socket(family, SOCK_DGRAM, IPPROTO_UDP);
3040 zassert_true(sock >= 0, "Cannot create socket (%d)", -errno);
3041
3042 optval = PORT_RANGE(1001, 1000);
3043 ret = zsock_setsockopt(sock, IPPROTO_IP, IP_LOCAL_PORT_RANGE,
3044 &optval, sizeof(optval));
3045 err = -errno;
3046 zexpect_equal(ret, -1, "setsockopt failed (%d)", err);
3047 zexpect_equal(err, -EINVAL, "Invalid errno (%d)", -err);
3048
3049 /* Port range cannot be just one port */
3050 optval = PORT_RANGE(1001, 1001);
3051 ret = zsock_setsockopt(sock, IPPROTO_IP, IP_LOCAL_PORT_RANGE,
3052 &optval, sizeof(optval));
3053 err = -errno;
3054 zexpect_equal(ret, -1, "setsockopt failed (%d)", err);
3055 zexpect_equal(err, -EINVAL, "Invalid errno (%d)", -err);
3056
3057 optval = PORT_RANGE(0, 1000);
3058 ret = zsock_setsockopt(sock, IPPROTO_IP, IP_LOCAL_PORT_RANGE,
3059 &optval, sizeof(optval));
3060 err = -errno;
3061 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
3062
3063 ret = zsock_bind(sock, my_addr, my_addr_len);
3064 err = -errno;
3065 zexpect_equal(ret, 0, "bind failed (%d)", err);
3066
3067 addr_len = local_addr_len;
3068 ret = zsock_getsockname(sock, local_addr, &addr_len);
3069 err = -errno;
3070 zexpect_equal(ret, 0, "getsockname failed (%d)", err);
3071
3072 /* The port should not be in the range */
3073 zexpect_false(ntohs(net_sin(local_addr)->sin_port) >= 1000 &&
3074 ntohs(net_sin(local_addr)->sin_port) <= 1001,
3075 "Invalid port %d", ntohs(net_sin(local_addr)->sin_port));
3076
3077 (void)zsock_close(sock);
3078 }
3079 #endif
3080
ZTEST(net_socket_udp,test_40_clamp_udp_tcp_port_range)3081 ZTEST(net_socket_udp, test_40_clamp_udp_tcp_port_range)
3082 {
3083 #if defined(CONFIG_NET_CONTEXT_CLAMP_PORT_RANGE)
3084 struct sockaddr_in my_addr4 = {
3085 .sin_family = AF_INET,
3086 .sin_port = 0,
3087 .sin_addr = { { { 192, 0, 2, 2 } } },
3088 };
3089 struct sockaddr_in6 my_addr6 = {
3090 .sin6_family = AF_INET6,
3091 .sin6_port = 0,
3092 .sin6_addr = in6addr_loopback,
3093 };
3094 struct sockaddr_in local_addr4;
3095 struct sockaddr_in6 local_addr6;
3096
3097 /* First try with a IPv4 socket */
3098 check_port_range((struct sockaddr *)&my_addr4, sizeof(my_addr4),
3099 (struct sockaddr *)&local_addr4, sizeof(local_addr4));
3100
3101 /* Finally try with a IPv6 socket */
3102 check_port_range((struct sockaddr *)&my_addr6, sizeof(my_addr6),
3103 (struct sockaddr *)&local_addr6, sizeof(local_addr6));
3104 #else
3105 ztest_test_skip();
3106 #endif
3107 }
3108
after(void * arg)3109 static void after(void *arg)
3110 {
3111 ARG_UNUSED(arg);
3112
3113 for (int i = 0; i < CONFIG_ZVFS_OPEN_MAX; ++i) {
3114 (void)zsock_close(i);
3115 }
3116 }
3117
3118 ZTEST_SUITE(net_socket_udp, NULL, NULL, NULL, after, NULL);
3119