1 /* main.c - Application main entry point */
2 
3 /*
4  * Copyright (c) 2016 Intel Corporation
5  *
6  * SPDX-License-Identifier: Apache-2.0
7  */
8 
9 #define NET_LOG_LEVEL CONFIG_NET_UDP_LOG_LEVEL
10 
11 #include <zephyr/logging/log.h>
12 LOG_MODULE_REGISTER(net_test, NET_LOG_LEVEL);
13 
14 #include <zephyr/kernel.h>
15 #include <zephyr/linker/sections.h>
16 
17 #include <zephyr/types.h>
18 #include <stddef.h>
19 #include <string.h>
20 #include <stdio.h>
21 #include <errno.h>
22 #include <zephyr/device.h>
23 #include <zephyr/init.h>
24 #include <zephyr/sys/printk.h>
25 #include <zephyr/net/buf.h>
26 #include <zephyr/net/net_core.h>
27 #include <zephyr/net/net_pkt.h>
28 #include <zephyr/net/net_ip.h>
29 #include <zephyr/net/ethernet.h>
30 #include <zephyr/net/dummy.h>
31 #include <zephyr/net/udp.h>
32 #include <zephyr/random/random.h>
33 
34 #include "ipv4.h"
35 #include "ipv6.h"
36 
37 #include <zephyr/ztest.h>
38 
39 #if NET_LOG_LEVEL >= LOG_LEVEL_DBG
40 #define DBG(fmt, ...) printk(fmt, ##__VA_ARGS__)
41 #else
42 #define DBG(fmt, ...)
43 #endif
44 
45 #include "udp_internal.h"
46 
47 #if NET_LOG_LEVEL >= LOG_LEVEL_DBG
48 #define NET_LOG_ENABLED 1
49 #endif
50 #include "net_private.h"
51 #include "ipv4.h"
52 
53 static bool test_failed;
54 static bool fail = true;
55 static struct k_sem recv_lock;
56 static char payload[] = { 'f', 'o', 'o', 'b', 'a', 'r', '\0' };
57 
58 struct net_udp_context {
59 	uint8_t mac_addr[sizeof(struct net_eth_addr)];
60 	struct net_linkaddr ll_addr;
61 };
62 
net_udp_dev_init(const struct device * dev)63 int net_udp_dev_init(const struct device *dev)
64 {
65 	struct net_udp_context *net_udp_context = dev->data;
66 
67 	net_udp_context = net_udp_context;
68 
69 	return 0;
70 }
71 
net_udp_get_mac(const struct device * dev)72 static uint8_t *net_udp_get_mac(const struct device *dev)
73 {
74 	struct net_udp_context *context = dev->data;
75 
76 	if (context->mac_addr[2] == 0x00) {
77 		/* 00-00-5E-00-53-xx Documentation RFC 7042 */
78 		context->mac_addr[0] = 0x00;
79 		context->mac_addr[1] = 0x00;
80 		context->mac_addr[2] = 0x5E;
81 		context->mac_addr[3] = 0x00;
82 		context->mac_addr[4] = 0x53;
83 		context->mac_addr[5] = sys_rand8_get();
84 	}
85 
86 	return context->mac_addr;
87 }
88 
net_udp_iface_init(struct net_if * iface)89 static void net_udp_iface_init(struct net_if *iface)
90 {
91 	uint8_t *mac = net_udp_get_mac(net_if_get_device(iface));
92 
93 	net_if_set_link_addr(iface, mac, 6, NET_LINK_ETHERNET);
94 }
95 
96 static int send_status = -EINVAL;
97 
tester_send(const struct device * dev,struct net_pkt * pkt)98 static int tester_send(const struct device *dev, struct net_pkt *pkt)
99 {
100 	if (!pkt->frags) {
101 		DBG("No data to send!\n");
102 		return -ENODATA;
103 	}
104 
105 	DBG("Data was sent successfully\n");
106 
107 	send_status = 0;
108 
109 	return 0;
110 }
111 
if_get_addr(struct net_if * iface)112 static inline struct in_addr *if_get_addr(struct net_if *iface)
113 {
114 	int i;
115 
116 	for (i = 0; i < NET_IF_MAX_IPV4_ADDR; i++) {
117 		if (iface->config.ip.ipv4->unicast[i].ipv4.is_used &&
118 		    iface->config.ip.ipv4->unicast[i].ipv4.address.family ==
119 								AF_INET &&
120 		    iface->config.ip.ipv4->unicast[i].ipv4.addr_state ==
121 							NET_ADDR_PREFERRED) {
122 			return
123 			    &iface->config.ip.ipv4->unicast[i].ipv4.address.in_addr;
124 		}
125 	}
126 
127 	return NULL;
128 }
129 
130 struct net_udp_context net_udp_context_data;
131 
132 static struct dummy_api net_udp_if_api = {
133 	.iface_api.init = net_udp_iface_init,
134 	.send = tester_send,
135 };
136 
137 #define _ETH_L2_LAYER DUMMY_L2
138 #define _ETH_L2_CTX_TYPE NET_L2_GET_CTX_TYPE(DUMMY_L2)
139 
140 NET_DEVICE_INIT(net_udp_test, "net_udp_test",
141 		net_udp_dev_init, NULL,
142 		&net_udp_context_data, NULL,
143 		CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
144 		&net_udp_if_api, _ETH_L2_LAYER, _ETH_L2_CTX_TYPE, 127);
145 
146 struct ud {
147 	const struct sockaddr *remote_addr;
148 	const struct sockaddr *local_addr;
149 	uint16_t remote_port;
150 	uint16_t local_port;
151 	char *test;
152 	void *handle;
153 };
154 
155 static struct ud *returned_ud;
156 
test_ok(struct net_conn * conn,struct net_pkt * pkt,union net_ip_header * ip_hdr,union net_proto_header * proto_hdr,void * user_data)157 static enum net_verdict test_ok(struct net_conn *conn,
158 				struct net_pkt *pkt,
159 				union net_ip_header *ip_hdr,
160 				union net_proto_header *proto_hdr,
161 				void *user_data)
162 {
163 	struct ud *ud = (struct ud *)user_data;
164 
165 	k_sem_give(&recv_lock);
166 
167 	if (!ud) {
168 		fail = true;
169 
170 		DBG("Test %s failed.", ud->test);
171 
172 		return NET_DROP;
173 	}
174 
175 	fail = false;
176 
177 	returned_ud = user_data;
178 
179 	net_pkt_unref(pkt);
180 
181 	return NET_OK;
182 }
183 
test_fail(struct net_conn * conn,struct net_pkt * pkt,union net_ip_header * ip_hdr,union net_proto_header * proto_hdr,void * user_data)184 static enum net_verdict test_fail(struct net_conn *conn,
185 				  struct net_pkt *pkt,
186 				  union net_ip_header *ip_hdr,
187 				  union net_proto_header *proto_hdr,
188 				  void *user_data)
189 {
190 	/* This function should never be called as there should not
191 	 * be a matching UDP connection.
192 	 */
193 
194 	fail = true;
195 	return NET_DROP;
196 }
197 
198 uint8_t ipv6_hop_by_hop_ext_hdr[] = {
199 /* Next header UDP */
200 0x11,
201 /* Length (multiple of 8 octets) */
202 0x0C,
203 /* Experimental extension */
204 0x3e,
205 /* Length in bytes */
206 0x20,
207 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
208 0x49, 0x4A, 0x4B, 0x4C, 0x4E, 0x4F, 0x50, 0x51,
209 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
210 0x5A, 0x5B, 0x5C, 0x5D, 0x5F, 0x60, 0x61, 0x62,
211 /* Another experimental extension */
212 0x3e,
213 /* Length in bytes */
214 0x20,
215 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A,
216 0x6B, 0x6C, 0x6D, 0x6F, 0x70, 0x71, 0x72, 0x73,
217 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B,
218 0x7C, 0x7D, 0x7E, 0x21, 0x22, 0x23, 0x24, 0x25,
219 /* Another experimental extension */
220 0x3e,
221 /* Length in bytes */
222 0x20,
223 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D,
224 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
225 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D,
226 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
227 };
228 
229 #define TIMEOUT K_MSEC(200)
230 
send_ipv6_udp_msg(struct net_if * iface,struct in6_addr * src,struct in6_addr * dst,uint16_t src_port,uint16_t dst_port,struct ud * ud,bool expect_failure)231 static bool send_ipv6_udp_msg(struct net_if *iface,
232 			      struct in6_addr *src,
233 			      struct in6_addr *dst,
234 			      uint16_t src_port,
235 			      uint16_t dst_port,
236 			      struct ud *ud,
237 			      bool expect_failure)
238 {
239 	struct net_pkt *pkt;
240 	int ret;
241 
242 	pkt = net_pkt_alloc_with_buffer(iface, 0, AF_INET6,
243 					IPPROTO_UDP, K_SECONDS(1));
244 	zassert_not_null(pkt, "Out of mem");
245 
246 	if (net_ipv6_create(pkt, src, dst) ||
247 	    net_udp_create(pkt, htons(src_port), htons(dst_port))) {
248 		printk("Cannot create IPv6 UDP pkt %p", pkt);
249 		zassert_true(0, "exiting");
250 	}
251 
252 	net_pkt_cursor_init(pkt);
253 	net_ipv6_finalize(pkt, IPPROTO_UDP);
254 
255 	ret = net_recv_data(iface, pkt);
256 	if (ret < 0) {
257 		printk("Cannot recv pkt %p, ret %d\n", pkt, ret);
258 		zassert_true(0, "exiting");
259 	}
260 
261 	if (k_sem_take(&recv_lock, TIMEOUT)) {
262 
263 		/**TESTPOINT: Check for failure*/
264 		zassert_true(expect_failure, "Timeout, packet not received");
265 		return true;
266 	}
267 
268 	/* Check that the returned user data is the same as what was given
269 	 * as a parameter.
270 	 */
271 	if (ud != returned_ud && !expect_failure) {
272 		printk("IPv6 wrong user data %p returned, expected %p\n",
273 		       returned_ud, ud);
274 		zassert_true(0, "exiting");
275 	}
276 
277 	return !fail;
278 }
279 
send_ipv6_udp_long_msg(struct net_if * iface,struct in6_addr * src,struct in6_addr * dst,uint16_t src_port,uint16_t dst_port,struct ud * ud,bool expect_failure)280 static bool send_ipv6_udp_long_msg(struct net_if *iface,
281 				   struct in6_addr *src,
282 				   struct in6_addr *dst,
283 				   uint16_t src_port,
284 				   uint16_t dst_port,
285 				   struct ud *ud,
286 				   bool expect_failure)
287 {
288 	struct net_pkt *pkt;
289 	int ret;
290 
291 	pkt = net_pkt_alloc_with_buffer(iface,
292 					sizeof(ipv6_hop_by_hop_ext_hdr) +
293 					sizeof(payload), AF_INET6,
294 					IPPROTO_UDP, K_SECONDS(1));
295 	zassert_not_null(pkt, "Out of mem");
296 
297 	if (net_ipv6_create(pkt, src, dst)) {
298 		printk("Cannot create IPv6  pkt %p", pkt);
299 		zassert_true(0, "exiting");
300 	}
301 
302 	if (net_pkt_write(pkt, (uint8_t *)ipv6_hop_by_hop_ext_hdr,
303 			      sizeof(ipv6_hop_by_hop_ext_hdr))) {
304 		printk("Cannot write IPv6 ext header pkt %p", pkt);
305 		zassert_true(0, "exiting");
306 	}
307 
308 	net_pkt_set_ipv6_ext_len(pkt, sizeof(ipv6_hop_by_hop_ext_hdr));
309 	net_pkt_set_ipv6_next_hdr(pkt, NET_IPV6_NEXTHDR_HBHO);
310 
311 	if (net_udp_create(pkt, htons(src_port), htons(dst_port))) {
312 		printk("Cannot create IPv6  pkt %p", pkt);
313 		zassert_true(0, "exiting");
314 	}
315 
316 	if (net_pkt_write(pkt, (uint8_t *)payload, sizeof(payload))) {
317 		printk("Cannot write IPv6 ext header pkt %p", pkt);
318 		zassert_true(0, "exiting");
319 	}
320 
321 	net_pkt_cursor_init(pkt);
322 	net_ipv6_finalize(pkt, IPPROTO_UDP);
323 
324 	ret = net_recv_data(iface, pkt);
325 	if (ret < 0) {
326 		printk("Cannot recv pkt %p, ret %d\n", pkt, ret);
327 		zassert_true(0, "exiting");
328 	}
329 
330 	if (k_sem_take(&recv_lock, TIMEOUT)) {
331 		/**TESTPOINT: Check for failure*/
332 		zassert_true(expect_failure, "Timeout, packet not received");
333 		return true;
334 	}
335 
336 	/* Check that the returned user data is the same as what was given
337 	 * as a parameter.
338 	 */
339 	if (ud != returned_ud && !expect_failure) {
340 		printk("IPv6 wrong user data %p returned, expected %p\n",
341 		       returned_ud, ud);
342 		zassert_true(0, "exiting");
343 	}
344 
345 	return !fail;
346 }
347 
send_ipv4_udp_msg(struct net_if * iface,struct in_addr * src,struct in_addr * dst,uint16_t src_port,uint16_t dst_port,struct ud * ud,bool expect_failure)348 static bool send_ipv4_udp_msg(struct net_if *iface,
349 			      struct in_addr *src,
350 			      struct in_addr *dst,
351 			      uint16_t src_port,
352 			      uint16_t dst_port,
353 			      struct ud *ud,
354 			      bool expect_failure)
355 {
356 	struct net_pkt *pkt;
357 	int ret;
358 
359 	pkt = net_pkt_alloc_with_buffer(iface, 0, AF_INET,
360 					IPPROTO_UDP, K_SECONDS(1));
361 	zassert_not_null(pkt, "Out of mem");
362 
363 	if (net_ipv4_create(pkt, src, dst) ||
364 	    net_udp_create(pkt, htons(src_port), htons(dst_port))) {
365 		printk("Cannot create IPv4 UDP pkt %p", pkt);
366 		zassert_true(0, "exiting");
367 	}
368 
369 	net_pkt_cursor_init(pkt);
370 	net_ipv4_finalize(pkt, IPPROTO_UDP);
371 
372 	ret = net_recv_data(iface, pkt);
373 	if (ret < 0) {
374 		printk("Cannot recv pkt %p, ret %d\n", pkt, ret);
375 		zassert_true(0, "exiting");
376 	}
377 
378 	if (k_sem_take(&recv_lock, TIMEOUT)) {
379 
380 		/**TESTPOINT: Check for failure*/
381 		zassert_true(expect_failure, "Timeout, packet not received");
382 		return true;
383 	}
384 
385 	/* Check that the returned user data is the same as what was given
386 	 * as a parameter.
387 	 */
388 	if (ud != returned_ud && !expect_failure) {
389 		printk("IPv4 wrong user data %p returned, expected %p\n",
390 		       returned_ud, ud);
391 		zassert_true(0, "exiting");
392 	}
393 
394 	return !fail;
395 }
396 
set_port(sa_family_t family,struct sockaddr * raddr,struct sockaddr * laddr,uint16_t rport,uint16_t lport)397 static void set_port(sa_family_t family, struct sockaddr *raddr,
398 		     struct sockaddr *laddr, uint16_t rport,
399 		     uint16_t lport)
400 {
401 	if (family == AF_INET6) {
402 		if (raddr) {
403 			((struct sockaddr_in6 *)raddr)->
404 				sin6_port = htons(rport);
405 		}
406 		if (laddr) {
407 			((struct sockaddr_in6 *)laddr)->
408 				sin6_port = htons(lport);
409 		}
410 	} else if (family == AF_INET) {
411 		if (raddr) {
412 			((struct sockaddr_in *)raddr)->
413 				sin_port = htons(rport);
414 		}
415 		if (laddr) {
416 			((struct sockaddr_in *)laddr)->
417 				sin_port = htons(lport);
418 		}
419 	}
420 }
421 
ZTEST(udp_fn_tests,test_udp)422 ZTEST(udp_fn_tests, test_udp)
423 {
424 	if (IS_ENABLED(CONFIG_NET_TC_THREAD_COOPERATIVE)) {
425 		k_thread_priority_set(k_current_get(),
426 				K_PRIO_COOP(CONFIG_NUM_COOP_PRIORITIES - 1));
427 	} else {
428 		k_thread_priority_set(k_current_get(), K_PRIO_PREEMPT(9));
429 	}
430 
431 	test_failed = false;
432 
433 	struct net_conn_handle *handlers[CONFIG_NET_MAX_CONN];
434 	struct net_if *iface;
435 	struct net_if_addr *ifaddr;
436 	struct ud *ud;
437 	int ret, i = 0;
438 	bool st;
439 
440 	struct sockaddr_in6 any_addr6;
441 	const struct in6_addr in6addr_anyaddr = IN6ADDR_ANY_INIT;
442 
443 	struct sockaddr_in6 my_addr6;
444 	struct in6_addr in6addr_my = { { { 0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0,
445 					   0, 0, 0, 0, 0, 0, 0, 0x1 } } };
446 
447 	struct sockaddr_in6 peer_addr6;
448 	struct in6_addr in6addr_peer = { { { 0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0,
449 					  0, 0, 0, 0x4e, 0x11, 0, 0, 0x2 } } };
450 
451 	struct sockaddr_in any_addr4;
452 	const struct in_addr in4addr_any = { { { 0 } } };
453 
454 	struct sockaddr_in my_addr4;
455 	struct in_addr in4addr_my = { { { 192, 0, 2, 1 } } };
456 
457 	struct sockaddr_in peer_addr4;
458 	struct in_addr in4addr_peer = { { { 192, 0, 2, 9 } } };
459 
460 	iface = net_if_get_first_by_type(&NET_L2_GET_NAME(DUMMY));
461 
462 	net_ipaddr_copy(&any_addr6.sin6_addr, &in6addr_anyaddr);
463 	any_addr6.sin6_family = AF_INET6;
464 
465 	net_ipaddr_copy(&my_addr6.sin6_addr, &in6addr_my);
466 	my_addr6.sin6_family = AF_INET6;
467 
468 	net_ipaddr_copy(&peer_addr6.sin6_addr, &in6addr_peer);
469 	peer_addr6.sin6_family = AF_INET6;
470 
471 	net_ipaddr_copy(&any_addr4.sin_addr, &in4addr_any);
472 	any_addr4.sin_family = AF_INET;
473 
474 	net_ipaddr_copy(&my_addr4.sin_addr, &in4addr_my);
475 	my_addr4.sin_family = AF_INET;
476 
477 	net_ipaddr_copy(&peer_addr4.sin_addr, &in4addr_peer);
478 	peer_addr4.sin_family = AF_INET;
479 
480 	k_sem_init(&recv_lock, 0, UINT_MAX);
481 
482 	ifaddr = net_if_ipv6_addr_add(iface, &in6addr_my, NET_ADDR_MANUAL, 0);
483 	if (!ifaddr) {
484 		printk("Cannot add %s to interface %p\n",
485 		       net_sprint_ipv6_addr(&in6addr_my), iface);
486 		zassert_true(0, "exiting");
487 	}
488 
489 	ifaddr = net_if_ipv4_addr_add(iface, &in4addr_my, NET_ADDR_MANUAL, 0);
490 	if (!ifaddr) {
491 		printk("Cannot add %s to interface %p\n",
492 		       net_sprint_ipv4_addr(&in4addr_my), iface);
493 		zassert_true(0, "exiting");
494 	}
495 
496 #define REGISTER(family, raddr, laddr, rport, lport)			\
497 	({								\
498 		static struct ud user_data;				\
499 									\
500 		user_data.remote_addr = (struct sockaddr *)raddr;	\
501 		user_data.local_addr =  (struct sockaddr *)laddr;	\
502 		user_data.remote_port = rport;				\
503 		user_data.local_port = lport;				\
504 		user_data.test = "DST="#raddr"-SRC="#laddr"-RP="#rport	\
505 			"-LP="#lport;					\
506 									\
507 		set_port(family, (struct sockaddr *)raddr,		\
508 			 (struct sockaddr *)laddr, rport, lport);	\
509 									\
510 		ret = net_udp_register(family,				\
511 				       (struct sockaddr *)raddr,	\
512 				       (struct sockaddr *)laddr,	\
513 				       rport, lport,			\
514 				       NULL, test_ok, &user_data,	\
515 				       &handlers[i]);			\
516 		if (ret) {						\
517 			printk("UDP register %s failed (%d)\n",		\
518 			       user_data.test, ret);			\
519 			zassert_true(0, "exiting");			\
520 		}							\
521 		user_data.handle = handlers[i++];			\
522 		&user_data;						\
523 	})
524 
525 #define REGISTER_FAIL(raddr, laddr, rport, lport)			\
526 	ret = net_udp_register(AF_INET,					\
527 			       (struct sockaddr *)raddr,		\
528 			       (struct sockaddr *)laddr,		\
529 			       rport, lport,				\
530 			       NULL, test_fail, INT_TO_POINTER(0),	\
531 			       NULL);					\
532 	if (!ret) {							\
533 		printk("UDP register invalid match %s failed\n",	\
534 		       "DST="#raddr"-SRC="#laddr"-RP="#rport"-LP="#lport); \
535 		zassert_true(0, "exiting");				\
536 	}
537 
538 #define UNREGISTER(ud)							\
539 	ret = net_udp_unregister(ud->handle);				\
540 	if (ret) {							\
541 		printk("UDP unregister %p failed (%d)\n", ud->handle,	\
542 		       ret);						\
543 		zassert_true(0, "exiting");				\
544 	}
545 
546 #define TEST_IPV6_OK(ud, raddr, laddr, rport, lport)			\
547 	st = send_ipv6_udp_msg(iface, raddr, laddr, rport, lport, ud,	\
548 			       false);					\
549 	if (!st) {							\
550 		printk("%d: UDP test \"%s\" fail\n", __LINE__,		\
551 		       ud->test);					\
552 		zassert_true(0, "exiting");				\
553 	}
554 
555 #define TEST_IPV6_LONG_OK(ud, raddr, laddr, rport, lport)		\
556 	st = send_ipv6_udp_long_msg(iface, raddr, laddr, rport, lport, ud, \
557 			       false);					\
558 	if (!st) {							\
559 		printk("%d: UDP long test \"%s\" fail\n", __LINE__,	\
560 		       ud->test);					\
561 		zassert_true(0, "exiting");				\
562 	}
563 
564 #define TEST_IPV4_OK(ud, raddr, laddr, rport, lport)			\
565 	st = send_ipv4_udp_msg(iface, raddr, laddr, rport, lport, ud,	\
566 			       false);					\
567 	if (!st) {							\
568 		printk("%d: UDP test \"%s\" fail\n", __LINE__,		\
569 		       ud->test);					\
570 		zassert_true(0, "exiting");				\
571 	}
572 
573 #define TEST_IPV6_FAIL(ud, raddr, laddr, rport, lport)			\
574 	st = send_ipv6_udp_msg(iface, raddr, laddr, rport, lport, ud,	\
575 			       true);					\
576 	if (!st) {							\
577 		printk("%d: UDP neg test \"%s\" fail\n", __LINE__,	\
578 		       ud->test);					\
579 		zassert_true(0, "exiting");				\
580 	}
581 
582 #define TEST_IPV4_FAIL(ud, raddr, laddr, rport, lport)			\
583 	st = send_ipv4_udp_msg(iface, raddr, laddr, rport, lport, ud,	\
584 			       true);					\
585 	if (!st) {							\
586 		printk("%d: UDP neg test \"%s\" fail\n", __LINE__,	\
587 		       ud->test);					\
588 		zassert_true(0, "exiting");				\
589 	}
590 
591 	ud = REGISTER(AF_INET6, &any_addr6, &any_addr6, 1234, 4242);
592 	TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
593 	TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
594 	TEST_IPV6_LONG_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
595 	TEST_IPV6_LONG_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
596 	TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400);
597 	TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400);
598 	UNREGISTER(ud);
599 
600 	ud = REGISTER(AF_INET, &any_addr4, &any_addr4, 1234, 4242);
601 	TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 1234, 4242);
602 	TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 1234, 4242);
603 	TEST_IPV4_FAIL(ud, &in4addr_peer, &in4addr_my, 1234, 4325);
604 	TEST_IPV4_FAIL(ud, &in4addr_peer, &in4addr_my, 1234, 4325);
605 	UNREGISTER(ud);
606 
607 	ud = REGISTER(AF_INET6, &any_addr6, NULL, 1234, 4242);
608 	TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
609 	TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
610 	TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400);
611 	TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400);
612 	UNREGISTER(ud);
613 
614 	ud = REGISTER(AF_INET6, NULL, &any_addr6, 1234, 4242);
615 	TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
616 	TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
617 	TEST_IPV6_LONG_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
618 	TEST_IPV6_LONG_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
619 	TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400);
620 	TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400);
621 	UNREGISTER(ud);
622 
623 	ud = REGISTER(AF_INET6, &peer_addr6, &my_addr6, 1234, 4242);
624 	TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
625 	TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 4243);
626 
627 	ud = REGISTER(AF_INET, &peer_addr4, &my_addr4, 1234, 4242);
628 	TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 1234, 4242);
629 	TEST_IPV4_FAIL(ud, &in4addr_peer, &in4addr_my, 1234, 4243);
630 
631 	ud = REGISTER(AF_UNSPEC, NULL, NULL, 1234, 42423);
632 	TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 1234, 42423);
633 	TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 42423);
634 
635 	ud = REGISTER(AF_UNSPEC, NULL, NULL, 1234, 0);
636 	TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 1234, 42422);
637 	TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 42422);
638 	TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 1234, 42422);
639 	TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 42422);
640 
641 	TEST_IPV4_FAIL(ud, &in4addr_peer, &in4addr_my, 12345, 42421);
642 	TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 12345, 42421);
643 
644 	ud = REGISTER(AF_UNSPEC, NULL, NULL, 0, 0);
645 	TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 12345, 42421);
646 	TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 12345, 42421);
647 	TEST_IPV6_LONG_OK(ud, &in6addr_peer, &in6addr_my, 12345, 42421);
648 
649 	/* Remote addr same as local addr, these two will never match */
650 	REGISTER(AF_INET6, &my_addr6, NULL, 1234, 4242);
651 	REGISTER(AF_INET, &my_addr4, NULL, 1234, 4242);
652 
653 	/* IPv4 remote addr and IPv6 remote addr, impossible combination */
654 	REGISTER_FAIL(&my_addr4, &my_addr6, 1234, 4242);
655 
656 	/**TESTPOINT: Check if tests passed*/
657 	zassert_false(fail, "Tests failed");
658 
659 	i--;
660 	while (i) {
661 		ret = net_udp_unregister(handlers[i]);
662 		if (ret < 0 && ret != -ENOENT) {
663 			printk("Cannot unregister udp %d\n", i);
664 			zassert_true(0, "exiting");
665 		}
666 
667 		i--;
668 	}
669 
670 	zassert_true((net_udp_unregister(NULL) < 0), "Unregister udp failed");
671 	zassert_false(test_failed, "udp tests failed");
672 }
673 
674 ZTEST_SUITE(udp_fn_tests, NULL, NULL, NULL, NULL, NULL);
675