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