1 /*
2 * Copyright (c) 2018-2020 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <zephyr/logging/log.h>
8 LOG_MODULE_REGISTER(net_test, CONFIG_NET_SOCKETS_LOG_LEVEL);
9
10 #include <stdio.h>
11 #include <zephyr/ztest_assert.h>
12 #include <zephyr/sys/util.h>
13 #include <zephyr/sys/sem.h>
14 #include <zephyr/net/socket.h>
15 #include <zephyr/net/dns_resolve.h>
16 #include <zephyr/net_buf.h>
17
18 #include "../../socket_helpers.h"
19
20 #include "dns_pack.h"
21
22 #define QUERY_HOST "www.zephyrproject.org"
23
24 #define ANY_PORT 0
25 #define MAX_BUF_SIZE 128
26 #define STACK_SIZE (1024 + CONFIG_TEST_EXTRA_STACK_SIZE)
27 #define THREAD_PRIORITY K_PRIO_COOP(2)
28 #define WAIT_TIME K_MSEC(250)
29
30 static uint8_t recv_buf[MAX_BUF_SIZE];
31
32 static int sock_v4;
33 static int sock_v6;
34
35 static struct net_sockaddr_in addr_v4;
36 static struct net_sockaddr_in6 addr_v6;
37
38 static int queries_received;
39 static int expected_query_count =
40 CONFIG_NET_SOCKETS_DNS_BACKOFF_INTERVAL >= CONFIG_NET_SOCKETS_DNS_TIMEOUT ?
41 2 :
42 /* Calculate for both IPv4 and IPv6 so need to double the value */
43 2 * (LOG2CEIL(DIV_ROUND_UP(CONFIG_NET_SOCKETS_DNS_TIMEOUT,
44 CONFIG_NET_SOCKETS_DNS_BACKOFF_INTERVAL) + 1));
45
46 /* The semaphore is there to wait the data to be received. */
47 static ZTEST_BMEM struct sys_sem wait_data;
48
49 NET_BUF_POOL_DEFINE(test_dns_msg_pool, 1, 512, 0, NULL);
50
check_dns_query(uint8_t * buf,int buf_len)51 static bool check_dns_query(uint8_t *buf, int buf_len)
52 {
53 struct dns_msg_t dns_msg;
54 struct net_buf *result;
55 enum dns_rr_type qtype;
56 enum dns_class qclass;
57 int ret, queries;
58
59 /* Store the DNS query name into a temporary net_buf as that is
60 * expected by dns_unpack_query() function. In this test we are
61 * currently not sending any DNS response back as that is not
62 * really needed by these tests.
63 */
64 result = net_buf_alloc(&test_dns_msg_pool, K_FOREVER);
65 if (!result) {
66 return false;
67 }
68
69 dns_msg.msg = buf;
70 dns_msg.msg_size = buf_len;
71
72 ret = mdns_unpack_query_header(&dns_msg, NULL);
73 if (ret < 0) {
74 return false;
75 }
76
77 queries = ret;
78 queries_received++;
79
80 NET_DBG("Received %d %s", queries,
81 queries > 1 ? "queries" : "query");
82
83 (void)memset(result->data, 0, net_buf_tailroom(result));
84 result->len = 0U;
85
86 ret = dns_unpack_query(&dns_msg, result, &qtype, &qclass);
87 if (ret < 0) {
88 net_buf_unref(result);
89 return false;
90 }
91
92 NET_DBG("[%d] query %s/%s label %s (%d bytes)", queries,
93 qtype == DNS_RR_TYPE_A ? "A" : "AAAA", "IN",
94 result->data, ret);
95
96 /* In this test we are just checking if the query came to us in correct
97 * form, we are not creating a DNS server implementation here.
98 */
99 if (strncmp(result->data, QUERY_HOST,
100 sizeof(QUERY_HOST) - 1)) {
101 net_buf_unref(result);
102 return false;
103 }
104
105 net_buf_unref(result);
106
107 return true;
108 }
109
process_dns(void * p1,void * p2,void * p3)110 static void process_dns(void *p1, void *p2, void *p3)
111 {
112 ARG_UNUSED(p1);
113 ARG_UNUSED(p2);
114 ARG_UNUSED(p3);
115
116 struct zsock_pollfd pollfds[2];
117 struct net_sockaddr *addr;
118 net_socklen_t addr_len;
119 int ret, idx;
120
121 NET_DBG("Waiting for IPv4 DNS packets on port %d",
122 net_ntohs(addr_v4.sin_port));
123 NET_DBG("Waiting for IPv6 DNS packets on port %d",
124 net_ntohs(addr_v6.sin6_port));
125
126 while (true) {
127 memset(pollfds, 0, sizeof(pollfds));
128 pollfds[0].fd = sock_v4;
129 pollfds[0].events = ZSOCK_POLLIN;
130 pollfds[1].fd = sock_v6;
131 pollfds[1].events = ZSOCK_POLLIN;
132
133 NET_DBG("Polling...");
134
135 ret = zsock_poll(pollfds, ARRAY_SIZE(pollfds), -1);
136 if (ret <= 0) {
137 continue;
138 }
139
140 for (idx = 0; idx < ARRAY_SIZE(pollfds); idx++) {
141 if (pollfds[idx].revents & ZSOCK_POLLIN) {
142 if (pollfds[idx].fd == sock_v4) {
143 addr_len = sizeof(addr_v4);
144 addr = (struct net_sockaddr *)&addr_v4;
145 } else {
146 addr_len = sizeof(addr_v6);
147 addr = (struct net_sockaddr *)&addr_v6;
148 }
149
150 ret = zsock_recvfrom(pollfds[idx].fd,
151 recv_buf, sizeof(recv_buf), 0,
152 addr, &addr_len);
153 if (ret < 0) {
154 /* Socket error */
155 NET_ERR("DNS: Connection error (%d)",
156 errno);
157 break;
158 }
159
160 NET_DBG("Received DNS query");
161
162 ret = check_dns_query(recv_buf,
163 sizeof(recv_buf));
164 if (ret) {
165 (void)sys_sem_give(&wait_data);
166 }
167 }
168 }
169 }
170 }
171
172 K_THREAD_DEFINE(dns_server_thread_id, STACK_SIZE,
173 process_dns, NULL, NULL, NULL,
174 THREAD_PRIORITY, 0, -1);
175
test_getaddrinfo_setup(void)176 static void *test_getaddrinfo_setup(void)
177 {
178 char str[NET_INET6_ADDRSTRLEN], *addr_str;
179 struct net_sockaddr addr;
180 int ret;
181
182 ret = net_ipaddr_parse(CONFIG_DNS_SERVER1,
183 sizeof(CONFIG_DNS_SERVER1) - 1,
184 &addr);
185 zassert_true(ret, "Cannot parse IP address %s", CONFIG_DNS_SERVER1);
186
187 if (addr.sa_family == NET_AF_INET) {
188 memcpy(&addr_v4, net_sin(&addr), sizeof(struct net_sockaddr_in));
189 } else if (addr.sa_family == NET_AF_INET6) {
190 memcpy(&addr_v6, net_sin6(&addr), sizeof(struct net_sockaddr_in6));
191 }
192
193 ret = net_ipaddr_parse(CONFIG_DNS_SERVER2,
194 sizeof(CONFIG_DNS_SERVER2) - 1,
195 &addr);
196 zassert_true(ret, "Cannot parse IP address %s", CONFIG_DNS_SERVER2);
197
198 if (addr.sa_family == NET_AF_INET) {
199 memcpy(&addr_v4, net_sin(&addr), sizeof(struct net_sockaddr_in));
200 } else if (addr.sa_family == NET_AF_INET6) {
201 memcpy(&addr_v6, net_sin6(&addr), sizeof(struct net_sockaddr_in6));
202 }
203
204 addr_str = zsock_inet_ntop(NET_AF_INET, &addr_v4.sin_addr, str, sizeof(str));
205 NET_DBG("v4: [%s]:%d", addr_str, net_ntohs(addr_v4.sin_port));
206
207 sock_v4 = prepare_listen_sock_udp_v4(&addr_v4);
208 zassert_true(sock_v4 >= 0, "Invalid IPv4 socket");
209
210 addr_str = zsock_inet_ntop(NET_AF_INET6, &addr_v6.sin6_addr, str, sizeof(str));
211 NET_DBG("v6: [%s]:%d", addr_str, net_ntohs(addr_v6.sin6_port));
212
213 sock_v6 = prepare_listen_sock_udp_v6(&addr_v6);
214 zassert_true(sock_v6 >= 0, "Invalid IPv6 socket");
215
216 sys_sem_init(&wait_data, 0, INT_MAX);
217
218 k_thread_start(dns_server_thread_id);
219
220 k_thread_priority_set(dns_server_thread_id,
221 k_thread_priority_get(k_current_get()));
222 k_yield();
223
224 return NULL;
225 }
226
ZTEST(net_socket_getaddrinfo,test_getaddrinfo_ok)227 ZTEST(net_socket_getaddrinfo, test_getaddrinfo_ok)
228 {
229 struct zsock_addrinfo *res = NULL;
230
231 queries_received = 0;
232
233 /* This check simulates a local query that we will catch
234 * in process_dns() function. So we do not check the res variable
235 * as that will currently not contain anything useful. We just check
236 * that the query triggered a function call to process_dns() function
237 * and that it could parse the DNS query.
238 */
239 (void)zsock_getaddrinfo(QUERY_HOST, NULL, NULL, &res);
240
241 (void)sys_sem_take(&wait_data, K_NO_WAIT);
242 (void)sys_sem_take(&wait_data, K_NO_WAIT);
243
244 zassert_equal(queries_received, expected_query_count,
245 "Did not receive both IPv4 and IPv6 query (got %d, expected %d)",
246 queries_received, expected_query_count);
247
248 zsock_freeaddrinfo(res);
249 }
250
ZTEST(net_socket_getaddrinfo,test_getaddrinfo_cancelled)251 ZTEST(net_socket_getaddrinfo, test_getaddrinfo_cancelled)
252 {
253 struct zsock_addrinfo *res = NULL;
254 int ret;
255
256 ret = zsock_getaddrinfo(QUERY_HOST, NULL, NULL, &res);
257
258 (void)sys_sem_take(&wait_data, K_NO_WAIT);
259 (void)sys_sem_take(&wait_data, K_NO_WAIT);
260
261 zassert_equal(queries_received, expected_query_count,
262 "Did not receive both IPv4 and IPv6 query (got %d, expected %d)",
263 queries_received, expected_query_count);
264
265 /* Without a local DNS server this request will be canceled. */
266 zassert_equal(ret, DNS_EAI_CANCELED, "Invalid result");
267
268 zsock_freeaddrinfo(res);
269 }
270
ZTEST(net_socket_getaddrinfo,test_getaddrinfo_no_host)271 ZTEST(net_socket_getaddrinfo, test_getaddrinfo_no_host)
272 {
273 struct zsock_addrinfo *res = NULL;
274 int ret;
275
276 ret = zsock_getaddrinfo(NULL, NULL, NULL, &res);
277
278 zassert_equal(ret, DNS_EAI_SYSTEM, "Invalid result");
279 zassert_equal(errno, EINVAL, "Invalid errno");
280 zassert_is_null(res, "ai_addr is not NULL");
281
282 zsock_freeaddrinfo(res);
283 }
284
ZTEST(net_socket_getaddrinfo,test_getaddrinfo_num_ipv4)285 ZTEST(net_socket_getaddrinfo, test_getaddrinfo_num_ipv4)
286 {
287 struct zsock_addrinfo *res = NULL;
288 struct net_sockaddr_in *saddr;
289 int ret;
290
291 struct zsock_addrinfo hints = {
292 .ai_family = NET_AF_INET,
293 .ai_socktype = NET_SOCK_STREAM
294 };
295
296 ret = zsock_getaddrinfo("1.2.3.255", "65534", NULL, &res);
297
298 zassert_equal(ret, 0, "Invalid result");
299 zassert_not_null(res, "");
300 zassert_is_null(res->ai_next, "");
301 zassert_equal(res->ai_family, NET_AF_INET, "");
302 zassert_equal(res->ai_socktype, NET_SOCK_STREAM, "");
303 zassert_equal(res->ai_protocol, NET_IPPROTO_TCP, "");
304 zsock_freeaddrinfo(res);
305
306 ret = zsock_getaddrinfo("1.2.3.255", "65534", &hints, &res);
307 zassert_equal(ret, 0, "Invalid result");
308 zassert_not_null(res, "");
309 zassert_is_null(res->ai_next, "");
310 zassert_equal(res->ai_family, NET_AF_INET, "");
311 zassert_equal(res->ai_socktype, NET_SOCK_STREAM, "");
312 zassert_equal(res->ai_protocol, NET_IPPROTO_TCP, "");
313 zsock_freeaddrinfo(res);
314
315 hints.ai_socktype = NET_SOCK_DGRAM;
316 ret = zsock_getaddrinfo("1.2.3.255", "65534", &hints, &res);
317 zassert_equal(ret, 0, "Invalid result");
318 zassert_not_null(res, "");
319 zassert_is_null(res->ai_next, "");
320 zassert_equal(res->ai_family, NET_AF_INET, "");
321 zassert_equal(res->ai_socktype, NET_SOCK_DGRAM, "");
322 zassert_equal(res->ai_protocol, NET_IPPROTO_UDP, "");
323
324 saddr = (struct net_sockaddr_in *)res->ai_addr;
325 zassert_equal(saddr->sin_family, NET_AF_INET, "");
326 zassert_equal(saddr->sin_port, net_htons(65534), "");
327 zassert_equal(saddr->sin_addr.s4_addr[0], 1, "");
328 zassert_equal(saddr->sin_addr.s4_addr[1], 2, "");
329 zassert_equal(saddr->sin_addr.s4_addr[2], 3, "");
330 zassert_equal(saddr->sin_addr.s4_addr[3], 255, "");
331 zsock_freeaddrinfo(res);
332 }
333
ZTEST(net_socket_getaddrinfo,test_getaddrinfo_num_ipv6)334 ZTEST(net_socket_getaddrinfo, test_getaddrinfo_num_ipv6)
335 {
336 struct zsock_addrinfo *res = NULL;
337 struct net_sockaddr_in6 *saddr;
338 int ret;
339
340 struct zsock_addrinfo hints = {
341 .ai_family = NET_AF_INET6,
342 .ai_socktype = NET_SOCK_STREAM
343 };
344
345 ret = zsock_getaddrinfo("[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]",
346 "65534", NULL, &res);
347
348 zassert_equal(ret, 0, "Invalid result");
349 zassert_not_null(res, "");
350 zassert_is_null(res->ai_next, "");
351 zassert_equal(res->ai_family, NET_AF_INET6, "");
352 zassert_equal(res->ai_socktype, NET_SOCK_STREAM, "");
353 zassert_equal(res->ai_protocol, NET_IPPROTO_TCP, "");
354
355 saddr = (struct net_sockaddr_in6 *)res->ai_addr;
356 zassert_equal(saddr->sin6_family, NET_AF_INET6, "");
357 zassert_equal(saddr->sin6_port, net_htons(65534), "");
358 zassert_equal(saddr->sin6_addr.s6_addr[0], 0xFE, "");
359 zassert_equal(saddr->sin6_addr.s6_addr[1], 0xDC, "");
360 zassert_equal(saddr->sin6_addr.s6_addr[2], 0xBA, "");
361 zassert_equal(saddr->sin6_addr.s6_addr[3], 0x98, "");
362 zassert_equal(saddr->sin6_addr.s6_addr[4], 0x76, "");
363 zassert_equal(saddr->sin6_addr.s6_addr[5], 0x54, "");
364 zassert_equal(saddr->sin6_addr.s6_addr[6], 0x32, "");
365 zassert_equal(saddr->sin6_addr.s6_addr[7], 0x10, "");
366 zassert_equal(saddr->sin6_addr.s6_addr[8], 0xFE, "");
367 zassert_equal(saddr->sin6_addr.s6_addr[9], 0xDC, "");
368 zassert_equal(saddr->sin6_addr.s6_addr[10], 0xBA, "");
369 zassert_equal(saddr->sin6_addr.s6_addr[11], 0x98, "");
370 zassert_equal(saddr->sin6_addr.s6_addr[12], 0x76, "");
371 zassert_equal(saddr->sin6_addr.s6_addr[13], 0x54, "");
372 zassert_equal(saddr->sin6_addr.s6_addr[14], 0x32, "");
373 zassert_equal(saddr->sin6_addr.s6_addr[15], 0x10, "");
374 zsock_freeaddrinfo(res);
375
376
377 ret = zsock_getaddrinfo("[1080:0:0:0:8:800:200C:417A]",
378 "65534", &hints, &res);
379 zassert_equal(ret, 0, "Invalid result");
380 zassert_not_null(res, "");
381 zassert_is_null(res->ai_next, "");
382 zassert_equal(res->ai_family, NET_AF_INET6, "");
383 zassert_equal(res->ai_socktype, NET_SOCK_STREAM, "");
384 zassert_equal(res->ai_protocol, NET_IPPROTO_TCP, "");
385
386 saddr = (struct net_sockaddr_in6 *)res->ai_addr;
387 zassert_equal(saddr->sin6_family, NET_AF_INET6, "");
388 zassert_equal(saddr->sin6_port, net_htons(65534), "");
389 zassert_equal(saddr->sin6_addr.s6_addr[0], 0x10, "");
390 zassert_equal(saddr->sin6_addr.s6_addr[1], 0x80, "");
391 zassert_equal(saddr->sin6_addr.s6_addr[2], 0x0, "");
392 zassert_equal(saddr->sin6_addr.s6_addr[3], 0x0, "");
393 zassert_equal(saddr->sin6_addr.s6_addr[4], 0x0, "");
394 zassert_equal(saddr->sin6_addr.s6_addr[5], 0x0, "");
395 zassert_equal(saddr->sin6_addr.s6_addr[6], 0x0, "");
396 zassert_equal(saddr->sin6_addr.s6_addr[7], 0x0, "");
397 zassert_equal(saddr->sin6_addr.s6_addr[8], 0x0, "");
398 zassert_equal(saddr->sin6_addr.s6_addr[9], 0x08, "");
399 zassert_equal(saddr->sin6_addr.s6_addr[10], 0x08, "");
400 zassert_equal(saddr->sin6_addr.s6_addr[11], 0x00, "");
401 zassert_equal(saddr->sin6_addr.s6_addr[12], 0x20, "");
402 zassert_equal(saddr->sin6_addr.s6_addr[13], 0x0C, "");
403 zassert_equal(saddr->sin6_addr.s6_addr[14], 0x41, "");
404 zassert_equal(saddr->sin6_addr.s6_addr[15], 0x7A, "");
405 zsock_freeaddrinfo(res);
406
407
408 hints.ai_socktype = NET_SOCK_DGRAM;
409 ret = zsock_getaddrinfo("[3ffe:2a00:100:7031::1]",
410 "65534", &hints, &res);
411 zassert_equal(ret, 0, "Invalid result");
412 zassert_not_null(res, "");
413 zassert_is_null(res->ai_next, "");
414 zassert_equal(res->ai_family, NET_AF_INET6, "");
415 zassert_equal(res->ai_socktype, NET_SOCK_DGRAM, "");
416 zassert_equal(res->ai_protocol, NET_IPPROTO_UDP, "");
417
418 saddr = (struct net_sockaddr_in6 *)res->ai_addr;
419 zassert_equal(saddr->sin6_family, NET_AF_INET6, "");
420 zassert_equal(saddr->sin6_port, net_htons(65534), "");
421 zassert_equal(saddr->sin6_addr.s6_addr[0], 0x3f, "");
422 zassert_equal(saddr->sin6_addr.s6_addr[1], 0xfe, "");
423 zassert_equal(saddr->sin6_addr.s6_addr[2], 0x2a, "");
424 zassert_equal(saddr->sin6_addr.s6_addr[3], 0x00, "");
425 zassert_equal(saddr->sin6_addr.s6_addr[4], 0x01, "");
426 zassert_equal(saddr->sin6_addr.s6_addr[5], 0x00, "");
427 zassert_equal(saddr->sin6_addr.s6_addr[6], 0x70, "");
428 zassert_equal(saddr->sin6_addr.s6_addr[7], 0x31, "");
429 zassert_equal(saddr->sin6_addr.s6_addr[8], 0x0, "");
430 zassert_equal(saddr->sin6_addr.s6_addr[9], 0x0, "");
431 zassert_equal(saddr->sin6_addr.s6_addr[10], 0x0, "");
432 zassert_equal(saddr->sin6_addr.s6_addr[11], 0x0, "");
433 zassert_equal(saddr->sin6_addr.s6_addr[12], 0x0, "");
434 zassert_equal(saddr->sin6_addr.s6_addr[13], 0x0, "");
435 zassert_equal(saddr->sin6_addr.s6_addr[14], 0x0, "");
436 zassert_equal(saddr->sin6_addr.s6_addr[15], 0x1, "");
437 zsock_freeaddrinfo(res);
438
439
440 ret = zsock_getaddrinfo("[1080::8:800:200C:417A]",
441 "65534", &hints, &res);
442 zassert_equal(ret, 0, "Invalid result");
443
444 saddr = (struct net_sockaddr_in6 *)res->ai_addr;
445 zassert_equal(saddr->sin6_family, NET_AF_INET6, "");
446 zassert_equal(saddr->sin6_port, net_htons(65534), "");
447 zassert_equal(saddr->sin6_addr.s6_addr[0], 0x10, "");
448 zassert_equal(saddr->sin6_addr.s6_addr[1], 0x80, "");
449 zassert_equal(saddr->sin6_addr.s6_addr[2], 0x0, "");
450 zassert_equal(saddr->sin6_addr.s6_addr[3], 0x0, "");
451 zassert_equal(saddr->sin6_addr.s6_addr[4], 0x0, "");
452 zassert_equal(saddr->sin6_addr.s6_addr[5], 0x0, "");
453 zassert_equal(saddr->sin6_addr.s6_addr[6], 0x0, "");
454 zassert_equal(saddr->sin6_addr.s6_addr[7], 0x0, "");
455 zassert_equal(saddr->sin6_addr.s6_addr[8], 0x0, "");
456 zassert_equal(saddr->sin6_addr.s6_addr[9], 0x8, "");
457 zassert_equal(saddr->sin6_addr.s6_addr[10], 0x08, "");
458 zassert_equal(saddr->sin6_addr.s6_addr[11], 0x00, "");
459 zassert_equal(saddr->sin6_addr.s6_addr[12], 0x20, "");
460 zassert_equal(saddr->sin6_addr.s6_addr[13], 0x0C, "");
461 zassert_equal(saddr->sin6_addr.s6_addr[14], 0x41, "");
462 zassert_equal(saddr->sin6_addr.s6_addr[15], 0x7A, "");
463 zsock_freeaddrinfo(res);
464
465
466 ret = zsock_getaddrinfo("[::192.9.5.5]", "65534", &hints, &res);
467 zassert_equal(ret, 0, "Invalid result");
468
469 saddr = (struct net_sockaddr_in6 *)res->ai_addr;
470 zassert_equal(saddr->sin6_family, NET_AF_INET6, "");
471 zassert_equal(saddr->sin6_port, net_htons(65534), "");
472 zassert_equal(saddr->sin6_addr.s6_addr[0], 0x0, "");
473 zassert_equal(saddr->sin6_addr.s6_addr[1], 0x0, "");
474 zassert_equal(saddr->sin6_addr.s6_addr[2], 0x0, "");
475 zassert_equal(saddr->sin6_addr.s6_addr[3], 0x0, "");
476 zassert_equal(saddr->sin6_addr.s6_addr[4], 0x0, "");
477 zassert_equal(saddr->sin6_addr.s6_addr[5], 0x0, "");
478 zassert_equal(saddr->sin6_addr.s6_addr[6], 0x0, "");
479 zassert_equal(saddr->sin6_addr.s6_addr[7], 0x0, "");
480 zassert_equal(saddr->sin6_addr.s6_addr[8], 0x0, "");
481 zassert_equal(saddr->sin6_addr.s6_addr[9], 0x0, "");
482 zassert_equal(saddr->sin6_addr.s6_addr[10], 0x0, "");
483 zassert_equal(saddr->sin6_addr.s6_addr[11], 0x0, "");
484 zassert_equal(saddr->sin6_addr.s6_addr[12], 192, "");
485 zassert_equal(saddr->sin6_addr.s6_addr[13], 9, "");
486 zassert_equal(saddr->sin6_addr.s6_addr[14], 5, "");
487 zassert_equal(saddr->sin6_addr.s6_addr[15], 5, "");
488 zsock_freeaddrinfo(res);
489
490
491 ret = zsock_getaddrinfo("[::FFFF:129.144.52.38]",
492 "65534", &hints, &res);
493 zassert_equal(ret, 0, "Invalid result");
494
495 saddr = (struct net_sockaddr_in6 *)res->ai_addr;
496 zassert_equal(saddr->sin6_family, NET_AF_INET6, "");
497 zassert_equal(saddr->sin6_port, net_htons(65534), "");
498 zassert_equal(saddr->sin6_addr.s6_addr[0], 0x0, "");
499 zassert_equal(saddr->sin6_addr.s6_addr[1], 0x0, "");
500 zassert_equal(saddr->sin6_addr.s6_addr[2], 0x0, "");
501 zassert_equal(saddr->sin6_addr.s6_addr[3], 0x0, "");
502 zassert_equal(saddr->sin6_addr.s6_addr[4], 0x0, "");
503 zassert_equal(saddr->sin6_addr.s6_addr[5], 0x0, "");
504 zassert_equal(saddr->sin6_addr.s6_addr[6], 0x0, "");
505 zassert_equal(saddr->sin6_addr.s6_addr[7], 0x0, "");
506 zassert_equal(saddr->sin6_addr.s6_addr[8], 0x0, "");
507 zassert_equal(saddr->sin6_addr.s6_addr[9], 0x0, "");
508 zassert_equal(saddr->sin6_addr.s6_addr[10], 0xFF, "");
509 zassert_equal(saddr->sin6_addr.s6_addr[11], 0xFF, "");
510 zassert_equal(saddr->sin6_addr.s6_addr[12], 129, "");
511 zassert_equal(saddr->sin6_addr.s6_addr[13], 144, "");
512 zassert_equal(saddr->sin6_addr.s6_addr[14], 52, "");
513 zassert_equal(saddr->sin6_addr.s6_addr[15], 38, "");
514 zsock_freeaddrinfo(res);
515
516
517 ret = zsock_getaddrinfo("[2010:836B:4179::836B:4179]",
518 "65534", &hints, &res);
519 zassert_equal(ret, 0, "Invalid result");
520
521 saddr = (struct net_sockaddr_in6 *)res->ai_addr;
522 zassert_equal(saddr->sin6_family, NET_AF_INET6, "");
523 zassert_equal(saddr->sin6_port, net_htons(65534), "");
524 zassert_equal(saddr->sin6_addr.s6_addr[0], 0x20, "");
525 zassert_equal(saddr->sin6_addr.s6_addr[1], 0x10, "");
526 zassert_equal(saddr->sin6_addr.s6_addr[2], 0x83, "");
527 zassert_equal(saddr->sin6_addr.s6_addr[3], 0x6B, "");
528 zassert_equal(saddr->sin6_addr.s6_addr[4], 0x41, "");
529 zassert_equal(saddr->sin6_addr.s6_addr[5], 0x79, "");
530 zassert_equal(saddr->sin6_addr.s6_addr[6], 0x0, "");
531 zassert_equal(saddr->sin6_addr.s6_addr[7], 0x0, "");
532 zassert_equal(saddr->sin6_addr.s6_addr[8], 0x0, "");
533 zassert_equal(saddr->sin6_addr.s6_addr[9], 0x0, "");
534 zassert_equal(saddr->sin6_addr.s6_addr[10], 0x0, "");
535 zassert_equal(saddr->sin6_addr.s6_addr[11], 0x0, "");
536 zassert_equal(saddr->sin6_addr.s6_addr[12], 0x83, "");
537 zassert_equal(saddr->sin6_addr.s6_addr[13], 0x6B, "");
538 zassert_equal(saddr->sin6_addr.s6_addr[14], 0x41, "");
539 zassert_equal(saddr->sin6_addr.s6_addr[15], 0x79, "");
540 zsock_freeaddrinfo(res);
541 }
542
ZTEST(net_socket_getaddrinfo,test_getaddrinfo_flags_numerichost)543 ZTEST(net_socket_getaddrinfo, test_getaddrinfo_flags_numerichost)
544 {
545 int ret;
546 struct zsock_addrinfo *res = NULL;
547 struct zsock_addrinfo hints = {
548 .ai_flags = ZSOCK_AI_NUMERICHOST,
549 };
550
551 ret = zsock_getaddrinfo("foo.bar", "65534", &hints, &res);
552 zassert_equal(ret, DNS_EAI_FAIL, "Invalid result");
553 zassert_is_null(res, "");
554
555 ret = zsock_getaddrinfo("1.2.3.4", "65534", &hints, &res);
556 zassert_equal(ret, 0, "Invalid result");
557 zassert_not_null(res, "");
558
559 zsock_freeaddrinfo(res);
560 }
561
ZTEST(net_socket_getaddrinfo,test_getaddrinfo_ipv4_hints_ipv6)562 ZTEST(net_socket_getaddrinfo, test_getaddrinfo_ipv4_hints_ipv6)
563 {
564 struct zsock_addrinfo *res = NULL;
565 struct zsock_addrinfo hints = {
566 .ai_family = NET_AF_INET6,
567 };
568 int ret;
569
570 ret = zsock_getaddrinfo("192.0.2.1", NULL, &hints, &res);
571 zassert_equal(ret, DNS_EAI_ADDRFAMILY, "Invalid result (%d)", ret);
572 zassert_is_null(res, "");
573 zsock_freeaddrinfo(res);
574 }
575
ZTEST(net_socket_getaddrinfo,test_getaddrinfo_ipv6_hints_ipv4)576 ZTEST(net_socket_getaddrinfo, test_getaddrinfo_ipv6_hints_ipv4)
577 {
578 struct zsock_addrinfo *res = NULL;
579 struct zsock_addrinfo hints = {
580 .ai_family = NET_AF_INET,
581 };
582 int ret;
583
584 ret = zsock_getaddrinfo("2001:db8::1", NULL, &hints, &res);
585 zassert_equal(ret, DNS_EAI_ADDRFAMILY, "Invalid result (%d)", ret);
586 zassert_is_null(res, "");
587 zsock_freeaddrinfo(res);
588 }
589
ZTEST(net_socket_getaddrinfo,test_getaddrinfo_port_invalid)590 ZTEST(net_socket_getaddrinfo, test_getaddrinfo_port_invalid)
591 {
592 int ret;
593 struct zsock_addrinfo *res = NULL;
594 ret = zsock_getaddrinfo("192.0.2.1", "70000", NULL, &res);
595 zassert_equal(ret, DNS_EAI_NONAME, "Invalid result (%d)", ret);
596 zassert_is_null(res, "");
597 zsock_freeaddrinfo(res);
598 }
599
ZTEST(net_socket_getaddrinfo,test_getaddrinfo_null_host)600 ZTEST(net_socket_getaddrinfo, test_getaddrinfo_null_host)
601 {
602 struct net_sockaddr_in *saddr;
603 struct net_sockaddr_in6 *saddr6;
604 struct zsock_addrinfo *res = NULL;
605 struct zsock_addrinfo hints = {
606 .ai_family = NET_AF_INET,
607 .ai_socktype = NET_SOCK_STREAM,
608 .ai_flags = ZSOCK_AI_PASSIVE
609 };
610 int ret;
611
612 /* Test IPv4 TCP */
613 ret = zsock_getaddrinfo(NULL, "80", &hints, &res);
614 zassert_equal(ret, 0, "Invalid result");
615 zassert_not_null(res, "");
616 zassert_is_null(res->ai_next, "");
617 zassert_equal(res->ai_family, NET_AF_INET, "");
618 zassert_equal(res->ai_socktype, NET_SOCK_STREAM, "");
619 zassert_equal(res->ai_protocol, NET_IPPROTO_TCP, "");
620 saddr = net_sin(res->ai_addr);
621 zassert_equal(saddr->sin_family, NET_AF_INET, "");
622 zassert_equal(saddr->sin_port, net_htons(80), "");
623 zassert_equal(saddr->sin_addr.s_addr, NET_INADDR_ANY, "");
624 zsock_freeaddrinfo(res);
625
626 /* Test IPv6 TCP */
627 hints.ai_family = NET_AF_INET6;
628 ret = zsock_getaddrinfo(NULL, "80", &hints, &res);
629 zassert_equal(ret, 0, "Invalid result");
630 zassert_not_null(res, "");
631 zassert_is_null(res->ai_next, "");
632 zassert_equal(res->ai_family, NET_AF_INET6, "");
633 zassert_equal(res->ai_socktype, NET_SOCK_STREAM, "");
634 zassert_equal(res->ai_protocol, NET_IPPROTO_TCP, "");
635 saddr6 = net_sin6(res->ai_addr);
636 zassert_equal(saddr6->sin6_family, NET_AF_INET6, "");
637 zassert_equal(saddr6->sin6_port, net_htons(80), "");
638 zassert_equal(0, memcmp(&saddr6->sin6_addr, &net_in6addr_any, sizeof(net_in6addr_any)), "");
639 zsock_freeaddrinfo(res);
640
641 /* Test IPv6 UDP */
642 hints.ai_socktype = NET_SOCK_DGRAM;
643 ret = zsock_getaddrinfo(NULL, "80", &hints, &res);
644 zassert_equal(ret, 0, "Invalid result");
645 zassert_not_null(res, "");
646 zassert_is_null(res->ai_next, "");
647 zassert_equal(res->ai_family, NET_AF_INET6, "");
648 zassert_equal(res->ai_socktype, NET_SOCK_DGRAM, "");
649 zassert_equal(res->ai_protocol, NET_IPPROTO_UDP, "");
650 saddr6 = (struct net_sockaddr_in6 *)res->ai_addr;
651 zassert_equal(saddr6->sin6_family, NET_AF_INET6, "");
652 zassert_equal(saddr6->sin6_port, net_htons(80), "");
653 zsock_freeaddrinfo(res);
654
655 /* Test IPv4 UDP */
656 hints.ai_family = NET_AF_INET;
657 ret = zsock_getaddrinfo(NULL, "80", &hints, &res);
658 zassert_equal(ret, 0, "Invalid result");
659 zassert_not_null(res, "");
660 zassert_is_null(res->ai_next, "");
661 zassert_equal(res->ai_family, NET_AF_INET, "");
662 zassert_equal(res->ai_socktype, NET_SOCK_DGRAM, "");
663 zassert_equal(res->ai_protocol, NET_IPPROTO_UDP, "");
664 saddr = (struct net_sockaddr_in *)res->ai_addr;
665 zassert_equal(saddr->sin_family, NET_AF_INET, "");
666 zassert_equal(saddr->sin_port, net_htons(80), "");
667 zsock_freeaddrinfo(res);
668 }
669
670 ZTEST_SUITE(net_socket_getaddrinfo, NULL, test_getaddrinfo_setup, NULL, NULL, NULL);
671