@@ -45,6 +45,7 @@ static const char test_str_all_tx_bufs[] =
4545#define MY_IPV4_ADDR "127.0.0.1"
4646#define MY_IPV6_ADDR "::1"
4747#define MY_MCAST_IPV4_ADDR "224.0.0.1"
48+ #define MY_MCAST_IPV6_ADDR "ff00::1"
4849
4950#define ANY_PORT 0
5051#define SERVER_PORT 4242
@@ -1980,6 +1981,19 @@ static void test_check_ttl(int sock_c, int sock_s, int sock_p,
19801981 "Invalid mcast ttl (%d vs %d)" ,
19811982 ipv4 -> ttl , expected_mcast_ttl );
19821983 }
1984+ } else if (family == AF_INET6 ) {
1985+ struct net_ipv6_hdr * ipv6 =
1986+ (struct net_ipv6_hdr * )& data_to_receive [0 ];
1987+
1988+ if (expected_ttl > 0 ) {
1989+ zassert_equal (ipv6 -> hop_limit , expected_ttl ,
1990+ "Invalid hop limit (%d vs %d)" ,
1991+ ipv6 -> hop_limit , expected_ttl );
1992+ } else if (expected_mcast_ttl > 0 ) {
1993+ zassert_equal (ipv6 -> hop_limit , expected_mcast_ttl ,
1994+ "Invalid mcast hop limit (%d vs %d)" ,
1995+ ipv6 -> hop_limit , expected_mcast_ttl );
1996+ }
19831997 } else {
19841998 zassert_true (false, "Invalid address family (%d)" ,
19851999 family );
@@ -2050,6 +2064,74 @@ ZTEST(net_socket_udp, test_31_v4_mcast_ttl)
20502064 AF_INET , 0 , mcast_ttl );
20512065}
20522066
2067+ ZTEST (net_socket_udp , test_33_v6_mcast_hops )
2068+ {
2069+ int ret ;
2070+ int client_sock ;
2071+ int server_sock ;
2072+ int packet_sock ;
2073+ int mcast_hops , if_mcast_hops ;
2074+ int verify , opt ;
2075+ socklen_t optlen ;
2076+ struct sockaddr_in6 client_addr ;
2077+ struct sockaddr_in6 server_addr ;
2078+ struct sockaddr_in6 sendto_addr ;
2079+
2080+ Z_TEST_SKIP_IFNDEF (CONFIG_NET_SOCKETS_PACKET );
2081+
2082+ prepare_sock_udp_v6 (MY_IPV6_ADDR , CLIENT_PORT , & client_sock , & client_addr );
2083+ prepare_sock_udp_v6 (MY_IPV6_ADDR , SERVER_PORT , & server_sock , & server_addr );
2084+
2085+ packet_sock = socket (AF_PACKET , SOCK_RAW , ETH_P_ALL );
2086+ zassert_true (packet_sock >= 0 , "Cannot create packet socket (%d)" , - errno );
2087+
2088+ ret = bind_socket (packet_sock , lo0 );
2089+ zassert_equal (ret , 0 , "packet socket bind failed" );
2090+
2091+ zassert_not_null (lo0 -> config .ip .ipv6 ,
2092+ "Interface %d (%p) no IPv6 configured" ,
2093+ net_if_get_by_iface (lo0 ), lo0 );
2094+
2095+ /* First make sure setting hop limit to -1 works as expected (route default
2096+ * value should be used).
2097+ */
2098+ if_mcast_hops = net_if_ipv6_get_mcast_hop_limit (lo0 );
2099+
2100+ opt = -1 ;
2101+ ret = setsockopt (client_sock , IPPROTO_IPV6 , IPV6_MULTICAST_HOPS , & opt ,
2102+ sizeof (opt ));
2103+ zassert_equal (ret , 0 , "Cannot set multicast hop limit (%d)" , - errno );
2104+
2105+ optlen = sizeof (verify );
2106+ ret = getsockopt (client_sock , IPPROTO_IPV6 , IPV6_MULTICAST_HOPS , & verify ,
2107+ & optlen );
2108+ zassert_equal (ret , 0 , "Cannot get multicast hop limit (%d)" , - errno );
2109+ zassert_equal (verify , if_mcast_hops , "Different multicast hop limit (%d vs %d)" ,
2110+ if_mcast_hops , verify );
2111+
2112+ /* Then test the normal case where we set the value */
2113+ mcast_hops = 8 ;
2114+ ret = setsockopt (client_sock , IPPROTO_IPV6 , IPV6_MULTICAST_HOPS , & mcast_hops ,
2115+ sizeof (mcast_hops ));
2116+ zassert_equal (ret , 0 , "Cannot set multicast hop limit (%d)" , - errno );
2117+
2118+ optlen = sizeof (verify );
2119+ ret = getsockopt (client_sock , IPPROTO_IPV6 , IPV6_MULTICAST_HOPS , & verify ,
2120+ & optlen );
2121+ zassert_equal (ret , 0 , "Cannot get multicast hop limit (%d)" , - errno );
2122+ zassert_equal (verify , mcast_hops , "Different multicast hop limit (%d vs %d)" ,
2123+ mcast_hops , verify );
2124+
2125+ ret = net_addr_pton (AF_INET6 , MY_MCAST_IPV6_ADDR , & sendto_addr .sin6_addr );
2126+ zassert_equal (ret , 0 , "Cannot get IPv6 address (%d)" , ret );
2127+
2128+ test_check_ttl (client_sock , server_sock , packet_sock ,
2129+ (struct sockaddr * )& client_addr , sizeof (client_addr ),
2130+ (struct sockaddr * )& server_addr , sizeof (server_addr ),
2131+ (struct sockaddr * )& sendto_addr , sizeof (sendto_addr ),
2132+ AF_INET6 , 0 , mcast_hops );
2133+ }
2134+
20532135static void after (void * arg )
20542136{
20552137 ARG_UNUSED (arg );
0 commit comments