Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-os by
test_tcp_oos.c
00001 #include "test_tcp_oos.h" 00002 00003 #include "lwip/priv/tcp_priv.h" 00004 #include "lwip/stats.h" 00005 #include "tcp_helper.h" 00006 00007 #if !LWIP_STATS || !TCP_STATS || !MEMP_STATS 00008 #error "This tests needs TCP- and MEMP-statistics enabled" 00009 #endif 00010 #if !TCP_QUEUE_OOSEQ 00011 #error "This tests needs TCP_QUEUE_OOSEQ enabled" 00012 #endif 00013 00014 /** CHECK_SEGMENTS_ON_OOSEQ: 00015 * 1: check count, seqno and len of segments on pcb->ooseq (strict) 00016 * 0: only check that bytes are received in correct order (less strict) */ 00017 #define CHECK_SEGMENTS_ON_OOSEQ 1 00018 00019 #if CHECK_SEGMENTS_ON_OOSEQ 00020 #define EXPECT_OOSEQ(x) EXPECT(x) 00021 #else 00022 #define EXPECT_OOSEQ(x) 00023 #endif 00024 00025 /* helper functions */ 00026 00027 /** Get the numbers of segments on the ooseq list */ 00028 static int tcp_oos_count(struct tcp_pcb* pcb) 00029 { 00030 int num = 0; 00031 struct tcp_seg* seg = pcb->ooseq; 00032 while(seg != NULL) { 00033 num++; 00034 seg = seg->next; 00035 } 00036 return num; 00037 } 00038 00039 #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)) 00040 /** Get the numbers of pbufs on the ooseq list */ 00041 static int tcp_oos_pbuf_count(struct tcp_pcb* pcb) 00042 { 00043 int num = 0; 00044 struct tcp_seg* seg = pcb->ooseq; 00045 while(seg != NULL) { 00046 num += pbuf_clen(seg->p); 00047 seg = seg->next; 00048 } 00049 return num; 00050 } 00051 #endif 00052 00053 /** Get the seqno of a segment (by index) on the ooseq list 00054 * 00055 * @param pcb the pcb to check for ooseq segments 00056 * @param seg_index index of the segment on the ooseq list 00057 * @return seqno of the segment 00058 */ 00059 static u32_t 00060 tcp_oos_seg_seqno(struct tcp_pcb* pcb, int seg_index) 00061 { 00062 int num = 0; 00063 struct tcp_seg* seg = pcb->ooseq; 00064 00065 /* then check the actual segment */ 00066 while(seg != NULL) { 00067 if(num == seg_index) { 00068 return seg->tcphdr->seqno; 00069 } 00070 num++; 00071 seg = seg->next; 00072 } 00073 fail(); 00074 return 0; 00075 } 00076 00077 /** Get the tcplen (datalen + SYN/FIN) of a segment (by index) on the ooseq list 00078 * 00079 * @param pcb the pcb to check for ooseq segments 00080 * @param seg_index index of the segment on the ooseq list 00081 * @return tcplen of the segment 00082 */ 00083 static int 00084 tcp_oos_seg_tcplen(struct tcp_pcb* pcb, int seg_index) 00085 { 00086 int num = 0; 00087 struct tcp_seg* seg = pcb->ooseq; 00088 00089 /* then check the actual segment */ 00090 while(seg != NULL) { 00091 if(num == seg_index) { 00092 return TCP_TCPLEN(seg); 00093 } 00094 num++; 00095 seg = seg->next; 00096 } 00097 fail(); 00098 return -1; 00099 } 00100 00101 /** Get the tcplen (datalen + SYN/FIN) of all segments on the ooseq list 00102 * 00103 * @param pcb the pcb to check for ooseq segments 00104 * @return tcplen of all segment 00105 */ 00106 static int 00107 tcp_oos_tcplen(struct tcp_pcb* pcb) 00108 { 00109 int len = 0; 00110 struct tcp_seg* seg = pcb->ooseq; 00111 00112 /* then check the actual segment */ 00113 while(seg != NULL) { 00114 len += TCP_TCPLEN(seg); 00115 seg = seg->next; 00116 } 00117 return len; 00118 } 00119 00120 /* Setup/teardown functions */ 00121 00122 static void 00123 tcp_oos_setup(void) 00124 { 00125 tcp_remove_all(); 00126 } 00127 00128 static void 00129 tcp_oos_teardown(void) 00130 { 00131 tcp_remove_all(); 00132 netif_list = NULL; 00133 netif_default = NULL; 00134 } 00135 00136 00137 00138 /* Test functions */ 00139 00140 /** create multiple segments and pass them to tcp_input in a wrong 00141 * order to see if ooseq-caching works correctly 00142 * FIN is received in out-of-sequence segments only */ 00143 START_TEST(test_tcp_recv_ooseq_FIN_OOSEQ) 00144 { 00145 struct test_tcp_counters counters; 00146 struct tcp_pcb* pcb; 00147 struct pbuf *p_8_9, *p_4_8, *p_4_10, *p_2_14, *p_fin, *pinseq; 00148 char data[] = { 00149 1, 2, 3, 4, 00150 5, 6, 7, 8, 00151 9, 10, 11, 12, 00152 13, 14, 15, 16}; 00153 ip_addr_t remote_ip, local_ip, netmask; 00154 u16_t data_len; 00155 u16_t remote_port = 0x100, local_port = 0x101; 00156 struct netif netif; 00157 LWIP_UNUSED_ARG(_i); 00158 00159 /* initialize local vars */ 00160 memset(&netif, 0, sizeof(netif)); 00161 IP_ADDR4(&local_ip, 192, 168, 1, 1); 00162 IP_ADDR4(&remote_ip, 192, 168, 1, 2); 00163 IP_ADDR4(&netmask, 255, 255, 255, 0); 00164 test_tcp_init_netif(&netif, NULL, &local_ip, &netmask); 00165 data_len = sizeof(data); 00166 /* initialize counter struct */ 00167 memset(&counters, 0, sizeof(counters)); 00168 counters.expected_data_len = data_len; 00169 counters.expected_data = data; 00170 00171 /* create and initialize the pcb */ 00172 pcb = test_tcp_new_counters_pcb(&counters); 00173 EXPECT_RET(pcb != NULL); 00174 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); 00175 00176 /* create segments */ 00177 /* pinseq is sent as last segment! */ 00178 pinseq = tcp_create_rx_segment(pcb, &data[0], 4, 0, 0, TCP_ACK); 00179 /* p1: 8 bytes before FIN */ 00180 /* seqno: 8..16 */ 00181 p_8_9 = tcp_create_rx_segment(pcb, &data[8], 8, 8, 0, TCP_ACK|TCP_FIN); 00182 /* p2: 4 bytes before p1, including the first 4 bytes of p1 (partly duplicate) */ 00183 /* seqno: 4..11 */ 00184 p_4_8 = tcp_create_rx_segment(pcb, &data[4], 8, 4, 0, TCP_ACK); 00185 /* p3: same as p2 but 2 bytes longer */ 00186 /* seqno: 4..13 */ 00187 p_4_10 = tcp_create_rx_segment(pcb, &data[4], 10, 4, 0, TCP_ACK); 00188 /* p4: 14 bytes before FIN, includes data from p1 and p2, plus partly from pinseq */ 00189 /* seqno: 2..15 */ 00190 p_2_14 = tcp_create_rx_segment(pcb, &data[2], 14, 2, 0, TCP_ACK); 00191 /* FIN, seqno 16 */ 00192 p_fin = tcp_create_rx_segment(pcb, NULL, 0,16, 0, TCP_ACK|TCP_FIN); 00193 EXPECT(pinseq != NULL); 00194 EXPECT(p_8_9 != NULL); 00195 EXPECT(p_4_8 != NULL); 00196 EXPECT(p_4_10 != NULL); 00197 EXPECT(p_2_14 != NULL); 00198 EXPECT(p_fin != NULL); 00199 if ((pinseq != NULL) && (p_8_9 != NULL) && (p_4_8 != NULL) && (p_4_10 != NULL) && (p_2_14 != NULL) && (p_fin != NULL)) { 00200 /* pass the segment to tcp_input */ 00201 test_tcp_input(p_8_9, &netif); 00202 /* check if counters are as expected */ 00203 EXPECT(counters.close_calls == 0); 00204 EXPECT(counters.recv_calls == 0); 00205 EXPECT(counters.recved_bytes == 0); 00206 EXPECT(counters.err_calls == 0); 00207 /* check ooseq queue */ 00208 EXPECT_OOSEQ(tcp_oos_count(pcb) == 1); 00209 EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 8); 00210 EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 9); /* includes FIN */ 00211 00212 /* pass the segment to tcp_input */ 00213 test_tcp_input(p_4_8, &netif); 00214 /* check if counters are as expected */ 00215 EXPECT(counters.close_calls == 0); 00216 EXPECT(counters.recv_calls == 0); 00217 EXPECT(counters.recved_bytes == 0); 00218 EXPECT(counters.err_calls == 0); 00219 /* check ooseq queue */ 00220 EXPECT_OOSEQ(tcp_oos_count(pcb) == 2); 00221 EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 4); 00222 EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 4); 00223 EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 8); 00224 EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 9); /* includes FIN */ 00225 00226 /* pass the segment to tcp_input */ 00227 test_tcp_input(p_4_10, &netif); 00228 /* check if counters are as expected */ 00229 EXPECT(counters.close_calls == 0); 00230 EXPECT(counters.recv_calls == 0); 00231 EXPECT(counters.recved_bytes == 0); 00232 EXPECT(counters.err_calls == 0); 00233 /* ooseq queue: unchanged */ 00234 EXPECT_OOSEQ(tcp_oos_count(pcb) == 2); 00235 EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 4); 00236 EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 4); 00237 EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 8); 00238 EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 9); /* includes FIN */ 00239 00240 /* pass the segment to tcp_input */ 00241 test_tcp_input(p_2_14, &netif); 00242 /* check if counters are as expected */ 00243 EXPECT(counters.close_calls == 0); 00244 EXPECT(counters.recv_calls == 0); 00245 EXPECT(counters.recved_bytes == 0); 00246 EXPECT(counters.err_calls == 0); 00247 /* check ooseq queue */ 00248 EXPECT_OOSEQ(tcp_oos_count(pcb) == 1); 00249 EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 2); 00250 EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 15); /* includes FIN */ 00251 00252 /* pass the segment to tcp_input */ 00253 test_tcp_input(p_fin, &netif); 00254 /* check if counters are as expected */ 00255 EXPECT(counters.close_calls == 0); 00256 EXPECT(counters.recv_calls == 0); 00257 EXPECT(counters.recved_bytes == 0); 00258 EXPECT(counters.err_calls == 0); 00259 /* ooseq queue: unchanged */ 00260 EXPECT_OOSEQ(tcp_oos_count(pcb) == 1); 00261 EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 2); 00262 EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 15); /* includes FIN */ 00263 00264 /* pass the segment to tcp_input */ 00265 test_tcp_input(pinseq, &netif); 00266 /* check if counters are as expected */ 00267 EXPECT(counters.close_calls == 1); 00268 EXPECT(counters.recv_calls == 1); 00269 EXPECT(counters.recved_bytes == data_len); 00270 EXPECT(counters.err_calls == 0); 00271 EXPECT(pcb->ooseq == NULL); 00272 } 00273 00274 /* make sure the pcb is freed */ 00275 EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1); 00276 tcp_abort(pcb); 00277 EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0); 00278 } 00279 END_TEST 00280 00281 00282 /** create multiple segments and pass them to tcp_input in a wrong 00283 * order to see if ooseq-caching works correctly 00284 * FIN is received IN-SEQUENCE at the end */ 00285 START_TEST(test_tcp_recv_ooseq_FIN_INSEQ) 00286 { 00287 struct test_tcp_counters counters; 00288 struct tcp_pcb* pcb; 00289 struct pbuf *p_1_2, *p_4_8, *p_3_11, *p_2_12, *p_15_1, *p_15_1a, *pinseq, *pinseqFIN; 00290 char data[] = { 00291 1, 2, 3, 4, 00292 5, 6, 7, 8, 00293 9, 10, 11, 12, 00294 13, 14, 15, 16}; 00295 ip_addr_t remote_ip, local_ip, netmask; 00296 u16_t data_len; 00297 u16_t remote_port = 0x100, local_port = 0x101; 00298 struct netif netif; 00299 LWIP_UNUSED_ARG(_i); 00300 00301 /* initialize local vars */ 00302 memset(&netif, 0, sizeof(netif)); 00303 IP_ADDR4(&local_ip, 192, 168, 1, 1); 00304 IP_ADDR4(&remote_ip, 192, 168, 1, 2); 00305 IP_ADDR4(&netmask, 255, 255, 255, 0); 00306 test_tcp_init_netif(&netif, NULL, &local_ip, &netmask); 00307 data_len = sizeof(data); 00308 /* initialize counter struct */ 00309 memset(&counters, 0, sizeof(counters)); 00310 counters.expected_data_len = data_len; 00311 counters.expected_data = data; 00312 00313 /* create and initialize the pcb */ 00314 pcb = test_tcp_new_counters_pcb(&counters); 00315 EXPECT_RET(pcb != NULL); 00316 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); 00317 00318 /* create segments */ 00319 /* p1: 7 bytes - 2 before FIN */ 00320 /* seqno: 1..2 */ 00321 p_1_2 = tcp_create_rx_segment(pcb, &data[1], 2, 1, 0, TCP_ACK); 00322 /* p2: 4 bytes before p1, including the first 4 bytes of p1 (partly duplicate) */ 00323 /* seqno: 4..11 */ 00324 p_4_8 = tcp_create_rx_segment(pcb, &data[4], 8, 4, 0, TCP_ACK); 00325 /* p3: same as p2 but 2 bytes longer and one byte more at the front */ 00326 /* seqno: 3..13 */ 00327 p_3_11 = tcp_create_rx_segment(pcb, &data[3], 11, 3, 0, TCP_ACK); 00328 /* p4: 13 bytes - 2 before FIN - should be ignored as contained in p1 and p3 */ 00329 /* seqno: 2..13 */ 00330 p_2_12 = tcp_create_rx_segment(pcb, &data[2], 12, 2, 0, TCP_ACK); 00331 /* pinseq is the first segment that is held back to create ooseq! */ 00332 /* seqno: 0..3 */ 00333 pinseq = tcp_create_rx_segment(pcb, &data[0], 4, 0, 0, TCP_ACK); 00334 /* p5: last byte before FIN */ 00335 /* seqno: 15 */ 00336 p_15_1 = tcp_create_rx_segment(pcb, &data[15], 1, 15, 0, TCP_ACK); 00337 /* p6: same as p5, should be ignored */ 00338 p_15_1a= tcp_create_rx_segment(pcb, &data[15], 1, 15, 0, TCP_ACK); 00339 /* pinseqFIN: last 2 bytes plus FIN */ 00340 /* only segment containing seqno 14 and FIN */ 00341 pinseqFIN = tcp_create_rx_segment(pcb, &data[14], 2, 14, 0, TCP_ACK|TCP_FIN); 00342 EXPECT(pinseq != NULL); 00343 EXPECT(p_1_2 != NULL); 00344 EXPECT(p_4_8 != NULL); 00345 EXPECT(p_3_11 != NULL); 00346 EXPECT(p_2_12 != NULL); 00347 EXPECT(p_15_1 != NULL); 00348 EXPECT(p_15_1a != NULL); 00349 EXPECT(pinseqFIN != NULL); 00350 if ((pinseq != NULL) && (p_1_2 != NULL) && (p_4_8 != NULL) && (p_3_11 != NULL) && (p_2_12 != NULL) 00351 && (p_15_1 != NULL) && (p_15_1a != NULL) && (pinseqFIN != NULL)) { 00352 /* pass the segment to tcp_input */ 00353 test_tcp_input(p_1_2, &netif); 00354 /* check if counters are as expected */ 00355 EXPECT(counters.close_calls == 0); 00356 EXPECT(counters.recv_calls == 0); 00357 EXPECT(counters.recved_bytes == 0); 00358 EXPECT(counters.err_calls == 0); 00359 /* check ooseq queue */ 00360 EXPECT_OOSEQ(tcp_oos_count(pcb) == 1); 00361 EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 1); 00362 EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 2); 00363 00364 /* pass the segment to tcp_input */ 00365 test_tcp_input(p_4_8, &netif); 00366 /* check if counters are as expected */ 00367 EXPECT(counters.close_calls == 0); 00368 EXPECT(counters.recv_calls == 0); 00369 EXPECT(counters.recved_bytes == 0); 00370 EXPECT(counters.err_calls == 0); 00371 /* check ooseq queue */ 00372 EXPECT_OOSEQ(tcp_oos_count(pcb) == 2); 00373 EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 1); 00374 EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 2); 00375 EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 4); 00376 EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 8); 00377 00378 /* pass the segment to tcp_input */ 00379 test_tcp_input(p_3_11, &netif); 00380 /* check if counters are as expected */ 00381 EXPECT(counters.close_calls == 0); 00382 EXPECT(counters.recv_calls == 0); 00383 EXPECT(counters.recved_bytes == 0); 00384 EXPECT(counters.err_calls == 0); 00385 /* check ooseq queue */ 00386 EXPECT_OOSEQ(tcp_oos_count(pcb) == 2); 00387 EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 1); 00388 EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 2); 00389 /* p_3_11 has removed p_4_8 from ooseq */ 00390 EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 3); 00391 EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 11); 00392 00393 /* pass the segment to tcp_input */ 00394 test_tcp_input(p_2_12, &netif); 00395 /* check if counters are as expected */ 00396 EXPECT(counters.close_calls == 0); 00397 EXPECT(counters.recv_calls == 0); 00398 EXPECT(counters.recved_bytes == 0); 00399 EXPECT(counters.err_calls == 0); 00400 /* check ooseq queue */ 00401 EXPECT_OOSEQ(tcp_oos_count(pcb) == 2); 00402 EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 1); 00403 EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 1); 00404 EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 2); 00405 EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 12); 00406 00407 /* pass the segment to tcp_input */ 00408 test_tcp_input(pinseq, &netif); 00409 /* check if counters are as expected */ 00410 EXPECT(counters.close_calls == 0); 00411 EXPECT(counters.recv_calls == 1); 00412 EXPECT(counters.recved_bytes == 14); 00413 EXPECT(counters.err_calls == 0); 00414 EXPECT(pcb->ooseq == NULL); 00415 00416 /* pass the segment to tcp_input */ 00417 test_tcp_input(p_15_1, &netif); 00418 /* check if counters are as expected */ 00419 EXPECT(counters.close_calls == 0); 00420 EXPECT(counters.recv_calls == 1); 00421 EXPECT(counters.recved_bytes == 14); 00422 EXPECT(counters.err_calls == 0); 00423 /* check ooseq queue */ 00424 EXPECT_OOSEQ(tcp_oos_count(pcb) == 1); 00425 EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 15); 00426 EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 1); 00427 00428 /* pass the segment to tcp_input */ 00429 test_tcp_input(p_15_1a, &netif); 00430 /* check if counters are as expected */ 00431 EXPECT(counters.close_calls == 0); 00432 EXPECT(counters.recv_calls == 1); 00433 EXPECT(counters.recved_bytes == 14); 00434 EXPECT(counters.err_calls == 0); 00435 /* check ooseq queue: unchanged */ 00436 EXPECT_OOSEQ(tcp_oos_count(pcb) == 1); 00437 EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 15); 00438 EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 1); 00439 00440 /* pass the segment to tcp_input */ 00441 test_tcp_input(pinseqFIN, &netif); 00442 /* check if counters are as expected */ 00443 EXPECT(counters.close_calls == 1); 00444 EXPECT(counters.recv_calls == 2); 00445 EXPECT(counters.recved_bytes == data_len); 00446 EXPECT(counters.err_calls == 0); 00447 EXPECT(pcb->ooseq == NULL); 00448 } 00449 00450 /* make sure the pcb is freed */ 00451 EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1); 00452 tcp_abort(pcb); 00453 EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0); 00454 } 00455 END_TEST 00456 00457 static char data_full_wnd[TCP_WND]; 00458 00459 /** create multiple segments and pass them to tcp_input with the first segment missing 00460 * to simulate overruning the rxwin with ooseq queueing enabled */ 00461 START_TEST(test_tcp_recv_ooseq_overrun_rxwin) 00462 { 00463 #if !TCP_OOSEQ_MAX_BYTES && !TCP_OOSEQ_MAX_PBUFS 00464 int i, k; 00465 struct test_tcp_counters counters; 00466 struct tcp_pcb* pcb; 00467 struct pbuf *pinseq, *p_ovr; 00468 ip_addr_t remote_ip, local_ip, netmask; 00469 u16_t remote_port = 0x100, local_port = 0x101; 00470 struct netif netif; 00471 int datalen = 0; 00472 int datalen2; 00473 00474 for(i = 0; i < (int)sizeof(data_full_wnd); i++) { 00475 data_full_wnd[i] = (char)i; 00476 } 00477 00478 /* initialize local vars */ 00479 memset(&netif, 0, sizeof(netif)); 00480 IP_ADDR4(&local_ip, 192, 168, 1, 1); 00481 IP_ADDR4(&remote_ip, 192, 168, 1, 2); 00482 IP_ADDR4(&netmask, 255, 255, 255, 0); 00483 test_tcp_init_netif(&netif, NULL, &local_ip, &netmask); 00484 /* initialize counter struct */ 00485 memset(&counters, 0, sizeof(counters)); 00486 counters.expected_data_len = TCP_WND; 00487 counters.expected_data = data_full_wnd; 00488 00489 /* create and initialize the pcb */ 00490 pcb = test_tcp_new_counters_pcb(&counters); 00491 EXPECT_RET(pcb != NULL); 00492 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); 00493 pcb->rcv_nxt = 0x8000; 00494 00495 /* create segments */ 00496 /* pinseq is sent as last segment! */ 00497 pinseq = tcp_create_rx_segment(pcb, &data_full_wnd[0], TCP_MSS, 0, 0, TCP_ACK); 00498 00499 for(i = TCP_MSS, k = 0; i < TCP_WND; i += TCP_MSS, k++) { 00500 int count, expected_datalen; 00501 struct pbuf *p = tcp_create_rx_segment(pcb, &data_full_wnd[TCP_MSS*(k+1)], 00502 TCP_MSS, TCP_MSS*(k+1), 0, TCP_ACK); 00503 EXPECT_RET(p != NULL); 00504 /* pass the segment to tcp_input */ 00505 test_tcp_input(p, &netif); 00506 /* check if counters are as expected */ 00507 EXPECT(counters.close_calls == 0); 00508 EXPECT(counters.recv_calls == 0); 00509 EXPECT(counters.recved_bytes == 0); 00510 EXPECT(counters.err_calls == 0); 00511 /* check ooseq queue */ 00512 count = tcp_oos_count(pcb); 00513 EXPECT_OOSEQ(count == k+1); 00514 datalen = tcp_oos_tcplen(pcb); 00515 if (i + TCP_MSS < TCP_WND) { 00516 expected_datalen = (k+1)*TCP_MSS; 00517 } else { 00518 expected_datalen = TCP_WND - TCP_MSS; 00519 } 00520 if (datalen != expected_datalen) { 00521 EXPECT_OOSEQ(datalen == expected_datalen); 00522 } 00523 } 00524 00525 /* pass in one more segment, cleary overrunning the rxwin */ 00526 p_ovr = tcp_create_rx_segment(pcb, &data_full_wnd[TCP_MSS*(k+1)], TCP_MSS, TCP_MSS*(k+1), 0, TCP_ACK); 00527 EXPECT_RET(p_ovr != NULL); 00528 /* pass the segment to tcp_input */ 00529 test_tcp_input(p_ovr, &netif); 00530 /* check if counters are as expected */ 00531 EXPECT(counters.close_calls == 0); 00532 EXPECT(counters.recv_calls == 0); 00533 EXPECT(counters.recved_bytes == 0); 00534 EXPECT(counters.err_calls == 0); 00535 /* check ooseq queue */ 00536 EXPECT_OOSEQ(tcp_oos_count(pcb) == k); 00537 datalen2 = tcp_oos_tcplen(pcb); 00538 EXPECT_OOSEQ(datalen == datalen2); 00539 00540 /* now pass inseq */ 00541 test_tcp_input(pinseq, &netif); 00542 EXPECT(pcb->ooseq == NULL); 00543 00544 /* make sure the pcb is freed */ 00545 EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1); 00546 tcp_abort(pcb); 00547 EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0); 00548 #endif /* !TCP_OOSEQ_MAX_BYTES && !TCP_OOSEQ_MAX_PBUFS */ 00549 LWIP_UNUSED_ARG(_i); 00550 } 00551 END_TEST 00552 00553 /** similar to above test, except seqno starts near the max rxwin */ 00554 START_TEST(test_tcp_recv_ooseq_overrun_rxwin_edge) 00555 { 00556 #if !TCP_OOSEQ_MAX_BYTES && !TCP_OOSEQ_MAX_PBUFS 00557 int i, k; 00558 struct test_tcp_counters counters; 00559 struct tcp_pcb* pcb; 00560 struct pbuf *pinseq, *p_ovr; 00561 ip_addr_t remote_ip, local_ip, netmask; 00562 u16_t remote_port = 0x100, local_port = 0x101; 00563 struct netif netif; 00564 int datalen = 0; 00565 int datalen2; 00566 00567 for(i = 0; i < (int)sizeof(data_full_wnd); i++) { 00568 data_full_wnd[i] = (char)i; 00569 } 00570 00571 /* initialize local vars */ 00572 memset(&netif, 0, sizeof(netif)); 00573 IP_ADDR4(&local_ip, 192, 168, 1, 1); 00574 IP_ADDR4(&remote_ip, 192, 168, 1, 2); 00575 IP_ADDR4(&netmask, 255, 255, 255, 0); 00576 test_tcp_init_netif(&netif, NULL, &local_ip, &netmask); 00577 /* initialize counter struct */ 00578 memset(&counters, 0, sizeof(counters)); 00579 counters.expected_data_len = TCP_WND; 00580 counters.expected_data = data_full_wnd; 00581 00582 /* create and initialize the pcb */ 00583 pcb = test_tcp_new_counters_pcb(&counters); 00584 EXPECT_RET(pcb != NULL); 00585 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); 00586 pcb->rcv_nxt = 0xffffffff - (TCP_WND / 2); 00587 00588 /* create segments */ 00589 /* pinseq is sent as last segment! */ 00590 pinseq = tcp_create_rx_segment(pcb, &data_full_wnd[0], TCP_MSS, 0, 0, TCP_ACK); 00591 00592 for(i = TCP_MSS, k = 0; i < TCP_WND; i += TCP_MSS, k++) { 00593 int count, expected_datalen; 00594 struct pbuf *p = tcp_create_rx_segment(pcb, &data_full_wnd[TCP_MSS*(k+1)], 00595 TCP_MSS, TCP_MSS*(k+1), 0, TCP_ACK); 00596 EXPECT_RET(p != NULL); 00597 /* pass the segment to tcp_input */ 00598 test_tcp_input(p, &netif); 00599 /* check if counters are as expected */ 00600 EXPECT(counters.close_calls == 0); 00601 EXPECT(counters.recv_calls == 0); 00602 EXPECT(counters.recved_bytes == 0); 00603 EXPECT(counters.err_calls == 0); 00604 /* check ooseq queue */ 00605 count = tcp_oos_count(pcb); 00606 EXPECT_OOSEQ(count == k+1); 00607 datalen = tcp_oos_tcplen(pcb); 00608 if (i + TCP_MSS < TCP_WND) { 00609 expected_datalen = (k+1)*TCP_MSS; 00610 } else { 00611 expected_datalen = TCP_WND - TCP_MSS; 00612 } 00613 if (datalen != expected_datalen) { 00614 EXPECT_OOSEQ(datalen == expected_datalen); 00615 } 00616 } 00617 00618 /* pass in one more segment, cleary overrunning the rxwin */ 00619 p_ovr = tcp_create_rx_segment(pcb, &data_full_wnd[TCP_MSS*(k+1)], TCP_MSS, TCP_MSS*(k+1), 0, TCP_ACK); 00620 EXPECT_RET(p_ovr != NULL); 00621 /* pass the segment to tcp_input */ 00622 test_tcp_input(p_ovr, &netif); 00623 /* check if counters are as expected */ 00624 EXPECT(counters.close_calls == 0); 00625 EXPECT(counters.recv_calls == 0); 00626 EXPECT(counters.recved_bytes == 0); 00627 EXPECT(counters.err_calls == 0); 00628 /* check ooseq queue */ 00629 EXPECT_OOSEQ(tcp_oos_count(pcb) == k); 00630 datalen2 = tcp_oos_tcplen(pcb); 00631 EXPECT_OOSEQ(datalen == datalen2); 00632 00633 /* now pass inseq */ 00634 test_tcp_input(pinseq, &netif); 00635 EXPECT(pcb->ooseq == NULL); 00636 00637 /* make sure the pcb is freed */ 00638 EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1); 00639 tcp_abort(pcb); 00640 EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0); 00641 #endif /* !TCP_OOSEQ_MAX_BYTES && !TCP_OOSEQ_MAX_PBUFS */ 00642 LWIP_UNUSED_ARG(_i); 00643 } 00644 END_TEST 00645 00646 START_TEST(test_tcp_recv_ooseq_max_bytes) 00647 { 00648 #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)) 00649 int i, k; 00650 struct test_tcp_counters counters; 00651 struct tcp_pcb* pcb; 00652 struct pbuf *p_ovr; 00653 ip_addr_t remote_ip, local_ip, netmask; 00654 u16_t remote_port = 0x100, local_port = 0x101; 00655 struct netif netif; 00656 int datalen = 0; 00657 int datalen2; 00658 00659 for(i = 0; i < sizeof(data_full_wnd); i++) { 00660 data_full_wnd[i] = (char)i; 00661 } 00662 00663 /* initialize local vars */ 00664 memset(&netif, 0, sizeof(netif)); 00665 IP_ADDR4(&local_ip, 192, 168, 1, 1); 00666 IP_ADDR4(&remote_ip, 192, 168, 1, 2); 00667 IP_ADDR4(&netmask, 255, 255, 255, 0); 00668 test_tcp_init_netif(&netif, NULL, &local_ip, &netmask); 00669 /* initialize counter struct */ 00670 memset(&counters, 0, sizeof(counters)); 00671 counters.expected_data_len = TCP_WND; 00672 counters.expected_data = data_full_wnd; 00673 00674 /* create and initialize the pcb */ 00675 pcb = test_tcp_new_counters_pcb(&counters); 00676 EXPECT_RET(pcb != NULL); 00677 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); 00678 pcb->rcv_nxt = 0x8000; 00679 00680 /* don't 'recv' the first segment (1 byte) so that all other segments will be ooseq */ 00681 00682 /* create segments and 'recv' them */ 00683 for(k = 1, i = 1; k < TCP_OOSEQ_MAX_BYTES; k += TCP_MSS, i++) { 00684 int count; 00685 struct pbuf *p = tcp_create_rx_segment(pcb, &data_full_wnd[k], 00686 TCP_MSS, k, 0, TCP_ACK); 00687 EXPECT_RET(p != NULL); 00688 EXPECT_RET(p->next == NULL); 00689 /* pass the segment to tcp_input */ 00690 test_tcp_input(p, &netif); 00691 /* check if counters are as expected */ 00692 EXPECT(counters.close_calls == 0); 00693 EXPECT(counters.recv_calls == 0); 00694 EXPECT(counters.recved_bytes == 0); 00695 EXPECT(counters.err_calls == 0); 00696 /* check ooseq queue */ 00697 count = tcp_oos_pbuf_count(pcb); 00698 EXPECT_OOSEQ(count == i); 00699 datalen = tcp_oos_tcplen(pcb); 00700 EXPECT_OOSEQ(datalen == (i * TCP_MSS)); 00701 } 00702 00703 /* pass in one more segment, overrunning the limit */ 00704 p_ovr = tcp_create_rx_segment(pcb, &data_full_wnd[k+1], 1, k+1, 0, TCP_ACK); 00705 EXPECT_RET(p_ovr != NULL); 00706 /* pass the segment to tcp_input */ 00707 test_tcp_input(p_ovr, &netif); 00708 /* check if counters are as expected */ 00709 EXPECT(counters.close_calls == 0); 00710 EXPECT(counters.recv_calls == 0); 00711 EXPECT(counters.recved_bytes == 0); 00712 EXPECT(counters.err_calls == 0); 00713 /* check ooseq queue (ensure the new segment was not accepted) */ 00714 EXPECT_OOSEQ(tcp_oos_count(pcb) == (i-1)); 00715 datalen2 = tcp_oos_tcplen(pcb); 00716 EXPECT_OOSEQ(datalen2 == ((i-1) * TCP_MSS)); 00717 00718 /* make sure the pcb is freed */ 00719 EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1); 00720 tcp_abort(pcb); 00721 EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0); 00722 #endif /* 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)) */ 00723 LWIP_UNUSED_ARG(_i); 00724 } 00725 END_TEST 00726 00727 START_TEST(test_tcp_recv_ooseq_max_pbufs) 00728 { 00729 #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)) 00730 int i; 00731 struct test_tcp_counters counters; 00732 struct tcp_pcb* pcb; 00733 struct pbuf *p_ovr; 00734 ip_addr_t remote_ip, local_ip, netmask; 00735 u16_t remote_port = 0x100, local_port = 0x101; 00736 struct netif netif; 00737 int datalen = 0; 00738 int datalen2; 00739 00740 for(i = 0; i < sizeof(data_full_wnd); i++) { 00741 data_full_wnd[i] = (char)i; 00742 } 00743 00744 /* initialize local vars */ 00745 memset(&netif, 0, sizeof(netif)); 00746 IP_ADDR4(&local_ip, 192, 168, 1, 1); 00747 IP_ADDR4(&remote_ip, 192, 168, 1, 2); 00748 IP_ADDR4(&netmask, 255, 255, 255, 0); 00749 test_tcp_init_netif(&netif, NULL, &local_ip, &netmask); 00750 /* initialize counter struct */ 00751 memset(&counters, 0, sizeof(counters)); 00752 counters.expected_data_len = TCP_WND; 00753 counters.expected_data = data_full_wnd; 00754 00755 /* create and initialize the pcb */ 00756 pcb = test_tcp_new_counters_pcb(&counters); 00757 EXPECT_RET(pcb != NULL); 00758 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); 00759 pcb->rcv_nxt = 0x8000; 00760 00761 /* don't 'recv' the first segment (1 byte) so that all other segments will be ooseq */ 00762 00763 /* create segments and 'recv' them */ 00764 for(i = 1; i <= TCP_OOSEQ_MAX_PBUFS; i++) { 00765 int count; 00766 struct pbuf *p = tcp_create_rx_segment(pcb, &data_full_wnd[i], 00767 1, i, 0, TCP_ACK); 00768 EXPECT_RET(p != NULL); 00769 EXPECT_RET(p->next == NULL); 00770 /* pass the segment to tcp_input */ 00771 test_tcp_input(p, &netif); 00772 /* check if counters are as expected */ 00773 EXPECT(counters.close_calls == 0); 00774 EXPECT(counters.recv_calls == 0); 00775 EXPECT(counters.recved_bytes == 0); 00776 EXPECT(counters.err_calls == 0); 00777 /* check ooseq queue */ 00778 count = tcp_oos_pbuf_count(pcb); 00779 EXPECT_OOSEQ(count == i); 00780 datalen = tcp_oos_tcplen(pcb); 00781 EXPECT_OOSEQ(datalen == i); 00782 } 00783 00784 /* pass in one more segment, overrunning the limit */ 00785 p_ovr = tcp_create_rx_segment(pcb, &data_full_wnd[i+1], 1, i+1, 0, TCP_ACK); 00786 EXPECT_RET(p_ovr != NULL); 00787 /* pass the segment to tcp_input */ 00788 test_tcp_input(p_ovr, &netif); 00789 /* check if counters are as expected */ 00790 EXPECT(counters.close_calls == 0); 00791 EXPECT(counters.recv_calls == 0); 00792 EXPECT(counters.recved_bytes == 0); 00793 EXPECT(counters.err_calls == 0); 00794 /* check ooseq queue (ensure the new segment was not accepted) */ 00795 EXPECT_OOSEQ(tcp_oos_count(pcb) == (i-1)); 00796 datalen2 = tcp_oos_tcplen(pcb); 00797 EXPECT_OOSEQ(datalen2 == (i-1)); 00798 00799 /* make sure the pcb is freed */ 00800 EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1); 00801 tcp_abort(pcb); 00802 EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0); 00803 #endif /* TCP_OOSEQ_MAX_PBUFS && (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)) */ 00804 LWIP_UNUSED_ARG(_i); 00805 } 00806 END_TEST 00807 00808 static void 00809 check_rx_counters(struct tcp_pcb *pcb, struct test_tcp_counters *counters, u32_t exp_close_calls, u32_t exp_rx_calls, 00810 u32_t exp_rx_bytes, u32_t exp_err_calls, int exp_oos_count, int exp_oos_len) 00811 { 00812 int oos_len; 00813 EXPECT(counters->close_calls == exp_close_calls); 00814 EXPECT(counters->recv_calls == exp_rx_calls); 00815 EXPECT(counters->recved_bytes == exp_rx_bytes); 00816 EXPECT(counters->err_calls == exp_err_calls); 00817 /* check that pbuf is queued in ooseq */ 00818 EXPECT_OOSEQ(tcp_oos_count(pcb) == exp_oos_count); 00819 oos_len = tcp_oos_tcplen(pcb); 00820 EXPECT_OOSEQ(exp_oos_len == oos_len); 00821 } 00822 00823 /* this test uses 4 packets: 00824 * - data (len=TCP_MSS) 00825 * - FIN 00826 * - data after FIN (len=1) (invalid) 00827 * - 2nd FIN (invalid) 00828 * 00829 * the parameter 'delay_packet' is a bitmask that choses which on these packets is ooseq 00830 */ 00831 static void test_tcp_recv_ooseq_double_FINs(int delay_packet) 00832 { 00833 int i, k; 00834 struct test_tcp_counters counters; 00835 struct tcp_pcb* pcb; 00836 struct pbuf *p_normal_fin, *p_data_after_fin, *p, *p_2nd_fin_ooseq; 00837 ip_addr_t remote_ip, local_ip, netmask; 00838 u16_t remote_port = 0x100, local_port = 0x101; 00839 struct netif netif; 00840 u32_t exp_rx_calls = 0, exp_rx_bytes = 0, exp_close_calls = 0, exp_oos_pbufs = 0, exp_oos_tcplen = 0; 00841 int first_dropped = 0xff; 00842 00843 for(i = 0; i < (int)sizeof(data_full_wnd); i++) { 00844 data_full_wnd[i] = (char)i; 00845 } 00846 00847 /* initialize local vars */ 00848 memset(&netif, 0, sizeof(netif)); 00849 IP_ADDR4(&local_ip, 192, 168, 1, 1); 00850 IP_ADDR4(&remote_ip, 192, 168, 1, 2); 00851 IP_ADDR4(&netmask, 255, 255, 255, 0); 00852 test_tcp_init_netif(&netif, NULL, &local_ip, &netmask); 00853 /* initialize counter struct */ 00854 memset(&counters, 0, sizeof(counters)); 00855 counters.expected_data_len = TCP_WND; 00856 counters.expected_data = data_full_wnd; 00857 00858 /* create and initialize the pcb */ 00859 pcb = test_tcp_new_counters_pcb(&counters); 00860 EXPECT_RET(pcb != NULL); 00861 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); 00862 pcb->rcv_nxt = 0x8000; 00863 00864 /* create segments */ 00865 p = tcp_create_rx_segment(pcb, &data_full_wnd[0], TCP_MSS, 0, 0, TCP_ACK); 00866 p_normal_fin = tcp_create_rx_segment(pcb, NULL, 0, TCP_MSS, 0, TCP_ACK|TCP_FIN); 00867 k = 1; 00868 p_data_after_fin = tcp_create_rx_segment(pcb, &data_full_wnd[TCP_MSS+1], k, TCP_MSS+1, 0, TCP_ACK); 00869 p_2nd_fin_ooseq = tcp_create_rx_segment(pcb, NULL, 0, TCP_MSS+1+k, 0, TCP_ACK|TCP_FIN); 00870 00871 if(delay_packet & 1) { 00872 /* drop normal data */ 00873 first_dropped = 1; 00874 } else { 00875 /* send normal data */ 00876 test_tcp_input(p, &netif); 00877 exp_rx_calls++; 00878 exp_rx_bytes += TCP_MSS; 00879 } 00880 /* check if counters are as expected */ 00881 check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); 00882 00883 if(delay_packet & 2) { 00884 /* drop FIN */ 00885 if(first_dropped > 2) { 00886 first_dropped = 2; 00887 } 00888 } else { 00889 /* send FIN */ 00890 test_tcp_input(p_normal_fin, &netif); 00891 if (first_dropped < 2) { 00892 /* already dropped packets, this one is ooseq */ 00893 exp_oos_pbufs++; 00894 exp_oos_tcplen++; 00895 } else { 00896 /* inseq */ 00897 exp_close_calls++; 00898 } 00899 } 00900 /* check if counters are as expected */ 00901 check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); 00902 00903 if(delay_packet & 4) { 00904 /* drop data-after-FIN */ 00905 if(first_dropped > 3) { 00906 first_dropped = 3; 00907 } 00908 } else { 00909 /* send data-after-FIN */ 00910 test_tcp_input(p_data_after_fin, &netif); 00911 if (first_dropped < 3) { 00912 /* already dropped packets, this one is ooseq */ 00913 if (delay_packet & 2) { 00914 /* correct FIN was ooseq */ 00915 exp_oos_pbufs++; 00916 exp_oos_tcplen += k; 00917 } 00918 } else { 00919 /* inseq: no change */ 00920 } 00921 } 00922 /* check if counters are as expected */ 00923 check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); 00924 00925 if(delay_packet & 8) { 00926 /* drop 2nd-FIN */ 00927 if(first_dropped > 4) { 00928 first_dropped = 4; 00929 } 00930 } else { 00931 /* send 2nd-FIN */ 00932 test_tcp_input(p_2nd_fin_ooseq, &netif); 00933 if (first_dropped < 3) { 00934 /* already dropped packets, this one is ooseq */ 00935 if (delay_packet & 2) { 00936 /* correct FIN was ooseq */ 00937 exp_oos_pbufs++; 00938 exp_oos_tcplen++; 00939 } 00940 } else { 00941 /* inseq: no change */ 00942 } 00943 } 00944 /* check if counters are as expected */ 00945 check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); 00946 00947 if(delay_packet & 1) { 00948 /* dropped normal data before */ 00949 test_tcp_input(p, &netif); 00950 exp_rx_calls++; 00951 exp_rx_bytes += TCP_MSS; 00952 if((delay_packet & 2) == 0) { 00953 /* normal FIN was NOT delayed */ 00954 exp_close_calls++; 00955 exp_oos_pbufs = exp_oos_tcplen = 0; 00956 } 00957 } 00958 /* check if counters are as expected */ 00959 check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); 00960 00961 if(delay_packet & 2) { 00962 /* dropped normal FIN before */ 00963 test_tcp_input(p_normal_fin, &netif); 00964 exp_close_calls++; 00965 exp_oos_pbufs = exp_oos_tcplen = 0; 00966 } 00967 /* check if counters are as expected */ 00968 check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); 00969 00970 if(delay_packet & 4) { 00971 /* dropped data-after-FIN before */ 00972 test_tcp_input(p_data_after_fin, &netif); 00973 } 00974 /* check if counters are as expected */ 00975 check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); 00976 00977 if(delay_packet & 8) { 00978 /* dropped 2nd-FIN before */ 00979 test_tcp_input(p_2nd_fin_ooseq, &netif); 00980 } 00981 /* check if counters are as expected */ 00982 check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); 00983 00984 /* check that ooseq data has been dumped */ 00985 EXPECT(pcb->ooseq == NULL); 00986 00987 /* make sure the pcb is freed */ 00988 EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1); 00989 tcp_abort(pcb); 00990 EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0); 00991 } 00992 00993 /** create multiple segments and pass them to tcp_input with the first segment missing 00994 * to simulate overruning the rxwin with ooseq queueing enabled */ 00995 #define FIN_TEST(name, num) \ 00996 START_TEST(name) \ 00997 { \ 00998 LWIP_UNUSED_ARG(_i); \ 00999 test_tcp_recv_ooseq_double_FINs(num); \ 01000 } \ 01001 END_TEST 01002 FIN_TEST(test_tcp_recv_ooseq_double_FIN_0, 0) 01003 FIN_TEST(test_tcp_recv_ooseq_double_FIN_1, 1) 01004 FIN_TEST(test_tcp_recv_ooseq_double_FIN_2, 2) 01005 FIN_TEST(test_tcp_recv_ooseq_double_FIN_3, 3) 01006 FIN_TEST(test_tcp_recv_ooseq_double_FIN_4, 4) 01007 FIN_TEST(test_tcp_recv_ooseq_double_FIN_5, 5) 01008 FIN_TEST(test_tcp_recv_ooseq_double_FIN_6, 6) 01009 FIN_TEST(test_tcp_recv_ooseq_double_FIN_7, 7) 01010 FIN_TEST(test_tcp_recv_ooseq_double_FIN_8, 8) 01011 FIN_TEST(test_tcp_recv_ooseq_double_FIN_9, 9) 01012 FIN_TEST(test_tcp_recv_ooseq_double_FIN_10, 10) 01013 FIN_TEST(test_tcp_recv_ooseq_double_FIN_11, 11) 01014 FIN_TEST(test_tcp_recv_ooseq_double_FIN_12, 12) 01015 FIN_TEST(test_tcp_recv_ooseq_double_FIN_13, 13) 01016 FIN_TEST(test_tcp_recv_ooseq_double_FIN_14, 14) 01017 FIN_TEST(test_tcp_recv_ooseq_double_FIN_15, 15) 01018 01019 01020 /** Create the suite including all tests for this module */ 01021 Suite * 01022 tcp_oos_suite(void) 01023 { 01024 testfunc tests[] = { 01025 TESTFUNC(test_tcp_recv_ooseq_FIN_OOSEQ), 01026 TESTFUNC(test_tcp_recv_ooseq_FIN_INSEQ), 01027 TESTFUNC(test_tcp_recv_ooseq_overrun_rxwin), 01028 TESTFUNC(test_tcp_recv_ooseq_overrun_rxwin_edge), 01029 TESTFUNC(test_tcp_recv_ooseq_max_bytes), 01030 TESTFUNC(test_tcp_recv_ooseq_max_pbufs), 01031 TESTFUNC(test_tcp_recv_ooseq_double_FIN_0), 01032 TESTFUNC(test_tcp_recv_ooseq_double_FIN_1), 01033 TESTFUNC(test_tcp_recv_ooseq_double_FIN_2), 01034 TESTFUNC(test_tcp_recv_ooseq_double_FIN_3), 01035 TESTFUNC(test_tcp_recv_ooseq_double_FIN_4), 01036 TESTFUNC(test_tcp_recv_ooseq_double_FIN_5), 01037 TESTFUNC(test_tcp_recv_ooseq_double_FIN_6), 01038 TESTFUNC(test_tcp_recv_ooseq_double_FIN_7), 01039 TESTFUNC(test_tcp_recv_ooseq_double_FIN_8), 01040 TESTFUNC(test_tcp_recv_ooseq_double_FIN_9), 01041 TESTFUNC(test_tcp_recv_ooseq_double_FIN_10), 01042 TESTFUNC(test_tcp_recv_ooseq_double_FIN_11), 01043 TESTFUNC(test_tcp_recv_ooseq_double_FIN_12), 01044 TESTFUNC(test_tcp_recv_ooseq_double_FIN_13), 01045 TESTFUNC(test_tcp_recv_ooseq_double_FIN_14), 01046 TESTFUNC(test_tcp_recv_ooseq_double_FIN_15) 01047 }; 01048 return create_suite("TCP_OOS", tests, sizeof(tests)/sizeof(testfunc), tcp_oos_setup, tcp_oos_teardown); 01049 }
Generated on Tue Jul 12 2022 13:16:16 by
1.7.2
