test_ip4.c 4.7 KB

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