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