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