xref: /third_party/lwip/test/unit/ip4/test_ip4.c (revision 195972f6)
1195972f6Sopenharmony_ci#include "test_ip4.h"
2195972f6Sopenharmony_ci
3195972f6Sopenharmony_ci#include "lwip/ip4.h"
4195972f6Sopenharmony_ci#include "lwip/inet_chksum.h"
5195972f6Sopenharmony_ci#include "lwip/stats.h"
6195972f6Sopenharmony_ci#include "lwip/prot/ip.h"
7195972f6Sopenharmony_ci#include "lwip/prot/ip4.h"
8195972f6Sopenharmony_ci
9195972f6Sopenharmony_ci#include "lwip/tcpip.h"
10195972f6Sopenharmony_ci
11195972f6Sopenharmony_ci#if !LWIP_IPV4 || !IP_REASSEMBLY || !MIB2_STATS || !IPFRAG_STATS
12195972f6Sopenharmony_ci#error "This tests needs LWIP_IPV4, IP_REASSEMBLY; MIB2- and IPFRAG-statistics enabled"
13195972f6Sopenharmony_ci#endif
14195972f6Sopenharmony_ci
15195972f6Sopenharmony_ci/* Helper functions */
16195972f6Sopenharmony_cistatic void
17195972f6Sopenharmony_cicreate_ip4_input_fragment(u16_t ip_id, u16_t start, u16_t len, int last)
18195972f6Sopenharmony_ci{
19195972f6Sopenharmony_ci  struct pbuf *p;
20195972f6Sopenharmony_ci  struct netif *input_netif = netif_list; /* just use any netif */
21195972f6Sopenharmony_ci  fail_unless((start & 7) == 0);
22195972f6Sopenharmony_ci  fail_unless(((len & 7) == 0) || last);
23195972f6Sopenharmony_ci  fail_unless(input_netif != NULL);
24195972f6Sopenharmony_ci
25195972f6Sopenharmony_ci  p = pbuf_alloc(PBUF_RAW, len + sizeof(struct ip_hdr), PBUF_RAM);
26195972f6Sopenharmony_ci  fail_unless(p != NULL);
27195972f6Sopenharmony_ci  if (p != NULL) {
28195972f6Sopenharmony_ci    err_t err;
29195972f6Sopenharmony_ci    struct ip_hdr *iphdr = (struct ip_hdr *)p->payload;
30195972f6Sopenharmony_ci    IPH_VHL_SET(iphdr, 4, sizeof(struct ip_hdr) / 4);
31195972f6Sopenharmony_ci    IPH_TOS_SET(iphdr, 0);
32195972f6Sopenharmony_ci    IPH_LEN_SET(iphdr, lwip_htons(p->tot_len));
33195972f6Sopenharmony_ci    IPH_ID_SET(iphdr, lwip_htons(ip_id));
34195972f6Sopenharmony_ci    if (last) {
35195972f6Sopenharmony_ci      IPH_OFFSET_SET(iphdr, lwip_htons(start / 8));
36195972f6Sopenharmony_ci    } else {
37195972f6Sopenharmony_ci      IPH_OFFSET_SET(iphdr, lwip_htons((start / 8) | IP_MF));
38195972f6Sopenharmony_ci    }
39195972f6Sopenharmony_ci    IPH_TTL_SET(iphdr, 5);
40195972f6Sopenharmony_ci    IPH_PROTO_SET(iphdr, IP_PROTO_UDP);
41195972f6Sopenharmony_ci    IPH_CHKSUM_SET(iphdr, 0);
42195972f6Sopenharmony_ci    ip4_addr_copy(iphdr->src, *netif_ip4_addr(input_netif));
43195972f6Sopenharmony_ci    iphdr->src.addr = lwip_htonl(lwip_htonl(iphdr->src.addr) + 1);
44195972f6Sopenharmony_ci    ip4_addr_copy(iphdr->dest, *netif_ip4_addr(input_netif));
45195972f6Sopenharmony_ci    IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, sizeof(struct ip_hdr)));
46195972f6Sopenharmony_ci
47195972f6Sopenharmony_ci    err = ip4_input(p, input_netif);
48195972f6Sopenharmony_ci    if (err != ERR_OK) {
49195972f6Sopenharmony_ci      pbuf_free(p);
50195972f6Sopenharmony_ci    }
51195972f6Sopenharmony_ci    fail_unless(err == ERR_OK);
52195972f6Sopenharmony_ci  }
53195972f6Sopenharmony_ci}
54195972f6Sopenharmony_ci
55195972f6Sopenharmony_ci/* Setups/teardown functions */
56195972f6Sopenharmony_ci
57195972f6Sopenharmony_cistatic void
58195972f6Sopenharmony_ciip4_setup(void)
59195972f6Sopenharmony_ci{
60195972f6Sopenharmony_ci  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
61195972f6Sopenharmony_ci}
62195972f6Sopenharmony_ci
63195972f6Sopenharmony_cistatic void
64195972f6Sopenharmony_ciip4_teardown(void)
65195972f6Sopenharmony_ci{
66195972f6Sopenharmony_ci  if (netif_list->loop_first != NULL) {
67195972f6Sopenharmony_ci    pbuf_free(netif_list->loop_first);
68195972f6Sopenharmony_ci    netif_list->loop_first = NULL;
69195972f6Sopenharmony_ci  }
70195972f6Sopenharmony_ci  netif_list->loop_last = NULL;
71195972f6Sopenharmony_ci  /* poll until all memory is released... */
72195972f6Sopenharmony_ci  tcpip_thread_poll_one();
73195972f6Sopenharmony_ci  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
74195972f6Sopenharmony_ci}
75195972f6Sopenharmony_ci
76195972f6Sopenharmony_ci
77195972f6Sopenharmony_ci/* Test functions */
78195972f6Sopenharmony_ci
79195972f6Sopenharmony_ciSTART_TEST(test_ip4_reass)
80195972f6Sopenharmony_ci{
81195972f6Sopenharmony_ci  const u16_t ip_id = 128;
82195972f6Sopenharmony_ci  LWIP_UNUSED_ARG(_i);
83195972f6Sopenharmony_ci
84195972f6Sopenharmony_ci  memset(&lwip_stats.mib2, 0, sizeof(lwip_stats.mib2));
85195972f6Sopenharmony_ci
86195972f6Sopenharmony_ci  create_ip4_input_fragment(ip_id, 8*200, 200, 1);
87195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.recv == 1);
88195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.err == 0);
89195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.memerr == 0);
90195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.drop == 0);
91195972f6Sopenharmony_ci  fail_unless(lwip_stats.mib2.ipreasmoks == 0);
92195972f6Sopenharmony_ci
93195972f6Sopenharmony_ci  create_ip4_input_fragment(ip_id, 0*200, 200, 0);
94195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.recv == 2);
95195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.err == 0);
96195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.memerr == 0);
97195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.drop == 0);
98195972f6Sopenharmony_ci  fail_unless(lwip_stats.mib2.ipreasmoks == 0);
99195972f6Sopenharmony_ci
100195972f6Sopenharmony_ci  create_ip4_input_fragment(ip_id, 1*200, 200, 0);
101195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.recv == 3);
102195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.err == 0);
103195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.memerr == 0);
104195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.drop == 0);
105195972f6Sopenharmony_ci  fail_unless(lwip_stats.mib2.ipreasmoks == 0);
106195972f6Sopenharmony_ci
107195972f6Sopenharmony_ci  create_ip4_input_fragment(ip_id, 2*200, 200, 0);
108195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.recv == 4);
109195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.err == 0);
110195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.memerr == 0);
111195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.drop == 0);
112195972f6Sopenharmony_ci  fail_unless(lwip_stats.mib2.ipreasmoks == 0);
113195972f6Sopenharmony_ci
114195972f6Sopenharmony_ci  create_ip4_input_fragment(ip_id, 3*200, 200, 0);
115195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.recv == 5);
116195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.err == 0);
117195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.memerr == 0);
118195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.drop == 0);
119195972f6Sopenharmony_ci  fail_unless(lwip_stats.mib2.ipreasmoks == 0);
120195972f6Sopenharmony_ci
121195972f6Sopenharmony_ci  create_ip4_input_fragment(ip_id, 4*200, 200, 0);
122195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.recv == 6);
123195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.err == 0);
124195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.memerr == 0);
125195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.drop == 0);
126195972f6Sopenharmony_ci  fail_unless(lwip_stats.mib2.ipreasmoks == 0);
127195972f6Sopenharmony_ci
128195972f6Sopenharmony_ci  create_ip4_input_fragment(ip_id, 7*200, 200, 0);
129195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.recv == 7);
130195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.err == 0);
131195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.memerr == 0);
132195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.drop == 0);
133195972f6Sopenharmony_ci  fail_unless(lwip_stats.mib2.ipreasmoks == 0);
134195972f6Sopenharmony_ci
135195972f6Sopenharmony_ci  create_ip4_input_fragment(ip_id, 6*200, 200, 0);
136195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.recv == 8);
137195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.err == 0);
138195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.memerr == 0);
139195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.drop == 0);
140195972f6Sopenharmony_ci  fail_unless(lwip_stats.mib2.ipreasmoks == 0);
141195972f6Sopenharmony_ci
142195972f6Sopenharmony_ci  create_ip4_input_fragment(ip_id, 5*200, 200, 0);
143195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.recv == 9);
144195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.err == 0);
145195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.memerr == 0);
146195972f6Sopenharmony_ci  fail_unless(lwip_stats.ip_frag.drop == 0);
147195972f6Sopenharmony_ci  fail_unless(lwip_stats.mib2.ipreasmoks == 1);
148195972f6Sopenharmony_ci}
149195972f6Sopenharmony_ciEND_TEST
150195972f6Sopenharmony_ci
151195972f6Sopenharmony_ci
152195972f6Sopenharmony_ci/** Create the suite including all tests for this module */
153195972f6Sopenharmony_ciSuite *
154195972f6Sopenharmony_ciip4_suite(void)
155195972f6Sopenharmony_ci{
156195972f6Sopenharmony_ci  testfunc tests[] = {
157195972f6Sopenharmony_ci    TESTFUNC(test_ip4_reass),
158195972f6Sopenharmony_ci  };
159195972f6Sopenharmony_ci  return create_suite("IPv4", tests, sizeof(tests)/sizeof(testfunc), ip4_setup, ip4_teardown);
160195972f6Sopenharmony_ci}
161