7 #if !LWIP_STATS || !TCP_STATS || !MEMP_STATS 8 #error "This tests needs TCP- and MEMP-statistics enabled" 11 #error "This tests needs TCP_QUEUE_OOSEQ enabled" 17 #define CHECK_SEGMENTS_ON_OOSEQ 1 19 #if CHECK_SEGMENTS_ON_OOSEQ 20 #define EXPECT_OOSEQ(x) EXPECT(x) 22 #define EXPECT_OOSEQ(x) 28 static int tcp_oos_count(
struct tcp_pcb* pcb)
31 struct tcp_seg* seg = pcb->ooseq;
39 #if TCP_OOSEQ_MAX_PBUFS && (TCP_OOSEQ_MAX_PBUFS < ((TCP_WND / TCP_MSS) + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) 41 static int tcp_oos_pbuf_count(
struct tcp_pcb* pcb)
44 struct tcp_seg* seg = pcb->ooseq;
60 tcp_oos_seg_seqno(
struct tcp_pcb* pcb,
int seg_index)
63 struct tcp_seg* seg = pcb->ooseq;
67 if(num == seg_index) {
68 return seg->tcphdr->seqno;
84 tcp_oos_seg_tcplen(
struct tcp_pcb* pcb,
int seg_index)
87 struct tcp_seg* seg = pcb->ooseq;
91 if(num == seg_index) {
92 return TCP_TCPLEN(seg);
107 tcp_oos_tcplen(
struct tcp_pcb* pcb)
110 struct tcp_seg* seg = pcb->ooseq;
114 len += TCP_TCPLEN(seg);
129 tcp_oos_teardown(
void)
147 struct pbuf *p_8_9, *p_4_8, *p_4_10, *p_2_14, *p_fin, *pinseq;
155 u16_t remote_port = 0x100, local_port = 0x101;
160 memset(&netif, 0,
sizeof(netif));
161 IP_ADDR4(&local_ip, 192, 168, 1, 1);
162 IP_ADDR4(&remote_ip, 192, 168, 1, 2);
163 IP_ADDR4(&netmask, 255, 255, 255, 0);
165 data_len =
sizeof(data);
167 memset(&counters, 0,
sizeof(counters));
174 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
199 if ((pinseq !=
NULL) && (p_8_9 !=
NULL) && (p_4_8 !=
NULL) && (p_4_10 !=
NULL) && (p_2_14 !=
NULL) && (p_fin !=
NULL)) {
275 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1);
277 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0);
289 struct pbuf *p_1_2, *p_4_8, *p_3_11, *p_2_12, *p_15_1, *p_15_1a, *pinseq, *pinseqFIN;
297 u16_t remote_port = 0x100, local_port = 0x101;
302 memset(&netif, 0,
sizeof(netif));
303 IP_ADDR4(&local_ip, 192, 168, 1, 1);
304 IP_ADDR4(&remote_ip, 192, 168, 1, 2);
305 IP_ADDR4(&netmask, 255, 255, 255, 0);
307 data_len =
sizeof(data);
309 memset(&counters, 0,
sizeof(counters));
316 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
350 if ((pinseq !=
NULL) && (p_1_2 !=
NULL) && (p_4_8 !=
NULL) && (p_3_11 !=
NULL) && (p_2_12 !=
NULL)
351 && (p_15_1 !=
NULL) && (p_15_1a !=
NULL) && (pinseqFIN !=
NULL)) {
451 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1);
453 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0);
457 static char data_full_wnd[
TCP_WND];
463 #if !TCP_OOSEQ_MAX_BYTES && !TCP_OOSEQ_MAX_PBUFS 467 struct pbuf *pinseq, *p_ovr;
469 u16_t remote_port = 0x100, local_port = 0x101;
474 for(i = 0; i <
sizeof(data_full_wnd); i++) {
475 data_full_wnd[i] = (char)i;
479 memset(&netif, 0,
sizeof(netif));
480 IP_ADDR4(&local_ip, 192, 168, 1, 1);
481 IP_ADDR4(&remote_ip, 192, 168, 1, 2);
482 IP_ADDR4(&netmask, 255, 255, 255, 0);
485 memset(&counters, 0,
sizeof(counters));
492 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
493 pcb->rcv_nxt = 0x8000;
500 int count, expected_datalen;
512 count = tcp_oos_count(pcb);
514 datalen = tcp_oos_tcplen(pcb);
516 expected_datalen = (k+1)*
TCP_MSS;
518 expected_datalen = TCP_WND -
TCP_MSS;
520 if (datalen != expected_datalen) {
537 datalen2 = tcp_oos_tcplen(pcb);
545 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1);
547 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0);
556 #if !TCP_OOSEQ_MAX_BYTES && !TCP_OOSEQ_MAX_PBUFS 560 struct pbuf *pinseq, *p_ovr;
562 u16_t remote_port = 0x100, local_port = 0x101;
567 for(i = 0; i < (int)
sizeof(data_full_wnd); i++) {
568 data_full_wnd[i] = (char)i;
572 memset(&netif, 0,
sizeof(netif));
573 IP_ADDR4(&local_ip, 192, 168, 1, 1);
574 IP_ADDR4(&remote_ip, 192, 168, 1, 2);
575 IP_ADDR4(&netmask, 255, 255, 255, 0);
578 memset(&counters, 0,
sizeof(counters));
585 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
586 pcb->rcv_nxt = 0xffffffff - (
TCP_WND / 2);
593 int count, expected_datalen;
605 count = tcp_oos_count(pcb);
607 datalen = tcp_oos_tcplen(pcb);
609 expected_datalen = (k+1)*
TCP_MSS;
611 expected_datalen = TCP_WND -
TCP_MSS;
613 if (datalen != expected_datalen) {
630 datalen2 = tcp_oos_tcplen(pcb);
638 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1);
640 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0);
648 #if TCP_OOSEQ_MAX_BYTES && (TCP_OOSEQ_MAX_BYTES < (TCP_WND + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) 654 u16_t remote_port = 0x100, local_port = 0x101;
659 for(i = 0; i <
sizeof(data_full_wnd); i++) {
660 data_full_wnd[i] = (char)i;
664 memset(&netif, 0,
sizeof(netif));
665 IP_ADDR4(&local_ip, 192, 168, 1, 1);
666 IP_ADDR4(&remote_ip, 192, 168, 1, 2);
667 IP_ADDR4(&netmask, 255, 255, 255, 0);
670 memset(&counters, 0,
sizeof(counters));
677 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
678 pcb->rcv_nxt = 0x8000;
697 count = tcp_oos_pbuf_count(pcb);
699 datalen = tcp_oos_tcplen(pcb);
715 datalen2 = tcp_oos_tcplen(pcb);
719 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1);
721 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0);
729 #if TCP_OOSEQ_MAX_PBUFS && (TCP_OOSEQ_MAX_PBUFS < ((TCP_WND / TCP_MSS) + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) 735 u16_t remote_port = 0x100, local_port = 0x101;
740 for(i = 0; i <
sizeof(data_full_wnd); i++) {
741 data_full_wnd[i] = (char)i;
745 memset(&netif, 0,
sizeof(netif));
746 IP_ADDR4(&local_ip, 192, 168, 1, 1);
747 IP_ADDR4(&remote_ip, 192, 168, 1, 2);
748 IP_ADDR4(&netmask, 255, 255, 255, 0);
751 memset(&counters, 0,
sizeof(counters));
758 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
759 pcb->rcv_nxt = 0x8000;
778 count = tcp_oos_pbuf_count(pcb);
780 datalen = tcp_oos_tcplen(pcb);
796 datalen2 = tcp_oos_tcplen(pcb);
800 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1);
802 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0);
810 u32_t exp_rx_bytes,
u32_t exp_err_calls,
int exp_oos_count,
int exp_oos_len)
819 oos_len = tcp_oos_tcplen(pcb);
831 static void test_tcp_recv_ooseq_double_FINs(
int delay_packet)
836 struct pbuf *p_normal_fin, *p_data_after_fin, *p, *p_2nd_fin_ooseq;
838 u16_t remote_port = 0x100, local_port = 0x101;
840 u32_t exp_rx_calls = 0, exp_rx_bytes = 0, exp_close_calls = 0, exp_oos_pbufs = 0, exp_oos_tcplen = 0;
841 int first_dropped = 0xff;
843 for(i = 0; i <
sizeof(data_full_wnd); i++) {
844 data_full_wnd[i] = (char)i;
848 memset(&netif, 0,
sizeof(netif));
849 IP_ADDR4(&local_ip, 192, 168, 1, 1);
850 IP_ADDR4(&remote_ip, 192, 168, 1, 2);
851 IP_ADDR4(&netmask, 255, 255, 255, 0);
854 memset(&counters, 0,
sizeof(counters));
861 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
862 pcb->rcv_nxt = 0x8000;
871 if(delay_packet & 1) {
881 check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen);
883 if(delay_packet & 2) {
885 if(first_dropped > 2) {
891 if (first_dropped < 2) {
901 check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen);
903 if(delay_packet & 4) {
905 if(first_dropped > 3) {
911 if (first_dropped < 3) {
913 if (delay_packet & 2) {
923 check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen);
925 if(delay_packet & 8) {
927 if(first_dropped > 4) {
933 if (first_dropped < 3) {
935 if (delay_packet & 2) {
945 check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen);
947 if(delay_packet & 1) {
952 if((delay_packet & 2) == 0) {
955 exp_oos_pbufs = exp_oos_tcplen = 0;
959 check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen);
961 if(delay_packet & 2) {
965 exp_oos_pbufs = exp_oos_tcplen = 0;
968 check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen);
970 if(delay_packet & 4) {
975 check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen);
977 if(delay_packet & 8) {
982 check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen);
988 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1);
990 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0);
995 #define FIN_TEST(name, num) \ 998 LWIP_UNUSED_ARG(_i); \ 999 test_tcp_recv_ooseq_double_FINs(num); \ 1002 FIN_TEST(test_tcp_recv_ooseq_double_FIN_0, 0)
1003 FIN_TEST(test_tcp_recv_ooseq_double_FIN_1, 1)
1004 FIN_TEST(test_tcp_recv_ooseq_double_FIN_2, 2)
1005 FIN_TEST(test_tcp_recv_ooseq_double_FIN_3, 3)
1006 FIN_TEST(test_tcp_recv_ooseq_double_FIN_4, 4)
1007 FIN_TEST(test_tcp_recv_ooseq_double_FIN_5, 5)
1008 FIN_TEST(test_tcp_recv_ooseq_double_FIN_6, 6)
1009 FIN_TEST(test_tcp_recv_ooseq_double_FIN_7, 7)
1010 FIN_TEST(test_tcp_recv_ooseq_double_FIN_8, 8)
1011 FIN_TEST(test_tcp_recv_ooseq_double_FIN_9, 9)
1012 FIN_TEST(test_tcp_recv_ooseq_double_FIN_10, 10)
1013 FIN_TEST(test_tcp_recv_ooseq_double_FIN_11, 11)
1014 FIN_TEST(test_tcp_recv_ooseq_double_FIN_12, 12)
1015 FIN_TEST(test_tcp_recv_ooseq_double_FIN_13, 13)
1016 FIN_TEST(test_tcp_recv_ooseq_double_FIN_14, 14)
1017 FIN_TEST(test_tcp_recv_ooseq_double_FIN_15, 15)
1025 TESTFUNC(test_tcp_recv_ooseq_FIN_OOSEQ),
1026 TESTFUNC(test_tcp_recv_ooseq_FIN_INSEQ),
1027 TESTFUNC(test_tcp_recv_ooseq_overrun_rxwin),
1028 TESTFUNC(test_tcp_recv_ooseq_overrun_rxwin_edge),
1029 TESTFUNC(test_tcp_recv_ooseq_max_bytes),
1030 TESTFUNC(test_tcp_recv_ooseq_max_pbufs),
1031 TESTFUNC(test_tcp_recv_ooseq_double_FIN_0),
1032 TESTFUNC(test_tcp_recv_ooseq_double_FIN_1),
1033 TESTFUNC(test_tcp_recv_ooseq_double_FIN_2),
1034 TESTFUNC(test_tcp_recv_ooseq_double_FIN_3),
1035 TESTFUNC(test_tcp_recv_ooseq_double_FIN_4),
1036 TESTFUNC(test_tcp_recv_ooseq_double_FIN_5),
1037 TESTFUNC(test_tcp_recv_ooseq_double_FIN_6),
1038 TESTFUNC(test_tcp_recv_ooseq_double_FIN_7),
1039 TESTFUNC(test_tcp_recv_ooseq_double_FIN_8),
1040 TESTFUNC(test_tcp_recv_ooseq_double_FIN_9),
1041 TESTFUNC(test_tcp_recv_ooseq_double_FIN_10),
1042 TESTFUNC(test_tcp_recv_ooseq_double_FIN_11),
1043 TESTFUNC(test_tcp_recv_ooseq_double_FIN_12),
1044 TESTFUNC(test_tcp_recv_ooseq_double_FIN_13),
1045 TESTFUNC(test_tcp_recv_ooseq_double_FIN_14),
1046 TESTFUNC(test_tcp_recv_ooseq_double_FIN_15)
1048 return create_suite(
"TCP_OOS", tests,
sizeof(tests)/
sizeof(
testfunc), tcp_oos_setup, tcp_oos_teardown);
struct tcp_pcb * test_tcp_new_counters_pcb(struct test_tcp_counters *counters)
struct netif * netif_list
void test_tcp_init_netif(struct netif *netif, struct test_tcp_txcounters *txcounters, ip_addr_t *ip_addr, ip_addr_t *netmask)
Suite * tcp_oos_suite(void)
struct netif * netif_default
#define TCP_OOSEQ_MAX_BYTES
#define FIN_TEST(name, num)
#define TCP_OOSEQ_MAX_PBUFS
void tcp_remove_all(void)
void tcp_set_state(struct tcp_pcb *pcb, enum tcp_state state, ip_addr_t *local_ip, ip_addr_t *remote_ip, u16_t local_port, u16_t remote_port)
Suite * create_suite(const char *name, testfunc *tests, size_t num_tests, SFun setup, SFun teardown)
void test_tcp_input(struct pbuf *p, struct netif *inp)
struct pbuf * tcp_create_rx_segment(struct tcp_pcb *pcb, void *data, size_t data_len, u32_t seqno_offset, u32_t ackno_offset, u8_t headerflags)
u8_t pbuf_clen(struct pbuf *p)
START_TEST(test_tcp_recv_ooseq_FIN_OOSEQ)
#define LWIP_UNUSED_ARG(x)