65 #ifdef LWIP_HOOK_FILENAME
66 #include LWIP_HOOK_FILENAME
69 #ifndef TCP_LOCAL_PORT_RANGE_START
72 #define TCP_LOCAL_PORT_RANGE_START 0xc000
73 #define TCP_LOCAL_PORT_RANGE_END 0xffff
74 #define TCP_ENSURE_LOCAL_PORT_RANGE(port) ((u16_t)(((port) & ~TCP_LOCAL_PORT_RANGE_START) + TCP_LOCAL_PORT_RANGE_START))
77 #if LWIP_TCP_KEEPALIVE
78 #define TCP_KEEP_DUR(pcb) ((pcb)->keep_cnt * (pcb)->keep_intvl)
79 #define TCP_KEEP_INTVL(pcb) ((pcb)->keep_intvl)
81 #define TCP_KEEP_DUR(pcb) TCP_MAXIDLE
82 #define TCP_KEEP_INTVL(pcb) TCP_KEEPINTVL_DEFAULT
87 #define INITIAL_MSS 536
89 #define INITIAL_MSS TCP_MSS
92 static const char *
const tcp_state_str[] = {
107 static u16_t tcp_port = TCP_LOCAL_PORT_RANGE_START;
111 static const u8_t tcp_backoff[13] =
112 { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7};
114 static const u8_t tcp_persist_backoff[7] = { 3, 6, 12, 24, 48, 96, 120 };
119 struct tcp_pcb *tcp_bound_pcbs;
121 union tcp_listen_pcbs_t tcp_listen_pcbs;
124 struct tcp_pcb *tcp_active_pcbs;
126 struct tcp_pcb *tcp_tw_pcbs;
129 struct tcp_pcb **
const tcp_pcb_lists[] = {&tcp_listen_pcbs.pcbs, &tcp_bound_pcbs,
130 &tcp_active_pcbs, &tcp_tw_pcbs};
132 u8_t tcp_active_pcbs_changed;
135 static u8_t tcp_timer;
136 static u8_t tcp_timer_ctr;
137 static u16_t tcp_new_port(
void);
139 static err_t tcp_close_shutdown_fin(
struct tcp_pcb *pcb);
147 #if LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND)
148 tcp_port = TCP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND());
161 if (++tcp_timer & 1) {
168 #if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG
173 tcp_remove_listener(
struct tcp_pcb *list,
struct tcp_pcb_listen *lpcb)
176 for (pcb = list; pcb !=
NULL; pcb = pcb->next) {
177 if (pcb->listener == lpcb) {
178 pcb->listener =
NULL;
188 tcp_listen_closed(
struct tcp_pcb *pcb)
190 #if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG
193 LWIP_ASSERT(
"pcb->state == LISTEN", pcb->state == LISTEN);
195 tcp_remove_listener(*tcp_pcb_lists[i], (
struct tcp_pcb_listen*)pcb);
201 #if TCP_LISTEN_BACKLOG
213 tcp_backlog_delayed(
struct tcp_pcb* pcb)
216 if ((pcb->flags & TF_BACKLOGPEND) == 0) {
217 if (pcb->listener !=
NULL) {
218 pcb->listener->accepts_pending++;
219 LWIP_ASSERT(
"accepts_pending != 0", pcb->listener->accepts_pending != 0);
220 pcb->flags |= TF_BACKLOGPEND;
235 tcp_backlog_accepted(
struct tcp_pcb* pcb)
238 if ((pcb->flags & TF_BACKLOGPEND) != 0) {
239 if (pcb->listener !=
NULL) {
240 LWIP_ASSERT(
"accepts_pending != 0", pcb->listener->accepts_pending != 0);
241 pcb->listener->accepts_pending--;
242 pcb->flags &= ~TF_BACKLOGPEND;
265 tcp_close_shutdown(
struct tcp_pcb *pcb,
u8_t rst_on_unacked_data)
267 if (rst_on_unacked_data && ((pcb->state == ESTABLISHED) || (pcb->state == CLOSE_WAIT))) {
268 if ((pcb->refused_data !=
NULL) || (pcb->rcv_wnd != TCP_WND_MAX(pcb))) {
271 LWIP_ASSERT(
"pcb->flags & TF_RXCLOSED", pcb->flags & TF_RXCLOSED);
275 tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
276 pcb->local_port, pcb->remote_port);
280 if (pcb->state == ESTABLISHED) {
282 pcb->state = TIME_WAIT;
283 TCP_REG(&tcp_tw_pcbs, pcb);
286 if (tcp_input_pcb == pcb) {
288 tcp_trigger_input_pcb_close();
299 switch (pcb->state) {
308 if (pcb->local_port != 0) {
309 TCP_RMV(&tcp_bound_pcbs, pcb);
314 tcp_listen_closed(pcb);
315 tcp_pcb_remove(&tcp_listen_pcbs.pcbs, pcb);
319 TCP_PCB_REMOVE_ACTIVE(pcb);
324 return tcp_close_shutdown_fin(pcb);
330 tcp_close_shutdown_fin(
struct tcp_pcb *pcb)
335 switch (pcb->state) {
337 err = tcp_send_fin(pcb);
339 tcp_backlog_accepted(pcb);
341 pcb->state = FIN_WAIT_1;
345 err = tcp_send_fin(pcb);
348 pcb->state = FIN_WAIT_1;
352 err = tcp_send_fin(pcb);
355 pcb->state = LAST_ACK;
372 pcb->flags |= TF_CLOSEPEND;
399 tcp_close(
struct tcp_pcb *pcb)
402 tcp_debug_print_state(pcb->state);
404 if (pcb->state != LISTEN) {
406 pcb->flags |= TF_RXCLOSED;
409 return tcp_close_shutdown(pcb, 1);
426 tcp_shutdown(
struct tcp_pcb *pcb,
int shut_rx,
int shut_tx)
428 if (pcb->state == LISTEN) {
433 pcb->flags |= TF_RXCLOSED;
436 return tcp_close_shutdown(pcb, 1);
439 if (pcb->refused_data !=
NULL) {
441 pcb->refused_data =
NULL;
447 switch (pcb->state) {
451 return tcp_close_shutdown(pcb, (
u8_t)shut_rx);
470 tcp_abandon(
struct tcp_pcb *pcb,
int reset)
473 #if LWIP_CALLBACK_API
479 LWIP_ASSERT(
"don't call tcp_abort/tcp_abandon for listen-pcbs",
480 pcb->state != LISTEN);
484 if (pcb->state == TIME_WAIT) {
485 tcp_pcb_remove(&tcp_tw_pcbs, pcb);
489 u16_t local_port = 0;
490 enum tcp_state last_state;
491 seqno = pcb->snd_nxt;
492 ackno = pcb->rcv_nxt;
493 #if LWIP_CALLBACK_API
496 errf_arg = pcb->callback_arg;
497 if (pcb->state == CLOSED) {
498 if (pcb->local_port != 0) {
500 TCP_RMV(&tcp_bound_pcbs, pcb);
504 local_port = pcb->local_port;
505 TCP_PCB_REMOVE_ACTIVE(pcb);
507 if (pcb->unacked !=
NULL) {
508 tcp_segs_free(pcb->unacked);
510 if (pcb->unsent !=
NULL) {
511 tcp_segs_free(pcb->unsent);
514 if (pcb->ooseq !=
NULL) {
515 tcp_segs_free(pcb->ooseq);
518 tcp_backlog_accepted(pcb);
521 tcp_rst(seqno, ackno, &pcb->local_ip, &pcb->remote_ip, local_port, pcb->remote_port);
523 last_state = pcb->state;
525 TCP_EVENT_ERR(last_state, errf, errf_arg,
ERR_ABRT);
541 tcp_abort(
struct tcp_pcb *pcb)
562 tcp_bind(
struct tcp_pcb *pcb,
const ip_addr_t *ipaddr,
u16_t port)
565 int max_pcb_list = NUM_TCP_PCB_LISTS;
566 struct tcp_pcb *cpcb;
570 if (ipaddr ==
NULL) {
571 ipaddr = IP4_ADDR_ANY;
576 if ((pcb ==
NULL) || (ipaddr ==
NULL)) {
580 LWIP_ERROR(
"tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED,
return ERR_VAL);
589 max_pcb_list = NUM_TCP_PCB_LISTS_NO_TIME_WAIT;
594 port = tcp_new_port();
600 for (i = 0; i < max_pcb_list; i++) {
601 for (cpcb = *tcp_pcb_lists[i]; cpcb !=
NULL; cpcb = cpcb->next) {
602 if (cpcb->local_port == port) {
627 pcb->local_port = port;
628 TCP_REG(&tcp_bound_pcbs, pcb);
632 #if LWIP_CALLBACK_API
637 tcp_accept_null(
void *arg,
struct tcp_pcb *pcb,
err_t err)
664 tcp_listen_with_backlog(
struct tcp_pcb *pcb,
u8_t backlog)
666 return tcp_listen_with_backlog_and_err(pcb, backlog,
NULL);
686 tcp_listen_with_backlog_and_err(
struct tcp_pcb *pcb,
u8_t backlog,
err_t *err)
688 struct tcp_pcb_listen *lpcb =
NULL;
692 LWIP_ERROR(
"tcp_listen: pcb already connected", pcb->state == CLOSED, res =
ERR_CLSD;
goto done);
695 if (pcb->state == LISTEN) {
696 lpcb = (
struct tcp_pcb_listen*)pcb;
705 for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb !=
NULL; lpcb = lpcb->next) {
706 if ((lpcb->local_port == pcb->local_port) &&
716 lpcb = (
struct tcp_pcb_listen *)
memp_malloc(MEMP_TCP_PCB_LISTEN);
721 lpcb->callback_arg = pcb->callback_arg;
722 lpcb->local_port = pcb->local_port;
723 lpcb->state = LISTEN;
724 lpcb->prio = pcb->prio;
725 lpcb->so_options = pcb->so_options;
726 lpcb->ttl = pcb->ttl;
727 lpcb->tos = pcb->tos;
728 #if LWIP_IPV4 && LWIP_IPV6
732 if (pcb->local_port != 0) {
733 TCP_RMV(&tcp_bound_pcbs, pcb);
736 #if LWIP_CALLBACK_API
737 lpcb->accept = tcp_accept_null;
739 #if TCP_LISTEN_BACKLOG
740 lpcb->accepts_pending = 0;
741 tcp_backlog_set(lpcb, backlog);
743 TCP_REG(&tcp_listen_pcbs.pcbs, (
struct tcp_pcb *)lpcb);
749 return (
struct tcp_pcb *)lpcb;
759 tcp_update_rcv_ann_wnd(
struct tcp_pcb *pcb)
761 u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
763 if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge +
LWIP_MIN((
TCP_WND / 2), pcb->mss))) {
765 pcb->rcv_ann_wnd = pcb->rcv_wnd;
766 return new_right_edge - pcb->rcv_ann_right_edge;
768 if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) {
771 pcb->rcv_ann_wnd = 0;
774 u32_t new_rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt;
776 LWIP_ASSERT(
"new_rcv_ann_wnd <= 0xffff", new_rcv_ann_wnd <= 0xffff);
778 pcb->rcv_ann_wnd = (tcpwnd_size_t)new_rcv_ann_wnd;
794 tcp_recved(
struct tcp_pcb *pcb,
u16_t len)
799 LWIP_ASSERT(
"don't call tcp_recved for listen-pcbs",
800 pcb->state != LISTEN);
803 if (pcb->rcv_wnd > TCP_WND_MAX(pcb)) {
804 pcb->rcv_wnd = TCP_WND_MAX(pcb);
805 }
else if (pcb->rcv_wnd == 0) {
807 if ((pcb->state == CLOSE_WAIT) || (pcb->state == LAST_ACK)) {
811 pcb->rcv_wnd = TCP_WND_MAX(pcb);
813 LWIP_ASSERT(
"tcp_recved: len wrapped rcv_wnd\n", 0);
817 wnd_inflation = tcp_update_rcv_ann_wnd(pcb);
829 len, pcb->rcv_wnd, (
u16_t)(TCP_WND_MAX(pcb) - pcb->rcv_wnd)));
845 if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) {
846 tcp_port = TCP_LOCAL_PORT_RANGE_START;
849 for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
850 for (pcb = *tcp_pcb_lists[i]; pcb !=
NULL; pcb = pcb->next) {
851 if (pcb->local_port == tcp_port) {
852 if (++n > (TCP_LOCAL_PORT_RANGE_END - TCP_LOCAL_PORT_RANGE_START)) {
877 tcp_connect(
struct tcp_pcb *pcb,
const ip_addr_t *ipaddr,
u16_t port,
878 tcp_connected_fn connected)
882 u16_t old_local_port;
884 if ((pcb ==
NULL) || (ipaddr ==
NULL)) {
888 LWIP_ERROR(
"tcp_connect: can only connect from state CLOSED", pcb->state == CLOSED,
return ERR_ISCONN);
892 pcb->remote_port = port;
909 old_local_port = pcb->local_port;
910 if (pcb->local_port == 0) {
911 pcb->local_port = tcp_new_port();
912 if (pcb->local_port == 0) {
920 struct tcp_pcb *cpcb;
923 for (i = 2; i < NUM_TCP_PCB_LISTS; i++) {
924 for (cpcb = *tcp_pcb_lists[i]; cpcb !=
NULL; cpcb = cpcb->next) {
925 if ((cpcb->local_port == pcb->local_port) &&
926 (cpcb->remote_port == port) &&
938 iss = tcp_next_iss(pcb);
941 pcb->lastack = iss - 1;
942 pcb->snd_wl2 = iss - 1;
943 pcb->snd_lbb = iss - 1;
946 pcb->rcv_wnd = pcb->rcv_ann_wnd = TCPWND_MIN16(
TCP_WND);
947 pcb->rcv_ann_right_edge = pcb->rcv_nxt;
951 pcb->mss = INITIAL_MSS;
952 #if TCP_CALCULATE_EFF_SEND_MSS
953 pcb->mss = tcp_eff_send_mss(pcb->mss, &pcb->local_ip, &pcb->remote_ip);
956 #if LWIP_CALLBACK_API
957 pcb->connected = connected;
963 ret = tcp_enqueue_flags(pcb,
TCP_SYN);
966 pcb->state = SYN_SENT;
967 if (old_local_port != 0) {
968 TCP_RMV(&tcp_bound_pcbs, pcb);
988 struct tcp_pcb *pcb, *prev;
989 tcpwnd_size_t eff_wnd;
1002 pcb = tcp_active_pcbs;
1006 while (pcb !=
NULL) {
1008 LWIP_ASSERT(
"tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED);
1009 LWIP_ASSERT(
"tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN);
1010 LWIP_ASSERT(
"tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT);
1011 if (pcb->last_timer == tcp_timer_ctr) {
1016 pcb->last_timer = tcp_timer_ctr;
1029 if (pcb->persist_backoff > 0) {
1032 u8_t backoff_cnt = tcp_persist_backoff[pcb->persist_backoff-1];
1033 if (pcb->persist_cnt < backoff_cnt) {
1036 if (pcb->persist_cnt >= backoff_cnt) {
1037 if (tcp_zero_window_probe(pcb) ==
ERR_OK) {
1038 pcb->persist_cnt = 0;
1039 if (pcb->persist_backoff <
sizeof(tcp_persist_backoff)) {
1040 pcb->persist_backoff++;
1046 if (pcb->rtime >= 0) {
1050 if (pcb->unacked !=
NULL && pcb->rtime >= pcb->rto) {
1053 " pcb->rto %"S16_F"\n",
1054 pcb->rtime, pcb->rto));
1058 if (pcb->state != SYN_SENT) {
1059 u8_t backoff_idx =
LWIP_MIN(pcb->nrtx,
sizeof(tcp_backoff)-1);
1060 pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[backoff_idx];
1067 eff_wnd =
LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
1068 pcb->ssthresh = eff_wnd >> 1;
1069 if (pcb->ssthresh < (tcpwnd_size_t)(pcb->mss << 1)) {
1070 pcb->ssthresh = (pcb->mss << 1);
1072 pcb->cwnd = pcb->mss;
1074 " ssthresh %"TCPWNDSIZE_F
"\n",
1075 pcb->cwnd, pcb->ssthresh));
1079 tcp_rexmit_rto(pcb);
1084 if (pcb->state == FIN_WAIT_2) {
1086 if (pcb->flags & TF_RXCLOSED) {
1089 if ((
u32_t)(tcp_ticks - pcb->tmr) >
1090 TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) {
1099 ((pcb->state == ESTABLISHED) ||
1100 (pcb->state == CLOSE_WAIT))) {
1101 if ((
u32_t)(tcp_ticks - pcb->tmr) >
1102 (pcb->keep_idle + TCP_KEEP_DUR(pcb)) / TCP_SLOW_INTERVAL)
1110 }
else if ((
u32_t)(tcp_ticks - pcb->tmr) >
1111 (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEP_INTVL(pcb))
1112 / TCP_SLOW_INTERVAL)
1114 err = tcp_keepalive(pcb);
1116 pcb->keep_cnt_sent++;
1125 if (pcb->ooseq !=
NULL &&
1126 (
u32_t)tcp_ticks - pcb->tmr >= pcb->rto * TCP_OOSEQ_TIMEOUT) {
1127 tcp_segs_free(pcb->ooseq);
1134 if (pcb->state == SYN_RCVD) {
1135 if ((
u32_t)(tcp_ticks - pcb->tmr) >
1136 TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) {
1143 if (pcb->state == LAST_ACK) {
1144 if ((
u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
1152 struct tcp_pcb *pcb2;
1153 #if LWIP_CALLBACK_API
1154 tcp_err_fn err_fn = pcb->errf;
1157 enum tcp_state last_state;
1161 LWIP_ASSERT(
"tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs);
1162 prev->next = pcb->next;
1165 LWIP_ASSERT(
"tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb);
1166 tcp_active_pcbs = pcb->next;
1170 tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
1171 pcb->local_port, pcb->remote_port);
1174 err_arg = pcb->callback_arg;
1175 last_state = pcb->state;
1180 tcp_active_pcbs_changed = 0;
1181 TCP_EVENT_ERR(last_state, err_fn, err_arg,
ERR_ABRT);
1182 if (tcp_active_pcbs_changed) {
1183 goto tcp_slowtmr_start;
1192 if (prev->polltmr >= prev->pollinterval) {
1195 tcp_active_pcbs_changed = 0;
1196 TCP_EVENT_POLL(prev, err);
1197 if (tcp_active_pcbs_changed) {
1198 goto tcp_slowtmr_start;
1212 while (pcb !=
NULL) {
1213 LWIP_ASSERT(
"tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
1217 if ((
u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
1223 struct tcp_pcb *pcb2;
1227 LWIP_ASSERT(
"tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs);
1228 prev->next = pcb->next;
1231 LWIP_ASSERT(
"tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
1232 tcp_tw_pcbs = pcb->next;
1253 struct tcp_pcb *pcb;
1258 pcb = tcp_active_pcbs;
1260 while (pcb !=
NULL) {
1261 if (pcb->last_timer != tcp_timer_ctr) {
1262 struct tcp_pcb *next;
1263 pcb->last_timer = tcp_timer_ctr;
1265 if (pcb->flags & TF_ACK_DELAY) {
1269 pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
1272 if (pcb->flags & TF_CLOSEPEND) {
1274 pcb->flags &= ~(TF_CLOSEPEND);
1275 tcp_close_shutdown_fin(pcb);
1281 if (pcb->refused_data !=
NULL) {
1282 tcp_active_pcbs_changed = 0;
1283 tcp_process_refused_data(pcb);
1284 if (tcp_active_pcbs_changed) {
1286 goto tcp_fasttmr_start;
1300 struct tcp_pcb *pcb;
1302 for (pcb = tcp_active_pcbs; pcb !=
NULL; pcb = pcb->next) {
1303 if (pcb->flags & TF_NAGLEMEMERR) {
1311 tcp_process_refused_data(
struct tcp_pcb *pcb)
1313 #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
1315 while (pcb->refused_data !=
NULL)
1319 u8_t refused_flags = pcb->refused_data->
flags;
1322 struct pbuf *refused_data = pcb->refused_data;
1323 #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
1324 pbuf_split_64k(refused_data, &rest);
1325 pcb->refused_data = rest;
1327 pcb->refused_data =
NULL;
1331 TCP_EVENT_RECV(pcb, refused_data,
ERR_OK, err);
1341 if (pcb->rcv_wnd != TCP_WND_MAX(pcb)) {
1344 TCP_EVENT_CLOSED(pcb, err);
1357 #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
1362 pcb->refused_data = refused_data;
1375 tcp_segs_free(
struct tcp_seg *seg)
1377 while (seg !=
NULL) {
1378 struct tcp_seg *next = seg->next;
1390 tcp_seg_free(
struct tcp_seg *seg)
1393 if (seg->p !=
NULL) {
1410 tcp_setprio(
struct tcp_pcb *pcb,
u8_t prio)
1424 tcp_seg_copy(
struct tcp_seg *seg)
1426 struct tcp_seg *cseg;
1428 cseg = (
struct tcp_seg *)
memp_malloc(MEMP_TCP_SEG);
1438 #if LWIP_CALLBACK_API
1444 tcp_recv_null(
void *arg,
struct tcp_pcb *pcb,
struct pbuf *p,
err_t err)
1450 }
else if (err ==
ERR_OK) {
1451 return tcp_close(pcb);
1464 tcp_kill_prio(
u8_t prio)
1466 struct tcp_pcb *pcb, *inactive;
1470 mprio =
LWIP_MIN(TCP_PRIO_MAX, prio);
1475 for (pcb = tcp_active_pcbs; pcb !=
NULL; pcb = pcb->next) {
1476 if (pcb->prio <= mprio &&
1477 (
u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
1478 inactivity = tcp_ticks - pcb->tmr;
1483 if (inactive !=
NULL) {
1485 (
void *)inactive, inactivity));
1486 tcp_abort(inactive);
1495 tcp_kill_state(
enum tcp_state state)
1497 struct tcp_pcb *pcb, *inactive;
1500 LWIP_ASSERT(
"invalid state", (state == CLOSING) || (state == LAST_ACK));
1506 for (pcb = tcp_active_pcbs; pcb !=
NULL; pcb = pcb->next) {
1507 if (pcb->state == state) {
1508 if ((
u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
1509 inactivity = tcp_ticks - pcb->tmr;
1514 if (inactive !=
NULL) {
1516 tcp_state_str[state], (
void *)inactive, inactivity));
1518 tcp_abandon(inactive, 0);
1527 tcp_kill_timewait(
void)
1529 struct tcp_pcb *pcb, *inactive;
1535 for (pcb = tcp_tw_pcbs; pcb !=
NULL; pcb = pcb->next) {
1536 if ((
u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
1537 inactivity = tcp_ticks - pcb->tmr;
1541 if (inactive !=
NULL) {
1543 (
void *)inactive, inactivity));
1544 tcp_abort(inactive);
1555 tcp_alloc(
u8_t prio)
1557 struct tcp_pcb *pcb;
1559 pcb = (
struct tcp_pcb *)
memp_malloc(MEMP_TCP_PCB);
1563 tcp_kill_timewait();
1565 pcb = (
struct tcp_pcb *)
memp_malloc(MEMP_TCP_PCB);
1569 tcp_kill_state(LAST_ACK);
1571 pcb = (
struct tcp_pcb *)
memp_malloc(MEMP_TCP_PCB);
1575 tcp_kill_state(CLOSING);
1577 pcb = (
struct tcp_pcb *)
memp_malloc(MEMP_TCP_PCB);
1581 tcp_kill_prio(prio);
1583 pcb = (
struct tcp_pcb *)
memp_malloc(MEMP_TCP_PCB);
1606 memset(pcb, 0,
sizeof(
struct tcp_pcb));
1611 pcb->rcv_wnd = pcb->rcv_ann_wnd = TCPWND_MIN16(
TCP_WND);
1615 pcb->mss = INITIAL_MSS;
1616 pcb->rto = 3000 / TCP_SLOW_INTERVAL;
1617 pcb->sv = 3000 / TCP_SLOW_INTERVAL;
1620 pcb->tmr = tcp_ticks;
1621 pcb->last_timer = tcp_timer_ctr;
1631 #if LWIP_CALLBACK_API
1632 pcb->recv = tcp_recv_null;
1636 pcb->keep_idle = TCP_KEEPIDLE_DEFAULT;
1638 #if LWIP_TCP_KEEPALIVE
1639 pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT;
1640 pcb->keep_cnt = TCP_KEEPCNT_DEFAULT;
1662 return tcp_alloc(TCP_PRIO_NORMAL);
1677 tcp_new_ip_type(
u8_t type)
1679 struct tcp_pcb * pcb;
1680 pcb = tcp_alloc(TCP_PRIO_NORMAL);
1681 #if LWIP_IPV4 && LWIP_IPV6
1701 tcp_arg(
struct tcp_pcb *pcb,
void *arg)
1706 pcb->callback_arg = arg;
1709 #if LWIP_CALLBACK_API
1720 tcp_recv(
struct tcp_pcb *pcb, tcp_recv_fn recv)
1723 LWIP_ASSERT(
"invalid socket state for recv callback", pcb->state != LISTEN);
1737 tcp_sent(
struct tcp_pcb *pcb, tcp_sent_fn sent)
1740 LWIP_ASSERT(
"invalid socket state for sent callback", pcb->state != LISTEN);
1757 tcp_err(
struct tcp_pcb *pcb, tcp_err_fn err)
1760 LWIP_ASSERT(
"invalid socket state for err callback", pcb->state != LISTEN);
1775 tcp_accept(
struct tcp_pcb *pcb, tcp_accept_fn accept)
1777 if ((pcb !=
NULL) && (pcb->state == LISTEN)) {
1778 struct tcp_pcb_listen *lpcb = (
struct tcp_pcb_listen*)pcb;
1779 lpcb->accept = accept;
1793 tcp_poll(
struct tcp_pcb *pcb, tcp_poll_fn poll,
u8_t interval)
1795 LWIP_ASSERT(
"invalid socket state for poll", pcb->state != LISTEN);
1796 #if LWIP_CALLBACK_API
1801 pcb->pollinterval = interval;
1811 tcp_pcb_purge(
struct tcp_pcb *pcb)
1813 if (pcb->state != CLOSED &&
1814 pcb->state != TIME_WAIT &&
1815 pcb->state != LISTEN) {
1819 tcp_backlog_accepted(pcb);
1821 if (pcb->refused_data !=
NULL) {
1824 pcb->refused_data =
NULL;
1826 if (pcb->unsent !=
NULL) {
1829 if (pcb->unacked !=
NULL) {
1833 if (pcb->ooseq !=
NULL) {
1836 tcp_segs_free(pcb->ooseq);
1844 tcp_segs_free(pcb->unsent);
1845 tcp_segs_free(pcb->unacked);
1846 pcb->unacked = pcb->unsent =
NULL;
1848 pcb->unsent_oversize = 0;
1860 tcp_pcb_remove(
struct tcp_pcb **pcblist,
struct tcp_pcb *pcb)
1862 TCP_RMV(pcblist, pcb);
1867 if (pcb->state != TIME_WAIT &&
1868 pcb->state != LISTEN &&
1869 pcb->flags & TF_ACK_DELAY) {
1870 pcb->flags |= TF_ACK_NOW;
1874 if (pcb->state != LISTEN) {
1882 pcb->state = CLOSED;
1884 pcb->local_port = 0;
1886 LWIP_ASSERT(
"tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane());
1895 tcp_next_iss(
struct tcp_pcb *pcb)
1897 #ifdef LWIP_HOOK_TCP_ISN
1898 return LWIP_HOOK_TCP_ISN(&pcb->local_ip, pcb->local_port, &pcb->remote_ip, pcb->remote_port);
1900 static u32_t iss = 6510;
1909 #if TCP_CALCULATE_EFF_SEND_MSS
1923 struct netif *outif;
1926 outif = ip_route(src, dest);
1933 mtu = nd6_get_destination_mtu(
ip_2_ip6(dest), outif);
1941 if (outif ==
NULL) {
1969 sendmss =
LWIP_MIN(sendmss, mss_s);
1977 tcp_netif_ip_addr_changed_pcblist(
const ip_addr_t* old_addr,
struct tcp_pcb* pcb_list)
1979 struct tcp_pcb *pcb;
1981 while (pcb !=
NULL) {
1986 && (!
IP_IS_V4_VAL(pcb->local_ip) || !ip4_addr_islinklocal(ip_2_ip4(&pcb->local_ip)))
1990 struct tcp_pcb *next = pcb->next;
2008 struct tcp_pcb_listen *lpcb, *next;
2011 tcp_netif_ip_addr_changed_pcblist(old_addr, tcp_active_pcbs);
2012 tcp_netif_ip_addr_changed_pcblist(old_addr, tcp_bound_pcbs);
2016 for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb !=
NULL; lpcb = next) {
2030 tcp_debug_state_str(
enum tcp_state s)
2032 return tcp_state_str[s];
2035 #if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG
2042 tcp_debug_print(
struct tcp_hdr *tcphdr)
2078 tcp_debug_print_state(
enum tcp_state s)
2089 tcp_debug_print_flags(
u8_t flags)
2122 tcp_debug_print_pcbs(
void)
2124 struct tcp_pcb *pcb;
2125 struct tcp_pcb_listen *pcbl;
2128 for (pcb = tcp_active_pcbs; pcb !=
NULL; pcb = pcb->next) {
2130 pcb->local_port, pcb->remote_port,
2131 pcb->snd_nxt, pcb->rcv_nxt));
2132 tcp_debug_print_state(pcb->state);
2136 for (pcbl = tcp_listen_pcbs.listen_pcbs; pcbl !=
NULL; pcbl = pcbl->next) {
2138 tcp_debug_print_state(pcbl->state);
2142 for (pcb = tcp_tw_pcbs; pcb !=
NULL; pcb = pcb->next) {
2144 pcb->local_port, pcb->remote_port,
2145 pcb->snd_nxt, pcb->rcv_nxt));
2146 tcp_debug_print_state(pcb->state);
2156 struct tcp_pcb *pcb;
2157 for (pcb = tcp_active_pcbs; pcb !=
NULL; pcb = pcb->next) {
2158 LWIP_ASSERT(
"tcp_pcbs_sane: active pcb->state != CLOSED", pcb->state != CLOSED);
2159 LWIP_ASSERT(
"tcp_pcbs_sane: active pcb->state != LISTEN", pcb->state != LISTEN);
2160 LWIP_ASSERT(
"tcp_pcbs_sane: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
2162 for (pcb = tcp_tw_pcbs; pcb !=
NULL; pcb = pcb->next) {
2163 LWIP_ASSERT(
"tcp_pcbs_sane: tw pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);