1 /*
2 * Copyright (c) 2017 Linaro Limited
3 * Copyright (c) 2021 Nordic Semiconductor
4 * Copyright 2025 NXP
5 *
6 * SPDX-License-Identifier: Apache-2.0
7 */
8
9 #include <zephyr/logging/log.h>
10 LOG_MODULE_REGISTER(net_test, CONFIG_NET_SOCKETS_LOG_LEVEL);
11
12 #include <stdio.h>
13 #include <zephyr/sys/sem.h>
14 #include <zephyr/ztest_assert.h>
15
16 #include <zephyr/net/socket.h>
17 #include <zephyr/net/ethernet.h>
18 #include <zephyr/net/net_mgmt.h>
19 #include <zephyr/net/net_event.h>
20
21 #include "ipv6.h"
22 #include "net_private.h"
23 #include "../../socket_helpers.h"
24
25 #if defined(CONFIG_NET_SOCKETS_LOG_LEVEL_DBG)
26 #define DBG(fmt, ...) printk(fmt, ##__VA_ARGS__)
27 #else
28 #define DBG(fmt, ...)
29 #endif
30
31 #define BUF_AND_SIZE(buf) buf, sizeof(buf) - 1
32 #define STRLEN(buf) (sizeof(buf) - 1)
33
34 #define TEST_STR_SMALL "test"
35 /* More than 256 bytes, to use >1 net_buf. */
36 #define TEST_STR2 \
37 "The Zephyr Project, a Linux Foundation hosted Collaboration " \
38 "Project, is an open source collaborative effort uniting leaders " \
39 "from across the industry to build a best-in-breed small, scalable, " \
40 "real-time operating system (RTOS) optimized for resource-" \
41 "constrained devices, across multiple architectures."
42 /* More than available TX buffers */
43 static const char test_str_all_tx_bufs[] =
44 #include <string_all_tx_bufs.inc>
45 "!"
46 ;
47
48 #define MY_IPV4_ADDR "127.0.0.1"
49 #define MY_IPV4_MAPPED_ADDR "::ffff:127.0.0.1"
50 #define MY_IPV6_ADDR "::1"
51 #define MY_MCAST_IPV4_ADDR "224.0.0.1"
52 #define MY_MCAST_IPV6_ADDR "ff01::1"
53 #define ANY_IPV6_ADDR "::"
54
55 #define ANY_PORT 0
56 #define SERVER_PORT 4242
57 #define CLIENT_PORT 9898
58
59 static ZTEST_BMEM char rx_buf[NET_ETH_MTU + 1];
60
61 /* Common routine to communicate packets over pair of sockets. */
comm_sendto_recvfrom(int client_sock,struct net_sockaddr * client_addr,net_socklen_t client_addrlen,int server_sock,struct net_sockaddr * server_addr,net_socklen_t server_addrlen)62 static void comm_sendto_recvfrom(int client_sock,
63 struct net_sockaddr *client_addr,
64 net_socklen_t client_addrlen,
65 int server_sock,
66 struct net_sockaddr *server_addr,
67 net_socklen_t server_addrlen)
68 {
69 int avail;
70 ssize_t sent = 0;
71 ssize_t recved = 0;
72 struct net_sockaddr addr;
73 net_socklen_t addrlen;
74 struct net_sockaddr addr2;
75 net_socklen_t addrlen2;
76
77 zassert_not_null(client_addr, "null client addr");
78 zassert_not_null(server_addr, "null server addr");
79
80 /*
81 * Test client -> server sending
82 */
83
84 sent = zsock_sendto(client_sock, TEST_STR_SMALL, strlen(TEST_STR_SMALL),
85 0, server_addr, server_addrlen);
86 zassert_equal(sent, strlen(TEST_STR_SMALL), "sendto failed");
87
88 k_msleep(100);
89
90 avail = 42;
91 zassert_ok(zsock_ioctl(server_sock, ZFD_IOCTL_FIONREAD, &avail));
92 zassert_equal(avail, strlen(TEST_STR_SMALL));
93
94 /* Test recvfrom(MSG_PEEK) */
95 addrlen = sizeof(addr);
96 clear_buf(rx_buf);
97 recved = zsock_recvfrom(server_sock, rx_buf, sizeof(rx_buf),
98 ZSOCK_MSG_PEEK, &addr, &addrlen);
99 zassert_true(recved >= 0, "recvfrom fail");
100 zassert_equal(recved, strlen(TEST_STR_SMALL),
101 "unexpected received bytes");
102 zassert_mem_equal(rx_buf, BUF_AND_SIZE(TEST_STR_SMALL), "wrong data");
103 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
104
105 /* Test normal recvfrom() */
106 addrlen = sizeof(addr);
107 clear_buf(rx_buf);
108 recved = zsock_recvfrom(server_sock, rx_buf, sizeof(rx_buf),
109 0, &addr, &addrlen);
110 zassert_true(recved >= 0, "recvfrom fail");
111 zassert_equal(recved, strlen(TEST_STR_SMALL),
112 "unexpected received bytes");
113 zassert_mem_equal(rx_buf, BUF_AND_SIZE(TEST_STR_SMALL), "wrong data");
114 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
115
116 /* Check the client port */
117 if (net_sin(client_addr)->sin_port != ANY_PORT) {
118 zassert_equal(net_sin(client_addr)->sin_port,
119 net_sin(&addr)->sin_port,
120 "unexpected client port");
121 }
122
123 /*
124 * Test server -> client sending
125 */
126
127 sent = zsock_sendto(server_sock, TEST_STR2, sizeof(TEST_STR2) - 1,
128 0, &addr, addrlen);
129 zassert_equal(sent, STRLEN(TEST_STR2), "sendto failed");
130
131 /* Test normal recvfrom() */
132 addrlen2 = sizeof(addr);
133 clear_buf(rx_buf);
134 recved = zsock_recvfrom(client_sock, rx_buf, sizeof(rx_buf),
135 0, &addr2, &addrlen2);
136 zassert_true(recved >= 0, "recvfrom fail");
137 zassert_equal(recved, STRLEN(TEST_STR2),
138 "unexpected received bytes");
139 zassert_mem_equal(rx_buf, BUF_AND_SIZE(TEST_STR2), "wrong data");
140 zassert_equal(addrlen2, server_addrlen, "unexpected addrlen");
141
142 /* Check the server port */
143 zassert_equal(net_sin(server_addr)->sin_port,
144 net_sin(&addr2)->sin_port,
145 "unexpected server port");
146
147 /* Test that unleft leftover data from datagram is discarded. */
148
149 /* Send 2 datagrams */
150 sent = zsock_sendto(server_sock, TEST_STR2, sizeof(TEST_STR2) - 1,
151 0, &addr, addrlen);
152 zassert_equal(sent, STRLEN(TEST_STR2), "sendto failed");
153 sent = zsock_sendto(server_sock, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1,
154 0, &addr, addrlen);
155 zassert_equal(sent, STRLEN(TEST_STR_SMALL), "sendto failed");
156
157 /* Receive just beginning of 1st datagram */
158 addrlen2 = sizeof(addr);
159 clear_buf(rx_buf);
160 recved = zsock_recvfrom(client_sock, rx_buf, 16, 0, &addr2, &addrlen2);
161 zassert_true(recved == 16, "recvfrom fail");
162 zassert_mem_equal(rx_buf, TEST_STR2, 16, "wrong data");
163
164 /* Make sure that now we receive 2nd datagram */
165 addrlen2 = sizeof(addr);
166 clear_buf(rx_buf);
167 recved = zsock_recvfrom(client_sock, rx_buf, 16, 0, &addr2, &addrlen2);
168 zassert_true(recved == STRLEN(TEST_STR_SMALL), "recvfrom fail");
169 zassert_mem_equal(rx_buf, BUF_AND_SIZE(TEST_STR_SMALL), "wrong data");
170 }
171
ZTEST(net_socket_udp,test_v4_sendto_recvfrom)172 ZTEST(net_socket_udp, test_v4_sendto_recvfrom)
173 {
174 int rv;
175 int client_sock;
176 int server_sock;
177 struct net_sockaddr_in client_addr;
178 struct net_sockaddr_in server_addr;
179
180 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
181 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
182
183 rv = zsock_bind(server_sock,
184 (struct net_sockaddr *)&server_addr,
185 sizeof(server_addr));
186 zassert_equal(rv, 0, "bind failed");
187
188 comm_sendto_recvfrom(client_sock,
189 (struct net_sockaddr *)&client_addr,
190 sizeof(client_addr),
191 server_sock,
192 (struct net_sockaddr *)&server_addr,
193 sizeof(server_addr));
194
195 rv = zsock_close(client_sock);
196 zassert_equal(rv, 0, "close failed");
197 rv = zsock_close(server_sock);
198 zassert_equal(rv, 0, "close failed");
199 }
200
ZTEST(net_socket_udp,test_v6_sendto_recvfrom)201 ZTEST(net_socket_udp, test_v6_sendto_recvfrom)
202 {
203 int rv;
204 int client_sock;
205 int server_sock;
206 struct net_sockaddr_in6 client_addr;
207 struct net_sockaddr_in6 server_addr;
208
209 prepare_sock_udp_v6(MY_IPV6_ADDR, ANY_PORT, &client_sock, &client_addr);
210 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
211
212 rv = zsock_bind(server_sock,
213 (struct net_sockaddr *)&server_addr, sizeof(server_addr));
214 zassert_equal(rv, 0, "bind failed");
215
216 comm_sendto_recvfrom(client_sock,
217 (struct net_sockaddr *)&client_addr,
218 sizeof(client_addr),
219 server_sock,
220 (struct net_sockaddr *)&server_addr,
221 sizeof(server_addr));
222
223 rv = zsock_close(client_sock);
224 zassert_equal(rv, 0, "close failed");
225 rv = zsock_close(server_sock);
226 zassert_equal(rv, 0, "close failed");
227 }
228
ZTEST(net_socket_udp,test_v4_bind_sendto)229 ZTEST(net_socket_udp, test_v4_bind_sendto)
230 {
231 int rv;
232 int client_sock;
233 int server_sock;
234 struct net_sockaddr_in client_addr;
235 struct net_sockaddr_in server_addr;
236
237 prepare_sock_udp_v4(MY_IPV4_ADDR, CLIENT_PORT, &client_sock, &client_addr);
238 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
239
240 rv = zsock_bind(client_sock,
241 (struct net_sockaddr *)&client_addr, sizeof(client_addr));
242 zassert_equal(rv, 0, "bind failed");
243
244 rv = zsock_bind(server_sock,
245 (struct net_sockaddr *)&server_addr, sizeof(server_addr));
246 zassert_equal(rv, 0, "bind failed");
247
248 comm_sendto_recvfrom(client_sock,
249 (struct net_sockaddr *)&client_addr,
250 sizeof(client_addr),
251 server_sock,
252 (struct net_sockaddr *)&server_addr,
253 sizeof(server_addr));
254
255 rv = zsock_close(client_sock);
256 zassert_equal(rv, 0, "close failed");
257 rv = zsock_close(server_sock);
258 zassert_equal(rv, 0, "close failed");
259 }
260
ZTEST(net_socket_udp,test_v6_bind_sendto)261 ZTEST(net_socket_udp, test_v6_bind_sendto)
262 {
263 int rv;
264 int client_sock;
265 int server_sock;
266 struct net_sockaddr_in6 client_addr;
267 struct net_sockaddr_in6 server_addr;
268
269 prepare_sock_udp_v6(MY_IPV6_ADDR, CLIENT_PORT, &client_sock, &client_addr);
270 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
271
272 rv = zsock_bind(client_sock,
273 (struct net_sockaddr *)&client_addr, sizeof(client_addr));
274 zassert_equal(rv, 0, "bind failed");
275
276 rv = zsock_bind(server_sock,
277 (struct net_sockaddr *)&server_addr, sizeof(server_addr));
278 zassert_equal(rv, 0, "bind failed");
279
280 comm_sendto_recvfrom(client_sock,
281 (struct net_sockaddr *)&client_addr,
282 sizeof(client_addr),
283 server_sock,
284 (struct net_sockaddr *)&server_addr,
285 sizeof(server_addr));
286
287 rv = zsock_close(client_sock);
288 zassert_equal(rv, 0, "close failed");
289 rv = zsock_close(server_sock);
290 zassert_equal(rv, 0, "close failed");
291 }
292
ZTEST(net_socket_udp,test_send_recv_2_sock)293 ZTEST(net_socket_udp, test_send_recv_2_sock)
294 {
295 int sock1, sock2;
296 struct net_sockaddr_in bind_addr, conn_addr;
297 char buf[10];
298 int len, rv;
299
300 prepare_sock_udp_v4(MY_IPV4_ADDR, 55555, &sock1, &bind_addr);
301 prepare_sock_udp_v4(MY_IPV4_ADDR, 55555, &sock2, &conn_addr);
302
303 rv = zsock_bind(sock1, (struct net_sockaddr *)&bind_addr, sizeof(bind_addr));
304 zassert_equal(rv, 0, "bind failed");
305
306 rv = zsock_connect(sock2, (struct net_sockaddr *)&conn_addr, sizeof(conn_addr));
307 zassert_equal(rv, 0, "connect failed");
308
309 len = zsock_send(sock2, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1, 0);
310 zassert_equal(len, STRLEN(TEST_STR_SMALL), "invalid send len");
311
312 clear_buf(buf);
313 len = zsock_recv(sock1, buf, sizeof(buf), ZSOCK_MSG_PEEK);
314 zassert_equal(len, STRLEN(TEST_STR_SMALL), "Invalid recv len");
315 zassert_mem_equal(buf, BUF_AND_SIZE(TEST_STR_SMALL), "Wrong data");
316
317 clear_buf(buf);
318 len = zsock_recv(sock1, buf, sizeof(buf), 0);
319 zassert_equal(len, STRLEN(TEST_STR_SMALL), "Invalid recv len");
320 zassert_mem_equal(buf, BUF_AND_SIZE(TEST_STR_SMALL), "Wrong data");
321
322 rv = zsock_close(sock1);
323 zassert_equal(rv, 0, "close failed");
324 rv = zsock_close(sock2);
325 zassert_equal(rv, 0, "close failed");
326 }
327
ZTEST(net_socket_udp,test_so_priority)328 ZTEST(net_socket_udp, test_so_priority)
329 {
330 struct net_sockaddr_in bind_addr4;
331 struct net_sockaddr_in6 bind_addr6;
332 int sock1, sock2, rv;
333 uint8_t optval;
334
335 prepare_sock_udp_v4(MY_IPV4_ADDR, 55555, &sock1, &bind_addr4);
336 prepare_sock_udp_v6(MY_IPV6_ADDR, 55555, &sock2, &bind_addr6);
337
338 rv = zsock_bind(sock1, (struct net_sockaddr *)&bind_addr4, sizeof(bind_addr4));
339 zassert_equal(rv, 0, "bind failed");
340
341 rv = zsock_bind(sock2, (struct net_sockaddr *)&bind_addr6, sizeof(bind_addr6));
342 zassert_equal(rv, 0, "bind failed");
343
344 optval = 2;
345 rv = zsock_setsockopt(sock1, ZSOCK_SOL_SOCKET, ZSOCK_SO_PRIORITY, &optval,
346 sizeof(optval));
347 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
348
349 optval = 6;
350 rv = zsock_setsockopt(sock2, ZSOCK_SOL_SOCKET, ZSOCK_SO_PRIORITY, &optval,
351 sizeof(optval));
352 zassert_equal(rv, 0, "setsockopt failed");
353
354 rv = zsock_close(sock1);
355 zassert_equal(rv, 0, "close failed");
356 rv = zsock_close(sock2);
357 zassert_equal(rv, 0, "close failed");
358 }
359
comm_sendmsg_recvfrom(int client_sock,struct net_sockaddr * client_addr,net_socklen_t client_addrlen,const struct net_msghdr * client_msg,int server_sock,struct net_sockaddr * server_addr,net_socklen_t server_addrlen)360 static void comm_sendmsg_recvfrom(int client_sock,
361 struct net_sockaddr *client_addr,
362 net_socklen_t client_addrlen,
363 const struct net_msghdr *client_msg,
364 int server_sock,
365 struct net_sockaddr *server_addr,
366 net_socklen_t server_addrlen)
367 {
368 ssize_t sent;
369 ssize_t recved;
370 struct net_sockaddr addr;
371 net_socklen_t addrlen;
372 int len, i;
373
374 zassert_not_null(client_addr, "null client addr");
375 zassert_not_null(server_addr, "null server addr");
376
377 /*
378 * Test client -> server sending
379 */
380
381 sent = zsock_sendmsg(client_sock, client_msg, 0);
382 zassert_true(sent > 0, "sendmsg failed (%d)", -errno);
383
384 for (i = 0, len = 0; i < client_msg->msg_iovlen; i++) {
385 len += client_msg->msg_iov[i].iov_len;
386 }
387
388 zassert_equal(sent, len, "iovec len (%d) vs sent (%d)", len, sent);
389
390 /* Test recvfrom(MSG_PEEK) */
391 addrlen = sizeof(addr);
392 clear_buf(rx_buf);
393 recved = zsock_recvfrom(server_sock, rx_buf, sizeof(rx_buf),
394 ZSOCK_MSG_PEEK, &addr, &addrlen);
395 zassert_true(recved >= 0, "recvfrom fail");
396 zassert_equal(recved, strlen(TEST_STR_SMALL),
397 "unexpected received bytes");
398 zassert_equal(sent, recved, "sent(%d)/received(%d) mismatch",
399 sent, recved);
400
401 zassert_mem_equal(rx_buf, BUF_AND_SIZE(TEST_STR_SMALL),
402 "wrong data (%s)", rx_buf);
403 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
404
405 /* Test normal recvfrom() */
406 addrlen = sizeof(addr);
407 clear_buf(rx_buf);
408 recved = zsock_recvfrom(server_sock, rx_buf, sizeof(rx_buf),
409 0, &addr, &addrlen);
410 zassert_true(recved >= 0, "recvfrom fail");
411 zassert_equal(recved, strlen(TEST_STR_SMALL),
412 "unexpected received bytes");
413 zassert_mem_equal(rx_buf, BUF_AND_SIZE(TEST_STR_SMALL), "wrong data");
414 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
415
416 /* Check the client port */
417 if (net_sin(client_addr)->sin_port != ANY_PORT) {
418 zassert_equal(net_sin(client_addr)->sin_port,
419 net_sin(&addr)->sin_port,
420 "unexpected client port");
421 }
422 }
423
ZTEST_USER(net_socket_udp,test_v4_sendmsg_recvfrom)424 ZTEST_USER(net_socket_udp, test_v4_sendmsg_recvfrom)
425 {
426 int rv;
427 int client_sock;
428 int server_sock;
429 struct net_sockaddr_in client_addr;
430 struct net_sockaddr_in server_addr;
431 struct net_msghdr msg;
432 struct net_cmsghdr *cmsg;
433 struct net_iovec io_vector[1];
434 union {
435 struct net_cmsghdr hdr;
436 unsigned char buf[NET_CMSG_SPACE(sizeof(int))];
437 } cmsgbuf;
438
439 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
440 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
441
442 rv = zsock_bind(server_sock,
443 (struct net_sockaddr *)&server_addr,
444 sizeof(server_addr));
445 zassert_equal(rv, 0, "server bind failed");
446
447 rv = zsock_bind(client_sock,
448 (struct net_sockaddr *)&client_addr,
449 sizeof(client_addr));
450 zassert_equal(rv, 0, "client bind failed");
451
452 io_vector[0].iov_base = TEST_STR_SMALL;
453 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
454
455 memset(&msg, 0, sizeof(msg));
456 msg.msg_control = &cmsgbuf.buf;
457 msg.msg_controllen = sizeof(cmsgbuf.buf);
458 msg.msg_iov = io_vector;
459 msg.msg_iovlen = 1;
460 msg.msg_name = &server_addr;
461 msg.msg_namelen = sizeof(server_addr);
462
463 cmsg = NET_CMSG_FIRSTHDR(&msg);
464 cmsg->cmsg_len = NET_CMSG_LEN(sizeof(int));
465 cmsg->cmsg_level = ZSOCK_SOL_SOCKET;
466 cmsg->cmsg_type = 1122;
467 *(int *)NET_CMSG_DATA(cmsg) = 42;
468
469 comm_sendmsg_recvfrom(client_sock,
470 (struct net_sockaddr *)&client_addr,
471 sizeof(client_addr),
472 &msg,
473 server_sock,
474 (struct net_sockaddr *)&server_addr,
475 sizeof(server_addr));
476
477 rv = zsock_close(client_sock);
478 zassert_equal(rv, 0, "close failed");
479 rv = zsock_close(server_sock);
480 zassert_equal(rv, 0, "close failed");
481 }
482
ZTEST_USER(net_socket_udp,test_v4_sendmsg_recvfrom_no_aux_data)483 ZTEST_USER(net_socket_udp, test_v4_sendmsg_recvfrom_no_aux_data)
484 {
485 int rv;
486 int client_sock;
487 int server_sock;
488 struct net_sockaddr_in client_addr;
489 struct net_sockaddr_in server_addr;
490 struct net_msghdr msg;
491 struct net_iovec io_vector[1];
492
493 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
494 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
495
496 rv = zsock_bind(server_sock,
497 (struct net_sockaddr *)&server_addr,
498 sizeof(server_addr));
499 zassert_equal(rv, 0, "server bind failed");
500
501 rv = zsock_bind(client_sock,
502 (struct net_sockaddr *)&client_addr,
503 sizeof(client_addr));
504 zassert_equal(rv, 0, "client bind failed");
505
506 io_vector[0].iov_base = TEST_STR_SMALL;
507 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
508
509 memset(&msg, 0, sizeof(msg));
510 msg.msg_iov = io_vector;
511 msg.msg_iovlen = 1;
512 msg.msg_name = &server_addr;
513 msg.msg_namelen = sizeof(server_addr);
514
515 comm_sendmsg_recvfrom(client_sock,
516 (struct net_sockaddr *)&client_addr,
517 sizeof(client_addr),
518 &msg,
519 server_sock,
520 (struct net_sockaddr *)&server_addr,
521 sizeof(server_addr));
522
523 rv = zsock_close(client_sock);
524 zassert_equal(rv, 0, "close failed");
525 rv = zsock_close(server_sock);
526 zassert_equal(rv, 0, "close failed");
527 }
528
ZTEST_USER(net_socket_udp,test_v6_sendmsg_recvfrom)529 ZTEST_USER(net_socket_udp, test_v6_sendmsg_recvfrom)
530 {
531 int rv;
532 int client_sock;
533 int server_sock;
534 struct net_sockaddr_in6 client_addr;
535 struct net_sockaddr_in6 server_addr;
536 struct net_msghdr msg;
537 struct net_cmsghdr *cmsg;
538 struct net_iovec io_vector[1];
539 union {
540 struct net_cmsghdr hdr;
541 unsigned char buf[NET_CMSG_SPACE(sizeof(int))];
542 } cmsgbuf;
543
544 prepare_sock_udp_v6(MY_IPV6_ADDR, ANY_PORT, &client_sock, &client_addr);
545 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
546
547 rv = zsock_bind(server_sock,
548 (struct net_sockaddr *)&server_addr, sizeof(server_addr));
549 zassert_equal(rv, 0, "server bind failed");
550
551 rv = zsock_bind(client_sock,
552 (struct net_sockaddr *)&client_addr,
553 sizeof(client_addr));
554 zassert_equal(rv, 0, "client bind failed");
555
556 io_vector[0].iov_base = TEST_STR_SMALL;
557 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
558
559 memset(&msg, 0, sizeof(msg));
560 msg.msg_control = &cmsgbuf.buf;
561 msg.msg_controllen = sizeof(cmsgbuf.buf);
562 msg.msg_iov = io_vector;
563 msg.msg_iovlen = 1;
564 msg.msg_name = &server_addr;
565 msg.msg_namelen = sizeof(server_addr);
566
567 cmsg = NET_CMSG_FIRSTHDR(&msg);
568 cmsg->cmsg_len = NET_CMSG_LEN(sizeof(int));
569 cmsg->cmsg_level = ZSOCK_SOL_SOCKET;
570 cmsg->cmsg_type = 1122;
571 *(int *)NET_CMSG_DATA(cmsg) = 42;
572
573 comm_sendmsg_recvfrom(client_sock,
574 (struct net_sockaddr *)&client_addr,
575 sizeof(client_addr),
576 &msg,
577 server_sock,
578 (struct net_sockaddr *)&server_addr,
579 sizeof(server_addr));
580
581 rv = zsock_close(client_sock);
582 zassert_equal(rv, 0, "close failed");
583 rv = zsock_close(server_sock);
584 zassert_equal(rv, 0, "close failed");
585 }
586
ZTEST_USER(net_socket_udp,test_v4_sendmsg_recvfrom_connected)587 ZTEST_USER(net_socket_udp, test_v4_sendmsg_recvfrom_connected)
588 {
589 int rv;
590 int client_sock;
591 int server_sock;
592 struct net_sockaddr_in client_addr;
593 struct net_sockaddr_in server_addr;
594 struct net_msghdr msg;
595 struct net_cmsghdr *cmsg;
596 struct net_iovec io_vector[1];
597 union {
598 struct net_cmsghdr hdr;
599 unsigned char buf[NET_CMSG_SPACE(sizeof(int))];
600 } cmsgbuf;
601
602 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
603 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
604
605 rv = zsock_bind(server_sock,
606 (struct net_sockaddr *)&server_addr,
607 sizeof(server_addr));
608 zassert_equal(rv, 0, "server bind failed");
609
610 rv = zsock_bind(client_sock,
611 (struct net_sockaddr *)&client_addr,
612 sizeof(client_addr));
613 zassert_equal(rv, 0, "client bind failed");
614
615 rv = zsock_connect(client_sock, (struct net_sockaddr *)&server_addr,
616 sizeof(server_addr));
617 zassert_equal(rv, 0, "connect failed");
618
619 io_vector[0].iov_base = TEST_STR_SMALL;
620 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
621
622 memset(&msg, 0, sizeof(msg));
623 msg.msg_control = &cmsgbuf.buf;
624 msg.msg_controllen = sizeof(cmsgbuf.buf);
625 msg.msg_iov = io_vector;
626 msg.msg_iovlen = 1;
627
628 cmsg = NET_CMSG_FIRSTHDR(&msg);
629 cmsg->cmsg_len = NET_CMSG_LEN(sizeof(int));
630 cmsg->cmsg_level = ZSOCK_SOL_SOCKET;
631 cmsg->cmsg_type = 1122;
632 *(int *)NET_CMSG_DATA(cmsg) = 42;
633
634 comm_sendmsg_recvfrom(client_sock,
635 (struct net_sockaddr *)&client_addr,
636 sizeof(client_addr),
637 &msg,
638 server_sock,
639 (struct net_sockaddr *)&server_addr,
640 sizeof(server_addr));
641
642 rv = zsock_close(client_sock);
643 zassert_equal(rv, 0, "close failed");
644 rv = zsock_close(server_sock);
645 zassert_equal(rv, 0, "close failed");
646 }
647
ZTEST_USER(net_socket_udp,test_v6_sendmsg_recvfrom_connected)648 ZTEST_USER(net_socket_udp, test_v6_sendmsg_recvfrom_connected)
649 {
650 int rv;
651 int client_sock;
652 int server_sock;
653 struct net_sockaddr_in6 client_addr;
654 struct net_sockaddr_in6 server_addr;
655 struct net_msghdr msg;
656 struct net_cmsghdr *cmsg;
657 struct net_iovec io_vector[1];
658 union {
659 struct net_cmsghdr hdr;
660 unsigned char buf[NET_CMSG_SPACE(sizeof(int))];
661 } cmsgbuf;
662
663 prepare_sock_udp_v6(MY_IPV6_ADDR, ANY_PORT, &client_sock, &client_addr);
664 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
665
666 rv = zsock_bind(server_sock,
667 (struct net_sockaddr *)&server_addr, sizeof(server_addr));
668 zassert_equal(rv, 0, "server bind failed");
669
670 rv = zsock_bind(client_sock,
671 (struct net_sockaddr *)&client_addr,
672 sizeof(client_addr));
673 zassert_equal(rv, 0, "client bind failed");
674
675 rv = zsock_connect(client_sock, (struct net_sockaddr *)&server_addr,
676 sizeof(server_addr));
677 zassert_equal(rv, 0, "connect failed");
678
679 io_vector[0].iov_base = TEST_STR_SMALL;
680 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
681
682 memset(&msg, 0, sizeof(msg));
683 msg.msg_control = &cmsgbuf.buf;
684 msg.msg_controllen = sizeof(cmsgbuf.buf);
685 msg.msg_iov = io_vector;
686 msg.msg_iovlen = 1;
687
688 cmsg = NET_CMSG_FIRSTHDR(&msg);
689 cmsg->cmsg_len = NET_CMSG_LEN(sizeof(int));
690 cmsg->cmsg_level = ZSOCK_SOL_SOCKET;
691 cmsg->cmsg_type = 1122;
692 *(int *)NET_CMSG_DATA(cmsg) = 42;
693
694 comm_sendmsg_recvfrom(client_sock,
695 (struct net_sockaddr *)&client_addr,
696 sizeof(client_addr),
697 &msg,
698 server_sock,
699 (struct net_sockaddr *)&server_addr,
700 sizeof(server_addr));
701
702 rv = zsock_close(client_sock);
703 zassert_equal(rv, 0, "close failed");
704 rv = zsock_close(server_sock);
705 zassert_equal(rv, 0, "close failed");
706 }
707
ZTEST(net_socket_udp,test_so_type)708 ZTEST(net_socket_udp, test_so_type)
709 {
710 struct net_sockaddr_in bind_addr4;
711 struct net_sockaddr_in6 bind_addr6;
712 int sock1, sock2, rv;
713 int optval;
714 net_socklen_t optsize = sizeof(optval);
715
716 prepare_sock_udp_v4(MY_IPV4_ADDR, 55555, &sock1, &bind_addr4);
717 prepare_sock_udp_v6(MY_IPV6_ADDR, 55555, &sock2, &bind_addr6);
718
719 rv = zsock_getsockopt(sock1, ZSOCK_SOL_SOCKET, ZSOCK_SO_TYPE, &optval, &optsize);
720 zassert_equal(rv, 0, "getsockopt failed (%d)", errno);
721 zassert_equal(optval, NET_SOCK_DGRAM, "getsockopt got invalid type");
722 zassert_equal(optsize, sizeof(optval), "getsockopt got invalid size");
723
724 rv = zsock_getsockopt(sock2, ZSOCK_SOL_SOCKET, ZSOCK_SO_TYPE, &optval, &optsize);
725 zassert_equal(rv, 0, "getsockopt failed (%d)", errno);
726 zassert_equal(optval, NET_SOCK_DGRAM, "getsockopt got invalid type");
727 zassert_equal(optsize, sizeof(optval), "getsockopt got invalid size");
728
729 rv = zsock_close(sock1);
730 zassert_equal(rv, 0, "close failed");
731 rv = zsock_close(sock2);
732 zassert_equal(rv, 0, "close failed");
733 }
734
ZTEST(net_socket_udp,test_so_txtime)735 ZTEST(net_socket_udp, test_so_txtime)
736 {
737 struct net_sockaddr_in bind_addr4;
738 struct net_sockaddr_in6 bind_addr6;
739 int sock1, sock2, rv;
740 net_socklen_t optlen;
741 int optval;
742
743 prepare_sock_udp_v4(MY_IPV4_ADDR, 55555, &sock1, &bind_addr4);
744 prepare_sock_udp_v6(MY_IPV6_ADDR, 55555, &sock2, &bind_addr6);
745
746 rv = zsock_bind(sock1, (struct net_sockaddr *)&bind_addr4, sizeof(bind_addr4));
747 zassert_equal(rv, 0, "bind failed");
748
749 rv = zsock_bind(sock2, (struct net_sockaddr *)&bind_addr6, sizeof(bind_addr6));
750 zassert_equal(rv, 0, "bind failed");
751
752 optval = true;
753 rv = zsock_setsockopt(sock1, ZSOCK_SOL_SOCKET, ZSOCK_SO_TXTIME, &optval,
754 sizeof(optval));
755 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
756
757 optval = false;
758 rv = zsock_setsockopt(sock2, ZSOCK_SOL_SOCKET, ZSOCK_SO_TXTIME, &optval,
759 sizeof(optval));
760 zassert_equal(rv, 0, "setsockopt failed");
761
762 optlen = sizeof(optval);
763 rv = zsock_getsockopt(sock1, ZSOCK_SOL_SOCKET, ZSOCK_SO_TXTIME, &optval, &optlen);
764 zassert_equal(rv, 0, "getsockopt failed (%d)", errno);
765 zassert_equal(optlen, sizeof(optval), "invalid optlen %d vs %d",
766 optlen, sizeof(optval));
767 zassert_equal(optval, true, "getsockopt txtime");
768
769 optlen = sizeof(optval);
770 rv = zsock_getsockopt(sock2, ZSOCK_SOL_SOCKET, ZSOCK_SO_TXTIME, &optval, &optlen);
771 zassert_equal(rv, 0, "getsockopt failed (%d)", errno);
772 zassert_equal(optlen, sizeof(optval), "invalid optlen %d vs %d",
773 optlen, sizeof(optval));
774 zassert_equal(optval, false, "getsockopt txtime");
775
776 rv = zsock_close(sock1);
777 zassert_equal(rv, 0, "close failed");
778 rv = zsock_close(sock2);
779 zassert_equal(rv, 0, "close failed");
780 }
781
ZTEST(net_socket_udp,test_so_rcvtimeo)782 ZTEST(net_socket_udp, test_so_rcvtimeo)
783 {
784 struct net_sockaddr_in bind_addr4;
785 struct net_sockaddr_in6 bind_addr6;
786 int sock1, sock2, rv;
787 ssize_t recved = 0;
788 struct net_sockaddr addr;
789 net_socklen_t addrlen;
790 uint32_t start_time, time_diff;
791
792 struct timeval optval = {
793 .tv_sec = 0,
794 .tv_usec = 300000,
795 };
796
797 prepare_sock_udp_v4(MY_IPV4_ADDR, 55555, &sock1, &bind_addr4);
798 prepare_sock_udp_v6(MY_IPV6_ADDR, 55555, &sock2, &bind_addr6);
799
800 rv = zsock_bind(sock1, (struct net_sockaddr *)&bind_addr4, sizeof(bind_addr4));
801 zassert_equal(rv, 0, "bind failed");
802
803 rv = zsock_bind(sock2, (struct net_sockaddr *)&bind_addr6, sizeof(bind_addr6));
804 zassert_equal(rv, 0, "bind failed");
805
806 rv = zsock_setsockopt(sock1, ZSOCK_SOL_SOCKET, ZSOCK_SO_RCVTIMEO, &optval,
807 sizeof(optval));
808 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
809
810 optval.tv_usec = 400000;
811 rv = zsock_setsockopt(sock2, ZSOCK_SOL_SOCKET, ZSOCK_SO_RCVTIMEO, &optval,
812 sizeof(optval));
813 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
814
815 addrlen = sizeof(addr);
816 clear_buf(rx_buf);
817 start_time = k_uptime_get_32();
818 recved = zsock_recvfrom(sock1, rx_buf, sizeof(rx_buf),
819 0, &addr, &addrlen);
820 time_diff = k_uptime_get_32() - start_time;
821
822 zassert_equal(recved, -1, "Unexpected return code");
823 zassert_equal(errno, EAGAIN, "Unexpected errno value: %d", errno);
824 zassert_true(time_diff >= 300, "Expected timeout after 300ms but "
825 "was %dms", time_diff);
826
827 start_time = k_uptime_get_32();
828 recved = zsock_recvfrom(sock2, rx_buf, sizeof(rx_buf),
829 0, &addr, &addrlen);
830 time_diff = k_uptime_get_32() - start_time;
831
832 zassert_equal(recved, -1, "Unexpected return code");
833 zassert_equal(errno, EAGAIN, "Unexpected errno value: %d", errno);
834 zassert_true(time_diff >= 400, "Expected timeout after 400ms but "
835 "was %dms", time_diff);
836
837 rv = zsock_close(sock1);
838 zassert_equal(rv, 0, "close failed");
839 rv = zsock_close(sock2);
840 zassert_equal(rv, 0, "close failed");
841 }
842
ZTEST(net_socket_udp,test_so_sndtimeo)843 ZTEST(net_socket_udp, test_so_sndtimeo)
844 {
845 struct net_sockaddr_in bind_addr4;
846 struct net_sockaddr_in6 bind_addr6;
847 int sock1, sock2, rv;
848
849 struct timeval optval = {
850 .tv_sec = 2,
851 .tv_usec = 500000,
852 };
853
854 prepare_sock_udp_v4(MY_IPV4_ADDR, 55555, &sock1, &bind_addr4);
855 prepare_sock_udp_v6(MY_IPV6_ADDR, 55555, &sock2, &bind_addr6);
856
857 rv = zsock_bind(sock1, (struct net_sockaddr *)&bind_addr4, sizeof(bind_addr4));
858 zassert_equal(rv, 0, "bind failed");
859
860 rv = zsock_bind(sock2, (struct net_sockaddr *)&bind_addr6, sizeof(bind_addr6));
861 zassert_equal(rv, 0, "bind failed");
862
863 rv = zsock_setsockopt(sock1, ZSOCK_SOL_SOCKET, ZSOCK_SO_SNDTIMEO, &optval,
864 sizeof(optval));
865 zassert_equal(rv, 0, "setsockopt failed (%d)", errno);
866
867 optval.tv_usec = 0;
868 rv = zsock_setsockopt(sock2, ZSOCK_SOL_SOCKET, ZSOCK_SO_SNDTIMEO, &optval,
869 sizeof(optval));
870 zassert_equal(rv, 0, "setsockopt failed");
871
872 rv = zsock_close(sock1);
873 zassert_equal(rv, 0, "close failed");
874 rv = zsock_close(sock2);
875 zassert_equal(rv, 0, "close failed");
876 }
877
ZTEST(net_socket_udp,test_so_protocol)878 ZTEST(net_socket_udp, test_so_protocol)
879 {
880 struct net_sockaddr_in bind_addr4;
881 struct net_sockaddr_in6 bind_addr6;
882 int sock1, sock2, rv;
883 int optval;
884 net_socklen_t optsize = sizeof(optval);
885
886 prepare_sock_udp_v4(MY_IPV4_ADDR, 55555, &sock1, &bind_addr4);
887 prepare_sock_udp_v6(MY_IPV6_ADDR, 55555, &sock2, &bind_addr6);
888
889 rv = zsock_getsockopt(sock1, ZSOCK_SOL_SOCKET, ZSOCK_SO_PROTOCOL, &optval, &optsize);
890 zassert_equal(rv, 0, "getsockopt failed (%d)", errno);
891 zassert_equal(optval, NET_IPPROTO_UDP, "getsockopt got invalid protocol");
892 zassert_equal(optsize, sizeof(optval), "getsockopt got invalid size");
893
894 rv = zsock_getsockopt(sock2, ZSOCK_SOL_SOCKET, ZSOCK_SO_PROTOCOL, &optval, &optsize);
895 zassert_equal(rv, 0, "getsockopt failed (%d)", errno);
896 zassert_equal(optval, NET_IPPROTO_UDP, "getsockopt got invalid protocol");
897 zassert_equal(optsize, sizeof(optval), "getsockopt got invalid size");
898
899 rv = zsock_close(sock1);
900 zassert_equal(rv, 0, "close failed");
901 rv = zsock_close(sock2);
902 zassert_equal(rv, 0, "close failed");
903 }
904
comm_sendmsg_with_txtime(int client_sock,struct net_sockaddr * client_addr,net_socklen_t client_addrlen,const struct net_msghdr * client_msg)905 static void comm_sendmsg_with_txtime(int client_sock,
906 struct net_sockaddr *client_addr,
907 net_socklen_t client_addrlen,
908 const struct net_msghdr *client_msg)
909 {
910 ssize_t sent;
911 int len, i;
912
913 zassert_not_null(client_addr, "null client addr");
914
915 /*
916 * Test client -> server sending
917 */
918
919 sent = zsock_sendmsg(client_sock, client_msg, 0);
920 zassert_true(sent > 0, "sendmsg failed (%d)", -errno);
921
922 for (i = 0, len = 0; i < client_msg->msg_iovlen; i++) {
923 len += client_msg->msg_iov[i].iov_len;
924 }
925
926 zassert_equal(sent, len, "iovec len (%d) vs sent (%d)", len, sent);
927 }
928
929 /* In order to verify that the network device driver is able to receive
930 * the TXTIME option, create a separate network device and catch the packets
931 * we are sending.
932 */
933 struct eth_fake_context {
934 struct net_if *iface;
935 uint8_t mac_address[6];
936 };
937
938 static struct eth_fake_context eth_fake_data;
939 static ZTEST_BMEM struct net_sockaddr_in6 udp_server_addr;
940
941 /* The semaphore is there to wait the data to be received. */
942 static ZTEST_BMEM struct sys_sem wait_data;
943
944 static struct net_if *eth_iface;
945 static struct net_if *lo0;
946 static ZTEST_BMEM bool test_started;
947 static ZTEST_BMEM bool test_failed;
948 static struct net_in6_addr my_addr1 = { { { 0x20, 0x01, 0x0d, 0xb8, 1, 0, 0, 0,
949 0, 0, 0, 0, 0, 0, 0, 0x1 } } };
950 static struct net_in_addr my_addr2 = { { { 192, 0, 2, 2 } } };
951 static struct net_in6_addr my_addr3 = { { { 0x20, 0x01, 0x0d, 0xb8, 1, 0, 0, 0,
952 0, 0, 0, 0, 0, 0, 0, 0x3 } } };
953 static struct net_in6_addr my_mcast_addr1 = { { { 0xff, 0x01, 0, 0, 0, 0, 0, 0,
954 0, 0, 0, 0, 0, 0, 0, 0x1 } } };
955 static struct net_in_addr my_mcast_addr2 = { { { 224, 0, 0, 2 } } };
956 static struct net_linkaddr server_link_addr = {
957 .addr = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 },
958 .len = NET_ETH_ADDR_LEN,
959 };
960 #define MY_IPV6_ADDR_ETH "2001:db8:100::1"
961 #define PEER_IPV6_ADDR_ETH "2001:db8:100::2"
962 #define TEST_TXTIME INT64_MAX
963 #define WAIT_TIME K_MSEC(250)
964 #define WAIT_TIME_LONG K_MSEC(1000)
965
eth_fake_iface_init(struct net_if * iface)966 static void eth_fake_iface_init(struct net_if *iface)
967 {
968 const struct device *dev = net_if_get_device(iface);
969 struct eth_fake_context *ctx = dev->data;
970
971 ctx->iface = iface;
972
973 net_if_set_link_addr(iface, ctx->mac_address,
974 sizeof(ctx->mac_address),
975 NET_LINK_ETHERNET);
976
977 ethernet_init(iface);
978 }
979
eth_fake_send(const struct device * dev,struct net_pkt * pkt)980 static int eth_fake_send(const struct device *dev, struct net_pkt *pkt)
981 {
982 net_time_t txtime;
983
984 ARG_UNUSED(dev);
985 ARG_UNUSED(pkt);
986
987 if (!test_started) {
988 return 0;
989 }
990
991 txtime = net_pkt_timestamp_ns(pkt);
992 if (txtime != TEST_TXTIME) {
993 test_failed = true;
994 } else {
995 test_failed = false;
996 }
997
998 (void)sys_sem_give(&wait_data);
999
1000 return 0;
1001 }
1002
1003 static struct ethernet_api eth_fake_api_funcs = {
1004 .iface_api.init = eth_fake_iface_init,
1005 .send = eth_fake_send,
1006 };
1007
1008 ETH_NET_DEVICE_INIT(eth_fake, "eth_fake", NULL, NULL, ð_fake_data, NULL,
1009 CONFIG_ETH_INIT_PRIORITY, ð_fake_api_funcs, NET_ETH_MTU);
1010
iface_cb(struct net_if * iface,void * user_data)1011 static void iface_cb(struct net_if *iface, void *user_data)
1012 {
1013 struct net_if **my_iface = user_data;
1014
1015 if (net_if_l2(iface) == &NET_L2_GET_NAME(ETHERNET)) {
1016 if (PART_OF_ARRAY(NET_IF_GET_NAME(eth_fake, 0), iface)) {
1017 *my_iface = iface;
1018 }
1019 }
1020
1021 if (net_if_l2(iface) == &NET_L2_GET_NAME(DUMMY)) {
1022 lo0 = iface;
1023 net_if_set_default(iface);
1024 }
1025 }
1026
ZTEST_USER(net_socket_udp,test_v6_sendmsg_with_txtime)1027 ZTEST_USER(net_socket_udp, test_v6_sendmsg_with_txtime)
1028 {
1029 int rv;
1030 int client_sock;
1031 int optval;
1032 net_time_t txtime;
1033 struct net_sockaddr_in6 client_addr;
1034 struct net_msghdr msg;
1035 struct net_cmsghdr *cmsg;
1036 struct net_iovec io_vector[1];
1037 union {
1038 struct net_cmsghdr hdr;
1039 unsigned char buf[NET_CMSG_SPACE(sizeof(uint64_t))];
1040 } cmsgbuf;
1041
1042 /* Just flush the semaphore */
1043 (void)sys_sem_take(&wait_data, K_NO_WAIT);
1044
1045 prepare_sock_udp_v6(MY_IPV6_ADDR_ETH, ANY_PORT, &client_sock, &client_addr);
1046
1047 rv = zsock_bind(client_sock,
1048 (struct net_sockaddr *)&client_addr,
1049 sizeof(client_addr));
1050 zassert_equal(rv, 0, "client bind failed");
1051
1052 io_vector[0].iov_base = TEST_STR_SMALL;
1053 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
1054
1055 memset(&msg, 0, sizeof(msg));
1056 msg.msg_control = &cmsgbuf.buf;
1057 msg.msg_controllen = sizeof(cmsgbuf.buf);
1058 msg.msg_iov = io_vector;
1059 msg.msg_iovlen = 1;
1060 msg.msg_name = &udp_server_addr;
1061 msg.msg_namelen = sizeof(udp_server_addr);
1062
1063 txtime = TEST_TXTIME;
1064
1065 cmsg = NET_CMSG_FIRSTHDR(&msg);
1066 cmsg->cmsg_len = NET_CMSG_LEN(sizeof(txtime));
1067 cmsg->cmsg_level = ZSOCK_SOL_SOCKET;
1068 cmsg->cmsg_type = ZSOCK_SCM_TXTIME;
1069 *(net_time_t *)NET_CMSG_DATA(cmsg) = txtime;
1070
1071 optval = true;
1072 rv = zsock_setsockopt(client_sock, ZSOCK_SOL_SOCKET, ZSOCK_SO_TXTIME, &optval,
1073 sizeof(optval));
1074
1075 test_started = true;
1076
1077 comm_sendmsg_with_txtime(client_sock,
1078 (struct net_sockaddr *)&client_addr,
1079 sizeof(client_addr),
1080 &msg);
1081
1082 rv = zsock_close(client_sock);
1083 zassert_equal(rv, 0, "close failed");
1084
1085 if (sys_sem_take(&wait_data, WAIT_TIME) != 0) {
1086 zassert_true(false, "Timeout DNS query not received");
1087 }
1088
1089 zassert_false(test_failed, "Invalid txtime received");
1090
1091 test_started = false;
1092 }
1093
test_msg_trunc(int sock_c,int sock_s,struct net_sockaddr * addr_c,net_socklen_t addrlen_c,struct net_sockaddr * addr_s,net_socklen_t addrlen_s)1094 void test_msg_trunc(int sock_c, int sock_s, struct net_sockaddr *addr_c,
1095 net_socklen_t addrlen_c, struct net_sockaddr *addr_s,
1096 net_socklen_t addrlen_s)
1097 {
1098 int rv;
1099 uint8_t str_buf[sizeof(TEST_STR_SMALL) - 1];
1100
1101 rv = zsock_bind(sock_s, addr_s, addrlen_s);
1102 zassert_equal(rv, 0, "server bind failed");
1103
1104 rv = zsock_bind(sock_c, addr_c, addrlen_c);
1105 zassert_equal(rv, 0, "client bind failed");
1106
1107 rv = zsock_connect(sock_c, addr_s, addrlen_s);
1108 zassert_equal(rv, 0, "connect failed");
1109
1110 /* MSG_TRUNC */
1111
1112 rv = zsock_send(sock_c, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1, 0);
1113 zassert_equal(rv, sizeof(TEST_STR_SMALL) - 1, "send failed");
1114
1115 memset(str_buf, 0, sizeof(str_buf));
1116 rv = zsock_recv(sock_s, str_buf, 2, ZSOCK_MSG_TRUNC);
1117 zassert_equal(rv, sizeof(TEST_STR_SMALL) - 1, "MSG_TRUNC flag failed");
1118 zassert_mem_equal(str_buf, TEST_STR_SMALL, 2, "invalid rx data");
1119 zassert_equal(str_buf[2], 0, "received more than requested");
1120
1121 /* The remaining data should've been discarded */
1122 rv = zsock_recv(sock_s, str_buf, sizeof(str_buf), ZSOCK_MSG_DONTWAIT);
1123 zassert_equal(rv, -1, "consecutive recv should've failed");
1124 zassert_equal(errno, EAGAIN, "incorrect errno value");
1125
1126 /* MSG_TRUNC & MSG_PEEK combo */
1127
1128 rv = zsock_send(sock_c, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1, 0);
1129 zassert_equal(rv, sizeof(TEST_STR_SMALL) - 1, "send failed");
1130
1131 memset(str_buf, 0, sizeof(str_buf));
1132 rv = zsock_recv(sock_s, str_buf, 2, ZSOCK_MSG_TRUNC | ZSOCK_MSG_PEEK);
1133 zassert_equal(rv, sizeof(TEST_STR_SMALL) - 1, "MSG_TRUNC flag failed");
1134
1135 /* The packet should still be available due to MSG_PEEK */
1136 rv = zsock_recv(sock_s, str_buf, sizeof(str_buf), ZSOCK_MSG_TRUNC);
1137 zassert_equal(rv, sizeof(TEST_STR_SMALL) - 1,
1138 "recv after MSG_PEEK failed");
1139 zassert_mem_equal(str_buf, BUF_AND_SIZE(TEST_STR_SMALL),
1140 "invalid rx data");
1141
1142 rv = zsock_close(sock_c);
1143 zassert_equal(rv, 0, "close failed");
1144 rv = zsock_close(sock_s);
1145 zassert_equal(rv, 0, "close failed");
1146 }
1147
ZTEST(net_socket_udp,test_v4_msg_trunc)1148 ZTEST(net_socket_udp, test_v4_msg_trunc)
1149 {
1150 int client_sock;
1151 int server_sock;
1152 struct net_sockaddr_in client_addr;
1153 struct net_sockaddr_in server_addr;
1154
1155 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
1156 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
1157
1158 test_msg_trunc(client_sock, server_sock,
1159 (struct net_sockaddr *)&client_addr, sizeof(client_addr),
1160 (struct net_sockaddr *)&server_addr, sizeof(server_addr));
1161 }
1162
ZTEST(net_socket_udp,test_v6_msg_trunc)1163 ZTEST(net_socket_udp, test_v6_msg_trunc)
1164 {
1165 int client_sock;
1166 int server_sock;
1167 struct net_sockaddr_in6 client_addr;
1168 struct net_sockaddr_in6 server_addr;
1169
1170 prepare_sock_udp_v6(MY_IPV6_ADDR, ANY_PORT, &client_sock, &client_addr);
1171 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
1172
1173 test_msg_trunc(client_sock, server_sock,
1174 (struct net_sockaddr *)&client_addr, sizeof(client_addr),
1175 (struct net_sockaddr *)&server_addr, sizeof(server_addr));
1176 }
1177
test_dgram_overflow(int sock_c,int sock_s,struct net_sockaddr * addr_c,net_socklen_t addrlen_c,struct net_sockaddr * addr_s,net_socklen_t addrlen_s,const void * buf,size_t buf_size)1178 static void test_dgram_overflow(int sock_c, int sock_s,
1179 struct net_sockaddr *addr_c, net_socklen_t addrlen_c,
1180 struct net_sockaddr *addr_s, net_socklen_t addrlen_s,
1181 const void *buf, size_t buf_size)
1182 {
1183 int rv;
1184
1185 rv = zsock_bind(sock_s, addr_s, addrlen_s);
1186 zassert_equal(rv, 0, "server bind failed");
1187
1188 rv = zsock_bind(sock_c, addr_c, addrlen_c);
1189 zassert_equal(rv, 0, "client bind failed");
1190
1191 rv = zsock_connect(sock_c, addr_s, addrlen_s);
1192 zassert_equal(rv, 0, "connect failed");
1193
1194 rv = zsock_send(sock_c, buf, buf_size, 0);
1195 zassert_equal(rv, -1, "send succeeded");
1196 zassert_equal(errno, ENOMEM, "incorrect errno value");
1197
1198 rv = zsock_close(sock_c);
1199 zassert_equal(rv, 0, "close failed");
1200 rv = zsock_close(sock_s);
1201 zassert_equal(rv, 0, "close failed");
1202 }
1203
test_dgram_fragmented(int sock_c,int sock_s,struct net_sockaddr * addr_c,net_socklen_t addrlen_c,struct net_sockaddr * addr_s,net_socklen_t addrlen_s,const void * buf,size_t buf_size)1204 static void test_dgram_fragmented(int sock_c, int sock_s,
1205 struct net_sockaddr *addr_c, net_socklen_t addrlen_c,
1206 struct net_sockaddr *addr_s, net_socklen_t addrlen_s,
1207 const void *buf, size_t buf_size)
1208 {
1209 int rv;
1210
1211 rv = zsock_bind(sock_s, addr_s, addrlen_s);
1212 zassert_equal(rv, 0, "server bind failed");
1213
1214 rv = zsock_bind(sock_c, addr_c, addrlen_c);
1215 zassert_equal(rv, 0, "client bind failed");
1216
1217 rv = zsock_connect(sock_c, addr_s, addrlen_s);
1218 zassert_equal(rv, 0, "connect failed");
1219
1220 rv = zsock_send(sock_c, buf, buf_size, 0);
1221 zassert_equal(rv, buf_size, "send failed");
1222
1223 memset(rx_buf, 0, sizeof(rx_buf));
1224 rv = zsock_recv(sock_s, rx_buf, sizeof(rx_buf), 0);
1225 zassert_equal(rv, buf_size, "recv failed");
1226 zassert_mem_equal(rx_buf, buf, buf_size, "wrong data");
1227
1228 rv = zsock_close(sock_c);
1229 zassert_equal(rv, 0, "close failed");
1230 rv = zsock_close(sock_s);
1231 zassert_equal(rv, 0, "close failed");
1232 }
1233
ZTEST(net_socket_udp,test_v4_dgram_overflow)1234 ZTEST(net_socket_udp, test_v4_dgram_overflow)
1235 {
1236 int client_sock;
1237 int server_sock;
1238 struct net_sockaddr_in client_addr;
1239 struct net_sockaddr_in server_addr;
1240
1241 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
1242 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
1243
1244 test_dgram_overflow(client_sock, server_sock,
1245 (struct net_sockaddr *)&client_addr, sizeof(client_addr),
1246 (struct net_sockaddr *)&server_addr, sizeof(server_addr),
1247 test_str_all_tx_bufs, NET_ETH_MTU + 1);
1248 }
1249
ZTEST(net_socket_udp,test_v6_dgram_fragmented_or_overflow)1250 ZTEST(net_socket_udp, test_v6_dgram_fragmented_or_overflow)
1251 {
1252 int client_sock;
1253 int server_sock;
1254 struct net_sockaddr_in6 client_addr;
1255 struct net_sockaddr_in6 server_addr;
1256
1257 prepare_sock_udp_v6(MY_IPV6_ADDR, ANY_PORT, &client_sock, &client_addr);
1258 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
1259
1260 if (IS_ENABLED(CONFIG_NET_IPV6_FRAGMENT)) {
1261 test_dgram_fragmented(client_sock, server_sock,
1262 (struct net_sockaddr *)&client_addr, sizeof(client_addr),
1263 (struct net_sockaddr *)&server_addr, sizeof(server_addr),
1264 test_str_all_tx_bufs, NET_ETH_MTU + 1);
1265 } else {
1266 test_dgram_overflow(client_sock, server_sock,
1267 (struct net_sockaddr *)&client_addr, sizeof(client_addr),
1268 (struct net_sockaddr *)&server_addr, sizeof(server_addr),
1269 test_str_all_tx_bufs, NET_ETH_MTU + 1);
1270 }
1271 }
1272
ZTEST(net_socket_udp,test_v6_dgram_overflow)1273 ZTEST(net_socket_udp, test_v6_dgram_overflow)
1274 {
1275 int client_sock;
1276 int server_sock;
1277 struct net_sockaddr_in6 client_addr;
1278 struct net_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 test_dgram_overflow(client_sock, server_sock,
1284 (struct net_sockaddr *)&client_addr, sizeof(client_addr),
1285 (struct net_sockaddr *)&server_addr, sizeof(server_addr),
1286 BUF_AND_SIZE(test_str_all_tx_bufs));
1287 }
1288
test_dgram_connected(int sock_c,int sock_s1,int sock_s2,struct net_sockaddr * addr_c,net_socklen_t addrlen_c,struct net_sockaddr * addr_s1,net_socklen_t addrlen_s1,struct net_sockaddr * addr_s2,net_socklen_t addrlen_s2)1289 static void test_dgram_connected(int sock_c, int sock_s1, int sock_s2,
1290 struct net_sockaddr *addr_c, net_socklen_t addrlen_c,
1291 struct net_sockaddr *addr_s1, net_socklen_t addrlen_s1,
1292 struct net_sockaddr *addr_s2, net_socklen_t addrlen_s2)
1293 {
1294 uint8_t tx_buf = 0xab;
1295 uint8_t rx_buf;
1296 int rv;
1297
1298 rv = zsock_bind(sock_c, addr_c, addrlen_c);
1299 zassert_equal(rv, 0, "client bind failed");
1300
1301 rv = zsock_bind(sock_s1, addr_s1, addrlen_s1);
1302 zassert_equal(rv, 0, "server bind failed");
1303
1304 rv = zsock_bind(sock_s2, addr_s2, addrlen_s2);
1305 zassert_equal(rv, 0, "server bind failed");
1306
1307 rv = zsock_connect(sock_c, addr_s1, addrlen_s1);
1308 zassert_equal(rv, 0, "connect failed");
1309
1310 /* Verify that a datagram can be received from the connected address */
1311 rv = zsock_sendto(sock_s1, &tx_buf, sizeof(tx_buf), 0, addr_c, addrlen_c);
1312 zassert_equal(rv, sizeof(tx_buf), "send failed %d", errno);
1313
1314 /* Give the packet a chance to go through the net stack */
1315 k_msleep(10);
1316
1317 rx_buf = 0;
1318 rv = zsock_recv(sock_c, &rx_buf, sizeof(rx_buf), ZSOCK_MSG_DONTWAIT);
1319 zassert_equal(rv, sizeof(rx_buf), "recv failed");
1320 zassert_equal(rx_buf, tx_buf, "wrong data");
1321
1322 /* Verify that a datagram is not received from other address */
1323 rv = zsock_sendto(sock_s2, &tx_buf, sizeof(tx_buf), 0, addr_c, addrlen_c);
1324 zassert_equal(rv, sizeof(tx_buf), "send failed");
1325
1326 /* Give the packet a chance to go through the net stack */
1327 k_msleep(10);
1328
1329 rv = zsock_recv(sock_c, &rx_buf, sizeof(rx_buf), ZSOCK_MSG_DONTWAIT);
1330 zassert_equal(rv, -1, "recv should've failed");
1331 zassert_equal(errno, EAGAIN, "incorrect errno");
1332
1333 rv = zsock_close(sock_c);
1334 zassert_equal(rv, 0, "close failed");
1335 rv = zsock_close(sock_s1);
1336 zassert_equal(rv, 0, "close failed");
1337 rv = zsock_close(sock_s2);
1338 zassert_equal(rv, 0, "close failed");
1339 }
1340
ZTEST(net_socket_udp,test_v4_dgram_connected)1341 ZTEST(net_socket_udp, test_v4_dgram_connected)
1342 {
1343 int client_sock;
1344 int server_sock_1;
1345 int server_sock_2;
1346 struct net_sockaddr_in client_addr;
1347 struct net_sockaddr_in server_addr_1;
1348 struct net_sockaddr_in server_addr_2;
1349
1350 prepare_sock_udp_v4(MY_IPV4_ADDR, CLIENT_PORT, &client_sock, &client_addr);
1351 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock_1, &server_addr_1);
1352 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT + 1, &server_sock_2, &server_addr_2);
1353
1354 test_dgram_connected(client_sock, server_sock_1, server_sock_2,
1355 (struct net_sockaddr *)&client_addr, sizeof(client_addr),
1356 (struct net_sockaddr *)&server_addr_1, sizeof(server_addr_1),
1357 (struct net_sockaddr *)&server_addr_2, sizeof(server_addr_2));
1358 }
1359
ZTEST(net_socket_udp,test_v6_dgram_connected)1360 ZTEST(net_socket_udp, test_v6_dgram_connected)
1361 {
1362 int client_sock;
1363 int server_sock_1;
1364 int server_sock_2;
1365 struct net_sockaddr_in6 client_addr;
1366 struct net_sockaddr_in6 server_addr_1;
1367 struct net_sockaddr_in6 server_addr_2;
1368
1369 prepare_sock_udp_v6(MY_IPV6_ADDR, CLIENT_PORT, &client_sock, &client_addr);
1370 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock_1, &server_addr_1);
1371 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT + 1, &server_sock_2, &server_addr_2);
1372
1373 test_dgram_connected(client_sock, server_sock_1, server_sock_2,
1374 (struct net_sockaddr *)&client_addr, sizeof(client_addr),
1375 (struct net_sockaddr *)&server_addr_1, sizeof(server_addr_1),
1376 (struct net_sockaddr *)&server_addr_2, sizeof(server_addr_2));
1377 }
1378
ZTEST_USER(net_socket_udp,test_recvmsg_invalid)1379 ZTEST_USER(net_socket_udp, test_recvmsg_invalid)
1380 {
1381 struct net_msghdr msg;
1382 struct net_sockaddr_in6 server_addr;
1383 struct net_cmsghdr *cmsg;
1384 struct net_iovec io_vector[1];
1385 union {
1386 struct net_cmsghdr hdr;
1387 unsigned char buf[NET_CMSG_SPACE(sizeof(int))];
1388 } cmsgbuf;
1389 int ret;
1390
1391 /* Userspace is needed for this test */
1392 Z_TEST_SKIP_IFNDEF(CONFIG_USERSPACE);
1393
1394 io_vector[0].iov_base = TEST_STR_SMALL;
1395 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
1396
1397 ret = zsock_recvmsg(0, NULL, 0);
1398 zassert_true(ret < 0 && errno == EINVAL, "Wrong errno (%d)", errno);
1399
1400 /* Set various pointers to NULL or invalid value which should cause failure */
1401 memset(&msg, 0, sizeof(msg));
1402 msg.msg_controllen = sizeof(cmsgbuf.buf);
1403
1404 ret = zsock_recvmsg(0, &msg, 0);
1405 zassert_true(ret < 0, "recvmsg() succeed");
1406
1407 msg.msg_control = &cmsgbuf.buf;
1408
1409 ret = zsock_recvmsg(0, &msg, 0);
1410 zassert_true(ret < 0 && errno == ENOMEM, "Wrong errno (%d)", errno);
1411
1412 msg.msg_iov = io_vector;
1413 msg.msg_iovlen = 1;
1414 msg.msg_name = (void *)1;
1415 msg.msg_namelen = sizeof(server_addr);
1416
1417 cmsg = NET_CMSG_FIRSTHDR(&msg);
1418 cmsg->cmsg_len = NET_CMSG_LEN(sizeof(int));
1419 cmsg->cmsg_level = ZSOCK_SOL_SOCKET;
1420 cmsg->cmsg_type = 1122;
1421 *(int *)NET_CMSG_DATA(cmsg) = 42;
1422
1423 ret = zsock_recvmsg(0, &msg, 0);
1424 zassert_true(ret < 0, "recvmsg() succeed");
1425 }
1426
comm_sendmsg_recvmsg(int client_sock,struct net_sockaddr * client_addr,net_socklen_t client_addrlen,const struct net_msghdr * client_msg,int server_sock,struct net_sockaddr * server_addr,net_socklen_t server_addrlen,struct net_msghdr * msg,void * cmsgbuf,int cmsgbuf_len,bool expect_control_data)1427 static void comm_sendmsg_recvmsg(int client_sock,
1428 struct net_sockaddr *client_addr,
1429 net_socklen_t client_addrlen,
1430 const struct net_msghdr *client_msg,
1431 int server_sock,
1432 struct net_sockaddr *server_addr,
1433 net_socklen_t server_addrlen,
1434 struct net_msghdr *msg,
1435 void *cmsgbuf, int cmsgbuf_len,
1436 bool expect_control_data)
1437 {
1438 #define MAX_BUF_LEN 64
1439 #define SMALL_BUF_LEN (sizeof(TEST_STR_SMALL) - 1 - 2)
1440 char buf[MAX_BUF_LEN];
1441 char buf2[SMALL_BUF_LEN];
1442 struct net_iovec io_vector[2];
1443 ssize_t sent;
1444 ssize_t recved;
1445 struct net_sockaddr addr;
1446 net_socklen_t addrlen = server_addrlen;
1447 int len, i;
1448
1449 zassert_not_null(client_addr, "null client addr");
1450 zassert_not_null(server_addr, "null server addr");
1451
1452 /*
1453 * Test client -> server sending
1454 */
1455
1456 sent = zsock_sendmsg(client_sock, client_msg, 0);
1457 zassert_true(sent > 0, "sendmsg failed, %s (%d)", strerror(errno), -errno);
1458
1459 /* One negative test with invalid msg_iov */
1460 memset(msg, 0, sizeof(*msg));
1461 recved = zsock_recvmsg(server_sock, msg, 0);
1462 zassert_true(recved < 0 && errno == ENOMEM, "Wrong errno (%d)", errno);
1463
1464 for (i = 0, len = 0; i < client_msg->msg_iovlen; i++) {
1465 len += client_msg->msg_iov[i].iov_len;
1466 }
1467
1468 zassert_equal(sent, len, "iovec len (%d) vs sent (%d)", len, sent);
1469
1470 /* Test first with one iovec */
1471 io_vector[0].iov_base = buf;
1472 io_vector[0].iov_len = sizeof(buf);
1473
1474 memset(msg, 0, sizeof(*msg));
1475 if (cmsgbuf != NULL) {
1476 memset(cmsgbuf, 0, cmsgbuf_len);
1477 }
1478 msg->msg_control = cmsgbuf;
1479 msg->msg_controllen = cmsgbuf_len;
1480 msg->msg_iov = io_vector;
1481 msg->msg_iovlen = 1;
1482 msg->msg_name = &addr;
1483 msg->msg_namelen = addrlen;
1484
1485 /* Test recvmsg(MSG_PEEK) */
1486 recved = zsock_recvmsg(server_sock, msg, ZSOCK_MSG_PEEK);
1487 zassert_true(recved > 0, "recvmsg fail, %s (%d)", strerror(errno), -errno);
1488 zassert_equal(recved, len, "unexpected received bytes (%d vs %d)",
1489 recved, len);
1490 zassert_equal(sent, recved, "sent(%d)/received(%d) mismatch",
1491 sent, recved);
1492 zassert_equal(msg->msg_iovlen, 1, "recvmsg should not modify msg_iovlen");
1493 zassert_equal(msg->msg_iov[0].iov_len, sizeof(buf),
1494 "recvmsg should not modify buffer length");
1495 zassert_mem_equal(buf, TEST_STR_SMALL, len,
1496 "wrong data (%s)", rx_buf);
1497 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
1498
1499 /* Test normal recvmsg() */
1500 clear_buf(rx_buf);
1501 recved = zsock_recvmsg(server_sock, msg, 0);
1502 zassert_true(recved > 0, "recvfrom fail");
1503 zassert_equal(recved, len, "unexpected received bytes");
1504 zassert_equal(msg->msg_iovlen, 1, "recvmsg should not modify msg_iovlen");
1505 zassert_equal(msg->msg_iov[0].iov_len, sizeof(buf),
1506 "recvmsg should not modify buffer length");
1507 zassert_mem_equal(buf, TEST_STR_SMALL, len,
1508 "wrong data (%s)", rx_buf);
1509 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
1510
1511 /* Control data should be empty */
1512 if (!expect_control_data) {
1513 zassert_equal(msg->msg_controllen, 0,
1514 "We received control data (%u vs %zu)",
1515 0U, msg->msg_controllen);
1516 }
1517
1518 /* Check the client port */
1519 if (addr.sa_family == NET_AF_INET) {
1520 if (net_sin(client_addr)->sin_port != ANY_PORT) {
1521 zassert_equal(net_sin(client_addr)->sin_port,
1522 net_sin(&addr)->sin_port,
1523 "unexpected client port");
1524 }
1525 }
1526
1527 if (addr.sa_family == NET_AF_INET6) {
1528 if (net_sin6(client_addr)->sin6_port != ANY_PORT) {
1529 zassert_equal(net_sin6(client_addr)->sin6_port,
1530 net_sin6(&addr)->sin6_port,
1531 "unexpected client port");
1532 }
1533 }
1534
1535 /* Then send the message again and verify that we could receive
1536 * the full message in smaller chunks too.
1537 */
1538 sent = zsock_sendmsg(client_sock, client_msg, 0);
1539 zassert_true(sent > 0, "sendmsg failed (%d)", -errno);
1540
1541 for (i = 0, len = 0; i < client_msg->msg_iovlen; i++) {
1542 len += client_msg->msg_iov[i].iov_len;
1543 }
1544
1545 zassert_equal(sent, len, "iovec len (%d) vs sent (%d)", len, sent);
1546
1547 /* and then test with two iovec */
1548 io_vector[0].iov_base = buf2;
1549 io_vector[0].iov_len = sizeof(buf2);
1550 io_vector[1].iov_base = buf;
1551 io_vector[1].iov_len = sizeof(buf);
1552
1553 memset(msg, 0, sizeof(*msg));
1554 if (cmsgbuf != NULL) {
1555 memset(cmsgbuf, 0, cmsgbuf_len);
1556 }
1557 msg->msg_control = cmsgbuf;
1558 msg->msg_controllen = cmsgbuf_len;
1559 msg->msg_iov = io_vector;
1560 msg->msg_iovlen = 2;
1561 msg->msg_name = &addr;
1562 msg->msg_namelen = addrlen;
1563
1564 /* Test recvmsg(MSG_PEEK) */
1565 recved = zsock_recvmsg(server_sock, msg, ZSOCK_MSG_PEEK);
1566 zassert_true(recved >= 0, "recvfrom fail (errno %d)", errno);
1567 zassert_equal(recved, len,
1568 "unexpected received bytes (%d vs %d)", recved, len);
1569 zassert_equal(sent, recved, "sent(%d)/received(%d) mismatch",
1570 sent, recved);
1571
1572 zassert_equal(msg->msg_iovlen, 2, "recvmsg should not modify msg_iovlen");
1573 zassert_equal(msg->msg_iov[0].iov_len, sizeof(buf2),
1574 "recvmsg should not modify buffer length");
1575 zassert_equal(msg->msg_iov[1].iov_len, sizeof(buf),
1576 "recvmsg should not modify buffer length");
1577 zassert_mem_equal(msg->msg_iov[0].iov_base, TEST_STR_SMALL, msg->msg_iov[0].iov_len,
1578 "wrong data in %s", "iov[0]");
1579 zassert_mem_equal(msg->msg_iov[1].iov_base, &TEST_STR_SMALL[msg->msg_iov[0].iov_len],
1580 len - msg->msg_iov[0].iov_len,
1581 "wrong data in %s", "iov[1]");
1582 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
1583
1584 /* Test normal recvfrom() */
1585 recved = zsock_recvmsg(server_sock, msg, ZSOCK_MSG_PEEK);
1586 zassert_true(recved >= 0, "recvfrom fail (errno %d)", errno);
1587 zassert_equal(recved, len,
1588 "unexpected received bytes (%d vs %d)", recved, len);
1589 zassert_equal(sent, recved, "sent(%d)/received(%d) mismatch",
1590 sent, recved);
1591
1592 zassert_equal(msg->msg_iovlen, 2, "recvmsg should not modify msg_iovlen");
1593 zassert_equal(msg->msg_iov[0].iov_len, sizeof(buf2),
1594 "recvmsg should not modify buffer length");
1595 zassert_equal(msg->msg_iov[1].iov_len, sizeof(buf),
1596 "recvmsg should not modify buffer length");
1597 zassert_mem_equal(msg->msg_iov[0].iov_base, TEST_STR_SMALL, msg->msg_iov[0].iov_len,
1598 "wrong data in %s", "iov[0]");
1599 zassert_mem_equal(msg->msg_iov[1].iov_base, &TEST_STR_SMALL[msg->msg_iov[0].iov_len],
1600 len - msg->msg_iov[0].iov_len,
1601 "wrong data in %s", "iov[1]");
1602 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
1603
1604 /* Control data should be empty */
1605 if (!expect_control_data) {
1606 zassert_equal(msg->msg_controllen, 0,
1607 "We received control data (%u vs %zu)",
1608 0U, msg->msg_controllen);
1609 }
1610
1611 /* Then check that the trucation flag is set correctly */
1612 sent = zsock_sendmsg(client_sock, client_msg, 0);
1613 zassert_true(sent > 0, "sendmsg failed (%d)", -errno);
1614
1615 for (i = 0, len = 0; i < client_msg->msg_iovlen; i++) {
1616 len += client_msg->msg_iov[i].iov_len;
1617 }
1618
1619 zassert_equal(sent, len, "iovec len (%d) vs sent (%d)", len, sent);
1620
1621 /* Test first with one iovec */
1622 io_vector[0].iov_base = buf2;
1623 io_vector[0].iov_len = sizeof(buf2);
1624
1625 memset(msg, 0, sizeof(*msg));
1626 if (cmsgbuf != NULL) {
1627 memset(cmsgbuf, 0, cmsgbuf_len);
1628 }
1629 msg->msg_control = cmsgbuf;
1630 msg->msg_controllen = cmsgbuf_len;
1631 msg->msg_iov = io_vector;
1632 msg->msg_iovlen = 1;
1633 msg->msg_name = &addr;
1634 msg->msg_namelen = addrlen;
1635
1636 /* Test recvmsg */
1637 recved = zsock_recvmsg(server_sock, msg, 0);
1638 zassert_true(recved > 0, "recvmsg fail, %s (%d)", strerror(errno), errno);
1639 zassert_equal(recved, sizeof(buf2),
1640 "unexpected received bytes (%d vs %d)",
1641 recved, sizeof(buf2));
1642 zassert_true(msg->msg_flags & ZSOCK_MSG_TRUNC, "Message not truncated");
1643
1644 zassert_equal(msg->msg_iovlen, 1, "recvmsg should not modify msg_iovlen");
1645 zassert_equal(msg->msg_iov[0].iov_len, sizeof(buf2),
1646 "recvmsg should not modify buffer length");
1647 zassert_mem_equal(buf2, TEST_STR_SMALL, sizeof(buf2),
1648 "wrong data (%s)", buf2);
1649 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
1650
1651 /* Control data should be empty */
1652 if (!expect_control_data) {
1653 zassert_equal(msg->msg_controllen, 0,
1654 "We received control data (%u vs %zu)",
1655 0U, msg->msg_controllen);
1656 }
1657 }
1658
ZTEST_USER(net_socket_udp,test_recvmsg_user)1659 ZTEST_USER(net_socket_udp, test_recvmsg_user)
1660 {
1661 int rv;
1662 int client_sock;
1663 int server_sock;
1664 struct net_sockaddr_in client_addr;
1665 struct net_sockaddr_in server_addr;
1666 struct net_msghdr msg, server_msg;
1667 struct net_iovec io_vector[1];
1668
1669 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
1670 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
1671
1672 rv = zsock_bind(server_sock,
1673 (struct net_sockaddr *)&server_addr,
1674 sizeof(server_addr));
1675 zassert_equal(rv, 0, "server bind failed");
1676
1677 rv = zsock_bind(client_sock,
1678 (struct net_sockaddr *)&client_addr,
1679 sizeof(client_addr));
1680 zassert_equal(rv, 0, "client bind failed");
1681
1682 io_vector[0].iov_base = TEST_STR_SMALL;
1683 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
1684
1685 memset(&msg, 0, sizeof(msg));
1686 msg.msg_iov = io_vector;
1687 msg.msg_iovlen = 1;
1688 msg.msg_name = &server_addr;
1689 msg.msg_namelen = sizeof(server_addr);
1690
1691 comm_sendmsg_recvmsg(client_sock,
1692 (struct net_sockaddr *)&client_addr,
1693 sizeof(client_addr),
1694 &msg,
1695 server_sock,
1696 (struct net_sockaddr *)&server_addr,
1697 sizeof(server_addr),
1698 &server_msg, NULL, 0, false);
1699
1700 rv = zsock_close(client_sock);
1701 zassert_equal(rv, 0, "close failed");
1702 rv = zsock_close(server_sock);
1703 zassert_equal(rv, 0, "close failed");
1704 }
1705
run_ancillary_recvmsg_test(int client_sock,struct net_sockaddr * client_addr,int client_addr_len,int server_sock,struct net_sockaddr * server_addr,int server_addr_len)1706 static void run_ancillary_recvmsg_test(int client_sock,
1707 struct net_sockaddr *client_addr,
1708 int client_addr_len,
1709 int server_sock,
1710 struct net_sockaddr *server_addr,
1711 int server_addr_len)
1712 {
1713 int rv;
1714 int opt;
1715 int ifindex = 0;
1716 net_socklen_t optlen;
1717 struct net_sockaddr addr = { 0 };
1718 struct net_if *iface;
1719 struct net_msghdr msg;
1720 struct net_msghdr server_msg;
1721 struct net_iovec io_vector[1];
1722 struct net_cmsghdr *cmsg, *prevcmsg;
1723 union {
1724 struct net_cmsghdr hdr;
1725 unsigned char buf[NET_CMSG_SPACE(sizeof(struct net_in6_pktinfo))];
1726 } cmsgbuf;
1727 #define SMALL_BUF_LEN (sizeof(TEST_STR_SMALL) - 1 - 2)
1728 char buf[MAX_BUF_LEN];
1729
1730 Z_TEST_SKIP_IFNDEF(CONFIG_NET_CONTEXT_RECV_PKTINFO);
1731
1732 rv = zsock_bind(server_sock, server_addr, server_addr_len);
1733 zassert_equal(rv, 0, "server bind failed");
1734
1735 rv = zsock_bind(client_sock, client_addr, client_addr_len);
1736 zassert_equal(rv, 0, "client bind failed");
1737
1738 io_vector[0].iov_base = TEST_STR_SMALL;
1739 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
1740
1741 memset(&cmsgbuf, 0, sizeof(cmsgbuf));
1742
1743 memset(&msg, 0, sizeof(msg));
1744 msg.msg_iov = io_vector;
1745 msg.msg_iovlen = 1;
1746 msg.msg_name = server_addr;
1747 msg.msg_namelen = server_addr_len;
1748
1749 comm_sendmsg_recvmsg(client_sock,
1750 client_addr,
1751 client_addr_len,
1752 &msg,
1753 server_sock,
1754 server_addr,
1755 server_addr_len,
1756 &server_msg,
1757 &cmsgbuf.buf,
1758 sizeof(cmsgbuf.buf),
1759 true);
1760
1761 for (prevcmsg = NULL, cmsg = NET_CMSG_FIRSTHDR(&server_msg);
1762 cmsg != NULL && prevcmsg != cmsg;
1763 prevcmsg = cmsg, cmsg = NET_CMSG_NXTHDR(&server_msg, cmsg)) {
1764 if (cmsg->cmsg_level == NET_IPPROTO_IP &&
1765 cmsg->cmsg_type == ZSOCK_IP_PKTINFO) {
1766 net_sin(&addr)->sin_addr =
1767 ((struct net_in_pktinfo *)NET_CMSG_DATA(cmsg))->ipi_addr;
1768 break;
1769 }
1770 }
1771
1772 /* As we have not set the socket option, the address should not be set */
1773 if (server_addr->sa_family == NET_AF_INET) {
1774 zassert_equal(net_sin(&addr)->sin_addr.s_addr, NET_INADDR_ANY,
1775 "Source address set!");
1776 }
1777
1778 if (server_addr->sa_family == NET_AF_INET6) {
1779 zassert_true(net_sin6(&addr)->sin6_addr.s6_addr32[0] == 0 &&
1780 net_sin6(&addr)->sin6_addr.s6_addr32[1] == 0 &&
1781 net_sin6(&addr)->sin6_addr.s6_addr32[2] == 0 &&
1782 net_sin6(&addr)->sin6_addr.s6_addr32[3] == 0,
1783 "Source address set!");
1784 }
1785
1786 opt = 1;
1787 optlen = sizeof(opt);
1788 if (server_addr->sa_family == NET_AF_INET) {
1789 rv = zsock_setsockopt(server_sock, NET_IPPROTO_IP,
1790 ZSOCK_IP_PKTINFO, &opt, optlen);
1791 } else {
1792 rv = zsock_setsockopt(server_sock, NET_IPPROTO_IPV6,
1793 ZSOCK_IPV6_RECVPKTINFO, &opt, optlen);
1794 }
1795 zassert_equal(rv, 0, "setsockopt failed (%d)", -errno);
1796
1797 memset(&cmsgbuf, 0, sizeof(cmsgbuf));
1798
1799 memset(&msg, 0, sizeof(msg));
1800 msg.msg_iov = io_vector;
1801 msg.msg_iovlen = 1;
1802 msg.msg_name = server_addr;
1803 msg.msg_namelen = server_addr_len;
1804
1805 comm_sendmsg_recvmsg(client_sock,
1806 client_addr,
1807 client_addr_len,
1808 &msg,
1809 server_sock,
1810 server_addr,
1811 server_addr_len,
1812 &server_msg,
1813 &cmsgbuf.buf,
1814 sizeof(cmsgbuf.buf),
1815 true);
1816
1817 for (cmsg = NET_CMSG_FIRSTHDR(&server_msg); cmsg != NULL;
1818 cmsg = NET_CMSG_NXTHDR(&server_msg, cmsg)) {
1819 if (cmsg->cmsg_level == NET_IPPROTO_IP &&
1820 cmsg->cmsg_type == ZSOCK_IP_PKTINFO) {
1821 net_sin(&addr)->sin_addr =
1822 ((struct net_in_pktinfo *)NET_CMSG_DATA(cmsg))->ipi_addr;
1823 ifindex = ((struct net_in_pktinfo *)NET_CMSG_DATA(cmsg))->ipi_ifindex;
1824 break;
1825 }
1826
1827 if (cmsg->cmsg_level == NET_IPPROTO_IPV6 &&
1828 cmsg->cmsg_type == ZSOCK_IPV6_PKTINFO) {
1829 net_ipaddr_copy(&net_sin6(&addr)->sin6_addr,
1830 &((struct net_in6_pktinfo *)NET_CMSG_DATA(cmsg))->ipi6_addr);
1831 ifindex = ((struct net_in6_pktinfo *)NET_CMSG_DATA(cmsg))->ipi6_ifindex;
1832 break;
1833 }
1834 }
1835
1836 if (server_addr->sa_family == NET_AF_INET) {
1837 zassert_equal(net_sin(&addr)->sin_addr.s_addr,
1838 net_sin(server_addr)->sin_addr.s_addr,
1839 "Source address not set properly!");
1840 }
1841
1842 if (server_addr->sa_family == NET_AF_INET6) {
1843 zassert_mem_equal(&net_sin6(&addr)->sin6_addr,
1844 &net_sin6(server_addr)->sin6_addr,
1845 sizeof(struct net_in6_addr),
1846 "Source address not set properly!");
1847 }
1848
1849 if (!k_is_user_context()) {
1850 iface = net_if_get_default();
1851 zassert_equal(ifindex, net_if_get_by_iface(iface));
1852 }
1853
1854 /* Make sure that the recvmsg() fails if control area is too small */
1855 rv = zsock_sendto(client_sock, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1, 0,
1856 server_addr, server_addr_len);
1857 zassert_equal(rv, STRLEN(TEST_STR_SMALL), "sendto failed (%d)", -errno);
1858
1859 io_vector[0].iov_base = buf;
1860 io_vector[0].iov_len = sizeof(buf);
1861
1862 memset(&msg, 0, sizeof(msg));
1863 msg.msg_control = &cmsgbuf.buf;
1864 msg.msg_controllen = 1; /* making sure the control buf is always too small */
1865 msg.msg_iov = io_vector;
1866 msg.msg_iovlen = 1;
1867
1868 rv = zsock_recvmsg(server_sock, &msg, 0);
1869 zassert_true(rv, "recvmsg succeed (%d)", rv);
1870
1871 zassert_true(msg.msg_flags & ZSOCK_MSG_CTRUNC, "Control message not truncated");
1872
1873 rv = zsock_close(client_sock);
1874 zassert_equal(rv, 0, "close failed");
1875 rv = zsock_close(server_sock);
1876 zassert_equal(rv, 0, "close failed");
1877 }
1878
ZTEST_USER(net_socket_udp,test_recvmsg_ancillary_ipv4_pktinfo_data_user)1879 ZTEST_USER(net_socket_udp, test_recvmsg_ancillary_ipv4_pktinfo_data_user)
1880 {
1881 struct net_sockaddr_in client_addr;
1882 struct net_sockaddr_in server_addr;
1883 int client_sock;
1884 int server_sock;
1885
1886 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
1887 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
1888
1889 run_ancillary_recvmsg_test(client_sock,
1890 (struct net_sockaddr *)&client_addr,
1891 sizeof(client_addr),
1892 server_sock,
1893 (struct net_sockaddr *)&server_addr,
1894 sizeof(server_addr));
1895 }
1896
ZTEST_USER(net_socket_udp,test_recvmsg_ancillary_ipv6_pktinfo_data_user)1897 ZTEST_USER(net_socket_udp, test_recvmsg_ancillary_ipv6_pktinfo_data_user)
1898 {
1899 struct net_sockaddr_in6 client_addr;
1900 struct net_sockaddr_in6 server_addr;
1901 int client_sock;
1902 int server_sock;
1903
1904 prepare_sock_udp_v6(MY_IPV6_ADDR, ANY_PORT, &client_sock, &client_addr);
1905 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
1906
1907 run_ancillary_recvmsg_test(client_sock,
1908 (struct net_sockaddr *)&client_addr,
1909 sizeof(client_addr),
1910 server_sock,
1911 (struct net_sockaddr *)&server_addr,
1912 sizeof(server_addr));
1913 }
1914
bind_socket(int sock,struct net_if * iface)1915 static int bind_socket(int sock, struct net_if *iface)
1916 {
1917 struct net_sockaddr_ll addr;
1918
1919 memset(&addr, 0, sizeof(addr));
1920
1921 addr.sll_ifindex = net_if_get_by_iface(iface);
1922 addr.sll_family = NET_AF_PACKET;
1923
1924 return zsock_bind(sock, (struct net_sockaddr *)&addr, sizeof(addr));
1925 }
1926
test_check_ttl(int sock_c,int sock_s,int sock_p,struct net_sockaddr * addr_c,net_socklen_t addrlen_c,struct net_sockaddr * addr_s,net_socklen_t addrlen_s,struct net_sockaddr * addr_sendto,net_socklen_t addrlen_sendto,net_sa_family_t family,uint8_t expected_ttl,uint8_t expected_mcast_ttl)1927 static void test_check_ttl(int sock_c, int sock_s, int sock_p,
1928 struct net_sockaddr *addr_c, net_socklen_t addrlen_c,
1929 struct net_sockaddr *addr_s, net_socklen_t addrlen_s,
1930 struct net_sockaddr *addr_sendto, net_socklen_t addrlen_sendto,
1931 net_sa_family_t family, uint8_t expected_ttl,
1932 uint8_t expected_mcast_ttl)
1933 {
1934 uint8_t tx_buf = 0xab;
1935 uint8_t rx_buf;
1936 int ret, count = 10, opt;
1937 #define IPV4_HDR_SIZE sizeof(struct net_ipv4_hdr)
1938 #define IPV6_HDR_SIZE sizeof(struct net_ipv6_hdr)
1939 #define UDP_HDR_SIZE sizeof(struct net_udp_hdr)
1940 #define V4_HDR_SIZE (IPV4_HDR_SIZE + UDP_HDR_SIZE)
1941 #define V6_HDR_SIZE (IPV6_HDR_SIZE + UDP_HDR_SIZE)
1942 #define MAX_HDR_SIZE (IPV6_HDR_SIZE + UDP_HDR_SIZE)
1943 uint8_t data_to_receive[sizeof(tx_buf) + MAX_HDR_SIZE];
1944 struct net_sockaddr_ll src;
1945 net_socklen_t addrlen;
1946 char ifname[CONFIG_NET_INTERFACE_NAME_LEN];
1947 struct net_ifreq ifreq = { 0 };
1948 struct timeval timeo_optval = {
1949 .tv_sec = 0,
1950 .tv_usec = 100000,
1951 };
1952 #if defined(CONFIG_NET_STATISTICS)
1953 struct net_stats_ip ipv4_stats_before, ipv4_stats_after;
1954 struct net_stats_ip ipv6_stats_before, ipv6_stats_after;
1955 #endif
1956
1957 Z_TEST_SKIP_IFNDEF(CONFIG_NET_INTERFACE_NAME);
1958
1959 ret = zsock_bind(sock_c, addr_c, addrlen_c);
1960 zassert_equal(ret, 0, "client bind failed");
1961
1962 ret = net_if_get_name(lo0, ifname, sizeof(ifname));
1963 zassert_true(ret > 0, "cannot get interface name (%d)", ret);
1964
1965 strncpy(ifreq.ifr_name, ifname, sizeof(ifreq.ifr_name));
1966 ret = zsock_setsockopt(sock_c, ZSOCK_SOL_SOCKET, ZSOCK_SO_BINDTODEVICE, &ifreq,
1967 sizeof(ifreq));
1968 zassert_equal(ret, 0, "SO_BINDTODEVICE failed, %d", -errno);
1969
1970 ret = zsock_connect(sock_c, addr_s, addrlen_s);
1971 zassert_equal(ret, 0, "connect failed");
1972
1973 ret = zsock_setsockopt(sock_s, ZSOCK_SOL_SOCKET, ZSOCK_SO_RCVTIMEO,
1974 &timeo_optval, sizeof(timeo_optval));
1975 zassert_equal(ret, 0, "Cannot set receive timeout (%d)", -errno);
1976
1977 while (count > 0) {
1978 ret = zsock_sendto(sock_c, &tx_buf, sizeof(tx_buf), 0,
1979 addr_sendto, addrlen_sendto);
1980 zassert_equal(ret, sizeof(tx_buf), "send failed (%d)", -errno);
1981
1982 ret = zsock_recv(sock_s, &rx_buf, sizeof(rx_buf), ZSOCK_MSG_DONTWAIT);
1983 if (ret > 0) {
1984 zassert_equal(ret, sizeof(rx_buf), "recv failed (%d)", ret);
1985 zassert_equal(rx_buf, tx_buf, "wrong data");
1986 }
1987
1988 ret = zsock_recvfrom(sock_p, data_to_receive, sizeof(data_to_receive), 0,
1989 (struct net_sockaddr *)&src, &addrlen);
1990 if (ret > 0) {
1991 int hdr_size = family == NET_AF_INET ?
1992 V4_HDR_SIZE : V6_HDR_SIZE;
1993 zassert_equal(ret, sizeof(tx_buf) + hdr_size,
1994 "Cannot receive all data (%d vs %zd) (%d)",
1995 ret, sizeof(tx_buf), -errno);
1996 zassert_mem_equal(&data_to_receive[hdr_size], &tx_buf,
1997 sizeof(tx_buf),
1998 "Sent and received buffers do not match");
1999
2000 if (family == NET_AF_INET) {
2001 struct net_ipv4_hdr *ipv4 =
2002 (struct net_ipv4_hdr *)&data_to_receive[0];
2003
2004 if (expected_ttl > 0) {
2005 zassert_equal(ipv4->ttl, expected_ttl,
2006 "Invalid ttl (%d vs %d)",
2007 ipv4->ttl, expected_ttl);
2008 } else if (expected_mcast_ttl > 0) {
2009 zassert_equal(ipv4->ttl, expected_mcast_ttl,
2010 "Invalid mcast ttl (%d vs %d)",
2011 ipv4->ttl, expected_mcast_ttl);
2012 }
2013 } else if (family == NET_AF_INET6) {
2014 struct net_ipv6_hdr *ipv6 =
2015 (struct net_ipv6_hdr *)&data_to_receive[0];
2016
2017 if (expected_ttl > 0) {
2018 zassert_equal(ipv6->hop_limit, expected_ttl,
2019 "Invalid hop limit (%d vs %d)",
2020 ipv6->hop_limit, expected_ttl);
2021 } else if (expected_mcast_ttl > 0) {
2022 zassert_equal(ipv6->hop_limit, expected_mcast_ttl,
2023 "Invalid mcast hop limit (%d vs %d)",
2024 ipv6->hop_limit, expected_mcast_ttl);
2025 }
2026 } else {
2027 zassert_true(false, "Invalid address family (%d)",
2028 family);
2029 }
2030
2031 break;
2032 }
2033
2034 count--;
2035 }
2036
2037 zassert_true(count > 0, "timeout while waiting data");
2038
2039 if (family == NET_AF_INET) {
2040 /* Set TTL to 0 and make sure the packet is dropped and not
2041 * received
2042 */
2043 int option;
2044
2045 if (expected_ttl > 0) {
2046 option = ZSOCK_IP_TTL;
2047 } else {
2048 option = ZSOCK_IP_MULTICAST_TTL;
2049 }
2050
2051 opt = 0;
2052 ret = zsock_setsockopt(sock_c, NET_IPPROTO_IP, option, &opt, sizeof(opt));
2053 zassert_equal(ret, 0, "Cannot set %s TTL (%d)",
2054 option == ZSOCK_IP_TTL ? "unicast" : "multicast",
2055 -errno);
2056
2057 #if defined(CONFIG_NET_STATISTICS)
2058 /* Get IPv4 stats and verify they are updated for dropped
2059 * packets.
2060 */
2061 net_mgmt(NET_REQUEST_STATS_GET_IPV4, lo0,
2062 &ipv4_stats_before, sizeof(ipv4_stats_before));
2063 #endif
2064 ret = zsock_sendto(sock_c, &tx_buf, sizeof(tx_buf), 0,
2065 addr_sendto, addrlen_sendto);
2066 zassert_equal(ret, sizeof(tx_buf), "send failed (%d)", -errno);
2067
2068 #if defined(CONFIG_NET_STATISTICS)
2069 net_mgmt(NET_REQUEST_STATS_GET_IPV4, lo0,
2070 &ipv4_stats_after, sizeof(ipv4_stats_after));
2071
2072 zassert_equal(ipv4_stats_before.drop + 1,
2073 ipv4_stats_after.drop,
2074 "Dropped statistics not updated (%d vs %d)",
2075 ipv4_stats_before.drop + 1,
2076 ipv4_stats_after.drop);
2077 #endif
2078 ret = zsock_recv(sock_s, &rx_buf, sizeof(rx_buf), 0);
2079 zassert_true(ret < 0 && errno == EAGAIN, "recv succeed (%d)", -errno);
2080 }
2081
2082 if (family == NET_AF_INET6) {
2083 /* Set hoplimit to 0 and make sure the packet is dropped and not
2084 * received.
2085 */
2086 int option;
2087
2088 if (expected_ttl > 0) {
2089 option = ZSOCK_IPV6_UNICAST_HOPS;
2090 } else {
2091 option = ZSOCK_IPV6_MULTICAST_HOPS;
2092 }
2093
2094 opt = 0;
2095 ret = zsock_setsockopt(sock_c, NET_IPPROTO_IPV6, option,
2096 &opt, sizeof(opt));
2097 zassert_equal(ret, 0, "Cannot set %s hops (%d)",
2098 option == ZSOCK_IPV6_UNICAST_HOPS ? "unicast" : "multicast",
2099 -errno);
2100
2101 #if defined(CONFIG_NET_STATISTICS)
2102 /* Get IPv6 stats and verify they are updated for dropped
2103 * packets.
2104 */
2105 net_mgmt(NET_REQUEST_STATS_GET_IPV6, lo0,
2106 &ipv6_stats_before, sizeof(ipv6_stats_before));
2107 #endif
2108 ret = zsock_sendto(sock_c, &tx_buf, sizeof(tx_buf), 0,
2109 addr_sendto, addrlen_sendto);
2110 zassert_equal(ret, sizeof(tx_buf), "send failed (%d)", -errno);
2111
2112 #if defined(CONFIG_NET_STATISTICS)
2113 net_mgmt(NET_REQUEST_STATS_GET_IPV6, lo0,
2114 &ipv6_stats_after, sizeof(ipv6_stats_after));
2115
2116 zassert_equal(ipv6_stats_before.drop + 1,
2117 ipv6_stats_after.drop,
2118 "Dropped statistics not updated (%d vs %d)",
2119 ipv6_stats_before.drop + 1,
2120 ipv6_stats_after.drop);
2121 #endif
2122 ret = zsock_recv(sock_s, &rx_buf, sizeof(rx_buf), 0);
2123 zassert_true(ret < 0 && errno == EAGAIN, "recv succeed (%d)", -errno);
2124
2125 }
2126
2127 ret = zsock_close(sock_c);
2128 zassert_equal(ret, 0, "close failed");
2129 ret = zsock_close(sock_s);
2130 zassert_equal(ret, 0, "close failed");
2131 ret = zsock_close(sock_p);
2132 zassert_equal(ret, 0, "close failed");
2133 }
2134
ZTEST(net_socket_udp,test_v4_ttl)2135 ZTEST(net_socket_udp, test_v4_ttl)
2136 {
2137 int ret;
2138 int client_sock;
2139 int server_sock;
2140 int packet_sock;
2141 int ttl, verify;
2142 net_socklen_t optlen;
2143 struct net_sockaddr_in client_addr;
2144 struct net_sockaddr_in server_addr;
2145
2146 Z_TEST_SKIP_IFNDEF(CONFIG_NET_SOCKETS_PACKET);
2147
2148 prepare_sock_udp_v4(MY_IPV4_ADDR, CLIENT_PORT, &client_sock, &client_addr);
2149 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
2150
2151 packet_sock = zsock_socket(NET_AF_PACKET, NET_SOCK_RAW, net_htons(ETH_P_ALL));
2152 zassert_true(packet_sock >= 0, "Cannot create packet socket (%d)", -errno);
2153
2154 ret = bind_socket(packet_sock, lo0);
2155 zassert_equal(ret, 0, "packet socket bind failed");
2156
2157 zassert_not_null(lo0->config.ip.ipv4,
2158 "Interface %d (%p) no IPv4 configured",
2159 net_if_get_by_iface(lo0), lo0);
2160
2161 ttl = 16;
2162 net_if_ipv4_set_ttl(lo0, ttl);
2163 verify = net_if_ipv4_get_ttl(lo0);
2164 zassert_equal(verify, ttl, "Different TTLs (%d vs %d)", ttl, verify);
2165
2166 ttl = 128;
2167 ret = zsock_setsockopt(client_sock, NET_IPPROTO_IP, ZSOCK_IP_TTL, &ttl, sizeof(ttl));
2168 zassert_equal(ret, 0, "Cannot set unicast TTL (%d)", -errno);
2169
2170 optlen = sizeof(verify);
2171 ret = zsock_getsockopt(client_sock, NET_IPPROTO_IP, ZSOCK_IP_TTL, &verify, &optlen);
2172 zassert_equal(ret, 0, "Cannot get unicast TTL (%d)", -errno);
2173 zassert_equal(verify, ttl, "Different unicast TTL (%d vs %d)",
2174 ttl, verify);
2175
2176 test_check_ttl(client_sock, server_sock, packet_sock,
2177 (struct net_sockaddr *)&client_addr, sizeof(client_addr),
2178 (struct net_sockaddr *)&server_addr, sizeof(server_addr),
2179 (struct net_sockaddr *)&server_addr, sizeof(server_addr),
2180 NET_AF_INET, ttl, 0);
2181 }
2182
ZTEST(net_socket_udp,test_v4_mcast_ttl)2183 ZTEST(net_socket_udp, test_v4_mcast_ttl)
2184 {
2185 int ret;
2186 int client_sock;
2187 int server_sock;
2188 int packet_sock;
2189 int mcast_ttl, verify;
2190 net_socklen_t optlen;
2191 struct net_sockaddr_in client_addr;
2192 struct net_sockaddr_in server_addr;
2193 struct net_sockaddr_in sendto_addr;
2194
2195 Z_TEST_SKIP_IFNDEF(CONFIG_NET_SOCKETS_PACKET);
2196
2197 prepare_sock_udp_v4(MY_IPV4_ADDR, CLIENT_PORT, &client_sock, &client_addr);
2198 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
2199
2200 packet_sock = zsock_socket(NET_AF_PACKET, NET_SOCK_RAW, net_htons(ETH_P_ALL));
2201 zassert_true(packet_sock >= 0, "Cannot create packet socket (%d)", -errno);
2202
2203 ret = bind_socket(packet_sock, lo0);
2204 zassert_equal(ret, 0, "packet socket bind failed");
2205
2206 zassert_not_null(lo0->config.ip.ipv4,
2207 "Interface %d (%p) no IPv4 configured",
2208 net_if_get_by_iface(lo0), lo0);
2209
2210 mcast_ttl = 8;
2211 ret = zsock_setsockopt(client_sock, NET_IPPROTO_IP, ZSOCK_IP_MULTICAST_TTL, &mcast_ttl,
2212 sizeof(mcast_ttl));
2213 zassert_equal(ret, 0, "Cannot set multicast ttl (%d)", -errno);
2214
2215 optlen = sizeof(verify);
2216 ret = zsock_getsockopt(client_sock, NET_IPPROTO_IP, ZSOCK_IP_MULTICAST_TTL, &verify,
2217 &optlen);
2218 zassert_equal(ret, 0, "Cannot get multicast ttl (%d)", -errno);
2219 zassert_equal(verify, mcast_ttl, "Different multicast TTLs (%d vs %d)",
2220 mcast_ttl, verify);
2221
2222 ret = net_addr_pton(NET_AF_INET, MY_MCAST_IPV4_ADDR, &sendto_addr.sin_addr);
2223 zassert_equal(ret, 0, "Cannot get IPv4 address (%d)", ret);
2224
2225 test_check_ttl(client_sock, server_sock, packet_sock,
2226 (struct net_sockaddr *)&client_addr, sizeof(client_addr),
2227 (struct net_sockaddr *)&server_addr, sizeof(server_addr),
2228 (struct net_sockaddr *)&sendto_addr, sizeof(sendto_addr),
2229 NET_AF_INET, 0, mcast_ttl);
2230 }
2231
ZTEST(net_socket_udp,test_v6_mcast_hops)2232 ZTEST(net_socket_udp, test_v6_mcast_hops)
2233 {
2234 int ret;
2235 int client_sock;
2236 int server_sock;
2237 int packet_sock;
2238 int mcast_hops, if_mcast_hops;
2239 int verify, opt;
2240 net_socklen_t optlen;
2241 struct net_sockaddr_in6 client_addr;
2242 struct net_sockaddr_in6 server_addr;
2243 struct net_sockaddr_in6 sendto_addr;
2244
2245 Z_TEST_SKIP_IFNDEF(CONFIG_NET_SOCKETS_PACKET);
2246
2247 prepare_sock_udp_v6(MY_IPV6_ADDR, CLIENT_PORT, &client_sock, &client_addr);
2248 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
2249
2250 packet_sock = zsock_socket(NET_AF_PACKET, NET_SOCK_RAW, net_htons(ETH_P_ALL));
2251 zassert_true(packet_sock >= 0, "Cannot create packet socket (%d)", -errno);
2252
2253 ret = bind_socket(packet_sock, lo0);
2254 zassert_equal(ret, 0, "packet socket bind failed");
2255
2256 zassert_not_null(lo0->config.ip.ipv6,
2257 "Interface %d (%p) no IPv6 configured",
2258 net_if_get_by_iface(lo0), lo0);
2259
2260 /* First make sure setting hop limit to -1 works as expected (route default
2261 * value should be used).
2262 */
2263 if_mcast_hops = net_if_ipv6_get_mcast_hop_limit(lo0);
2264
2265 opt = -1;
2266 ret = zsock_setsockopt(client_sock, NET_IPPROTO_IPV6, ZSOCK_IPV6_MULTICAST_HOPS, &opt,
2267 sizeof(opt));
2268 zassert_equal(ret, 0, "Cannot set multicast hop limit (%d)", -errno);
2269
2270 optlen = sizeof(verify);
2271 ret = zsock_getsockopt(client_sock, NET_IPPROTO_IPV6, ZSOCK_IPV6_MULTICAST_HOPS, &verify,
2272 &optlen);
2273 zassert_equal(ret, 0, "Cannot get multicast hop limit (%d)", -errno);
2274 zassert_equal(verify, if_mcast_hops, "Different multicast hop limit (%d vs %d)",
2275 if_mcast_hops, verify);
2276
2277 /* Then test the normal case where we set the value */
2278 mcast_hops = 8;
2279 ret = zsock_setsockopt(client_sock, NET_IPPROTO_IPV6, ZSOCK_IPV6_MULTICAST_HOPS,
2280 &mcast_hops, sizeof(mcast_hops));
2281 zassert_equal(ret, 0, "Cannot set multicast hop limit (%d)", -errno);
2282
2283 optlen = sizeof(verify);
2284 ret = zsock_getsockopt(client_sock, NET_IPPROTO_IPV6, ZSOCK_IPV6_MULTICAST_HOPS, &verify,
2285 &optlen);
2286 zassert_equal(ret, 0, "Cannot get multicast hop limit (%d)", -errno);
2287 zassert_equal(verify, mcast_hops, "Different multicast hop limit (%d vs %d)",
2288 mcast_hops, verify);
2289
2290 ret = net_addr_pton(NET_AF_INET6, MY_MCAST_IPV6_ADDR, &sendto_addr.sin6_addr);
2291 zassert_equal(ret, 0, "Cannot get IPv6 address (%d)", ret);
2292
2293 test_check_ttl(client_sock, server_sock, packet_sock,
2294 (struct net_sockaddr *)&client_addr, sizeof(client_addr),
2295 (struct net_sockaddr *)&server_addr, sizeof(server_addr),
2296 (struct net_sockaddr *)&sendto_addr, sizeof(sendto_addr),
2297 NET_AF_INET6, 0, mcast_hops);
2298 }
2299
ZTEST(net_socket_udp,test_v6_hops)2300 ZTEST(net_socket_udp, test_v6_hops)
2301 {
2302 int ret;
2303 int client_sock;
2304 int server_sock;
2305 int packet_sock;
2306 int hops, verify;
2307 net_socklen_t optlen;
2308 struct net_sockaddr_in6 client_addr;
2309 struct net_sockaddr_in6 server_addr;
2310
2311 Z_TEST_SKIP_IFNDEF(CONFIG_NET_SOCKETS_PACKET);
2312
2313 prepare_sock_udp_v6(MY_IPV6_ADDR, CLIENT_PORT, &client_sock, &client_addr);
2314 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
2315
2316 packet_sock = zsock_socket(NET_AF_PACKET, NET_SOCK_RAW, net_htons(ETH_P_ALL));
2317 zassert_true(packet_sock >= 0, "Cannot create packet socket (%d)", -errno);
2318
2319 ret = bind_socket(packet_sock, lo0);
2320 zassert_equal(ret, 0, "packet socket bind failed");
2321
2322 zassert_not_null(lo0->config.ip.ipv6,
2323 "Interface %d (%p) no IPv6 configured",
2324 net_if_get_by_iface(lo0), lo0);
2325
2326 hops = 16;
2327 net_if_ipv6_set_hop_limit(lo0, hops);
2328 verify = net_if_ipv6_get_hop_limit(lo0);
2329 zassert_equal(verify, hops, "Different hop limit (%d vs %d)", hops, verify);
2330
2331 hops = 8;
2332 ret = zsock_setsockopt(client_sock, NET_IPPROTO_IPV6, ZSOCK_IPV6_UNICAST_HOPS, &hops,
2333 sizeof(hops));
2334 zassert_equal(ret, 0, "Cannot set unicast hops (%d)", -errno);
2335
2336 optlen = sizeof(verify);
2337 ret = zsock_getsockopt(client_sock, NET_IPPROTO_IPV6, ZSOCK_IPV6_UNICAST_HOPS, &verify,
2338 &optlen);
2339 zassert_equal(ret, 0, "Cannot get unicast hops (%d)", -errno);
2340 zassert_equal(verify, hops, "Different unicast hops (%d vs %d)",
2341 hops, verify);
2342
2343 test_check_ttl(client_sock, server_sock, packet_sock,
2344 (struct net_sockaddr *)&client_addr, sizeof(client_addr),
2345 (struct net_sockaddr *)&server_addr, sizeof(server_addr),
2346 (struct net_sockaddr *)&server_addr, sizeof(server_addr),
2347 NET_AF_INET6, hops, 0);
2348 }
2349
ZTEST_USER(net_socket_udp,test_recvmsg_msg_controllen_update)2350 ZTEST_USER(net_socket_udp, test_recvmsg_msg_controllen_update)
2351 {
2352 int rv;
2353 int client_sock;
2354 int server_sock;
2355 struct net_sockaddr_in client_addr;
2356 struct net_sockaddr_in server_addr;
2357 struct net_msghdr msg, server_msg;
2358 struct net_iovec io_vector[1];
2359 union {
2360 struct net_cmsghdr hdr;
2361 unsigned char buf[NET_CMSG_SPACE(sizeof(struct net_in6_pktinfo))];
2362 } cmsgbuf;
2363
2364 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
2365 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
2366
2367 rv = zsock_bind(server_sock,
2368 (struct net_sockaddr *)&server_addr,
2369 sizeof(server_addr));
2370 zassert_equal(rv, 0, "server bind failed");
2371
2372 rv = zsock_bind(client_sock,
2373 (struct net_sockaddr *)&client_addr,
2374 sizeof(client_addr));
2375 zassert_equal(rv, 0, "client bind failed");
2376
2377 memset(&cmsgbuf, 0, sizeof(cmsgbuf));
2378
2379 io_vector[0].iov_base = TEST_STR_SMALL;
2380 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
2381
2382 memset(&msg, 0, sizeof(msg));
2383 msg.msg_iov = io_vector;
2384 msg.msg_iovlen = 1;
2385 msg.msg_name = &server_addr;
2386 msg.msg_namelen = sizeof(server_addr);
2387
2388 comm_sendmsg_recvmsg(client_sock,
2389 (struct net_sockaddr *)&client_addr,
2390 sizeof(client_addr),
2391 &msg,
2392 server_sock,
2393 (struct net_sockaddr *)&server_addr,
2394 sizeof(server_addr),
2395 &server_msg,
2396 &cmsgbuf.buf,
2397 sizeof(cmsgbuf.buf),
2398 false);
2399
2400 rv = zsock_close(client_sock);
2401 zassert_equal(rv, 0, "close failed");
2402 rv = zsock_close(server_sock);
2403 zassert_equal(rv, 0, "close failed");
2404 }
2405
ZTEST(net_socket_udp,test_v6_address_removal)2406 ZTEST(net_socket_udp, test_v6_address_removal)
2407 {
2408 int ret;
2409 bool status;
2410 int client_sock;
2411 struct net_sockaddr_in6 client_addr;
2412 struct net_if_addr *ifaddr;
2413 struct net_if *iface;
2414
2415 if (!IS_ENABLED(CONFIG_NET_IPV6_PE)) {
2416 return;
2417 }
2418
2419 ifaddr = net_if_ipv6_addr_lookup(&my_addr1, &iface);
2420 zassert_equal(ifaddr->atomic_ref, 1, "Ref count is wrong (%ld vs %d)",
2421 ifaddr->atomic_ref, 1);
2422
2423 prepare_sock_udp_v6(MY_IPV6_ADDR_ETH, CLIENT_PORT, &client_sock, &client_addr);
2424
2425 ret = zsock_bind(client_sock,
2426 (struct net_sockaddr *)&client_addr,
2427 sizeof(client_addr));
2428 zassert_equal(ret, 0, "client bind failed");
2429
2430 status = net_if_ipv6_addr_rm(eth_iface, &my_addr1);
2431 zassert_false(status, "Address could be removed");
2432
2433 ifaddr = net_if_ipv6_addr_lookup(&my_addr1, &iface);
2434 zassert_not_null(ifaddr, "Address %s not found",
2435 net_sprint_ipv6_addr(&my_addr1));
2436
2437 ret = zsock_close(client_sock);
2438 zassert_equal(ret, 0, "close failed");
2439
2440 ifaddr = net_if_ipv6_addr_lookup(&my_addr1, &iface);
2441 zassert_equal(iface, eth_iface, "Invalid interface %p vs %p",
2442 iface, eth_iface);
2443 zassert_is_null(ifaddr, "Address %s found",
2444 net_sprint_ipv6_addr(&my_addr1));
2445 }
2446
check_ipv6_address_preferences(struct net_if * iface,uint16_t preference,const struct net_in6_addr * addr,const struct net_in6_addr * dest)2447 static void check_ipv6_address_preferences(struct net_if *iface,
2448 uint16_t preference,
2449 const struct net_in6_addr *addr,
2450 const struct net_in6_addr *dest)
2451 {
2452 const struct net_in6_addr *selected;
2453 net_socklen_t optlen;
2454 int optval;
2455 int sock;
2456 int ret;
2457
2458 sock = zsock_socket(NET_AF_INET6, NET_SOCK_DGRAM, NET_IPPROTO_UDP);
2459 zassert_true(sock >= 0, "Cannot create socket (%d)", -errno);
2460
2461 optval = preference;
2462 ret = zsock_setsockopt(sock, NET_IPPROTO_IPV6, ZSOCK_IPV6_ADDR_PREFERENCES,
2463 &optval, sizeof(optval));
2464 zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2465
2466 optval = 0; optlen = 0U;
2467 ret = zsock_getsockopt(sock, NET_IPPROTO_IPV6, ZSOCK_IPV6_ADDR_PREFERENCES,
2468 &optval, &optlen);
2469 zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2470 zassert_equal(optlen, sizeof(optval), "invalid optlen %d vs %d",
2471 optlen, sizeof(optval));
2472 zassert_equal(optval, preference,
2473 "getsockopt address preferences");
2474
2475 selected = net_if_ipv6_select_src_addr_hint(iface,
2476 dest,
2477 preference);
2478 ret = net_ipv6_addr_cmp(addr, selected);
2479 zassert_true(ret, "Wrong address %s selected, expected %s",
2480 net_sprint_ipv6_addr(selected),
2481 net_sprint_ipv6_addr(addr));
2482
2483 ret = zsock_close(sock);
2484 zassert_equal(sock, 0, "Cannot close socket (%d)", -errno);
2485 }
2486
ZTEST(net_socket_udp,test_ipv6_src_addr_select)2487 ZTEST(net_socket_udp, test_ipv6_src_addr_select)
2488 {
2489 struct net_if_addr *ifaddr;
2490 const struct net_in6_addr dest = { { { 0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0,
2491 0, 0, 0, 0, 0, 0, 0, 0x2 } } };
2492
2493 net_if_foreach(iface_cb, ð_iface);
2494 zassert_not_null(eth_iface, "No ethernet interface found");
2495
2496 ifaddr = net_if_ipv6_addr_add(eth_iface, &my_addr1,
2497 NET_ADDR_AUTOCONF, 0);
2498 if (!ifaddr) {
2499 DBG("Cannot add IPv6 address %s\n",
2500 net_sprint_ipv6_addr(&my_addr1));
2501 zassert_not_null(ifaddr, "addr1");
2502 }
2503
2504 ifaddr->is_temporary = false;
2505
2506 ifaddr = net_if_ipv6_addr_add(eth_iface, &my_addr3,
2507 NET_ADDR_AUTOCONF, 0);
2508 if (!ifaddr) {
2509 DBG("Cannot add IPv6 address %s\n",
2510 net_sprint_ipv6_addr(&my_addr3));
2511 zassert_not_null(ifaddr, "addr1");
2512 }
2513
2514 ifaddr->is_temporary = true;
2515
2516 net_if_up(eth_iface);
2517
2518 check_ipv6_address_preferences(NULL, ZSOCK_IPV6_PREFER_SRC_PUBLIC,
2519 &my_addr1, &dest);
2520 check_ipv6_address_preferences(NULL, ZSOCK_IPV6_PREFER_SRC_TMP,
2521 &my_addr3, &dest);
2522 }
2523
ZTEST(net_socket_udp,test_ipv6_multicast_ifindex)2524 ZTEST(net_socket_udp, test_ipv6_multicast_ifindex)
2525 {
2526 struct net_sockaddr_in6 saddr6 = {
2527 .sin6_family = NET_AF_INET6,
2528 .sin6_port = net_htons(SERVER_PORT),
2529 .sin6_addr = my_mcast_addr1,
2530 };
2531 struct net_if_mcast_addr *ifmaddr;
2532 struct net_if_addr *ifaddr;
2533 int server_sock;
2534 net_socklen_t addrlen;
2535 net_socklen_t optlen;
2536 int ifindex;
2537 int optval;
2538 int sock;
2539 int ret;
2540 int err;
2541
2542 net_if_foreach(iface_cb, ð_iface);
2543 zassert_not_null(eth_iface, "No ethernet interface found");
2544
2545 ifmaddr = net_if_ipv6_maddr_add(eth_iface, &my_mcast_addr1);
2546 if (!ifmaddr) {
2547 DBG("Cannot add IPv6 multicast address %s\n",
2548 net_sprint_ipv6_addr(&my_mcast_addr1));
2549 zassert_not_null(ifmaddr, "mcast_addr1");
2550 }
2551
2552 ifaddr = net_if_ipv6_addr_add(eth_iface, &my_addr3,
2553 NET_ADDR_AUTOCONF, 0);
2554 if (!ifaddr) {
2555 DBG("Cannot add IPv6 address %s\n",
2556 net_sprint_ipv6_addr(&my_addr3));
2557 zassert_not_null(ifaddr, "addr1");
2558 }
2559
2560 net_if_up(eth_iface);
2561
2562 /* Check that we get the default interface */
2563 sock = zsock_socket(NET_AF_INET6, NET_SOCK_DGRAM, NET_IPPROTO_UDP);
2564 zassert_true(sock >= 0, "Cannot create socket (%d)", -errno);
2565
2566 optval = 0; optlen = 0U;
2567 ret = zsock_getsockopt(sock, NET_IPPROTO_IPV6, ZSOCK_IPV6_MULTICAST_IF,
2568 &optval, &optlen);
2569 zexpect_equal(ret, 0, "setsockopt failed (%d)", errno);
2570 zexpect_equal(optlen, sizeof(optval), "invalid optlen %d vs %d",
2571 optlen, sizeof(optval));
2572 ifindex = net_if_get_by_iface(net_if_get_default());
2573 zexpect_equal(optval, ifindex,
2574 "getsockopt multicast ifindex (expected %d got %d)",
2575 ifindex, optval);
2576
2577 ret = zsock_close(sock);
2578 zassert_equal(sock, 0, "Cannot close socket (%d)", -errno);
2579
2580 /* Check failure for IPv4 socket */
2581 sock = zsock_socket(NET_AF_INET, NET_SOCK_DGRAM, NET_IPPROTO_UDP);
2582 zassert_true(sock >= 0, "Cannot create socket (%d)", -errno);
2583
2584 optval = 0; optlen = 0U;
2585 ret = zsock_getsockopt(sock, NET_IPPROTO_IPV6, ZSOCK_IPV6_MULTICAST_IF,
2586 &optval, &optlen);
2587 err = -errno;
2588 zexpect_equal(ret, -1, "setsockopt failed (%d)", errno);
2589 zexpect_equal(err, -EAFNOSUPPORT, "setsockopt failed (%d)", errno);
2590 zexpect_equal(optlen, 0U, "setsockopt optlen (%d)", optlen);
2591
2592 ret = zsock_close(sock);
2593 zassert_equal(sock, 0, "Cannot close socket (%d)", -errno);
2594
2595 /* Check that we can set the interface */
2596 sock = zsock_socket(NET_AF_INET6, NET_SOCK_DGRAM, NET_IPPROTO_UDP);
2597 zassert_true(sock >= 0, "Cannot create socket (%d)", -errno);
2598
2599 /* Clear any existing interface value by setting it to 0 */
2600 optval = 0; optlen = sizeof(int);
2601 ret = zsock_setsockopt(sock, NET_IPPROTO_IPV6, ZSOCK_IPV6_MULTICAST_IF,
2602 &optval, optlen);
2603 err = -errno;
2604 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2605 zexpect_equal(optlen, sizeof(optval), "invalid optlen %d vs %d",
2606 optlen, sizeof(optval));
2607
2608 /* Set the output multicast packet interface to the default interface */
2609 optval = net_if_get_by_iface(net_if_get_default()); optlen = sizeof(int);
2610 ret = zsock_setsockopt(sock, NET_IPPROTO_IPV6, ZSOCK_IPV6_MULTICAST_IF,
2611 &optval, optlen);
2612 zexpect_equal(ret, 0, "setsockopt failed (%d)", errno);
2613 zexpect_equal(optlen, sizeof(optval), "invalid optlen %d vs %d",
2614 optlen, sizeof(optval));
2615
2616 optval = 0; optlen = 0U;
2617 ret = zsock_getsockopt(sock, NET_IPPROTO_IPV6, ZSOCK_IPV6_MULTICAST_IF,
2618 &optval, &optlen);
2619 err = -errno;
2620 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2621 zexpect_equal(optlen, sizeof(int), "setsockopt optlen (%d)", optlen);
2622 zexpect_equal(optval, net_if_get_by_iface(net_if_get_default()),
2623 "getsockopt multicast ifindex (expected %d got %d)",
2624 net_if_get_by_iface(net_if_get_default()), optval);
2625
2626 server_sock = prepare_listen_sock_udp_v6(&saddr6);
2627 zassert_not_equal(server_sock, -1, "Cannot create server socket (%d)", -errno);
2628
2629 test_started = true;
2630 loopback_enable_address_swap(false);
2631
2632 ret = zsock_sendto(sock, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1, 0,
2633 (struct net_sockaddr *)&saddr6, sizeof(saddr6));
2634 zexpect_equal(ret, STRLEN(TEST_STR_SMALL),
2635 "invalid send len (was %d expected %d) (%d)",
2636 ret, STRLEN(TEST_STR_SMALL), -errno);
2637
2638 /* Test that the sent data is received from default interface and
2639 * not the Ethernet one.
2640 */
2641 addrlen = sizeof(saddr6);
2642 ret = zsock_recvfrom(server_sock, rx_buf, sizeof(rx_buf),
2643 0, (struct net_sockaddr *)&saddr6, &addrlen);
2644 zexpect_true(ret >= 0, "recvfrom fail");
2645 zexpect_equal(ret, strlen(TEST_STR_SMALL),
2646 "unexpected received bytes");
2647 zexpect_mem_equal(rx_buf, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1,
2648 "wrong data");
2649
2650 ret = zsock_close(sock);
2651 zassert_equal(ret, 0, "Cannot close socket (%d)", -errno);
2652
2653 ret = zsock_close(server_sock);
2654 zassert_equal(ret, 0, "Cannot close socket (%d)", -errno);
2655
2656 test_started = false;
2657 loopback_enable_address_swap(true);
2658 }
2659
ZTEST(net_socket_udp,test_ipv4_multicast_ifindex)2660 ZTEST(net_socket_udp, test_ipv4_multicast_ifindex)
2661 {
2662 struct net_sockaddr_in saddr4 = {
2663 .sin_family = NET_AF_INET,
2664 .sin_port = net_htons(SERVER_PORT),
2665 .sin_addr = my_mcast_addr2,
2666 };
2667 struct net_sockaddr_in dst_addr = {
2668 .sin_family = NET_AF_INET,
2669 .sin_port = net_htons(SERVER_PORT),
2670 .sin_addr = my_mcast_addr2,
2671 };
2672 struct net_if_mcast_addr *ifmaddr;
2673 struct net_if_addr *ifaddr;
2674 struct net_in_addr addr = { 0 };
2675 struct net_ip_mreqn mreqn;
2676 struct net_ip_mreq mreq;
2677 struct net_if *iface;
2678 int server_sock;
2679 net_socklen_t addrlen;
2680 net_socklen_t optlen;
2681 int ifindex;
2682 int sock;
2683 int ret;
2684 int err;
2685
2686 net_if_foreach(iface_cb, ð_iface);
2687 zassert_not_null(eth_iface, "No ethernet interface found");
2688
2689 ifmaddr = net_if_ipv4_maddr_add(eth_iface, &my_mcast_addr2);
2690 if (!ifmaddr) {
2691 DBG("Cannot add IPv4 multicast address %s\n",
2692 net_sprint_ipv4_addr(&my_mcast_addr2));
2693 zassert_not_null(ifmaddr, "mcast_addr2");
2694 }
2695
2696 ifaddr = net_if_ipv4_addr_add(eth_iface, &my_addr2,
2697 NET_ADDR_MANUAL, 0);
2698 if (!ifaddr) {
2699 DBG("Cannot add IPv4 address %s\n",
2700 net_sprint_ipv4_addr(&my_addr2));
2701 zassert_not_null(ifaddr, "addr2");
2702 }
2703
2704 net_if_up(eth_iface);
2705
2706 /* Check that we get the default interface */
2707 sock = zsock_socket(NET_AF_INET, NET_SOCK_DGRAM, NET_IPPROTO_UDP);
2708 zassert_true(sock >= 0, "Cannot create socket (%d)", -errno);
2709
2710 optlen = sizeof(addr);
2711 ret = zsock_getsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_MULTICAST_IF,
2712 &addr, &optlen);
2713 zexpect_equal(ret, 0, "setsockopt failed (%d)", errno);
2714 zexpect_equal(optlen, sizeof(addr), "invalid optlen %d vs %d",
2715 optlen, sizeof(addr));
2716 ifindex = net_if_get_by_iface(net_if_get_default());
2717 ret = net_if_ipv4_addr_lookup_by_index(&addr);
2718 zexpect_equal(ret, ifindex,
2719 "getsockopt multicast ifindex (expected %d got %d)",
2720 ifindex, ret);
2721
2722 ret = zsock_close(sock);
2723 zassert_equal(sock, 0, "Cannot close socket (%d)", -errno);
2724
2725 /* Check failure for IPv6 socket */
2726 sock = zsock_socket(NET_AF_INET6, NET_SOCK_DGRAM, NET_IPPROTO_UDP);
2727 zassert_true(sock >= 0, "Cannot create socket (%d)", -errno);
2728
2729 optlen = 0U;
2730 ret = zsock_getsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_MULTICAST_IF,
2731 &addr, &optlen);
2732 err = -errno;
2733 zexpect_equal(ret, -1, "setsockopt failed (%d)", errno);
2734 zexpect_equal(err, -EAFNOSUPPORT, "setsockopt failed (%d)", errno);
2735 zexpect_equal(optlen, 0U, "setsockopt optlen (%d)", optlen);
2736
2737 ret = zsock_close(sock);
2738 zassert_equal(sock, 0, "Cannot close socket (%d)", -errno);
2739
2740 /* Check that we can set the interface */
2741 sock = zsock_socket(NET_AF_INET, NET_SOCK_DGRAM, NET_IPPROTO_UDP);
2742 zassert_true(sock >= 0, "Cannot create socket (%d)", -errno);
2743
2744 /* Clear any existing interface value by setting it to 0 */
2745 optlen = sizeof(mreqn);
2746 mreqn.imr_ifindex = 0;
2747 mreqn.imr_address.s_addr = 0;
2748
2749 ret = zsock_setsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_MULTICAST_IF,
2750 &mreqn, optlen);
2751 err = -errno;
2752 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2753
2754 /* Verify that we get the empty value */
2755 optlen = sizeof(addr);
2756 ret = zsock_getsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_MULTICAST_IF,
2757 &addr, &optlen);
2758 err = -errno;
2759 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2760 zexpect_equal(optlen, sizeof(addr), "setsockopt optlen (%d)", optlen);
2761
2762 /* Set the output multicast packet interface to the default interface */
2763 optlen = sizeof(mreqn);
2764 mreqn.imr_ifindex = net_if_get_by_iface(net_if_get_default());
2765 mreqn.imr_address.s_addr = 0;
2766
2767 ret = zsock_setsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_MULTICAST_IF,
2768 &mreqn, optlen);
2769 err = -errno;
2770 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2771
2772 /* Verify that we get the default interface */
2773 optlen = sizeof(addr);
2774 memset(&addr, 0, sizeof(addr));
2775 ret = zsock_getsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_MULTICAST_IF,
2776 &addr, &optlen);
2777 err = -errno;
2778 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2779 zexpect_equal(optlen, sizeof(addr), "setsockopt optlen (%d)", optlen);
2780
2781 ifaddr = net_if_ipv4_addr_lookup(&addr, &iface);
2782 zexpect_not_null(ifaddr, "Address %s not found",
2783 net_sprint_ipv4_addr(&addr));
2784 zexpect_equal(net_if_get_by_iface(iface),
2785 net_if_get_by_iface(net_if_get_default()),
2786 "Invalid interface %d vs %d",
2787 net_if_get_by_iface(iface),
2788 net_if_get_by_iface(net_if_get_default()));
2789
2790 /* Now send a packet and verify that it is sent via the default
2791 * interface instead of the Ethernet interface.
2792 */
2793 server_sock = prepare_listen_sock_udp_v4(&saddr4);
2794 zassert_not_equal(server_sock, -1, "Cannot create server socket (%d)", -errno);
2795
2796 test_started = true;
2797 loopback_enable_address_swap(false);
2798
2799 ret = zsock_sendto(sock, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1, 0,
2800 (struct net_sockaddr *)&dst_addr, sizeof(dst_addr));
2801 zexpect_equal(ret, STRLEN(TEST_STR_SMALL),
2802 "invalid send len (was %d expected %d) (%d)",
2803 ret, STRLEN(TEST_STR_SMALL), -errno);
2804
2805 /* Test that the sent data is received from Ethernet interface. */
2806 addrlen = sizeof(saddr4);
2807 ret = zsock_recvfrom(server_sock, rx_buf, sizeof(rx_buf),
2808 0, (struct net_sockaddr *)&saddr4, &addrlen);
2809 zexpect_true(ret >= 0, "recvfrom fail");
2810 zexpect_equal(ret, strlen(TEST_STR_SMALL),
2811 "unexpected received bytes");
2812 zexpect_mem_equal(rx_buf, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1,
2813 "wrong data");
2814
2815 /* Clear the old interface value by setting it to 0 */
2816 optlen = sizeof(mreqn);
2817 mreqn.imr_ifindex = 0;
2818 mreqn.imr_address.s_addr = 0;
2819
2820 ret = zsock_setsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_MULTICAST_IF,
2821 &mreqn, optlen);
2822 err = -errno;
2823 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2824
2825 /* Then do it the other way around, set the address but leave the
2826 * interface number unassigned.
2827 */
2828 optlen = sizeof(mreqn);
2829 mreqn.imr_ifindex = 0;
2830
2831 /* Get the address of default interface and set it as a target
2832 * interface.
2833 */
2834 ifaddr = net_if_ipv4_addr_get_first_by_index(net_if_get_by_iface(net_if_get_default()));
2835 zexpect_not_null(ifaddr, "No address found for interface %d",
2836 net_if_get_by_iface(net_if_get_default()));
2837 mreqn.imr_address.s_addr = ifaddr->address.in_addr.s_addr;
2838
2839 ret = zsock_setsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_MULTICAST_IF,
2840 &mreqn, optlen);
2841 zexpect_equal(ret, 0, "setsockopt failed (%d)", errno);
2842
2843 /* Verify that we get the default interface address */
2844 optlen = sizeof(struct net_in_addr);
2845 ret = zsock_getsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_MULTICAST_IF,
2846 &addr, &optlen);
2847 err = -errno;
2848 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2849 zexpect_equal(optlen, sizeof(struct net_in_addr), "setsockopt optlen (%d)", optlen);
2850 ret = net_if_ipv4_addr_lookup_by_index(&addr);
2851 zexpect_equal(ret, net_if_get_by_iface(net_if_get_default()),
2852 "getsockopt multicast ifindex (expected %d got %d)",
2853 net_if_get_by_iface(net_if_get_default()), ret);
2854 zexpect_equal(ifaddr->address.in_addr.s_addr,
2855 addr.s_addr,
2856 "getsockopt iface address mismatch (expected %s got %s)",
2857 net_sprint_ipv4_addr(&ifaddr->address.in_addr),
2858 net_sprint_ipv4_addr(&addr));
2859
2860 ret = zsock_sendto(sock, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1, 0,
2861 (struct net_sockaddr *)&dst_addr, sizeof(dst_addr));
2862 zexpect_equal(ret, STRLEN(TEST_STR_SMALL),
2863 "invalid send len (was %d expected %d) (%d)",
2864 ret, STRLEN(TEST_STR_SMALL), -errno);
2865
2866 /* Test that the sent data is received from default interface. */
2867 addrlen = sizeof(saddr4);
2868 ret = zsock_recvfrom(server_sock, rx_buf, sizeof(rx_buf),
2869 0, (struct net_sockaddr *)&saddr4, &addrlen);
2870 zexpect_true(ret >= 0, "recvfrom fail");
2871 zexpect_equal(ret, strlen(TEST_STR_SMALL),
2872 "unexpected received bytes");
2873 zexpect_mem_equal(rx_buf, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1,
2874 "wrong data");
2875
2876 /* Then use mreq structure to set the interface */
2877 optlen = sizeof(mreq);
2878 ifaddr = net_if_ipv4_addr_get_first_by_index(net_if_get_by_iface(net_if_get_default()));
2879 zexpect_not_null(ifaddr, "No address found for interface %d",
2880 net_if_get_by_iface(net_if_get_default()));
2881 mreq.imr_interface.s_addr = ifaddr->address.in_addr.s_addr;
2882
2883 ret = zsock_setsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_MULTICAST_IF,
2884 &mreq, optlen);
2885 zexpect_equal(ret, 0, "setsockopt failed (%d)", errno);
2886
2887 ret = zsock_sendto(sock, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1, 0,
2888 (struct net_sockaddr *)&dst_addr, sizeof(dst_addr));
2889 zexpect_equal(ret, STRLEN(TEST_STR_SMALL),
2890 "invalid send len (was %d expected %d) (%d)",
2891 ret, STRLEN(TEST_STR_SMALL), -errno);
2892
2893 /* Test that the sent data is received from default interface. */
2894 addrlen = sizeof(saddr4);
2895 ret = zsock_recvfrom(server_sock, rx_buf, sizeof(rx_buf),
2896 0, (struct net_sockaddr *)&saddr4, &addrlen);
2897 zexpect_true(ret >= 0, "recvfrom fail");
2898 zexpect_equal(ret, strlen(TEST_STR_SMALL),
2899 "unexpected received bytes");
2900 zexpect_mem_equal(rx_buf, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1,
2901 "wrong data");
2902
2903 ret = zsock_close(sock);
2904 zassert_equal(ret, 0, "Cannot close socket (%d)", -errno);
2905
2906 ret = zsock_close(server_sock);
2907 zassert_equal(ret, 0, "Cannot close socket (%d)", -errno);
2908
2909 test_started = false;
2910 loopback_enable_address_swap(true);
2911 }
2912
2913 #if defined(CONFIG_NET_CONTEXT_CLAMP_PORT_RANGE)
2914
2915 #define PORT_RANGE(lower, upper) \
2916 (uint32_t)(((uint16_t)(upper) << 16) | (uint16_t)(lower))
2917
check_port_range(struct net_sockaddr * my_addr,size_t my_addr_len,struct net_sockaddr * local_addr,size_t local_addr_len)2918 static void check_port_range(struct net_sockaddr *my_addr,
2919 size_t my_addr_len,
2920 struct net_sockaddr *local_addr,
2921 size_t local_addr_len)
2922 {
2923 net_sa_family_t family = NET_AF_UNSPEC;
2924 uint32_t optval;
2925 net_socklen_t addr_len;
2926 net_socklen_t optlen;
2927 int sock;
2928 int ret, err;
2929
2930 addr_len = local_addr_len;
2931
2932 if (my_addr->sa_family == NET_AF_INET) {
2933 family = NET_AF_INET;
2934 } else if (my_addr->sa_family == NET_AF_INET6) {
2935 family = NET_AF_INET6;
2936 } else {
2937 zassert_true(false, "Invalid address family %d",
2938 my_addr->sa_family);
2939 }
2940
2941 sock = zsock_socket(family, NET_SOCK_DGRAM, NET_IPPROTO_UDP);
2942 zassert_true(sock >= 0, "Cannot create socket (%d)", -errno);
2943
2944 optval = PORT_RANGE(1024, 1500);
2945 ret = zsock_setsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_LOCAL_PORT_RANGE,
2946 &optval, sizeof(optval));
2947 err = -errno;
2948 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2949
2950 optval = 0; optlen = 0U;
2951 ret = zsock_setsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_LOCAL_PORT_RANGE,
2952 &optval, optlen);
2953 err = -errno;
2954 zexpect_equal(ret, -1, "setsockopt failed (%d)", err);
2955
2956 optval = 0; optlen = sizeof(uint64_t);
2957 ret = zsock_setsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_LOCAL_PORT_RANGE,
2958 &optval, optlen);
2959 err = -errno;
2960 zexpect_equal(ret, -1, "setsockopt failed (%d)", err);
2961
2962 optval = PORT_RANGE(0, 0);
2963 ret = zsock_setsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_LOCAL_PORT_RANGE,
2964 &optval, sizeof(optval));
2965 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2966
2967 /* Linux allows setting the invalid port range but that is not
2968 * then taken into use when we bind the socket.
2969 */
2970 optval = PORT_RANGE(1024, 0);
2971 ret = zsock_setsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_LOCAL_PORT_RANGE,
2972 &optval, sizeof(optval));
2973 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2974
2975 optval = PORT_RANGE(0, 1024);
2976 ret = zsock_setsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_LOCAL_PORT_RANGE,
2977 &optval, sizeof(optval));
2978 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2979
2980 /* Then set a valid range and verify that bound socket is using it */
2981 optval = PORT_RANGE(10000, 10010);
2982 ret = zsock_setsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_LOCAL_PORT_RANGE,
2983 &optval, sizeof(optval));
2984 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2985
2986 optval = 0; optlen = sizeof(optval);
2987 ret = zsock_getsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_LOCAL_PORT_RANGE,
2988 &optval, &optlen);
2989 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
2990 zexpect_equal(optval, PORT_RANGE(10000, 10010), "Invalid port range");
2991
2992 ret = zsock_bind(sock, my_addr, my_addr_len);
2993 err = -errno;
2994 zexpect_equal(ret, 0, "bind failed (%d)", err);
2995
2996 ret = zsock_getsockname(sock, local_addr, &addr_len);
2997 err = -errno;
2998 zexpect_equal(ret, 0, "getsockname failed (%d)", err);
2999
3000 /* The port should be in the range */
3001 zexpect_true(net_ntohs(net_sin(local_addr)->sin_port) >= 10000 &&
3002 net_ntohs(net_sin(local_addr)->sin_port) <= 10010,
3003 "Invalid port %d", net_ntohs(net_sin(local_addr)->sin_port));
3004
3005 (void)zsock_close(sock);
3006
3007 /* Try setting invalid range and verify that we do not net a port from that
3008 * range.
3009 */
3010 sock = zsock_socket(family, NET_SOCK_DGRAM, NET_IPPROTO_UDP);
3011 zassert_true(sock >= 0, "Cannot create socket (%d)", -errno);
3012
3013 optval = PORT_RANGE(1001, 1000);
3014 ret = zsock_setsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_LOCAL_PORT_RANGE,
3015 &optval, sizeof(optval));
3016 err = -errno;
3017 zexpect_equal(ret, -1, "setsockopt failed (%d)", err);
3018 zexpect_equal(err, -EINVAL, "Invalid errno (%d)", -err);
3019
3020 /* Port range cannot be just one port */
3021 optval = PORT_RANGE(1001, 1001);
3022 ret = zsock_setsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_LOCAL_PORT_RANGE,
3023 &optval, sizeof(optval));
3024 err = -errno;
3025 zexpect_equal(ret, -1, "setsockopt failed (%d)", err);
3026 zexpect_equal(err, -EINVAL, "Invalid errno (%d)", -err);
3027
3028 optval = PORT_RANGE(0, 1000);
3029 ret = zsock_setsockopt(sock, NET_IPPROTO_IP, ZSOCK_IP_LOCAL_PORT_RANGE,
3030 &optval, sizeof(optval));
3031 err = -errno;
3032 zexpect_equal(ret, 0, "setsockopt failed (%d)", err);
3033
3034 ret = zsock_bind(sock, my_addr, my_addr_len);
3035 err = -errno;
3036 zexpect_equal(ret, 0, "bind failed (%d)", err);
3037
3038 addr_len = local_addr_len;
3039 ret = zsock_getsockname(sock, local_addr, &addr_len);
3040 err = -errno;
3041 zexpect_equal(ret, 0, "getsockname failed (%d)", err);
3042
3043 /* The port should not be in the range */
3044 zexpect_false(net_ntohs(net_sin(local_addr)->sin_port) >= 1000 &&
3045 net_ntohs(net_sin(local_addr)->sin_port) <= 1001,
3046 "Invalid port %d", net_ntohs(net_sin(local_addr)->sin_port));
3047
3048 (void)zsock_close(sock);
3049 }
3050 #endif
3051
ZTEST(net_socket_udp,test_clamp_udp_tcp_port_range)3052 ZTEST(net_socket_udp, test_clamp_udp_tcp_port_range)
3053 {
3054 #if defined(CONFIG_NET_CONTEXT_CLAMP_PORT_RANGE)
3055 struct net_sockaddr_in my_addr4 = {
3056 .sin_family = NET_AF_INET,
3057 .sin_port = 0,
3058 .sin_addr = { { { 192, 0, 2, 2 } } },
3059 };
3060 struct net_sockaddr_in6 my_addr6 = {
3061 .sin6_family = NET_AF_INET6,
3062 .sin6_port = 0,
3063 .sin6_addr = net_in6addr_loopback,
3064 };
3065 struct net_sockaddr_in local_addr4;
3066 struct net_sockaddr_in6 local_addr6;
3067
3068 /* First try with a IPv4 socket */
3069 check_port_range((struct net_sockaddr *)&my_addr4, sizeof(my_addr4),
3070 (struct net_sockaddr *)&local_addr4, sizeof(local_addr4));
3071
3072 /* Finally try with a IPv6 socket */
3073 check_port_range((struct net_sockaddr *)&my_addr6, sizeof(my_addr6),
3074 (struct net_sockaddr *)&local_addr6, sizeof(local_addr6));
3075 #else
3076 ztest_test_skip();
3077 #endif
3078 }
3079
test_dgram_peer_addr_reset(int sock_c,int sock_s1,int sock_s2,struct net_sockaddr * addr_c,net_socklen_t addrlen_c,struct net_sockaddr * addr_s1,net_socklen_t addrlen_s1,struct net_sockaddr * addr_s2,net_socklen_t addrlen_s2)3080 static void test_dgram_peer_addr_reset(int sock_c, int sock_s1, int sock_s2,
3081 struct net_sockaddr *addr_c, net_socklen_t addrlen_c,
3082 struct net_sockaddr *addr_s1, net_socklen_t addrlen_s1,
3083 struct net_sockaddr *addr_s2, net_socklen_t addrlen_s2)
3084 {
3085 uint8_t tx_buf = 0xab;
3086 uint8_t rx_buf;
3087 struct net_sockaddr_storage unspec = {
3088 .ss_family = NET_AF_UNSPEC,
3089 };
3090 int rv;
3091
3092 rv = zsock_bind(sock_c, addr_c, addrlen_c);
3093 zassert_equal(rv, 0, "client bind failed");
3094
3095 rv = zsock_bind(sock_s1, addr_s1, addrlen_s1);
3096 zassert_equal(rv, 0, "server bind failed");
3097
3098 rv = zsock_bind(sock_s2, addr_s2, addrlen_s2);
3099 zassert_equal(rv, 0, "server bind failed");
3100
3101 /* Connect client socket to a specific peer address. */
3102 rv = zsock_connect(sock_c, addr_s1, addrlen_s1);
3103 zassert_equal(rv, 0, "connect failed");
3104
3105 /* Verify that a datagram is not received from other address */
3106 rv = zsock_sendto(sock_s2, &tx_buf, sizeof(tx_buf), 0, addr_c, addrlen_c);
3107 zassert_equal(rv, sizeof(tx_buf), "send failed");
3108
3109 /* Give the packet a chance to go through the net stack */
3110 k_msleep(10);
3111
3112 rv = zsock_recv(sock_c, &rx_buf, sizeof(rx_buf), ZSOCK_MSG_DONTWAIT);
3113 zassert_equal(rv, -1, "recv should've failed");
3114 zassert_equal(errno, EAGAIN, "incorrect errno");
3115
3116 /* Reset peer address */
3117 rv = zsock_connect(sock_c, (struct net_sockaddr *)&unspec, sizeof(unspec));
3118 zassert_equal(rv, 0, "connect failed");
3119
3120 /* Verify that a datagram can be received from other address */
3121 rv = zsock_sendto(sock_s2, &tx_buf, sizeof(tx_buf), 0, addr_c, addrlen_c);
3122 zassert_equal(rv, sizeof(tx_buf), "send failed");
3123
3124 /* Give the packet a chance to go through the net stack */
3125 k_msleep(10);
3126
3127 rx_buf = 0;
3128 rv = zsock_recv(sock_c, &rx_buf, sizeof(rx_buf), ZSOCK_MSG_DONTWAIT);
3129 zassert_equal(rv, sizeof(rx_buf), "recv failed %d", errno);
3130 zassert_equal(rx_buf, tx_buf, "wrong data");
3131
3132 rv = zsock_close(sock_c);
3133 zassert_equal(rv, 0, "close failed");
3134 rv = zsock_close(sock_s1);
3135 zassert_equal(rv, 0, "close failed");
3136 rv = zsock_close(sock_s2);
3137 zassert_equal(rv, 0, "close failed");
3138 }
3139
ZTEST(net_socket_udp,test_v4_dgram_peer_addr_reset)3140 ZTEST(net_socket_udp, test_v4_dgram_peer_addr_reset)
3141 {
3142 int client_sock;
3143 int server_sock_1;
3144 int server_sock_2;
3145 struct net_sockaddr_in client_addr;
3146 struct net_sockaddr_in server_addr_1;
3147 struct net_sockaddr_in server_addr_2;
3148
3149 prepare_sock_udp_v4(MY_IPV4_ADDR, CLIENT_PORT, &client_sock, &client_addr);
3150 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock_1, &server_addr_1);
3151 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT + 1, &server_sock_2, &server_addr_2);
3152
3153 test_dgram_peer_addr_reset(client_sock, server_sock_1, server_sock_2,
3154 (struct net_sockaddr *)&client_addr, sizeof(client_addr),
3155 (struct net_sockaddr *)&server_addr_1, sizeof(server_addr_1),
3156 (struct net_sockaddr *)&server_addr_2, sizeof(server_addr_2));
3157 }
3158
ZTEST(net_socket_udp,test_v6_dgram_peer_addr_reset)3159 ZTEST(net_socket_udp, test_v6_dgram_peer_addr_reset)
3160 {
3161 int client_sock;
3162 int server_sock_1;
3163 int server_sock_2;
3164 struct net_sockaddr_in6 client_addr;
3165 struct net_sockaddr_in6 server_addr_1;
3166 struct net_sockaddr_in6 server_addr_2;
3167
3168 prepare_sock_udp_v6(MY_IPV6_ADDR, CLIENT_PORT, &client_sock, &client_addr);
3169 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock_1, &server_addr_1);
3170 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT + 1, &server_sock_2, &server_addr_2);
3171
3172 test_dgram_peer_addr_reset(client_sock, server_sock_1, server_sock_2,
3173 (struct net_sockaddr *)&client_addr, sizeof(client_addr),
3174 (struct net_sockaddr *)&server_addr_1, sizeof(server_addr_1),
3175 (struct net_sockaddr *)&server_addr_2, sizeof(server_addr_2));
3176 }
3177
comm_sendmsg_recvmsg_hop_limit(int client_sock,struct net_sockaddr * client_addr,net_socklen_t client_addrlen,const struct net_msghdr * client_msg,int server_sock,struct net_sockaddr * server_addr,net_socklen_t server_addrlen,struct net_msghdr * msg,void * cmsgbuf,int cmsgbuf_len,bool expect_control_data)3178 static void comm_sendmsg_recvmsg_hop_limit(int client_sock,
3179 struct net_sockaddr *client_addr,
3180 net_socklen_t client_addrlen,
3181 const struct net_msghdr *client_msg,
3182 int server_sock,
3183 struct net_sockaddr *server_addr,
3184 net_socklen_t server_addrlen,
3185 struct net_msghdr *msg,
3186 void *cmsgbuf, int cmsgbuf_len,
3187 bool expect_control_data)
3188 {
3189 #define MAX_BUF_LEN 64
3190 char buf[MAX_BUF_LEN];
3191 struct net_iovec io_vector[1];
3192 ssize_t sent;
3193 ssize_t recved;
3194 struct net_sockaddr addr;
3195 net_socklen_t addrlen = server_addrlen;
3196 int len, i;
3197
3198 zassert_not_null(client_addr, "null client addr");
3199 zassert_not_null(server_addr, "null server addr");
3200
3201 /*
3202 * Test client -> server sending
3203 */
3204
3205 sent = zsock_sendmsg(client_sock, client_msg, 0);
3206 zassert_true(sent > 0, "sendmsg failed, %s (%d)", strerror(errno), -errno);
3207
3208 /* One negative test with invalid msg_iov */
3209 memset(msg, 0, sizeof(*msg));
3210 recved = zsock_recvmsg(server_sock, msg, 0);
3211 zassert_true(recved < 0 && errno == ENOMEM, "Wrong errno (%d)", errno);
3212
3213 for (i = 0, len = 0; i < client_msg->msg_iovlen; i++) {
3214 len += client_msg->msg_iov[i].iov_len;
3215 }
3216
3217 zassert_equal(sent, len, "iovec len (%d) vs sent (%d)", len, sent);
3218
3219 /* Test first with one iovec */
3220 io_vector[0].iov_base = buf;
3221 io_vector[0].iov_len = sizeof(buf);
3222
3223 memset(msg, 0, sizeof(*msg));
3224 if (cmsgbuf != NULL) {
3225 memset(cmsgbuf, 0, cmsgbuf_len);
3226 }
3227 msg->msg_control = cmsgbuf;
3228 msg->msg_controllen = cmsgbuf_len;
3229 msg->msg_iov = io_vector;
3230 msg->msg_iovlen = 1;
3231 msg->msg_name = &addr;
3232 msg->msg_namelen = addrlen;
3233
3234 /* Test normal recvmsg() */
3235 clear_buf(rx_buf);
3236 recved = zsock_recvmsg(server_sock, msg, 0);
3237 zassert_true(recved > 0, "recvfrom fail");
3238 zassert_equal(recved, len, "unexpected received bytes");
3239 zassert_equal(msg->msg_iovlen, 1, "recvmsg should not modify msg_iovlen");
3240 zassert_equal(msg->msg_iov[0].iov_len, sizeof(buf),
3241 "recvmsg should not modify buffer length");
3242 zassert_mem_equal(buf, TEST_STR_SMALL, len,
3243 "wrong data (%s)", rx_buf);
3244 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
3245
3246 /* Control data should be empty */
3247 if (!expect_control_data) {
3248 zassert_equal(msg->msg_controllen, 0,
3249 "We received control data (%u vs %zu)",
3250 0U, msg->msg_controllen);
3251 }
3252 }
3253
run_ancillary_recvmsg_hoplimit_test(int client_sock,struct net_sockaddr * client_addr,int client_addr_len,int server_sock,struct net_sockaddr * server_addr,int server_addr_len)3254 static void run_ancillary_recvmsg_hoplimit_test(int client_sock,
3255 struct net_sockaddr *client_addr,
3256 int client_addr_len,
3257 int server_sock,
3258 struct net_sockaddr *server_addr,
3259 int server_addr_len)
3260 {
3261 int rv;
3262 int opt;
3263 net_socklen_t optlen;
3264 struct net_msghdr msg;
3265 struct net_msghdr server_msg;
3266 struct net_iovec io_vector[1];
3267 struct net_cmsghdr *cmsg, *prevcmsg;
3268 int send_hop_limit = 90, recv_hop_limit = 0;
3269 union {
3270 struct net_cmsghdr hdr;
3271 unsigned char buf[NET_CMSG_SPACE(sizeof(int))];
3272 } cmsgbuf;
3273
3274 Z_TEST_SKIP_IFNDEF(CONFIG_NET_CONTEXT_RECV_HOPLIMIT);
3275
3276 rv = zsock_bind(server_sock, server_addr, server_addr_len);
3277 zassert_equal(rv, 0, "server bind failed");
3278
3279 rv = zsock_bind(client_sock, client_addr, client_addr_len);
3280 zassert_equal(rv, 0, "client bind failed");
3281
3282 io_vector[0].iov_base = TEST_STR_SMALL;
3283 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
3284
3285 memset(&cmsgbuf, 0, sizeof(cmsgbuf));
3286
3287 memset(&msg, 0, sizeof(msg));
3288 msg.msg_name = server_addr;
3289 msg.msg_namelen = server_addr_len;
3290 msg.msg_iov = io_vector;
3291 msg.msg_iovlen = 1;
3292 msg.msg_control = &cmsgbuf.buf;
3293 msg.msg_controllen = sizeof(cmsgbuf.buf);
3294
3295 cmsg = NET_CMSG_FIRSTHDR(&msg);
3296 cmsg->cmsg_len = NET_CMSG_LEN(sizeof(int));
3297 if (client_addr->sa_family == NET_AF_INET) {
3298 cmsg->cmsg_level = NET_IPPROTO_IP;
3299 cmsg->cmsg_type = ZSOCK_IP_TTL;
3300 } else {
3301 cmsg->cmsg_level = NET_IPPROTO_IPV6;
3302 cmsg->cmsg_type = ZSOCK_IPV6_HOPLIMIT;
3303 }
3304
3305 *(int *)NET_CMSG_DATA(cmsg) = send_hop_limit;
3306
3307 comm_sendmsg_recvmsg_hop_limit(client_sock,
3308 client_addr,
3309 client_addr_len,
3310 &msg,
3311 server_sock,
3312 server_addr,
3313 server_addr_len,
3314 &server_msg,
3315 &cmsgbuf.buf,
3316 sizeof(cmsgbuf.buf),
3317 true);
3318
3319 for (prevcmsg = NULL, cmsg = NET_CMSG_FIRSTHDR(&server_msg);
3320 cmsg != NULL && prevcmsg != cmsg;
3321 prevcmsg = cmsg, cmsg = NET_CMSG_NXTHDR(&server_msg, cmsg)) {
3322 if (client_addr->sa_family == NET_AF_INET) {
3323 if (cmsg->cmsg_level == NET_IPPROTO_IP &&
3324 cmsg->cmsg_type == ZSOCK_IP_TTL) {
3325 recv_hop_limit = *(int *)NET_CMSG_DATA(cmsg);
3326 break;
3327 }
3328 } else {
3329 if (cmsg->cmsg_level == NET_IPPROTO_IPV6 &&
3330 cmsg->cmsg_type == ZSOCK_IPV6_HOPLIMIT) {
3331 recv_hop_limit = *(int *)NET_CMSG_DATA(cmsg);
3332 break;
3333 }
3334 }
3335 }
3336
3337 /* As we have not set the socket option, the hop_limit should not be set */
3338 zassert_equal(recv_hop_limit, 0, "Hop limit set!");
3339
3340 opt = 1;
3341 optlen = sizeof(opt);
3342 if (server_addr->sa_family == NET_AF_INET) {
3343 rv = zsock_setsockopt(server_sock, NET_IPPROTO_IP,
3344 ZSOCK_IP_RECVTTL, &opt, optlen);
3345 } else {
3346 rv = zsock_setsockopt(server_sock, NET_IPPROTO_IPV6,
3347 ZSOCK_IPV6_RECVHOPLIMIT, &opt, optlen);
3348 }
3349 zassert_equal(rv, 0, "setsockopt failed (%d)", -errno);
3350
3351 memset(&cmsgbuf, 0, sizeof(cmsgbuf));
3352
3353 memset(&msg, 0, sizeof(msg));
3354 msg.msg_name = server_addr;
3355 msg.msg_namelen = server_addr_len;
3356 msg.msg_iov = io_vector;
3357 msg.msg_iovlen = 1;
3358 msg.msg_control = &cmsgbuf.buf;
3359 msg.msg_controllen = sizeof(cmsgbuf.buf);
3360
3361 cmsg = NET_CMSG_FIRSTHDR(&msg);
3362 cmsg->cmsg_len = NET_CMSG_LEN(sizeof(int));
3363 if (client_addr->sa_family == NET_AF_INET) {
3364 cmsg->cmsg_level = NET_IPPROTO_IP;
3365 cmsg->cmsg_type = ZSOCK_IP_TTL;
3366 } else {
3367 cmsg->cmsg_level = NET_IPPROTO_IPV6;
3368 cmsg->cmsg_type = ZSOCK_IPV6_HOPLIMIT;
3369 }
3370
3371 *(int *)NET_CMSG_DATA(cmsg) = send_hop_limit;
3372
3373 comm_sendmsg_recvmsg_hop_limit(client_sock,
3374 client_addr,
3375 client_addr_len,
3376 &msg,
3377 server_sock,
3378 server_addr,
3379 server_addr_len,
3380 &server_msg,
3381 &cmsgbuf.buf,
3382 sizeof(cmsgbuf.buf),
3383 true);
3384
3385 for (prevcmsg = NULL, cmsg = NET_CMSG_FIRSTHDR(&server_msg);
3386 cmsg != NULL && prevcmsg != cmsg;
3387 prevcmsg = cmsg, cmsg = NET_CMSG_NXTHDR(&server_msg, cmsg)) {
3388 if (client_addr->sa_family == NET_AF_INET) {
3389 if (cmsg->cmsg_level == NET_IPPROTO_IP &&
3390 cmsg->cmsg_type == ZSOCK_IP_TTL) {
3391 recv_hop_limit = *(int *)NET_CMSG_DATA(cmsg);
3392 break;
3393 }
3394 } else {
3395 if (cmsg->cmsg_level == NET_IPPROTO_IPV6 &&
3396 cmsg->cmsg_type == ZSOCK_IPV6_HOPLIMIT) {
3397 recv_hop_limit = *(int *)NET_CMSG_DATA(cmsg);
3398 break;
3399 }
3400 }
3401 }
3402
3403 zassert_equal(send_hop_limit, recv_hop_limit, "Hop limit not parsed correctly");
3404 }
3405
ZTEST_USER(net_socket_udp,test_recvmsg_ancillary_ipv4_hoplimit_data_user)3406 ZTEST_USER(net_socket_udp, test_recvmsg_ancillary_ipv4_hoplimit_data_user)
3407 {
3408 struct net_sockaddr_in client_addr;
3409 struct net_sockaddr_in server_addr;
3410 int client_sock;
3411 int server_sock;
3412
3413 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
3414 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
3415
3416 run_ancillary_recvmsg_hoplimit_test(client_sock,
3417 (struct net_sockaddr *)&client_addr,
3418 sizeof(client_addr),
3419 server_sock,
3420 (struct net_sockaddr *)&server_addr,
3421 sizeof(server_addr));
3422 }
3423
ZTEST_USER(net_socket_udp,test_recvmsg_ancillary_ipv6_hoplimit_data_user)3424 ZTEST_USER(net_socket_udp, test_recvmsg_ancillary_ipv6_hoplimit_data_user)
3425 {
3426 struct net_sockaddr_in6 client_addr;
3427 struct net_sockaddr_in6 server_addr;
3428 int client_sock;
3429 int server_sock;
3430
3431 prepare_sock_udp_v6(MY_IPV6_ADDR, ANY_PORT, &client_sock, &client_addr);
3432 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock, &server_addr);
3433
3434 run_ancillary_recvmsg_hoplimit_test(client_sock,
3435 (struct net_sockaddr *)&client_addr,
3436 sizeof(client_addr),
3437 server_sock,
3438 (struct net_sockaddr *)&server_addr,
3439 sizeof(server_addr));
3440 }
3441
sendto_recvfrom(int client_sock,struct net_sockaddr * client_addr,net_socklen_t client_addrlen,int server_sock,struct net_sockaddr * server_addr,net_socklen_t server_addrlen,bool expect_failure)3442 static void sendto_recvfrom(int client_sock,
3443 struct net_sockaddr *client_addr,
3444 net_socklen_t client_addrlen,
3445 int server_sock,
3446 struct net_sockaddr *server_addr,
3447 net_socklen_t server_addrlen,
3448 bool expect_failure)
3449 {
3450 ssize_t sent = 0;
3451 ssize_t recved = 0;
3452 struct net_sockaddr addr;
3453 net_socklen_t addrlen;
3454 struct net_sockaddr addr2;
3455 net_socklen_t addrlen2;
3456
3457 zassert_not_null(client_addr, "null client addr");
3458 zassert_not_null(server_addr, "null server addr");
3459
3460 /*
3461 * Test client -> server sending
3462 */
3463
3464 sent = zsock_sendto(client_sock, TEST_STR_SMALL, strlen(TEST_STR_SMALL),
3465 0, server_addr, server_addrlen);
3466 zassert_equal(sent, strlen(TEST_STR_SMALL), "sendto failed");
3467
3468 k_msleep(100);
3469
3470 /* Test normal recvfrom() */
3471 addrlen = sizeof(addr);
3472 clear_buf(rx_buf);
3473 recved = zsock_recvfrom(server_sock, rx_buf, sizeof(rx_buf),
3474 0, &addr, &addrlen);
3475 zassert_true(recved >= 0, "recvfrom fail");
3476 zassert_equal(recved, strlen(TEST_STR_SMALL),
3477 "unexpected received bytes");
3478 zassert_mem_equal(rx_buf, BUF_AND_SIZE(TEST_STR_SMALL), "wrong data");
3479 zassert_equal(addrlen, client_addrlen, "unexpected addrlen");
3480
3481 /*
3482 * Test server -> client sending
3483 */
3484
3485 sent = zsock_sendto(server_sock, TEST_STR2, sizeof(TEST_STR2) - 1,
3486 0, &addr, addrlen);
3487 zassert_equal(sent, STRLEN(TEST_STR2), "sendto failed");
3488
3489 /* Test normal recvfrom() */
3490 addrlen2 = sizeof(addr);
3491 clear_buf(rx_buf);
3492 recved = zsock_recvfrom(client_sock, rx_buf, sizeof(rx_buf),
3493 expect_failure ? ZSOCK_MSG_DONTWAIT : 0,
3494 &addr2, &addrlen2);
3495 if (!expect_failure) {
3496 zassert_true(recved >= 0, "recvfrom fail");
3497 zassert_equal(recved, STRLEN(TEST_STR2),
3498 "unexpected received bytes");
3499 zassert_mem_equal(rx_buf, BUF_AND_SIZE(TEST_STR2), "wrong data");
3500 zassert_equal(addrlen2, server_addrlen, "unexpected addrlen");
3501 } else {
3502 /* We should not receive anything as the socket is shutdown for
3503 * receiving.
3504 */
3505 zassert_equal(recved, -1, "recvfrom should fail (got %d)", recved);
3506 }
3507 }
3508
ZTEST_USER(net_socket_udp,test_udp_shutdown_recv)3509 ZTEST_USER(net_socket_udp, test_udp_shutdown_recv)
3510 {
3511 int rv;
3512 int client_sock;
3513 int server_sock;
3514 struct net_sockaddr_in client_addr;
3515 struct net_sockaddr_in server_addr;
3516
3517 prepare_sock_udp_v4(MY_IPV4_ADDR, ANY_PORT, &client_sock, &client_addr);
3518 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock, &server_addr);
3519
3520 rv = zsock_bind(server_sock,
3521 (struct net_sockaddr *)&server_addr,
3522 sizeof(server_addr));
3523 zassert_equal(rv, 0, "bind failed");
3524
3525 sendto_recvfrom(client_sock,
3526 (struct net_sockaddr *)&client_addr,
3527 sizeof(client_addr),
3528 server_sock,
3529 (struct net_sockaddr *)&server_addr,
3530 sizeof(server_addr),
3531 false);
3532
3533 /* Shutdown UDP socket for receiving and verify that we do not get any data. */
3534 rv = zsock_shutdown(client_sock, ZSOCK_SHUT_RD);
3535 zassert_equal(rv, 0, "shutdown failed (%d)", -errno);
3536
3537 sendto_recvfrom(client_sock,
3538 (struct net_sockaddr *)&client_addr,
3539 sizeof(client_addr),
3540 server_sock,
3541 (struct net_sockaddr *)&server_addr,
3542 sizeof(server_addr),
3543 true);
3544
3545 rv = zsock_close(client_sock);
3546 zassert_equal(rv, 0, "close failed");
3547 rv = zsock_close(server_sock);
3548 zassert_equal(rv, 0, "close failed");
3549 }
3550
3551 enum ipv4_mapped_to_ipv6_send_mode {
3552 IPV4_MAPPED_TO_IPV6_SENDTO,
3553 IPV4_MAPPED_TO_IPV6_SENDMSG,
3554 };
3555
test_ipv4_mapped_to_ipv6_send_common(enum ipv4_mapped_to_ipv6_send_mode test_mode)3556 void test_ipv4_mapped_to_ipv6_send_common(enum ipv4_mapped_to_ipv6_send_mode test_mode)
3557 {
3558 int off = 0;
3559 int ret;
3560 int sock_s, sock_c;
3561 net_socklen_t addrlen;
3562 struct net_sockaddr_in addr_c4 = { 0 };
3563 struct net_sockaddr_in addr_s4 = { 0 };
3564 struct net_sockaddr_in6 addr_s6 = { 0 };
3565 struct net_sockaddr_in6 addr_recv = { 0 };
3566 struct net_in6_addr mapped_address = { 0 };
3567
3568 /* Create IPv4 client socket */
3569 prepare_sock_udp_v4(MY_IPV4_ADDR, CLIENT_PORT, &sock_c, &addr_c4);
3570 /* Create IPv6 server socket */
3571 prepare_sock_udp_v6(ANY_IPV6_ADDR, SERVER_PORT, &sock_s, &addr_s6);
3572
3573 /* Prepare server's IPv4 address and expected mapped address */
3574 addr_s4.sin_family = NET_AF_INET;
3575 addr_s4.sin_port = net_htons(SERVER_PORT);
3576 ret = zsock_inet_pton(NET_AF_INET, MY_IPV4_ADDR, &addr_s4.sin_addr);
3577 zassert_equal(ret, 1, "inet_pton failed");
3578
3579 ret = zsock_inet_pton(NET_AF_INET6, MY_IPV4_MAPPED_ADDR, &mapped_address);
3580 zassert_equal(ret, 1, "inet_pton failed");
3581
3582 /* Bind the client socket to ensure we check the correct address */
3583 ret = zsock_bind(sock_c, (struct net_sockaddr *)&addr_c4, sizeof(addr_c4));
3584 zassert_ok(ret, "bind failed, %d", errno);
3585
3586 /* Turn off IPV6_V6ONLY on the server socket, so the socket becomes
3587 * dual-stack.
3588 */
3589 ret = zsock_setsockopt(sock_s, NET_IPPROTO_IPV6, ZSOCK_IPV6_V6ONLY, &off, sizeof(off));
3590 zassert_ok(ret, "setsockopt failed, %d", errno);
3591
3592 /* And bind it to ANY address */
3593 ret = zsock_bind(sock_s, (struct net_sockaddr *)&addr_s6, sizeof(addr_s6));
3594 zassert_ok(ret, "bind failed, %d", errno);
3595
3596 /* Send datagram from IPv4 client socket to dual-stack server */
3597 ret = zsock_sendto(sock_c, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1, 0,
3598 (struct net_sockaddr *)&addr_s4, sizeof(addr_s4));
3599 zexpect_equal(ret, sizeof(TEST_STR_SMALL) - 1,
3600 "invalid send len (was %d expected %d) (%d)",
3601 ret, sizeof(TEST_STR_SMALL) - 1, errno);
3602
3603 /* Give the packet a chance to go through the net stack */
3604 k_msleep(10);
3605
3606 /* Server should get the datagram, with IPv4-to-IPv6 mapped address */
3607 addrlen = sizeof(addr_recv);
3608 clear_buf(rx_buf);
3609 ret = zsock_recvfrom(sock_s, rx_buf, sizeof(rx_buf), ZSOCK_MSG_DONTWAIT,
3610 (struct net_sockaddr *)&addr_recv, &addrlen);
3611 zassert_true(ret >= 0, "recvfrom fail (%d)", errno);
3612 zassert_equal(ret, sizeof(TEST_STR_SMALL) - 1, "unexpected received bytes");
3613 zassert_mem_equal(rx_buf, BUF_AND_SIZE(TEST_STR_SMALL), "wrong data");
3614 zassert_equal(addrlen, sizeof(struct net_sockaddr_in6), "unexpected addrlen");
3615 zassert_equal(addr_recv.sin6_family, NET_AF_INET6,
3616 "IPv4-to-IPv6 mapped address should be NET_AF_INET6");
3617 zassert_equal(addr_recv.sin6_port, net_htons(CLIENT_PORT), "invalid port");
3618 zassert_mem_equal(&addr_recv.sin6_addr, &mapped_address,
3619 sizeof(mapped_address), "invalid mapped address");
3620
3621 /* Echo data back */
3622 if (test_mode == IPV4_MAPPED_TO_IPV6_SENDTO) {
3623 ret = zsock_sendto(sock_s, TEST_STR_SMALL, sizeof(TEST_STR_SMALL) - 1, 0,
3624 (struct net_sockaddr *)&addr_recv, addrlen);
3625 zexpect_equal(ret, sizeof(TEST_STR_SMALL) - 1,
3626 "invalid send len (was %d expected %d) (%d)",
3627 ret, sizeof(TEST_STR_SMALL) - 1, errno);
3628 } else if (test_mode == IPV4_MAPPED_TO_IPV6_SENDMSG) {
3629 struct net_msghdr msg = { 0 };
3630 struct net_iovec io_vector[1] = { 0 };
3631
3632 io_vector[0].iov_base = TEST_STR_SMALL;
3633 io_vector[0].iov_len = strlen(TEST_STR_SMALL);
3634
3635 msg.msg_iov = io_vector;
3636 msg.msg_iovlen = 1;
3637 msg.msg_name = &addr_recv;
3638 msg.msg_namelen = addrlen;
3639
3640 ret = zsock_sendmsg(sock_s, &msg, 0);
3641 zexpect_equal(ret, sizeof(TEST_STR_SMALL) - 1,
3642 "invalid send len (was %d expected %d) (%d)",
3643 ret, sizeof(TEST_STR_SMALL) - 1, errno);
3644 } else {
3645 zassert_unreachable("invalid test mode");
3646 }
3647
3648 /* Give the packet a chance to go through the net stack */
3649 k_msleep(10);
3650
3651 /* Client should get the echoed datagram */
3652 clear_buf(rx_buf);
3653 ret = zsock_recv(sock_c, rx_buf, sizeof(rx_buf), ZSOCK_MSG_DONTWAIT);
3654 zassert_true(ret >= 0, "recvfrom fail (%d)", errno);
3655 zassert_equal(ret, sizeof(TEST_STR_SMALL) - 1, "unexpected received bytes");
3656 zassert_mem_equal(rx_buf, BUF_AND_SIZE(TEST_STR_SMALL), "wrong data");
3657
3658 ret = zsock_close(sock_c);
3659 zassert_ok(ret, "close failed, %d", errno);
3660 ret = zsock_close(sock_s);
3661 zassert_ok(ret, "close failed, %d", errno);
3662 }
3663
ZTEST(net_socket_udp,test_ipv4_mapped_to_ipv6_sendto)3664 ZTEST(net_socket_udp, test_ipv4_mapped_to_ipv6_sendto)
3665 {
3666 Z_TEST_SKIP_IFNDEF(CONFIG_NET_IPV4_MAPPING_TO_IPV6);
3667
3668 test_ipv4_mapped_to_ipv6_send_common(IPV4_MAPPED_TO_IPV6_SENDTO);
3669 }
3670
ZTEST(net_socket_udp,test_ipv4_mapped_to_ipv6_sendmsg)3671 ZTEST(net_socket_udp, test_ipv4_mapped_to_ipv6_sendmsg)
3672 {
3673 Z_TEST_SKIP_IFNDEF(CONFIG_NET_IPV4_MAPPING_TO_IPV6);
3674
3675 test_ipv4_mapped_to_ipv6_send_common(IPV4_MAPPED_TO_IPV6_SENDMSG);
3676 }
3677
test_rebinding_common(net_sa_family_t family)3678 static void test_rebinding_common(net_sa_family_t family)
3679 {
3680 int rv;
3681 int client_sock;
3682 int server_sock;
3683 struct net_sockaddr client_addr;
3684 struct net_sockaddr server_addr;
3685 net_socklen_t addrlen;
3686
3687 if (family == NET_AF_INET) {
3688 prepare_sock_udp_v4(MY_IPV4_ADDR, CLIENT_PORT, &client_sock,
3689 (struct net_sockaddr_in *)&client_addr);
3690 prepare_sock_udp_v4(MY_IPV4_ADDR, SERVER_PORT, &server_sock,
3691 (struct net_sockaddr_in *)&server_addr);
3692 addrlen = sizeof(struct net_sockaddr_in);
3693 } else {
3694 prepare_sock_udp_v6(MY_IPV6_ADDR, CLIENT_PORT, &client_sock,
3695 (struct net_sockaddr_in6 *)&client_addr);
3696 prepare_sock_udp_v6(MY_IPV6_ADDR, SERVER_PORT, &server_sock,
3697 (struct net_sockaddr_in6 *)&server_addr);
3698 addrlen = sizeof(struct net_sockaddr_in6);
3699 }
3700
3701 rv = zsock_bind(client_sock, &client_addr, addrlen);
3702 zassert_equal(rv, 0, "bind failed");
3703
3704 rv = zsock_bind(server_sock, &server_addr, addrlen);
3705 zassert_equal(rv, 0, "bind failed");
3706
3707 /* Initial datagram exchange */
3708 comm_sendto_recvfrom(client_sock, &client_addr, addrlen,
3709 server_sock, &server_addr, addrlen);
3710
3711 /* Rebind client socket */
3712 if (family == NET_AF_INET) {
3713 net_sin(&client_addr)->sin_port = net_htons(CLIENT_PORT + 1);
3714 } else {
3715 net_sin6(&client_addr)->sin6_port = net_htons(CLIENT_PORT + 1);
3716 }
3717 rv = zsock_bind(client_sock, &client_addr, addrlen);
3718 zassert_equal(rv, 0, "rebinding failed");
3719
3720 /* Datagram exchange with rebound client socket */
3721 comm_sendto_recvfrom(client_sock, &client_addr, addrlen,
3722 server_sock, &server_addr, addrlen);
3723
3724 /* Rebind server socket */
3725 if (family == NET_AF_INET) {
3726 net_sin(&server_addr)->sin_port = net_htons(SERVER_PORT + 1);
3727 } else {
3728 net_sin6(&server_addr)->sin6_port = net_htons(SERVER_PORT + 1);
3729 }
3730 rv = zsock_bind(server_sock, &server_addr, addrlen);
3731 zassert_equal(rv, 0, "rebinding failed");
3732
3733 /* Datagram exchange with rebound server socket */
3734 comm_sendto_recvfrom(client_sock, &client_addr, addrlen,
3735 server_sock, &server_addr, addrlen);
3736
3737 rv = zsock_close(client_sock);
3738 zassert_equal(rv, 0, "close failed");
3739 rv = zsock_close(server_sock);
3740 zassert_equal(rv, 0, "close failed");
3741 }
3742
ZTEST(net_socket_udp,test_v4_rebinding)3743 ZTEST(net_socket_udp, test_v4_rebinding)
3744 {
3745 test_rebinding_common(NET_AF_INET);
3746 }
3747
ZTEST(net_socket_udp,test_v6_rebinding)3748 ZTEST(net_socket_udp, test_v6_rebinding)
3749 {
3750 test_rebinding_common(NET_AF_INET6);
3751 }
3752
after(void * arg)3753 static void after(void *arg)
3754 {
3755 ARG_UNUSED(arg);
3756
3757 for (int i = 0; i < ZVFS_OPEN_SIZE; ++i) {
3758 (void)zsock_close(i);
3759 }
3760 }
3761
setup(void)3762 static void *setup(void)
3763 {
3764 struct net_if_addr *ifaddr;
3765 int ret;
3766
3767
3768 net_if_foreach(iface_cb, ð_iface);
3769 zassert_not_null(eth_iface, "No ethernet interface found");
3770
3771 net_if_down(eth_iface);
3772
3773 ifaddr = net_if_ipv6_addr_add(eth_iface, &my_addr1,
3774 NET_ADDR_MANUAL, 0);
3775 if (!ifaddr) {
3776 DBG("Cannot add IPv6 address %s\n",
3777 net_sprint_ipv6_addr(&my_addr1));
3778 zassert_not_null(ifaddr, "addr1");
3779 }
3780
3781 ifaddr = net_if_ipv4_addr_add(eth_iface, &my_addr2,
3782 NET_ADDR_MANUAL, 0);
3783 if (!ifaddr) {
3784 DBG("Cannot add IPv4 address %s\n",
3785 net_sprint_ipv4_addr(&my_addr2));
3786 zassert_not_null(ifaddr, "addr2");
3787 }
3788
3789 net_if_up(eth_iface);
3790
3791 (void)memset(&udp_server_addr, 0, sizeof(udp_server_addr));
3792 udp_server_addr.sin6_family = NET_AF_INET6;
3793 udp_server_addr.sin6_port = net_htons(1234);
3794 ret = zsock_inet_pton(NET_AF_INET6, PEER_IPV6_ADDR_ETH, &udp_server_addr.sin6_addr);
3795 zassert_equal(ret, 1, "inet_pton failed");
3796
3797 /* In order to avoid neighbor discovery, populate neighbor cache */
3798 net_ipv6_nbr_add(eth_iface, &udp_server_addr.sin6_addr, &server_link_addr,
3799 true, NET_IPV6_NBR_STATE_REACHABLE);
3800
3801 (void)sys_sem_init(&wait_data, 0, 1);
3802
3803 return NULL;
3804 }
3805
3806 ZTEST_SUITE(net_socket_udp, NULL, setup, NULL, after, NULL);
3807