Skip to content

Commit 8bd612c

Browse files
jukkarhenrikbrixandersen
authored andcommitted
tests: net: udp: Add IPv6 multicast hop limit tests
Make sure that setting IPv6 multicast hop limit works as expected. Signed-off-by: Jukka Rissanen <[email protected]>
1 parent 1c684bc commit 8bd612c

File tree

1 file changed

+82
-0
lines changed
  • tests/net/socket/udp/src

1 file changed

+82
-0
lines changed

tests/net/socket/udp/src/main.c

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
20532135
static void after(void *arg)
20542136
{
20552137
ARG_UNUSED(arg);

0 commit comments

Comments
 (0)