xref: /dpdk/app/test/test_net_ip6.c (revision 189fdd3762758486aec347ebdeb9f5bfe74b5600)
1ca786defSRobin Jarry /* SPDX-License-Identifier: BSD-3-Clause
2ca786defSRobin Jarry  * Copyright (c) 2024 Robin Jarry
3ca786defSRobin Jarry  */
4ca786defSRobin Jarry 
5ca786defSRobin Jarry #include <rte_ip6.h>
6ca786defSRobin Jarry 
7ca786defSRobin Jarry #include "test.h"
8ca786defSRobin Jarry 
9ca786defSRobin Jarry static const struct rte_ipv6_addr mask_full = RTE_IPV6_MASK_FULL;
10ca786defSRobin Jarry static const struct rte_ipv6_addr zero_addr = RTE_IPV6_ADDR_UNSPEC;
11ca786defSRobin Jarry 
12ca786defSRobin Jarry static int
13*189fdd37SRobin Jarry test_ipv6_check_version(void)
14*189fdd37SRobin Jarry {
15*189fdd37SRobin Jarry 	struct rte_ipv6_hdr h;
16*189fdd37SRobin Jarry 
17*189fdd37SRobin Jarry 	h.vtc_flow = 0;
18*189fdd37SRobin Jarry 	TEST_ASSERT_EQUAL(rte_ipv6_check_version(&h), -EINVAL, "");
19*189fdd37SRobin Jarry 	h.vtc_flow = RTE_BE32(0x7f00ba44);
20*189fdd37SRobin Jarry 	TEST_ASSERT_EQUAL(rte_ipv6_check_version(&h), -EINVAL, "");
21*189fdd37SRobin Jarry 	h.vtc_flow = RTE_BE32(0x6badcaca);
22*189fdd37SRobin Jarry 	TEST_ASSERT_EQUAL(rte_ipv6_check_version(&h), 0, "");
23*189fdd37SRobin Jarry 
24*189fdd37SRobin Jarry 	return 0;
25*189fdd37SRobin Jarry }
26*189fdd37SRobin Jarry 
27*189fdd37SRobin Jarry static int
28ca786defSRobin Jarry test_ipv6_addr_mask(void)
29ca786defSRobin Jarry {
30ca786defSRobin Jarry 	const struct rte_ipv6_addr masked_3 = RTE_IPV6(0xe000, 0, 0, 0, 0, 0, 0, 0);
31ca786defSRobin Jarry 	const struct rte_ipv6_addr masked_42 = RTE_IPV6(0xffff, 0xffff, 0xffc0, 0, 0, 0, 0, 0);
32ca786defSRobin Jarry 	const struct rte_ipv6_addr masked_85 =
33ca786defSRobin Jarry 		RTE_IPV6(0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xf800, 0, 0);
34ca786defSRobin Jarry 	const struct rte_ipv6_addr masked_127 =
35ca786defSRobin Jarry 		RTE_IPV6(0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe);
36ca786defSRobin Jarry 	struct rte_ipv6_addr ip;
37ca786defSRobin Jarry 
38ca786defSRobin Jarry 	ip = mask_full;
39ca786defSRobin Jarry 	rte_ipv6_addr_mask(&ip, 0);
40ca786defSRobin Jarry 	TEST_ASSERT(rte_ipv6_addr_eq(&ip, &zero_addr), "");
41ca786defSRobin Jarry 	TEST_ASSERT_EQUAL(rte_ipv6_mask_depth(&zero_addr), 0, "");
42ca786defSRobin Jarry 
43ca786defSRobin Jarry 	ip = mask_full;
44ca786defSRobin Jarry 	rte_ipv6_addr_mask(&ip, 3);
45ca786defSRobin Jarry 	TEST_ASSERT(rte_ipv6_addr_eq(&ip, &masked_3), "");
46ca786defSRobin Jarry 	TEST_ASSERT_EQUAL(rte_ipv6_mask_depth(&masked_3), 3, "");
47ca786defSRobin Jarry 
48ca786defSRobin Jarry 	ip = mask_full;
49ca786defSRobin Jarry 	rte_ipv6_addr_mask(&ip, 42);
50ca786defSRobin Jarry 	TEST_ASSERT(rte_ipv6_addr_eq(&ip, &masked_42), "");
51ca786defSRobin Jarry 	TEST_ASSERT_EQUAL(rte_ipv6_mask_depth(&masked_42), 42, "");
52ca786defSRobin Jarry 
53ca786defSRobin Jarry 	ip = mask_full;
54ca786defSRobin Jarry 	rte_ipv6_addr_mask(&ip, 85);
55ca786defSRobin Jarry 	TEST_ASSERT(rte_ipv6_addr_eq(&ip, &masked_85), "");
56ca786defSRobin Jarry 	TEST_ASSERT_EQUAL(rte_ipv6_mask_depth(&masked_85), 85, "");
57ca786defSRobin Jarry 
58ca786defSRobin Jarry 	ip = mask_full;
59ca786defSRobin Jarry 	rte_ipv6_addr_mask(&ip, 127);
60ca786defSRobin Jarry 	TEST_ASSERT(rte_ipv6_addr_eq(&ip, &masked_127), "");
61ca786defSRobin Jarry 	TEST_ASSERT_EQUAL(rte_ipv6_mask_depth(&masked_127), 127, "");
62ca786defSRobin Jarry 
63ca786defSRobin Jarry 	ip = mask_full;
64ca786defSRobin Jarry 	rte_ipv6_addr_mask(&ip, 128);
65ca786defSRobin Jarry 	TEST_ASSERT(rte_ipv6_addr_eq(&ip, &mask_full), "");
66ca786defSRobin Jarry 	TEST_ASSERT_EQUAL(rte_ipv6_mask_depth(&mask_full), 128, "");
67ca786defSRobin Jarry 
68ca786defSRobin Jarry 	const struct rte_ipv6_addr mask_holed =
69ca786defSRobin Jarry 		RTE_IPV6(0xffff, 0xffff, 0xffff, 0xefff, 0xffff, 0xffff, 0xffff, 0xffff);
70ca786defSRobin Jarry 	TEST_ASSERT_EQUAL(rte_ipv6_mask_depth(&mask_holed), 51, "");
71ca786defSRobin Jarry 
72ca786defSRobin Jarry 	return TEST_SUCCESS;
73ca786defSRobin Jarry }
74ca786defSRobin Jarry 
75ca786defSRobin Jarry static int
76ca786defSRobin Jarry test_ipv6_addr_eq_prefix(void)
77ca786defSRobin Jarry {
78ca786defSRobin Jarry 	const struct rte_ipv6_addr ip1 =
79ca786defSRobin Jarry 		RTE_IPV6(0x2a01, 0xcb00, 0x0254, 0x3300, 0x1b9f, 0x8071, 0x67cd, 0xbf20);
80ca786defSRobin Jarry 	const struct rte_ipv6_addr ip2 =
81ca786defSRobin Jarry 		RTE_IPV6(0x2a01, 0xcb00, 0x0254, 0x3300, 0x6239, 0xe1f4, 0x7a0b, 0x2371);
82ca786defSRobin Jarry 	const struct rte_ipv6_addr ip3 =
83ca786defSRobin Jarry 		RTE_IPV6(0xfd10, 0x0039, 0x0208, 0x0001, 0x0000, 0x0000, 0x0000, 0x1008);
84ca786defSRobin Jarry 
85ca786defSRobin Jarry 	TEST_ASSERT(rte_ipv6_addr_eq_prefix(&ip1, &ip2, 1), "");
86ca786defSRobin Jarry 	TEST_ASSERT(rte_ipv6_addr_eq_prefix(&ip1, &ip2, 37), "");
87ca786defSRobin Jarry 	TEST_ASSERT(rte_ipv6_addr_eq_prefix(&ip1, &ip2, 64), "");
88ca786defSRobin Jarry 	TEST_ASSERT(!rte_ipv6_addr_eq_prefix(&ip1, &ip2, 112), "");
89ca786defSRobin Jarry 	TEST_ASSERT(rte_ipv6_addr_eq_prefix(&ip1, &ip3, 0), "");
90ca786defSRobin Jarry 	TEST_ASSERT(!rte_ipv6_addr_eq_prefix(&ip1, &ip3, 13), "");
91ca786defSRobin Jarry 
92ca786defSRobin Jarry 	return TEST_SUCCESS;
93ca786defSRobin Jarry }
94ca786defSRobin Jarry 
95ca786defSRobin Jarry static int
96ca786defSRobin Jarry test_ipv6_addr_kind(void)
97ca786defSRobin Jarry {
98ca786defSRobin Jarry 	TEST_ASSERT(rte_ipv6_addr_is_unspec(&zero_addr), "");
993d6d85f5SRobin Jarry 	TEST_ASSERT(!rte_ipv6_addr_is_linklocal(&zero_addr), "");
1003d6d85f5SRobin Jarry 	TEST_ASSERT(!rte_ipv6_addr_is_loopback(&zero_addr), "");
1013d6d85f5SRobin Jarry 	TEST_ASSERT(!rte_ipv6_addr_is_mcast(&zero_addr), "");
102ca786defSRobin Jarry 
103ca786defSRobin Jarry 	const struct rte_ipv6_addr ucast =
104ca786defSRobin Jarry 		RTE_IPV6(0x2a01, 0xcb00, 0x0254, 0x3300, 0x6239, 0xe1f4, 0x7a0b, 0x2371);
105ca786defSRobin Jarry 	TEST_ASSERT(!rte_ipv6_addr_is_unspec(&ucast), "");
1063d6d85f5SRobin Jarry 	TEST_ASSERT(!rte_ipv6_addr_is_linklocal(&ucast), "");
1073d6d85f5SRobin Jarry 	TEST_ASSERT(!rte_ipv6_addr_is_loopback(&ucast), "");
1083d6d85f5SRobin Jarry 	TEST_ASSERT(!rte_ipv6_addr_is_mcast(&ucast), "");
109ca786defSRobin Jarry 
110ca786defSRobin Jarry 	const struct rte_ipv6_addr mcast = RTE_IPV6(0xff01, 0, 0, 0, 0, 0, 0, 1);
111ca786defSRobin Jarry 	TEST_ASSERT(!rte_ipv6_addr_is_unspec(&mcast), "");
1123d6d85f5SRobin Jarry 	TEST_ASSERT(!rte_ipv6_addr_is_linklocal(&mcast), "");
1133d6d85f5SRobin Jarry 	TEST_ASSERT(!rte_ipv6_addr_is_loopback(&mcast), "");
1143d6d85f5SRobin Jarry 	TEST_ASSERT(rte_ipv6_addr_is_mcast(&mcast), "");
115ca786defSRobin Jarry 
116ca786defSRobin Jarry 	const struct rte_ipv6_addr lo = RTE_IPV6_ADDR_LOOPBACK;
117ca786defSRobin Jarry 	TEST_ASSERT(!rte_ipv6_addr_is_unspec(&lo), "");
1183d6d85f5SRobin Jarry 	TEST_ASSERT(!rte_ipv6_addr_is_linklocal(&lo), "");
1193d6d85f5SRobin Jarry 	TEST_ASSERT(rte_ipv6_addr_is_loopback(&lo), "");
1203d6d85f5SRobin Jarry 	TEST_ASSERT(!rte_ipv6_addr_is_mcast(&lo), "");
121ca786defSRobin Jarry 
122ca786defSRobin Jarry 	const struct rte_ipv6_addr local =
123ca786defSRobin Jarry 		RTE_IPV6(0xfe80, 0, 0, 0, 0x5a84, 0xc52c, 0x6aef, 0x4639);
124ca786defSRobin Jarry 	TEST_ASSERT(!rte_ipv6_addr_is_unspec(&local), "");
1253d6d85f5SRobin Jarry 	TEST_ASSERT(rte_ipv6_addr_is_linklocal(&local), "");
1263d6d85f5SRobin Jarry 	TEST_ASSERT(!rte_ipv6_addr_is_loopback(&local), "");
1273d6d85f5SRobin Jarry 	TEST_ASSERT(!rte_ipv6_addr_is_mcast(&local), "");
1283d6d85f5SRobin Jarry 
1293d6d85f5SRobin Jarry 	return TEST_SUCCESS;
1303d6d85f5SRobin Jarry }
1313d6d85f5SRobin Jarry 
1323d6d85f5SRobin Jarry static int
1333d6d85f5SRobin Jarry test_ipv6_llocal_from_ethernet(void)
1343d6d85f5SRobin Jarry {
1353d6d85f5SRobin Jarry 	const struct rte_ether_addr local_mac = {{0x04, 0x7b, 0xcb, 0x5c, 0x08, 0x44}};
1363d6d85f5SRobin Jarry 	const struct rte_ipv6_addr local_ip =
1373d6d85f5SRobin Jarry 		RTE_IPV6(0xfe80, 0, 0, 0, 0x047b, 0xcbff, 0xfe5c, 0x0844);
1383d6d85f5SRobin Jarry 	struct rte_ipv6_addr ip;
1393d6d85f5SRobin Jarry 
1403d6d85f5SRobin Jarry 	rte_ipv6_llocal_from_ethernet(&ip, &local_mac);
1413d6d85f5SRobin Jarry 	TEST_ASSERT(rte_ipv6_addr_eq(&ip, &local_ip), "");
1423d6d85f5SRobin Jarry 
1433d6d85f5SRobin Jarry 	return TEST_SUCCESS;
1443d6d85f5SRobin Jarry }
1453d6d85f5SRobin Jarry 
1463d6d85f5SRobin Jarry static int
1473d6d85f5SRobin Jarry test_ipv6_solnode_from_addr(void)
1483d6d85f5SRobin Jarry {
1493d6d85f5SRobin Jarry 	struct rte_ipv6_addr sol;
1503d6d85f5SRobin Jarry 
1513d6d85f5SRobin Jarry 	const struct rte_ipv6_addr llocal =
1523d6d85f5SRobin Jarry 		RTE_IPV6(0xfe80, 0, 0, 0, 0x047b, 0xcbff, 0xfe5c, 0x0844);
1533d6d85f5SRobin Jarry 	const struct rte_ipv6_addr llocal_sol =
1543d6d85f5SRobin Jarry 		RTE_IPV6(0xff02, 0, 0, 0, 0, 0x0001, 0xff5c, 0x0844);
1553d6d85f5SRobin Jarry 	rte_ipv6_solnode_from_addr(&sol, &llocal);
1563d6d85f5SRobin Jarry 	TEST_ASSERT(rte_ipv6_addr_eq(&sol, &llocal_sol), "");
1573d6d85f5SRobin Jarry 
1583d6d85f5SRobin Jarry 	const struct rte_ipv6_addr ucast =
1593d6d85f5SRobin Jarry 		RTE_IPV6(0x2a01, 0xcb00, 0x0254, 0x3300, 0x1b9f, 0x8071, 0x67cd, 0xbf20);
1603d6d85f5SRobin Jarry 	const struct rte_ipv6_addr ucast_sol =
1613d6d85f5SRobin Jarry 		RTE_IPV6(0xff02, 0, 0, 0, 0, 0x0001, 0xffcd, 0xbf20);
1623d6d85f5SRobin Jarry 	rte_ipv6_solnode_from_addr(&sol, &ucast);
1633d6d85f5SRobin Jarry 	TEST_ASSERT(rte_ipv6_addr_eq(&sol, &ucast_sol), "");
1643d6d85f5SRobin Jarry 
1653d6d85f5SRobin Jarry 	return TEST_SUCCESS;
1663d6d85f5SRobin Jarry }
1673d6d85f5SRobin Jarry 
1683d6d85f5SRobin Jarry static int
1693d6d85f5SRobin Jarry test_ether_mcast_from_ipv6(void)
1703d6d85f5SRobin Jarry {
1713d6d85f5SRobin Jarry 	const struct rte_ether_addr mcast_mac = {{0x33, 0x33, 0xd3, 0x00, 0x02, 0x01}};
1723d6d85f5SRobin Jarry 	const struct rte_ipv6_addr mcast_ip =
1733d6d85f5SRobin Jarry 		RTE_IPV6(0xff02, 0, 0, 0x0201, 0, 0, 0xd300, 0x0201);
1743d6d85f5SRobin Jarry 	struct rte_ether_addr mac;
1753d6d85f5SRobin Jarry 
1763d6d85f5SRobin Jarry 	rte_ether_mcast_from_ipv6(&mac, &mcast_ip);
1773d6d85f5SRobin Jarry 	TEST_ASSERT(rte_is_same_ether_addr(&mac, &mcast_mac), "");
178ca786defSRobin Jarry 
179ca786defSRobin Jarry 	return TEST_SUCCESS;
180ca786defSRobin Jarry }
181ca786defSRobin Jarry 
182ca786defSRobin Jarry static int
183ca786defSRobin Jarry test_net_ipv6(void)
184ca786defSRobin Jarry {
185*189fdd37SRobin Jarry 	TEST_ASSERT_SUCCESS(test_ipv6_check_version(), "");
186ca786defSRobin Jarry 	TEST_ASSERT_SUCCESS(test_ipv6_addr_mask(), "");
187ca786defSRobin Jarry 	TEST_ASSERT_SUCCESS(test_ipv6_addr_eq_prefix(), "");
188ca786defSRobin Jarry 	TEST_ASSERT_SUCCESS(test_ipv6_addr_kind(), "");
1893d6d85f5SRobin Jarry 	TEST_ASSERT_SUCCESS(test_ipv6_llocal_from_ethernet(), "");
1903d6d85f5SRobin Jarry 	TEST_ASSERT_SUCCESS(test_ipv6_solnode_from_addr(), "");
1913d6d85f5SRobin Jarry 	TEST_ASSERT_SUCCESS(test_ether_mcast_from_ipv6(), "");
192ca786defSRobin Jarry 	return TEST_SUCCESS;
193ca786defSRobin Jarry }
194ca786defSRobin Jarry 
195ca786defSRobin Jarry REGISTER_FAST_TEST(net_ipv6_autotest, true, true, test_net_ipv6);
196