@@ -224,10 +224,21 @@ ZTEST(ip_addr_fn, test_ipv6_addresses)
224
224
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0x2 } } };
225
225
struct in6_addr addr6_pref3 = { { { 0x20 , 0x01 , 0x0d , 0xb8 , 0x64 , 0 , 0 ,
226
226
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0x2 } } };
227
+ struct in6_addr ula = { { { 0xfc , 0x00 , 0xaa , 0xaa , 0 , 0 , 0 , 0 ,
228
+ 0 , 0 , 0 , 0 , 0xd1 , 0xd2 , 0xd3 , 0xd4 } } };
229
+ struct in6_addr ula2 = { { { 0xfc , 0x00 , 0xaa , 0xaa , 0 , 0 , 0 , 0 ,
230
+ 0 , 0 , 0 , 0 , 0x1 , 0x2 , 0x3 , 0x4 } } };
231
+ struct in6_addr ula3 = { { { 0xfc , 0x00 , 0xaa , 0xaa , 0 , 0 , 0 , 0 ,
232
+ 0 , 0 , 0 , 0 , 0xf1 , 0xf2 , 0xf3 , 0xf4 } } };
233
+ struct in6_addr ula4 = { { { 0xfc , 0x00 , 0xaa , 0xaa , 0 , 0 , 0 , 0 ,
234
+ 0 , 0 , 0 , 0 , 0xf1 , 0xf2 , 0xf3 , 0xf5 } } };
235
+ struct in6_addr ula5 = { { { 0xfc , 0x00 , 0xaa , 0xaa , 0 , 0 , 0 , 0 ,
236
+ 0 , 0 , 0 , 0 , 0xf1 , 0xf2 , 0xf3 , 0xf6 } } };
227
237
struct in6_addr * tmp ;
228
238
const struct in6_addr * out ;
229
239
struct net_if_addr * ifaddr1 , * ifaddr2 ;
230
240
struct net_if_mcast_addr * ifmaddr1 ;
241
+ struct net_if_ipv6_prefix * prefix ;
231
242
struct net_if * iface ;
232
243
int i ;
233
244
@@ -369,6 +380,81 @@ ZTEST(ip_addr_fn, test_ipv6_addresses)
369
380
"IPv6 removing address failed\n" );
370
381
zassert_true (net_if_ipv6_addr_rm (default_iface , & addr6_pref2 ),
371
382
"IPv6 removing address failed\n" );
383
+
384
+ /**TESTPOINTS: Check what IPv6 address is selected when some
385
+ * addresses are in preferred state and some in deprecated state.
386
+ */
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" );
390
+
391
+ ifaddr2 -> addr_state = NET_ADDR_PREFERRED ;
392
+
393
+ out = net_if_ipv6_select_src_addr (default_iface , & ula2 );
394
+ zassert_not_null (out , "IPv6 src ula addr selection failed, "
395
+ "iface %p\n" , default_iface );
396
+
397
+ DBG ("Selected IPv6 address %s, iface %p\n" ,
398
+ net_sprint_ipv6_addr (out ), iface );
399
+
400
+ zassert_false (memcmp (out -> s6_addr , & ula .s6_addr , sizeof (struct in6_addr )),
401
+ "IPv6 wrong src ula address selected, iface %p\n" , iface );
402
+
403
+ /* Allow selection of deprecated address if no other address
404
+ * is available.
405
+ */
406
+ ifaddr2 -> addr_state = NET_ADDR_DEPRECATED ;
407
+
408
+ out = net_if_ipv6_select_src_addr (default_iface , & ula3 );
409
+ zassert_not_null (out , "IPv6 src ula addr selection failed, "
410
+ "iface %p\n" , default_iface );
411
+
412
+ /* Then add another address with preferred state and check that we
413
+ * still select the deprecated address as it is a better match.
414
+ */
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" );
418
+
419
+ ifaddr2 -> addr_state = NET_ADDR_PREFERRED ;
420
+
421
+ out = net_if_ipv6_select_src_addr (default_iface , & ula2 );
422
+ zassert_not_null (out , "IPv6 src ula addr selection failed, "
423
+ "iface %p\n" , default_iface );
424
+
425
+ DBG ("Selected IPv6 address %s, iface %p\n" ,
426
+ net_sprint_ipv6_addr (out ), iface );
427
+
428
+ zassert_false (memcmp (out -> s6_addr , & ula3 .s6_addr , sizeof (struct in6_addr )),
429
+ "IPv6 wrong src ula address selected, iface %p\n" , iface );
430
+
431
+ zassert_true (net_if_ipv6_addr_rm (default_iface , & ula ),
432
+ "IPv6 removing address failed\n" );
433
+
434
+ prefix = net_if_ipv6_prefix_add (default_iface , & ula4 , 96 , 3600 );
435
+ zassert_not_null (prefix , "IPv6 ula prefix add failed" );
436
+
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" );
440
+
441
+ ifaddr2 -> addr_state = NET_ADDR_DEPRECATED ;
442
+
443
+ out = net_if_ipv6_select_src_addr (default_iface , & ula5 );
444
+ zassert_not_null (out , "IPv6 src ula addr selection failed, "
445
+ "iface %p\n" , default_iface );
446
+
447
+ DBG ("Selected IPv6 address %s, iface %p\n" ,
448
+ net_sprint_ipv6_addr (out ), iface );
449
+
450
+ zassert_false (memcmp (out -> s6_addr , & ula4 .s6_addr , sizeof (struct in6_addr )),
451
+ "IPv6 wrong src ula address selected, iface %p\n" , iface );
452
+
453
+ zassert_true (net_if_ipv6_addr_rm (default_iface , & ula3 ),
454
+ "IPv6 removing address failed\n" );
455
+
456
+ zassert_true (net_if_ipv6_addr_rm (default_iface , & ula4 ),
457
+ "IPv6 removing address failed\n" );
372
458
}
373
459
374
460
ZTEST (ip_addr_fn , test_ipv4_ll_address_select_default_first )
0 commit comments