1195972f6Sopenharmony_ci#include "test_ip6.h" 2195972f6Sopenharmony_ci 3195972f6Sopenharmony_ci#include "lwip/ethip6.h" 4195972f6Sopenharmony_ci#include "lwip/ip6.h" 5195972f6Sopenharmony_ci#include "lwip/inet_chksum.h" 6195972f6Sopenharmony_ci#include "lwip/nd6.h" 7195972f6Sopenharmony_ci#include "lwip/stats.h" 8195972f6Sopenharmony_ci#include "lwip/prot/ethernet.h" 9195972f6Sopenharmony_ci#include "lwip/prot/ip.h" 10195972f6Sopenharmony_ci#include "lwip/prot/ip6.h" 11195972f6Sopenharmony_ci 12195972f6Sopenharmony_ci#include "lwip/tcpip.h" 13195972f6Sopenharmony_ci 14195972f6Sopenharmony_ci#if LWIP_IPV6 /* allow to build the unit tests without IPv6 support */ 15195972f6Sopenharmony_ci 16195972f6Sopenharmony_cistatic struct netif test_netif6; 17195972f6Sopenharmony_cistatic int linkoutput_ctr; 18195972f6Sopenharmony_ci 19195972f6Sopenharmony_cistatic err_t 20195972f6Sopenharmony_cidefault_netif_linkoutput(struct netif *netif, struct pbuf *p) 21195972f6Sopenharmony_ci{ 22195972f6Sopenharmony_ci fail_unless(netif == &test_netif6); 23195972f6Sopenharmony_ci fail_unless(p != NULL); 24195972f6Sopenharmony_ci linkoutput_ctr++; 25195972f6Sopenharmony_ci return ERR_OK; 26195972f6Sopenharmony_ci} 27195972f6Sopenharmony_ci 28195972f6Sopenharmony_cistatic err_t 29195972f6Sopenharmony_cidefault_netif_init(struct netif *netif) 30195972f6Sopenharmony_ci{ 31195972f6Sopenharmony_ci fail_unless(netif != NULL); 32195972f6Sopenharmony_ci netif->linkoutput = default_netif_linkoutput; 33195972f6Sopenharmony_ci netif->output_ip6 = ethip6_output; 34195972f6Sopenharmony_ci netif->mtu = 1500; 35195972f6Sopenharmony_ci netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHERNET | NETIF_FLAG_MLD6; 36195972f6Sopenharmony_ci netif->hwaddr_len = ETH_HWADDR_LEN; 37195972f6Sopenharmony_ci return ERR_OK; 38195972f6Sopenharmony_ci} 39195972f6Sopenharmony_ci 40195972f6Sopenharmony_cistatic void 41195972f6Sopenharmony_cidefault_netif_add(void) 42195972f6Sopenharmony_ci{ 43195972f6Sopenharmony_ci struct netif *n; 44195972f6Sopenharmony_ci fail_unless(netif_default == NULL); 45195972f6Sopenharmony_ci n = netif_add_noaddr(&test_netif6, NULL, default_netif_init, NULL); 46195972f6Sopenharmony_ci fail_unless(n == &test_netif6); 47195972f6Sopenharmony_ci netif_set_default(&test_netif6); 48195972f6Sopenharmony_ci} 49195972f6Sopenharmony_ci 50195972f6Sopenharmony_cistatic void 51195972f6Sopenharmony_cidefault_netif_remove(void) 52195972f6Sopenharmony_ci{ 53195972f6Sopenharmony_ci fail_unless(netif_default == &test_netif6); 54195972f6Sopenharmony_ci netif_remove(&test_netif6); 55195972f6Sopenharmony_ci} 56195972f6Sopenharmony_ci 57195972f6Sopenharmony_cistatic void 58195972f6Sopenharmony_ciip6_test_handle_timers(int count) 59195972f6Sopenharmony_ci{ 60195972f6Sopenharmony_ci int i; 61195972f6Sopenharmony_ci for (i = 0; i < count; i++) { 62195972f6Sopenharmony_ci nd6_tmr(); 63195972f6Sopenharmony_ci } 64195972f6Sopenharmony_ci} 65195972f6Sopenharmony_ci 66195972f6Sopenharmony_ci/* Setups/teardown functions */ 67195972f6Sopenharmony_ci 68195972f6Sopenharmony_cistatic void 69195972f6Sopenharmony_ciip6_setup(void) 70195972f6Sopenharmony_ci{ 71195972f6Sopenharmony_ci default_netif_add(); 72195972f6Sopenharmony_ci lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT)); 73195972f6Sopenharmony_ci} 74195972f6Sopenharmony_ci 75195972f6Sopenharmony_cistatic void 76195972f6Sopenharmony_ciip6_teardown(void) 77195972f6Sopenharmony_ci{ 78195972f6Sopenharmony_ci if (netif_list->loop_first != NULL) { 79195972f6Sopenharmony_ci pbuf_free(netif_list->loop_first); 80195972f6Sopenharmony_ci netif_list->loop_first = NULL; 81195972f6Sopenharmony_ci } 82195972f6Sopenharmony_ci netif_list->loop_last = NULL; 83195972f6Sopenharmony_ci /* poll until all memory is released... */ 84195972f6Sopenharmony_ci tcpip_thread_poll_one(); 85195972f6Sopenharmony_ci default_netif_remove(); 86195972f6Sopenharmony_ci lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT)); 87195972f6Sopenharmony_ci} 88195972f6Sopenharmony_ci 89195972f6Sopenharmony_ci 90195972f6Sopenharmony_ci/* Test functions */ 91195972f6Sopenharmony_ci 92195972f6Sopenharmony_cistatic void 93195972f6Sopenharmony_citest_ip6_ll_addr_iter(int expected_ctr1, int expected_ctr2) 94195972f6Sopenharmony_ci{ 95195972f6Sopenharmony_ci fail_unless(linkoutput_ctr == 0); 96195972f6Sopenharmony_ci 97195972f6Sopenharmony_ci /* test that nothing is sent with link uo but netif down */ 98195972f6Sopenharmony_ci netif_set_link_up(&test_netif6); 99195972f6Sopenharmony_ci ip6_test_handle_timers(500); 100195972f6Sopenharmony_ci fail_unless(linkoutput_ctr == 0); 101195972f6Sopenharmony_ci netif_set_link_down(&test_netif6); 102195972f6Sopenharmony_ci fail_unless(linkoutput_ctr == 0); 103195972f6Sopenharmony_ci 104195972f6Sopenharmony_ci /* test that nothing is sent with link down but netif up */ 105195972f6Sopenharmony_ci netif_set_up(&test_netif6); 106195972f6Sopenharmony_ci ip6_test_handle_timers(500); 107195972f6Sopenharmony_ci fail_unless(linkoutput_ctr == 0); 108195972f6Sopenharmony_ci netif_set_down(&test_netif6); 109195972f6Sopenharmony_ci fail_unless(linkoutput_ctr == 0); 110195972f6Sopenharmony_ci 111195972f6Sopenharmony_ci /* test what is sent with link up + netif up */ 112195972f6Sopenharmony_ci netif_set_link_up(&test_netif6); 113195972f6Sopenharmony_ci netif_set_up(&test_netif6); 114195972f6Sopenharmony_ci ip6_test_handle_timers(500); 115195972f6Sopenharmony_ci fail_unless(linkoutput_ctr == expected_ctr1); 116195972f6Sopenharmony_ci netif_set_down(&test_netif6); 117195972f6Sopenharmony_ci netif_set_link_down(&test_netif6); 118195972f6Sopenharmony_ci fail_unless(linkoutput_ctr == expected_ctr1); 119195972f6Sopenharmony_ci linkoutput_ctr = 0; 120195972f6Sopenharmony_ci 121195972f6Sopenharmony_ci netif_set_up(&test_netif6); 122195972f6Sopenharmony_ci netif_set_link_up(&test_netif6); 123195972f6Sopenharmony_ci ip6_test_handle_timers(500); 124195972f6Sopenharmony_ci fail_unless(linkoutput_ctr == expected_ctr2); 125195972f6Sopenharmony_ci netif_set_link_down(&test_netif6); 126195972f6Sopenharmony_ci netif_set_down(&test_netif6); 127195972f6Sopenharmony_ci fail_unless(linkoutput_ctr == expected_ctr2); 128195972f6Sopenharmony_ci linkoutput_ctr = 0; 129195972f6Sopenharmony_ci} 130195972f6Sopenharmony_ci 131195972f6Sopenharmony_ciSTART_TEST(test_ip6_ll_addr) 132195972f6Sopenharmony_ci{ 133195972f6Sopenharmony_ci LWIP_UNUSED_ARG(_i); 134195972f6Sopenharmony_ci 135195972f6Sopenharmony_ci /* test without link-local address */ 136195972f6Sopenharmony_ci test_ip6_ll_addr_iter(0, 0); 137195972f6Sopenharmony_ci 138195972f6Sopenharmony_ci /* test with link-local address */ 139195972f6Sopenharmony_ci netif_create_ip6_linklocal_address(&test_netif6, 1); 140195972f6Sopenharmony_ci test_ip6_ll_addr_iter(3 + LWIP_IPV6_DUP_DETECT_ATTEMPTS + LWIP_IPV6_MLD, 3); 141195972f6Sopenharmony_ci} 142195972f6Sopenharmony_ciEND_TEST 143195972f6Sopenharmony_ci 144195972f6Sopenharmony_ciSTART_TEST(test_ip6_aton_ipv4mapped) 145195972f6Sopenharmony_ci{ 146195972f6Sopenharmony_ci int ret; 147195972f6Sopenharmony_ci ip_addr_t addr; 148195972f6Sopenharmony_ci ip6_addr_t addr6; 149195972f6Sopenharmony_ci const ip_addr_t addr_expected = IPADDR6_INIT_HOST(0, 0, 0xFFFF, 0xD4CC65D2); 150195972f6Sopenharmony_ci const char *full_ipv6_addr = "0:0:0:0:0:FFFF:D4CC:65D2"; 151195972f6Sopenharmony_ci const char *shortened_ipv6_addr = "::FFFF:D4CC:65D2"; 152195972f6Sopenharmony_ci const char *full_ipv4_mapped_addr = "0:0:0:0:0:FFFF:212.204.101.210"; 153195972f6Sopenharmony_ci const char *shortened_ipv4_mapped_addr = "::FFFF:212.204.101.210"; 154195972f6Sopenharmony_ci const char *bogus_ipv4_mapped_addr = "::FFFF:212.204.101.2101"; 155195972f6Sopenharmony_ci LWIP_UNUSED_ARG(_i); 156195972f6Sopenharmony_ci 157195972f6Sopenharmony_ci /* check IPv6 representation */ 158195972f6Sopenharmony_ci memset(&addr6, 0, sizeof(addr6)); 159195972f6Sopenharmony_ci ret = ip6addr_aton(full_ipv6_addr, &addr6); 160195972f6Sopenharmony_ci fail_unless(ret == 1); 161195972f6Sopenharmony_ci fail_unless(memcmp(&addr6, &addr_expected, 16) == 0); 162195972f6Sopenharmony_ci memset(&addr, 0, sizeof(addr)); 163195972f6Sopenharmony_ci ret = ipaddr_aton(full_ipv6_addr, &addr); 164195972f6Sopenharmony_ci fail_unless(ret == 1); 165195972f6Sopenharmony_ci fail_unless(memcmp(&addr, &addr_expected, 16) == 0); 166195972f6Sopenharmony_ci 167195972f6Sopenharmony_ci /* check shortened IPv6 representation */ 168195972f6Sopenharmony_ci memset(&addr6, 0, sizeof(addr6)); 169195972f6Sopenharmony_ci ret = ip6addr_aton(shortened_ipv6_addr, &addr6); 170195972f6Sopenharmony_ci fail_unless(ret == 1); 171195972f6Sopenharmony_ci fail_unless(memcmp(&addr6, &addr_expected, 16) == 0); 172195972f6Sopenharmony_ci memset(&addr, 0, sizeof(addr)); 173195972f6Sopenharmony_ci ret = ipaddr_aton(shortened_ipv6_addr, &addr); 174195972f6Sopenharmony_ci fail_unless(ret == 1); 175195972f6Sopenharmony_ci fail_unless(memcmp(&addr, &addr_expected, 16) == 0); 176195972f6Sopenharmony_ci 177195972f6Sopenharmony_ci /* checked shortened mixed representation */ 178195972f6Sopenharmony_ci memset(&addr6, 0, sizeof(addr6)); 179195972f6Sopenharmony_ci ret = ip6addr_aton(shortened_ipv4_mapped_addr, &addr6); 180195972f6Sopenharmony_ci fail_unless(ret == 1); 181195972f6Sopenharmony_ci fail_unless(memcmp(&addr6, &addr_expected, 16) == 0); 182195972f6Sopenharmony_ci memset(&addr, 0, sizeof(addr)); 183195972f6Sopenharmony_ci ret = ipaddr_aton(shortened_ipv4_mapped_addr, &addr); 184195972f6Sopenharmony_ci fail_unless(ret == 1); 185195972f6Sopenharmony_ci fail_unless(memcmp(&addr, &addr_expected, 16) == 0); 186195972f6Sopenharmony_ci 187195972f6Sopenharmony_ci /* checked mixed representation */ 188195972f6Sopenharmony_ci memset(&addr6, 0, sizeof(addr6)); 189195972f6Sopenharmony_ci ret = ip6addr_aton(full_ipv4_mapped_addr, &addr6); 190195972f6Sopenharmony_ci fail_unless(ret == 1); 191195972f6Sopenharmony_ci fail_unless(memcmp(&addr6, &addr_expected, 16) == 0); 192195972f6Sopenharmony_ci memset(&addr, 0, sizeof(addr)); 193195972f6Sopenharmony_ci ret = ipaddr_aton(full_ipv4_mapped_addr, &addr); 194195972f6Sopenharmony_ci fail_unless(ret == 1); 195195972f6Sopenharmony_ci fail_unless(memcmp(&addr, &addr_expected, 16) == 0); 196195972f6Sopenharmony_ci 197195972f6Sopenharmony_ci /* checked bogus mixed representation */ 198195972f6Sopenharmony_ci memset(&addr6, 0, sizeof(addr6)); 199195972f6Sopenharmony_ci ret = ip6addr_aton(bogus_ipv4_mapped_addr, &addr6); 200195972f6Sopenharmony_ci fail_unless(ret == 0); 201195972f6Sopenharmony_ci memset(&addr, 0, sizeof(addr)); 202195972f6Sopenharmony_ci ret = ipaddr_aton(bogus_ipv4_mapped_addr, &addr); 203195972f6Sopenharmony_ci fail_unless(ret == 0); 204195972f6Sopenharmony_ci} 205195972f6Sopenharmony_ciEND_TEST 206195972f6Sopenharmony_ci 207195972f6Sopenharmony_ciSTART_TEST(test_ip6_ntoa_ipv4mapped) 208195972f6Sopenharmony_ci{ 209195972f6Sopenharmony_ci const ip_addr_t addr = IPADDR6_INIT_HOST(0, 0, 0xFFFF, 0xD4CC65D2); 210195972f6Sopenharmony_ci char buf[128]; 211195972f6Sopenharmony_ci char *str; 212195972f6Sopenharmony_ci LWIP_UNUSED_ARG(_i); 213195972f6Sopenharmony_ci 214195972f6Sopenharmony_ci str = ip6addr_ntoa_r(ip_2_ip6(&addr), buf, sizeof(buf)); 215195972f6Sopenharmony_ci fail_unless(str == buf); 216195972f6Sopenharmony_ci fail_unless(!strcmp(str, "::FFFF:212.204.101.210")); 217195972f6Sopenharmony_ci} 218195972f6Sopenharmony_ciEND_TEST 219195972f6Sopenharmony_ci 220195972f6Sopenharmony_cistruct test_addr_and_str { 221195972f6Sopenharmony_ci ip_addr_t addr; 222195972f6Sopenharmony_ci const char *str; 223195972f6Sopenharmony_ci}; 224195972f6Sopenharmony_ci 225195972f6Sopenharmony_ciSTART_TEST(test_ip6_ntoa) 226195972f6Sopenharmony_ci{ 227195972f6Sopenharmony_ci struct test_addr_and_str tests[] = { 228195972f6Sopenharmony_ci {IPADDR6_INIT_HOST(0xfe800000, 0x00000000, 0xb2a1a2ff, 0xfea3a4a5), "FE80::B2A1:A2FF:FEA3:A4A5"}, /* test shortened zeros */ 229195972f6Sopenharmony_ci {IPADDR6_INIT_HOST(0xfe800000, 0xff000000, 0xb2a1a2ff, 0xfea3a4a5), "FE80:0:FF00:0:B2A1:A2FF:FEA3:A4A5"}, /* don't omit single zero blocks */ 230195972f6Sopenharmony_ci {IPADDR6_INIT_HOST(0xfe800000, 0xff000000, 0xb2000000, 0x0000a4a5), "FE80:0:FF00:0:B200::A4A5"}, /* omit longest zero block */ 231195972f6Sopenharmony_ci }; 232195972f6Sopenharmony_ci char buf[128]; 233195972f6Sopenharmony_ci char *str; 234195972f6Sopenharmony_ci size_t i; 235195972f6Sopenharmony_ci LWIP_UNUSED_ARG(_i); 236195972f6Sopenharmony_ci 237195972f6Sopenharmony_ci for (i = 0; i < LWIP_ARRAYSIZE(tests); i++) { 238195972f6Sopenharmony_ci str = ip6addr_ntoa_r(ip_2_ip6(&tests[i].addr), buf, sizeof(buf)); 239195972f6Sopenharmony_ci fail_unless(str == buf); 240195972f6Sopenharmony_ci fail_unless(!strcmp(str, tests[i].str)); 241195972f6Sopenharmony_ci } 242195972f6Sopenharmony_ci} 243195972f6Sopenharmony_ciEND_TEST 244195972f6Sopenharmony_ci 245195972f6Sopenharmony_ciSTART_TEST(test_ip6_lladdr) 246195972f6Sopenharmony_ci{ 247195972f6Sopenharmony_ci u8_t zeros[128]; 248195972f6Sopenharmony_ci const u8_t test_mac_addr[6] = {0xb0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5}; 249195972f6Sopenharmony_ci const u32_t expected_ip6_addr_1[4] = {PP_HTONL(0xfe800000), 0, PP_HTONL(0xb2a1a2ff), PP_HTONL(0xfea3a4a5)}; 250195972f6Sopenharmony_ci const u32_t expected_ip6_addr_2[4] = {PP_HTONL(0xfe800000), 0, PP_HTONL(0x0000b0a1), PP_HTONL(0xa2a3a4a5)}; 251195972f6Sopenharmony_ci LWIP_UNUSED_ARG(_i); 252195972f6Sopenharmony_ci memset(zeros, 0, sizeof(zeros)); 253195972f6Sopenharmony_ci 254195972f6Sopenharmony_ci fail_unless(test_netif6.hwaddr_len == 6); 255195972f6Sopenharmony_ci fail_unless(!memcmp(test_netif6.hwaddr, zeros, 6)); 256195972f6Sopenharmony_ci 257195972f6Sopenharmony_ci fail_unless(test_netif6.ip6_addr_state[0] == 0); 258195972f6Sopenharmony_ci fail_unless(!memcmp(netif_ip6_addr(&test_netif6, 0), zeros, sizeof(ip6_addr_t))); 259195972f6Sopenharmony_ci 260195972f6Sopenharmony_ci /* set specific mac addr */ 261195972f6Sopenharmony_ci memcpy(test_netif6.hwaddr, test_mac_addr, 6); 262195972f6Sopenharmony_ci 263195972f6Sopenharmony_ci /* create link-local addr based on mac (EUI-48) */ 264195972f6Sopenharmony_ci netif_create_ip6_linklocal_address(&test_netif6, 1); 265195972f6Sopenharmony_ci fail_unless(IP_IS_V6(&test_netif6.ip6_addr[0])); 266195972f6Sopenharmony_ci fail_unless(!memcmp(&netif_ip6_addr(&test_netif6, 0)->addr, expected_ip6_addr_1, 16)); 267195972f6Sopenharmony_ci#if LWIP_IPV6_SCOPES 268195972f6Sopenharmony_ci fail_unless(netif_ip6_addr(&test_netif6, 0)->zone == (test_netif6.num + 1)); 269195972f6Sopenharmony_ci#endif 270195972f6Sopenharmony_ci /* reset address */ 271195972f6Sopenharmony_ci memset(&test_netif6.ip6_addr[0], 0, sizeof(ip6_addr_t)); 272195972f6Sopenharmony_ci test_netif6.ip6_addr_state[0] = 0; 273195972f6Sopenharmony_ci 274195972f6Sopenharmony_ci /* create link-local addr based interface ID */ 275195972f6Sopenharmony_ci netif_create_ip6_linklocal_address(&test_netif6, 0); 276195972f6Sopenharmony_ci fail_unless(IP_IS_V6(&test_netif6.ip6_addr[0])); 277195972f6Sopenharmony_ci fail_unless(!memcmp(&netif_ip6_addr(&test_netif6, 0)->addr, expected_ip6_addr_2, 16)); 278195972f6Sopenharmony_ci#if LWIP_IPV6_SCOPES 279195972f6Sopenharmony_ci fail_unless(netif_ip6_addr(&test_netif6, 0)->zone == (test_netif6.num + 1)); 280195972f6Sopenharmony_ci#endif 281195972f6Sopenharmony_ci /* reset address */ 282195972f6Sopenharmony_ci memset(&test_netif6.ip6_addr[0], 0, sizeof(ip6_addr_t)); 283195972f6Sopenharmony_ci test_netif6.ip6_addr_state[0] = 0; 284195972f6Sopenharmony_ci 285195972f6Sopenharmony_ci /* reset mac address */ 286195972f6Sopenharmony_ci memset(&test_netif6.hwaddr, 0, sizeof(test_netif6.hwaddr)); 287195972f6Sopenharmony_ci} 288195972f6Sopenharmony_ciEND_TEST 289195972f6Sopenharmony_ci 290195972f6Sopenharmony_ci/* Reproduces bug #57374 */ 291195972f6Sopenharmony_ciSTART_TEST(test_ip6_frag_pbuf_len_assert) 292195972f6Sopenharmony_ci{ 293195972f6Sopenharmony_ci ip_addr_t my_addr = IPADDR6_INIT_HOST(0x20010db8, 0x0, 0x0, 0x1); 294195972f6Sopenharmony_ci ip_addr_t peer_addr = IPADDR6_INIT_HOST(0x20010db8, 0x0, 0x0, 0x4); 295195972f6Sopenharmony_ci struct pbuf *payload, *hdr; 296195972f6Sopenharmony_ci err_t err; 297195972f6Sopenharmony_ci int i; 298195972f6Sopenharmony_ci 299195972f6Sopenharmony_ci /* Configure and enable local address */ 300195972f6Sopenharmony_ci test_netif6.mtu = 1500; 301195972f6Sopenharmony_ci netif_set_up(&test_netif6); 302195972f6Sopenharmony_ci netif_ip6_addr_set(&test_netif6, 0, ip_2_ip6(&my_addr)); 303195972f6Sopenharmony_ci netif_ip6_addr_set_state(&test_netif6, 0, IP6_ADDR_VALID); 304195972f6Sopenharmony_ci 305195972f6Sopenharmony_ci /* Create packet with lots of small pbufs around mtu limit */ 306195972f6Sopenharmony_ci payload = pbuf_alloc(PBUF_RAW, 1400, PBUF_POOL); 307195972f6Sopenharmony_ci fail_unless(payload != NULL); 308195972f6Sopenharmony_ci for (i = 0; i < 16; i++) { 309195972f6Sopenharmony_ci struct pbuf *p = pbuf_alloc(PBUF_RAW, 32, PBUF_RAM); 310195972f6Sopenharmony_ci fail_unless(p != NULL); 311195972f6Sopenharmony_ci pbuf_cat(payload, p); 312195972f6Sopenharmony_ci } 313195972f6Sopenharmony_ci /* Prefix with header like UDP would */ 314195972f6Sopenharmony_ci hdr = pbuf_alloc(PBUF_IP, 8, PBUF_RAM); 315195972f6Sopenharmony_ci fail_unless(hdr != NULL); 316195972f6Sopenharmony_ci pbuf_chain(hdr, payload); 317195972f6Sopenharmony_ci 318195972f6Sopenharmony_ci /* Send it and don't crash while fragmenting */ 319195972f6Sopenharmony_ci err = ip6_output_if_src(hdr, ip_2_ip6(&my_addr), ip_2_ip6(&peer_addr), 15, 0, IP_PROTO_UDP, &test_netif6); 320195972f6Sopenharmony_ci fail_unless(err == ERR_OK); 321195972f6Sopenharmony_ci 322195972f6Sopenharmony_ci pbuf_free(hdr); 323195972f6Sopenharmony_ci pbuf_free(payload); 324195972f6Sopenharmony_ci} 325195972f6Sopenharmony_ciEND_TEST 326195972f6Sopenharmony_ci 327195972f6Sopenharmony_ci/** Create the suite including all tests for this module */ 328195972f6Sopenharmony_ciSuite * 329195972f6Sopenharmony_ciip6_suite(void) 330195972f6Sopenharmony_ci{ 331195972f6Sopenharmony_ci testfunc tests[] = { 332195972f6Sopenharmony_ci TESTFUNC(test_ip6_ll_addr), 333195972f6Sopenharmony_ci TESTFUNC(test_ip6_aton_ipv4mapped), 334195972f6Sopenharmony_ci TESTFUNC(test_ip6_ntoa_ipv4mapped), 335195972f6Sopenharmony_ci TESTFUNC(test_ip6_ntoa), 336195972f6Sopenharmony_ci TESTFUNC(test_ip6_lladdr), 337195972f6Sopenharmony_ci TESTFUNC(test_ip6_frag_pbuf_len_assert) 338195972f6Sopenharmony_ci }; 339195972f6Sopenharmony_ci return create_suite("IPv6", tests, sizeof(tests)/sizeof(testfunc), ip6_setup, ip6_teardown); 340195972f6Sopenharmony_ci} 341195972f6Sopenharmony_ci 342195972f6Sopenharmony_ci#else /* LWIP_IPV6 */ 343195972f6Sopenharmony_ci 344195972f6Sopenharmony_ci/* allow to build the unit tests without IPv6 support */ 345195972f6Sopenharmony_ciSTART_TEST(test_ip6_dummy) 346195972f6Sopenharmony_ci{ 347195972f6Sopenharmony_ci LWIP_UNUSED_ARG(_i); 348195972f6Sopenharmony_ci} 349195972f6Sopenharmony_ciEND_TEST 350195972f6Sopenharmony_ci 351195972f6Sopenharmony_ciSuite * 352195972f6Sopenharmony_ciip6_suite(void) 353195972f6Sopenharmony_ci{ 354195972f6Sopenharmony_ci testfunc tests[] = { 355195972f6Sopenharmony_ci TESTFUNC(test_ip6_dummy), 356195972f6Sopenharmony_ci }; 357195972f6Sopenharmony_ci return create_suite("IPv6", tests, sizeof(tests)/sizeof(testfunc), NULL, NULL); 358195972f6Sopenharmony_ci} 359195972f6Sopenharmony_ci#endif /* LWIP_IPV6 */ 360