@@ -224,10 +224,21 @@ ZTEST(ip_addr_fn, test_ipv6_addresses)
224224 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0x2 } } };
225225 struct in6_addr addr6_pref3 = { { { 0x20 , 0x01 , 0x0d , 0xb8 , 0x64 , 0 , 0 ,
226226 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 } } };
227237 struct in6_addr * tmp ;
228238 const struct in6_addr * out ;
229239 struct net_if_addr * ifaddr1 , * ifaddr2 ;
230240 struct net_if_mcast_addr * ifmaddr1 ;
241+ struct net_if_ipv6_prefix * prefix ;
231242 struct net_if * iface ;
232243 int i ;
233244
@@ -369,6 +380,81 @@ ZTEST(ip_addr_fn, test_ipv6_addresses)
369380 "IPv6 removing address failed\n" );
370381 zassert_true (net_if_ipv6_addr_rm (default_iface , & addr6_pref2 ),
371382 "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" );
372458}
373459
374460ZTEST (ip_addr_fn , test_ipv4_ll_address_select_default_first )
0 commit comments