@@ -34,6 +34,9 @@ LOG_MODULE_REGISTER(net_test, CONFIG_NET_IPV6_LOG_LEVEL);
34
34
#define DBG (fmt , ...)
35
35
#endif
36
36
37
+ extern struct net_if_addr * net_if_ipv6_get_ifaddr (struct net_if * iface ,
38
+ const void * addr );
39
+
37
40
static struct net_if * default_iface ;
38
41
static struct net_if * second_iface ;
39
42
@@ -210,6 +213,43 @@ ZTEST(ip_addr_fn, test_ip_addresses)
210
213
TEST_IPV4 (127 , 0 , 0 , 1 , "127.0.0.1" );
211
214
}
212
215
216
+ #if defined(CONFIG_NET_IPV6_LOG_LEVEL ) || defined(CONFIG_NET_IPV4_LOG_LEVEL )
217
+ static const char * addr_state_to_str (enum net_addr_state state )
218
+ {
219
+ switch (state ) {
220
+ case NET_ADDR_PREFERRED :
221
+ return "preferred" ;
222
+ case NET_ADDR_DEPRECATED :
223
+ return "deprecated" ;
224
+ case NET_ADDR_TENTATIVE :
225
+ return "tentative" ;
226
+ case NET_ADDR_ANY_STATE :
227
+ return "invalid" ;
228
+ default :
229
+ break ;
230
+ }
231
+
232
+ return "unknown" ;
233
+ }
234
+
235
+ static const char * get_addr_state (struct net_if * iface ,
236
+ const struct in6_addr * addr )
237
+ {
238
+ struct net_if_addr * ifaddr ;
239
+
240
+ if (iface == NULL ) {
241
+ return "<iface not set>" ;
242
+ }
243
+
244
+ ifaddr = net_if_ipv6_get_ifaddr (iface , addr );
245
+ if (ifaddr ) {
246
+ return addr_state_to_str (ifaddr -> addr_state );
247
+ }
248
+
249
+ return "<addr not found>" ;
250
+ }
251
+ #endif
252
+
213
253
ZTEST (ip_addr_fn , test_ipv6_addresses )
214
254
{
215
255
struct in6_addr loopback = IN6ADDR_LOOPBACK_INIT ;
@@ -227,16 +267,16 @@ ZTEST(ip_addr_fn, test_ipv6_addresses)
227
267
struct in6_addr ula = { { { 0xfc , 0x00 , 0xaa , 0xaa , 0 , 0 , 0 , 0 ,
228
268
0 , 0 , 0 , 0 , 0xd1 , 0xd2 , 0xd3 , 0xd4 } } };
229
269
struct in6_addr ula2 = { { { 0xfc , 0x00 , 0xaa , 0xaa , 0 , 0 , 0 , 0 ,
230
- 0 , 0 , 0 , 0 , 0x1 , 0x2 , 0x3 , 0x4 } } };
270
+ 0 , 0 , 0 , 0 , 0xd1 , 0xd2 , 0xd3 , 2 } } };
231
271
struct in6_addr ula3 = { { { 0xfc , 0x00 , 0xaa , 0xaa , 0 , 0 , 0 , 0 ,
232
- 0 , 0 , 0 , 0 , 0xf1 , 0xf2 , 0xf3 , 0xf4 } } };
272
+ 0 , 0 , 0 , 0 , 0xd1 , 0xd2 , 0xf3 , 3 } } };
233
273
struct in6_addr ula4 = { { { 0xfc , 0x00 , 0xaa , 0xaa , 0 , 0 , 0 , 0 ,
234
- 0 , 0 , 0 , 0 , 0xf1 , 0xf2 , 0xf3 , 0xf5 } } };
274
+ 0 , 0 , 0 , 0 , 0xd1 , 0xd2 , 0xf3 , 4 } } };
235
275
struct in6_addr ula5 = { { { 0xfc , 0x00 , 0xaa , 0xaa , 0 , 0 , 0 , 0 ,
236
- 0 , 0 , 0 , 0 , 0xf1 , 0xf2 , 0xf3 , 0xf6 } } };
276
+ 0 , 0 , 0 , 0 , 0xd1 , 0xd2 , 0xd3 , 0xd5 } } };
237
277
struct in6_addr * tmp ;
238
278
const struct in6_addr * out ;
239
- struct net_if_addr * ifaddr1 , * ifaddr2 ;
279
+ struct net_if_addr * ifaddr1 , * ifaddr2 , * ifaddr_ula , * ifaddr_ula3 , * ifaddr_ula4 ;
240
280
struct net_if_mcast_addr * ifmaddr1 ;
241
281
struct net_if_ipv6_prefix * prefix ;
242
282
struct net_if * iface ;
@@ -339,8 +379,10 @@ ZTEST(ip_addr_fn, test_ipv6_addresses)
339
379
"IPv6 src addr selection failed, iface %p\n" ,
340
380
iface );
341
381
342
- DBG ("Selected IPv6 address %s, iface %p\n" ,
343
- net_sprint_ipv6_addr (out ), iface );
382
+ DBG ("%d: Selected IPv6 address %s state %s, iface %p\n" , __LINE__ ,
383
+ net_sprint_ipv6_addr (out ),
384
+ get_addr_state (iface , out ),
385
+ iface );
344
386
345
387
zassert_false (memcmp (out -> s6_addr , & addr6_pref2 .s6_addr ,
346
388
sizeof (struct in6_addr )),
@@ -352,8 +394,9 @@ ZTEST(ip_addr_fn, test_ipv6_addresses)
352
394
zassert_not_null (out , "IPv6 src any addr selection failed, "
353
395
"iface %p\n" , iface );
354
396
355
- DBG ("Selected IPv6 address %s, iface %p\n" ,
356
- net_sprint_ipv6_addr (out ), iface );
397
+ DBG ("%d: Selected IPv6 address %s, iface %p\n" , __LINE__ ,
398
+ net_sprint_ipv6_addr (out ),
399
+ iface );
357
400
358
401
zassert_false (memcmp (out -> s6_addr , & any .s6_addr ,
359
402
sizeof (struct in6_addr )),
@@ -367,8 +410,10 @@ ZTEST(ip_addr_fn, test_ipv6_addresses)
367
410
zassert_not_null (out , "IPv6 src ll addr selection failed, "
368
411
"iface %p\n" , iface );
369
412
370
- DBG ("Selected IPv6 address %s, iface %p\n" ,
371
- net_sprint_ipv6_addr (out ), iface );
413
+ DBG ("%d: Selected IPv6 address %s state %s, iface %p\n" , __LINE__ ,
414
+ net_sprint_ipv6_addr (out ),
415
+ iface != NULL ? get_addr_state (iface , out ) : "unknown" ,
416
+ iface );
372
417
373
418
zassert_false (memcmp (out -> s6_addr , & addr6 .s6_addr ,
374
419
sizeof (struct in6_addr )),
@@ -384,72 +429,115 @@ ZTEST(ip_addr_fn, test_ipv6_addresses)
384
429
/**TESTPOINTS: Check what IPv6 address is selected when some
385
430
* addresses are in preferred state and some in deprecated state.
386
431
*/
387
- ifaddr2 = net_if_ipv6_addr_add (default_iface , & ula ,
388
- NET_ADDR_AUTOCONF , 0 );
389
- zassert_not_null (ifaddr2 , "IPv6 ula address add failed" );
432
+ prefix = net_if_ipv6_prefix_add (default_iface , & ula , 96 , 3600 );
433
+ zassert_not_null (prefix , "IPv6 ula prefix add failed" );
390
434
391
- ifaddr2 -> addr_state = NET_ADDR_PREFERRED ;
435
+ prefix = net_if_ipv6_prefix_add (default_iface , & ula2 , 64 , 3600 );
436
+ zassert_not_null (prefix , "IPv6 ula prefix add failed" );
437
+
438
+ ifaddr_ula = net_if_ipv6_addr_add (default_iface , & ula ,
439
+ NET_ADDR_AUTOCONF , 0 );
440
+ zassert_not_null (ifaddr_ula , "IPv6 ula address add failed" );
441
+
442
+ ifaddr_ula -> addr_state = NET_ADDR_PREFERRED ;
392
443
393
444
out = net_if_ipv6_select_src_addr (default_iface , & ula2 );
394
445
zassert_not_null (out , "IPv6 src ula addr selection failed, "
395
446
"iface %p\n" , default_iface );
396
447
397
- DBG ("Selected IPv6 address %s, iface %p\n" ,
398
- net_sprint_ipv6_addr (out ), iface );
448
+ DBG ("%d: Selected IPv6 address %s state %s, iface %p\n" , __LINE__ ,
449
+ net_sprint_ipv6_addr (out ), get_addr_state (default_iface , out ),
450
+ iface );
399
451
400
452
zassert_false (memcmp (out -> s6_addr , & ula .s6_addr , sizeof (struct in6_addr )),
401
453
"IPv6 wrong src ula address selected, iface %p\n" , iface );
402
454
403
455
/* Allow selection of deprecated address if no other address
404
456
* is available.
405
457
*/
406
- ifaddr2 -> addr_state = NET_ADDR_DEPRECATED ;
458
+ ifaddr_ula -> addr_state = NET_ADDR_DEPRECATED ;
407
459
408
460
out = net_if_ipv6_select_src_addr (default_iface , & ula3 );
409
461
zassert_not_null (out , "IPv6 src ula addr selection failed, "
410
462
"iface %p\n" , default_iface );
411
463
464
+ /* Back to preferred state so that later checks work correctly */
465
+ ifaddr_ula -> addr_state = NET_ADDR_PREFERRED ;
466
+
412
467
/* Then add another address with preferred state and check that we
413
- * still select the deprecated address as it is a better match.
468
+ * still do not select the deprecated address even if it is a better match.
414
469
*/
415
- ifaddr2 = net_if_ipv6_addr_add (default_iface , & ula3 ,
416
- NET_ADDR_AUTOCONF , 0 );
417
- zassert_not_null (ifaddr2 , "IPv6 ula address add failed" );
470
+ ifaddr_ula3 = net_if_ipv6_addr_add (default_iface , & ula3 ,
471
+ NET_ADDR_AUTOCONF , 0 );
472
+ zassert_not_null (ifaddr_ula3 , "IPv6 ula address add failed" );
418
473
419
- ifaddr2 -> addr_state = NET_ADDR_PREFERRED ;
474
+ ifaddr_ula3 -> addr_state = NET_ADDR_PREFERRED ;
420
475
421
476
out = net_if_ipv6_select_src_addr (default_iface , & ula2 );
422
477
zassert_not_null (out , "IPv6 src ula addr selection failed, "
423
478
"iface %p\n" , default_iface );
424
479
425
- DBG ("Selected IPv6 address %s, iface %p\n" ,
426
- net_sprint_ipv6_addr (out ), iface );
480
+ DBG ("%d: Selected IPv6 address %s state %s, iface %p\n" , __LINE__ ,
481
+ net_sprint_ipv6_addr (out ), get_addr_state (default_iface , out ),
482
+ iface );
427
483
428
484
zassert_false (memcmp (out -> s6_addr , & ula3 .s6_addr , sizeof (struct in6_addr )),
429
485
"IPv6 wrong src ula address selected, iface %p\n" , iface );
430
486
431
- zassert_true (net_if_ipv6_addr_rm (default_iface , & ula ),
432
- "IPv6 removing address failed\n" );
487
+ /* Then change the address to deprecated state and check that we
488
+ * do select the deprecated address.
489
+ */
490
+ ifaddr_ula3 -> addr_state = NET_ADDR_DEPRECATED ;
433
491
434
- prefix = net_if_ipv6_prefix_add (default_iface , & ula4 , 96 , 3600 );
435
- zassert_not_null (prefix , "IPv6 ula prefix add failed" );
492
+ out = net_if_ipv6_select_src_addr (default_iface , & ula2 );
493
+ zassert_not_null (out , "IPv6 src ula addr selection failed, "
494
+ "iface %p\n" , default_iface );
436
495
437
- ifaddr1 = net_if_ipv6_addr_add ( default_iface , & ula4 ,
438
- NET_ADDR_AUTOCONF , 0 );
439
- zassert_not_null ( ifaddr1 , "IPv6 ula address add failed" );
496
+ DBG ( "%d: Selected IPv6 address %s state %s, iface %p\n" , __LINE__ ,
497
+ net_sprint_ipv6_addr ( out ), get_addr_state ( default_iface , out ),
498
+ iface );
440
499
441
- ifaddr2 -> addr_state = NET_ADDR_DEPRECATED ;
500
+ zassert_false (memcmp (out -> s6_addr , & ula .s6_addr , sizeof (struct in6_addr )),
501
+ "IPv6 wrong src ula address selected, iface %p\n" , iface );
502
+
503
+ /* Then have two deprecated addresses */
504
+ ifaddr_ula -> addr_state = NET_ADDR_DEPRECATED ;
505
+
506
+ out = net_if_ipv6_select_src_addr (default_iface , & ula2 );
507
+ zassert_not_null (out , "IPv6 src ula addr selection failed, "
508
+ "iface %p\n" , default_iface );
509
+
510
+ DBG ("%d: Selected IPv6 address %s state %s, iface %p\n" , __LINE__ ,
511
+ net_sprint_ipv6_addr (out ), get_addr_state (default_iface , out ),
512
+ iface );
442
513
514
+ zassert_false (memcmp (out -> s6_addr , & ula3 .s6_addr , sizeof (struct in6_addr )),
515
+ "IPv6 wrong src ula address selected, iface %p\n" , iface );
516
+
517
+ ifaddr_ula4 = net_if_ipv6_addr_add (default_iface , & ula4 ,
518
+ NET_ADDR_AUTOCONF , 0 );
519
+ zassert_not_null (ifaddr_ula4 , "IPv6 ula address add failed" );
520
+
521
+ ifaddr_ula4 -> addr_state = NET_ADDR_DEPRECATED ;
522
+ ifaddr_ula3 -> addr_state = NET_ADDR_PREFERRED ;
523
+
524
+ /* There is now one preferred and two deprecated addresses.
525
+ * The preferred address should be selected.
526
+ */
443
527
out = net_if_ipv6_select_src_addr (default_iface , & ula5 );
444
528
zassert_not_null (out , "IPv6 src ula addr selection failed, "
445
529
"iface %p\n" , default_iface );
446
530
447
- DBG ("Selected IPv6 address %s, iface %p\n" ,
448
- net_sprint_ipv6_addr (out ), iface );
531
+ DBG ("%d: Selected IPv6 address %s state %s, iface %p\n" , __LINE__ ,
532
+ net_sprint_ipv6_addr (out ), get_addr_state (default_iface , out ),
533
+ iface );
449
534
450
- zassert_false (memcmp (out -> s6_addr , & ula4 .s6_addr , sizeof (struct in6_addr )),
535
+ zassert_false (memcmp (out -> s6_addr , & ula3 .s6_addr , sizeof (struct in6_addr )),
451
536
"IPv6 wrong src ula address selected, iface %p\n" , iface );
452
537
538
+ zassert_true (net_if_ipv6_addr_rm (default_iface , & ula ),
539
+ "IPv6 removing address failed\n" );
540
+
453
541
zassert_true (net_if_ipv6_addr_rm (default_iface , & ula3 ),
454
542
"IPv6 removing address failed\n" );
455
543
@@ -489,8 +577,8 @@ ZTEST(ip_addr_fn, test_ipv4_ll_address_select_default_first)
489
577
zassert_not_null (out , "IPv4 src addr selection failed, iface %p\n" ,
490
578
iface );
491
579
492
- DBG ("Selected IPv4 address %s, iface %p\n" , net_sprint_ipv4_addr ( out ) ,
493
- iface );
580
+ DBG ("%d: Selected IPv4 address %s, iface %p\n" , __LINE__ ,
581
+ net_sprint_ipv4_addr ( out ), iface );
494
582
495
583
zassert_equal_ptr (iface , default_iface , "Wrong iface selected" );
496
584
zassert_equal (out -> s_addr , lladdr4_1 .s_addr ,
@@ -528,8 +616,8 @@ ZTEST(ip_addr_fn, test_ipv4_ll_address_select)
528
616
zassert_not_null (out , "IPv4 src addr selection failed, iface %p\n" ,
529
617
iface );
530
618
531
- DBG ("Selected IPv4 address %s, iface %p\n" , net_sprint_ipv4_addr ( out ) ,
532
- iface );
619
+ DBG ("%d: Selected IPv4 address %s, iface %p\n" , __LINE__ ,
620
+ net_sprint_ipv4_addr ( out ), iface );
533
621
534
622
zassert_equal (out -> s_addr , lladdr4_1 .s_addr ,
535
623
"IPv4 wrong src address selected, iface %p\n" , iface );
@@ -540,8 +628,8 @@ ZTEST(ip_addr_fn, test_ipv4_ll_address_select)
540
628
zassert_not_null (out , "IPv4 src addr selection failed, iface %p\n" ,
541
629
iface );
542
630
543
- DBG ("Selected IPv4 address %s, iface %p\n" , net_sprint_ipv4_addr ( out ) ,
544
- iface );
631
+ DBG ("%d: Selected IPv4 address %s, iface %p\n" , __LINE__ ,
632
+ net_sprint_ipv4_addr ( out ), iface );
545
633
546
634
zassert_equal (out -> s_addr , lladdr4_2 .s_addr ,
547
635
"IPv4 wrong src address selected, iface %p\n" , iface );
@@ -606,7 +694,7 @@ ZTEST(ip_addr_fn, test_ipv4_addresses)
606
694
zassert_not_null (out , "IPv4 src addr selection failed, "
607
695
"iface %p\n" , iface );
608
696
609
- DBG ("Selected IPv4 address %s, iface %p\n" ,
697
+ DBG ("%d: Selected IPv4 address %s, iface %p\n" , __LINE__ ,
610
698
net_sprint_ipv4_addr (out ), iface );
611
699
612
700
zassert_equal (out -> s_addr , addr4 .s_addr ,
@@ -618,7 +706,7 @@ ZTEST(ip_addr_fn, test_ipv4_addresses)
618
706
zassert_not_null (out , "IPv4 src ll addr selection failed, "
619
707
"iface %p\n" , iface );
620
708
621
- DBG ("Selected IPv4 address %s, iface %p\n" ,
709
+ DBG ("%d: Selected IPv4 address %s, iface %p\n" , __LINE__ ,
622
710
net_sprint_ipv4_addr (out ), iface );
623
711
624
712
zassert_equal (out -> s_addr , lladdr4 .s_addr ,
@@ -630,7 +718,7 @@ ZTEST(ip_addr_fn, test_ipv4_addresses)
630
718
zassert_not_null (out , "IPv4 src any addr selection failed, "
631
719
"iface %p\n" , iface );
632
720
633
- DBG ("Selected IPv4 address %s, iface %p\n" ,
721
+ DBG ("%d: Selected IPv4 address %s, iface %p\n" , __LINE__ ,
634
722
net_sprint_ipv4_addr (out ), iface );
635
723
636
724
zassert_equal (out -> s_addr , addr4 .s_addr ,
@@ -642,7 +730,7 @@ ZTEST(ip_addr_fn, test_ipv4_addresses)
642
730
zassert_not_null (out , "IPv4 src any addr selection failed, "
643
731
"iface %p\n" , iface );
644
732
645
- DBG ("Selected IPv4 address %s, iface %p\n" ,
733
+ DBG ("%d: Selected IPv4 address %s, iface %p\n" , __LINE__ ,
646
734
net_sprint_ipv4_addr (out ), iface );
647
735
648
736
zassert_equal (out -> s_addr , addr4 .s_addr ,
0 commit comments