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