58 const char *
const tcp_state_str[] = {
74 const u8_t tcp_backoff[13] =
75 { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7};
77 const u8_t tcp_persist_backoff[7] = { 3, 6, 12, 24, 48, 96, 120 };
82 struct tcp_pcb *tcp_bound_pcbs;
84 union tcp_listen_pcbs_t tcp_listen_pcbs;
87 struct tcp_pcb *tcp_active_pcbs;
89 struct tcp_pcb *tcp_tw_pcbs;
91 #define NUM_TCP_PCB_LISTS 4
92 #define NUM_TCP_PCB_LISTS_NO_TIME_WAIT 3
94 struct tcp_pcb **tcp_pcb_lists[] = {&tcp_listen_pcbs.pcbs, &tcp_bound_pcbs,
95 &tcp_active_pcbs, &tcp_tw_pcbs};
98 struct tcp_pcb *tcp_tmp_pcb;
101 static u8_t tcp_timer;
102 static u16_t tcp_new_port(
void);
114 if (++tcp_timer & 1) {
138 tcp_close_shutdown(
struct tcp_pcb *pcb,
u8_t rst_on_unacked_data)
142 if (rst_on_unacked_data && (pcb->state != LISTEN)) {
143 if ((pcb->refused_data !=
NULL) || (pcb->rcv_wnd !=
TCP_WND)) {
146 LWIP_ASSERT(
"pcb->flags & TF_RXCLOSED", pcb->flags & TF_RXCLOSED);
150 tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
151 pcb->local_port, pcb->remote_port);
158 TCP_RMV(&tcp_active_pcbs, pcb);
159 pcb->state = TIME_WAIT;
160 TCP_REG(&tcp_tw_pcbs, pcb);
166 switch (pcb->state) {
176 TCP_RMV(&tcp_bound_pcbs, pcb);
182 tcp_pcb_remove(&tcp_listen_pcbs.pcbs, pcb);
188 tcp_pcb_remove(&tcp_active_pcbs, pcb);
194 err = tcp_send_fin(pcb);
197 pcb->state = FIN_WAIT_1;
201 err = tcp_send_fin(pcb);
204 pcb->state = FIN_WAIT_1;
208 err = tcp_send_fin(pcb);
211 pcb->state = LAST_ACK;
250 tcp_close(
struct tcp_pcb *pcb)
254 tcp_debug_print_state(pcb->state);
257 if (pcb->state != LISTEN) {
259 pcb->flags |= TF_RXCLOSED;
262 return tcp_close_shutdown(pcb, 1);
276 tcp_shutdown(
struct tcp_pcb *pcb,
int shut_rx,
int shut_tx)
278 if (pcb->state == LISTEN) {
283 if (pcb->refused_data !=
NULL) {
285 pcb->refused_data =
NULL;
288 pcb->flags |= TF_RXCLOSED;
293 switch (pcb->state) {
297 return tcp_close_shutdown(pcb, 0);
316 tcp_abandon(
struct tcp_pcb *pcb,
int reset)
319 u16_t remote_port, local_port;
321 #if LWIP_CALLBACK_API
327 LWIP_ASSERT(
"don't call tcp_abort/tcp_abandon for listen-pcbs",
328 pcb->state != LISTEN);
332 if (pcb->state == TIME_WAIT) {
333 tcp_pcb_remove(&tcp_tw_pcbs, pcb);
336 seqno = pcb->snd_nxt;
337 ackno = pcb->rcv_nxt;
340 local_port = pcb->local_port;
341 remote_port = pcb->remote_port;
342 #if LWIP_CALLBACK_API
345 errf_arg = pcb->callback_arg;
346 tcp_pcb_remove(&tcp_active_pcbs, pcb);
347 if (pcb->unacked !=
NULL) {
348 tcp_segs_free(pcb->unacked);
350 if (pcb->unsent !=
NULL) {
351 tcp_segs_free(pcb->unsent);
354 if (pcb->ooseq !=
NULL) {
355 tcp_segs_free(pcb->ooseq);
359 TCP_EVENT_ERR(errf, errf_arg,
ERR_ABRT);
362 tcp_rst(seqno, ackno, &local_ip, &remote_ip, local_port, remote_port);
378 tcp_abort(
struct tcp_pcb *pcb)
400 int max_pcb_list = NUM_TCP_PCB_LISTS;
401 struct tcp_pcb *cpcb;
412 max_pcb_list = NUM_TCP_PCB_LISTS_NO_TIME_WAIT;
417 port = tcp_new_port();
421 for (i = 0; i < max_pcb_list; i++) {
422 for(cpcb = *tcp_pcb_lists[i]; cpcb !=
NULL; cpcb = cpcb->next) {
423 if (cpcb->local_port == port) {
443 pcb->local_ip = *ipaddr;
445 pcb->local_port = port;
446 TCP_REG(&tcp_bound_pcbs, pcb);
450 #if LWIP_CALLBACK_API
455 tcp_accept_null(
void *arg,
struct tcp_pcb *pcb,
err_t err)
480 tcp_listen_with_backlog(
struct tcp_pcb *pcb,
u8_t backlog)
482 struct tcp_pcb_listen *lpcb;
485 LWIP_ERROR(
"tcp_listen: pcb already connected", pcb->state == CLOSED,
return NULL);
488 if (pcb->state == LISTEN) {
496 for(lpcb = tcp_listen_pcbs.listen_pcbs; lpcb !=
NULL; lpcb = lpcb->next) {
497 if (lpcb->local_port == pcb->local_port) {
498 if (
ip_addr_cmp(&lpcb->local_ip, &pcb->local_ip)) {
506 lpcb = (
struct tcp_pcb_listen *)
memp_malloc(MEMP_TCP_PCB_LISTEN);
510 lpcb->callback_arg = pcb->callback_arg;
511 lpcb->local_port = pcb->local_port;
512 lpcb->state = LISTEN;
513 lpcb->prio = pcb->prio;
514 lpcb->so_options = pcb->so_options;
516 lpcb->ttl = pcb->ttl;
517 lpcb->tos = pcb->tos;
519 TCP_RMV(&tcp_bound_pcbs, pcb);
521 #if LWIP_CALLBACK_API
522 lpcb->accept = tcp_accept_null;
524 #if TCP_LISTEN_BACKLOG
525 lpcb->accepts_pending = 0;
526 lpcb->backlog = (backlog ? backlog : 1);
528 TCP_REG(&tcp_listen_pcbs.pcbs, (
struct tcp_pcb *)lpcb);
529 return (
struct tcp_pcb *)lpcb;
538 u32_t tcp_update_rcv_ann_wnd(
struct tcp_pcb *pcb)
540 u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
542 if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge +
LWIP_MIN((
TCP_WND / 2), pcb->mss))) {
544 pcb->rcv_ann_wnd = pcb->rcv_wnd;
545 return new_right_edge - pcb->rcv_ann_right_edge;
547 if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) {
550 pcb->rcv_ann_wnd = 0;
553 u32_t new_rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt;
554 LWIP_ASSERT(
"new_rcv_ann_wnd <= 0xffff", new_rcv_ann_wnd <= 0xffff);
555 pcb->rcv_ann_wnd = (
u16_t)new_rcv_ann_wnd;
570 tcp_recved(
struct tcp_pcb *pcb,
u16_t len)
574 LWIP_ASSERT(
"tcp_recved: len would wrap rcv_wnd\n",
575 len <= 0xffff - pcb->rcv_wnd );
582 wnd_inflation = tcp_update_rcv_ann_wnd(pcb);
594 len, pcb->rcv_wnd,
TCP_WND - pcb->rcv_wnd));
608 #ifndef TCP_LOCAL_PORT_RANGE_START
609 #define TCP_LOCAL_PORT_RANGE_START 4096
610 #define TCP_LOCAL_PORT_RANGE_END 0x7fff
612 static u16_t port = TCP_LOCAL_PORT_RANGE_START;
615 if (++port > TCP_LOCAL_PORT_RANGE_END) {
616 port = TCP_LOCAL_PORT_RANGE_START;
619 for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
620 for(pcb = *tcp_pcb_lists[i]; pcb !=
NULL; pcb = pcb->next) {
621 if (pcb->local_port == port) {
643 tcp_connected_fn connected)
648 LWIP_ERROR(
"tcp_connect: can only connected from state CLOSED", pcb->state == CLOSED,
return ERR_ISCONN);
651 if (ipaddr !=
NULL) {
652 pcb->remote_ip = *ipaddr;
656 pcb->remote_port = port;
671 if (pcb->local_port == 0) {
672 pcb->local_port = tcp_new_port();
678 struct tcp_pcb *cpcb;
681 for (i = 2; i < NUM_TCP_PCB_LISTS; i++) {
682 for(cpcb = *tcp_pcb_lists[i]; cpcb !=
NULL; cpcb = cpcb->next) {
683 if ((cpcb->local_port == pcb->local_port) &&
684 (cpcb->remote_port == port) &&
694 iss = tcp_next_iss();
697 pcb->lastack = iss - 1;
698 pcb->snd_lbb = iss - 1;
701 pcb->rcv_ann_right_edge = pcb->rcv_nxt;
706 #if TCP_CALCULATE_EFF_SEND_MSS
707 pcb->mss = tcp_eff_send_mss(pcb->mss, ipaddr);
710 pcb->ssthresh = pcb->mss * 10;
711 #if LWIP_CALLBACK_API
712 pcb->connected = connected;
718 ret = tcp_enqueue_flags(pcb, TCP_SYN);
721 pcb->state = SYN_SENT;
722 TCP_RMV(&tcp_bound_pcbs, pcb);
723 TCP_REG(&tcp_active_pcbs, pcb);
741 struct tcp_pcb *pcb, *prev;
753 pcb = tcp_active_pcbs;
757 while (pcb !=
NULL) {
759 LWIP_ASSERT(
"tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED);
760 LWIP_ASSERT(
"tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN);
761 LWIP_ASSERT(
"tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT);
774 if (pcb->persist_backoff > 0) {
778 if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
779 pcb->persist_cnt = 0;
780 if (pcb->persist_backoff <
sizeof(tcp_persist_backoff)) {
781 pcb->persist_backoff++;
783 tcp_zero_window_probe(pcb);
790 if (pcb->unacked !=
NULL && pcb->rtime >= pcb->rto) {
793 " pcb->rto %"S16_F"\n",
794 pcb->rtime, pcb->rto));
798 if (pcb->state != SYN_SENT) {
799 pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[pcb->nrtx];
806 eff_wnd =
LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
807 pcb->ssthresh = eff_wnd >> 1;
808 if (pcb->ssthresh < (pcb->mss << 1)) {
809 pcb->ssthresh = (pcb->mss << 1);
811 pcb->cwnd = pcb->mss;
813 " ssthresh %"U16_F"\n",
814 pcb->cwnd, pcb->ssthresh));
823 if (pcb->state == FIN_WAIT_2) {
824 if ((
u32_t)(tcp_ticks - pcb->tmr) >
825 TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) {
833 ((pcb->state == ESTABLISHED) ||
834 (pcb->state == CLOSE_WAIT))) {
835 #if LWIP_TCP_KEEPALIVE
836 if((
u32_t)(tcp_ticks - pcb->tmr) >
837 (pcb->keep_idle + (pcb->keep_cnt*pcb->keep_intvl))
840 if((
u32_t)(tcp_ticks - pcb->tmr) >
841 (pcb->keep_idle + TCP_MAXIDLE) / TCP_SLOW_INTERVAL)
851 #if LWIP_TCP_KEEPALIVE
852 else if((
u32_t)(tcp_ticks - pcb->tmr) >
853 (pcb->keep_idle + pcb->keep_cnt_sent * pcb->keep_intvl)
856 else if((
u32_t)(tcp_ticks - pcb->tmr) >
857 (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEPINTVL_DEFAULT)
862 pcb->keep_cnt_sent++;
870 if (pcb->ooseq !=
NULL &&
871 (
u32_t)tcp_ticks - pcb->tmr >= pcb->rto * TCP_OOSEQ_TIMEOUT) {
872 tcp_segs_free(pcb->ooseq);
879 if (pcb->state == SYN_RCVD) {
880 if ((
u32_t)(tcp_ticks - pcb->tmr) >
881 TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) {
888 if (pcb->state == LAST_ACK) {
889 if ((
u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
897 struct tcp_pcb *pcb2;
901 LWIP_ASSERT(
"tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs);
902 prev->next = pcb->next;
905 LWIP_ASSERT(
"tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb);
906 tcp_active_pcbs = pcb->next;
909 TCP_EVENT_ERR(pcb->errf, pcb->callback_arg,
ERR_ABRT);
911 tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
912 pcb->local_port, pcb->remote_port);
925 if (prev->polltmr >= prev->pollinterval) {
928 TCP_EVENT_POLL(prev, err);
941 while (pcb !=
NULL) {
942 LWIP_ASSERT(
"tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
946 if ((
u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
954 struct tcp_pcb *pcb2;
958 LWIP_ASSERT(
"tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs);
959 prev->next = pcb->next;
962 LWIP_ASSERT(
"tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
963 tcp_tw_pcbs = pcb->next;
984 struct tcp_pcb *pcb = tcp_active_pcbs;
987 struct tcp_pcb *next = pcb->next;
989 if (pcb->refused_data !=
NULL) {
993 TCP_EVENT_RECV(pcb, pcb->refused_data,
ERR_OK, err);
995 pcb->refused_data =
NULL;
1003 if (pcb && (pcb->flags & TF_ACK_DELAY)) {
1007 pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
1020 tcp_segs_free(
struct tcp_seg *seg)
1022 while (seg !=
NULL) {
1023 struct tcp_seg *next = seg->next;
1035 tcp_seg_free(
struct tcp_seg *seg)
1038 if (seg->p !=
NULL) {
1055 tcp_setprio(
struct tcp_pcb *pcb,
u8_t prio)
1069 tcp_seg_copy(
struct tcp_seg *seg)
1071 struct tcp_seg *cseg;
1073 cseg = (
struct tcp_seg *)
memp_malloc(MEMP_TCP_SEG);
1083 #if LWIP_CALLBACK_API
1089 tcp_recv_null(
void *arg,
struct tcp_pcb *pcb,
struct pbuf *p,
err_t err)
1095 }
else if (err ==
ERR_OK) {
1096 return tcp_close(pcb);
1108 tcp_kill_prio(
u8_t prio)
1110 struct tcp_pcb *pcb, *inactive;
1115 mprio = TCP_PRIO_MAX;
1120 for(pcb = tcp_active_pcbs; pcb !=
NULL; pcb = pcb->next) {
1121 if (pcb->prio <= prio &&
1122 pcb->prio <= mprio &&
1123 (
u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
1124 inactivity = tcp_ticks - pcb->tmr;
1129 if (inactive !=
NULL) {
1131 (
void *)inactive, inactivity));
1132 tcp_abort(inactive);
1141 tcp_kill_timewait(
void)
1143 struct tcp_pcb *pcb, *inactive;
1149 for(pcb = tcp_tw_pcbs; pcb !=
NULL; pcb = pcb->next) {
1150 if ((
u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
1151 inactivity = tcp_ticks - pcb->tmr;
1155 if (inactive !=
NULL) {
1157 (
void *)inactive, inactivity));
1158 tcp_abort(inactive);
1169 tcp_alloc(
u8_t prio)
1171 struct tcp_pcb *pcb;
1174 pcb = (
struct tcp_pcb *)
memp_malloc(MEMP_TCP_PCB);
1178 tcp_kill_timewait();
1180 pcb = (
struct tcp_pcb *)
memp_malloc(MEMP_TCP_PCB);
1184 tcp_kill_prio(prio);
1186 pcb = (
struct tcp_pcb *)
memp_malloc(MEMP_TCP_PCB);
1198 memset(pcb, 0,
sizeof(
struct tcp_pcb));
1201 pcb->snd_queuelen = 0;
1209 pcb->rto = 3000 / TCP_SLOW_INTERVAL;
1211 pcb->sv = 3000 / TCP_SLOW_INTERVAL;
1214 iss = tcp_next_iss();
1219 pcb->tmr = tcp_ticks;
1223 #if LWIP_CALLBACK_API
1224 pcb->recv = tcp_recv_null;
1228 pcb->keep_idle = TCP_KEEPIDLE_DEFAULT;
1230 #if LWIP_TCP_KEEPALIVE
1231 pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT;
1232 pcb->keep_cnt = TCP_KEEPCNT_DEFAULT;
1235 pcb->keep_cnt_sent = 0;
1255 return tcp_alloc(TCP_PRIO_NORMAL);
1266 tcp_arg(
struct tcp_pcb *pcb,
void *arg)
1268 pcb->callback_arg = arg;
1270 #if LWIP_CALLBACK_API
1280 tcp_recv(
struct tcp_pcb *pcb, tcp_recv_fn recv)
1293 tcp_sent(
struct tcp_pcb *pcb, tcp_sent_fn sent)
1307 tcp_err(
struct tcp_pcb *pcb, tcp_err_fn err)
1321 tcp_accept(
struct tcp_pcb *pcb, tcp_accept_fn accept)
1323 pcb->accept = accept;
1335 tcp_poll(
struct tcp_pcb *pcb, tcp_poll_fn poll,
u8_t interval)
1337 #if LWIP_CALLBACK_API
1342 pcb->pollinterval = interval;
1352 tcp_pcb_purge(
struct tcp_pcb *pcb)
1354 if (pcb->state != CLOSED &&
1355 pcb->state != TIME_WAIT &&
1356 pcb->state != LISTEN) {
1360 #if TCP_LISTEN_BACKLOG
1361 if (pcb->state == SYN_RCVD) {
1363 struct tcp_pcb_listen *lpcb;
1364 LWIP_ASSERT(
"tcp_pcb_purge: pcb->state == SYN_RCVD but tcp_listen_pcbs is NULL",
1365 tcp_listen_pcbs.listen_pcbs !=
NULL);
1366 for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb !=
NULL; lpcb = lpcb->next) {
1367 if ((lpcb->local_port == pcb->local_port) &&
1371 LWIP_ASSERT(
"tcp_pcb_purge: listen pcb does not have accepts pending",
1372 lpcb->accepts_pending > 0);
1373 lpcb->accepts_pending--;
1381 if (pcb->refused_data !=
NULL) {
1384 pcb->refused_data =
NULL;
1386 if (pcb->unsent !=
NULL) {
1389 if (pcb->unacked !=
NULL) {
1393 if (pcb->ooseq !=
NULL) {
1396 tcp_segs_free(pcb->ooseq);
1404 tcp_segs_free(pcb->unsent);
1405 tcp_segs_free(pcb->unacked);
1406 pcb->unacked = pcb->unsent =
NULL;
1408 pcb->unsent_oversize = 0;
1420 tcp_pcb_remove(
struct tcp_pcb **pcblist,
struct tcp_pcb *pcb)
1422 TCP_RMV(pcblist, pcb);
1427 if (pcb->state != TIME_WAIT &&
1428 pcb->state != LISTEN &&
1429 pcb->flags & TF_ACK_DELAY) {
1430 pcb->flags |= TF_ACK_NOW;
1434 if (pcb->state != LISTEN) {
1442 pcb->state = CLOSED;
1444 LWIP_ASSERT(
"tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane());
1455 static u32_t iss = 6510;
1461 #if TCP_CALCULATE_EFF_SEND_MSS
1471 struct netif *outif;
1474 if ((outif !=
NULL) && (outif->
mtu != 0)) {
1480 sendmss =
LWIP_MIN(sendmss, mss_s);
1487 tcp_debug_state_str(
enum tcp_state s)
1489 return tcp_state_str[s];
1492 #if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG
1499 tcp_debug_print(
struct tcp_hdr *tcphdr)
1507 ntohl(tcphdr->seqno)));
1510 ntohl(tcphdr->ackno)));
1512 LWIP_DEBUGF(
TCP_DEBUG, (
"| %2"U16_F
" | |%"U16_F
"%"U16_F
"%"U16_F
"%"U16_F
"%"U16_F
"%"U16_F
"| %5"U16_F
" | (hdrlen, flags (",
1513 TCPH_HDRLEN(tcphdr),
1514 TCPH_FLAGS(tcphdr) >> 5 & 1,
1515 TCPH_FLAGS(tcphdr) >> 4 & 1,
1516 TCPH_FLAGS(tcphdr) >> 3 & 1,
1517 TCPH_FLAGS(tcphdr) >> 2 & 1,
1518 TCPH_FLAGS(tcphdr) >> 1 & 1,
1519 TCPH_FLAGS(tcphdr) & 1,
1520 ntohs(tcphdr->wnd)));
1521 tcp_debug_print_flags(TCPH_FLAGS(tcphdr));
1525 ntohs(tcphdr->chksum),
ntohs(tcphdr->urgp)));
1535 tcp_debug_print_state(
enum tcp_state s)
1548 if (flags & TCP_FIN) {
1551 if (flags & TCP_SYN) {
1554 if (flags & TCP_RST) {
1557 if (flags & TCP_PSH) {
1560 if (flags & TCP_ACK) {
1563 if (flags & TCP_URG) {
1566 if (flags & TCP_ECE) {
1569 if (flags & TCP_CWR) {
1579 tcp_debug_print_pcbs(
void)
1581 struct tcp_pcb *pcb;
1583 for(pcb = tcp_active_pcbs; pcb !=
NULL; pcb = pcb->next) {
1585 pcb->local_port, pcb->remote_port,
1586 pcb->snd_nxt, pcb->rcv_nxt));
1587 tcp_debug_print_state(pcb->state);
1590 for(pcb = (
struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb !=
NULL; pcb = pcb->next) {
1592 pcb->local_port, pcb->remote_port,
1593 pcb->snd_nxt, pcb->rcv_nxt));
1594 tcp_debug_print_state(pcb->state);
1597 for(pcb = tcp_tw_pcbs; pcb !=
NULL; pcb = pcb->next) {
1599 pcb->local_port, pcb->remote_port,
1600 pcb->snd_nxt, pcb->rcv_nxt));
1601 tcp_debug_print_state(pcb->state);
1611 struct tcp_pcb *pcb;
1612 for(pcb = tcp_active_pcbs; pcb !=
NULL; pcb = pcb->next) {
1613 LWIP_ASSERT(
"tcp_pcbs_sane: active pcb->state != CLOSED", pcb->state != CLOSED);
1614 LWIP_ASSERT(
"tcp_pcbs_sane: active pcb->state != LISTEN", pcb->state != LISTEN);
1615 LWIP_ASSERT(
"tcp_pcbs_sane: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
1617 for(pcb = tcp_tw_pcbs; pcb !=
NULL; pcb = pcb->next) {
1618 LWIP_ASSERT(
"tcp_pcbs_sane: tw pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);