test_ip4.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #include "test_ip4.h"
  2. #include "lwip/ip4.h"
  3. #include "lwip/inet_chksum.h"
  4. #include "lwip/stats.h"
  5. #include "lwip/prot/ip.h"
  6. #include "lwip/prot/ip4.h"
  7. #include "lwip/tcpip.h"
  8. #if !LWIP_IPV4 || !IP_REASSEMBLY || !MIB2_STATS || !IPFRAG_STATS
  9. #error "This tests needs LWIP_IPV4, IP_REASSEMBLY; MIB2- and IPFRAG-statistics enabled"
  10. #endif
  11. /* Helper functions */
  12. static void
  13. create_ip4_input_fragment(u16_t ip_id, u16_t start, u16_t len, int last)
  14. {
  15. struct pbuf *p;
  16. struct netif *input_netif = netif_list; /* just use any netif */
  17. fail_unless((start & 7) == 0);
  18. fail_unless(((len & 7) == 0) || last);
  19. fail_unless(input_netif != NULL);
  20. p = pbuf_alloc(PBUF_RAW, len + sizeof(struct ip_hdr), PBUF_RAM);
  21. fail_unless(p != NULL);
  22. if (p != NULL) {
  23. err_t err;
  24. struct ip_hdr *iphdr = (struct ip_hdr *)p->payload;
  25. IPH_VHL_SET(iphdr, 4, sizeof(struct ip_hdr) / 4);
  26. IPH_TOS_SET(iphdr, 0);
  27. IPH_LEN_SET(iphdr, lwip_htons(p->tot_len));
  28. IPH_ID_SET(iphdr, lwip_htons(ip_id));
  29. if (last) {
  30. IPH_OFFSET_SET(iphdr, lwip_htons(start / 8));
  31. } else {
  32. IPH_OFFSET_SET(iphdr, lwip_htons((start / 8) | IP_MF));
  33. }
  34. IPH_TTL_SET(iphdr, 5);
  35. IPH_PROTO_SET(iphdr, IP_PROTO_UDP);
  36. IPH_CHKSUM_SET(iphdr, 0);
  37. ip4_addr_copy(iphdr->src, *netif_ip4_addr(input_netif));
  38. iphdr->src.addr = lwip_htonl(lwip_htonl(iphdr->src.addr) + 1);
  39. ip4_addr_copy(iphdr->dest, *netif_ip4_addr(input_netif));
  40. IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, sizeof(struct ip_hdr)));
  41. err = ip4_input(p, input_netif);
  42. if (err != ERR_OK) {
  43. pbuf_free(p);
  44. }
  45. fail_unless(err == ERR_OK);
  46. }
  47. }
  48. /* Setups/teardown functions */
  49. static void
  50. ip4_setup(void)
  51. {
  52. lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
  53. }
  54. static void
  55. ip4_teardown(void)
  56. {
  57. if (netif_list->loop_first != NULL) {
  58. pbuf_free(netif_list->loop_first);
  59. netif_list->loop_first = NULL;
  60. }
  61. netif_list->loop_last = NULL;
  62. /* poll until all memory is released... */
  63. tcpip_thread_poll_one();
  64. lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
  65. }
  66. /* Test functions */
  67. START_TEST(test_ip4_reass)
  68. {
  69. const u16_t ip_id = 128;
  70. LWIP_UNUSED_ARG(_i);
  71. memset(&lwip_stats.mib2, 0, sizeof(lwip_stats.mib2));
  72. create_ip4_input_fragment(ip_id, 8*200, 200, 1);
  73. fail_unless(lwip_stats.ip_frag.recv == 1);
  74. fail_unless(lwip_stats.ip_frag.err == 0);
  75. fail_unless(lwip_stats.ip_frag.memerr == 0);
  76. fail_unless(lwip_stats.ip_frag.drop == 0);
  77. fail_unless(lwip_stats.mib2.ipreasmoks == 0);
  78. create_ip4_input_fragment(ip_id, 0*200, 200, 0);
  79. fail_unless(lwip_stats.ip_frag.recv == 2);
  80. fail_unless(lwip_stats.ip_frag.err == 0);
  81. fail_unless(lwip_stats.ip_frag.memerr == 0);
  82. fail_unless(lwip_stats.ip_frag.drop == 0);
  83. fail_unless(lwip_stats.mib2.ipreasmoks == 0);
  84. create_ip4_input_fragment(ip_id, 1*200, 200, 0);
  85. fail_unless(lwip_stats.ip_frag.recv == 3);
  86. fail_unless(lwip_stats.ip_frag.err == 0);
  87. fail_unless(lwip_stats.ip_frag.memerr == 0);
  88. fail_unless(lwip_stats.ip_frag.drop == 0);
  89. fail_unless(lwip_stats.mib2.ipreasmoks == 0);
  90. create_ip4_input_fragment(ip_id, 2*200, 200, 0);
  91. fail_unless(lwip_stats.ip_frag.recv == 4);
  92. fail_unless(lwip_stats.ip_frag.err == 0);
  93. fail_unless(lwip_stats.ip_frag.memerr == 0);
  94. fail_unless(lwip_stats.ip_frag.drop == 0);
  95. fail_unless(lwip_stats.mib2.ipreasmoks == 0);
  96. create_ip4_input_fragment(ip_id, 3*200, 200, 0);
  97. fail_unless(lwip_stats.ip_frag.recv == 5);
  98. fail_unless(lwip_stats.ip_frag.err == 0);
  99. fail_unless(lwip_stats.ip_frag.memerr == 0);
  100. fail_unless(lwip_stats.ip_frag.drop == 0);
  101. fail_unless(lwip_stats.mib2.ipreasmoks == 0);
  102. create_ip4_input_fragment(ip_id, 4*200, 200, 0);
  103. fail_unless(lwip_stats.ip_frag.recv == 6);
  104. fail_unless(lwip_stats.ip_frag.err == 0);
  105. fail_unless(lwip_stats.ip_frag.memerr == 0);
  106. fail_unless(lwip_stats.ip_frag.drop == 0);
  107. fail_unless(lwip_stats.mib2.ipreasmoks == 0);
  108. create_ip4_input_fragment(ip_id, 7*200, 200, 0);
  109. fail_unless(lwip_stats.ip_frag.recv == 7);
  110. fail_unless(lwip_stats.ip_frag.err == 0);
  111. fail_unless(lwip_stats.ip_frag.memerr == 0);
  112. fail_unless(lwip_stats.ip_frag.drop == 0);
  113. fail_unless(lwip_stats.mib2.ipreasmoks == 0);
  114. create_ip4_input_fragment(ip_id, 6*200, 200, 0);
  115. fail_unless(lwip_stats.ip_frag.recv == 8);
  116. fail_unless(lwip_stats.ip_frag.err == 0);
  117. fail_unless(lwip_stats.ip_frag.memerr == 0);
  118. fail_unless(lwip_stats.ip_frag.drop == 0);
  119. fail_unless(lwip_stats.mib2.ipreasmoks == 0);
  120. create_ip4_input_fragment(ip_id, 5*200, 200, 0);
  121. fail_unless(lwip_stats.ip_frag.recv == 9);
  122. fail_unless(lwip_stats.ip_frag.err == 0);
  123. fail_unless(lwip_stats.ip_frag.memerr == 0);
  124. fail_unless(lwip_stats.ip_frag.drop == 0);
  125. fail_unless(lwip_stats.mib2.ipreasmoks == 1);
  126. }
  127. END_TEST
  128. /** Create the suite including all tests for this module */
  129. Suite *
  130. ip4_suite(void)
  131. {
  132. testfunc tests[] = {
  133. TESTFUNC(test_ip4_reass),
  134. };
  135. return create_suite("IPv4", tests, sizeof(tests)/sizeof(testfunc), ip4_setup, ip4_teardown);
  136. }