60 #ifndef TCP_LOCAL_PORT_RANGE_START 63 #define TCP_LOCAL_PORT_RANGE_START 0xc000 64 #define TCP_LOCAL_PORT_RANGE_END 0xffff 65 #define TCP_ENSURE_LOCAL_PORT_RANGE(port) ((u16_t)(((port) & ~TCP_LOCAL_PORT_RANGE_START) + TCP_LOCAL_PORT_RANGE_START)) 68 #if LWIP_TCP_KEEPALIVE 69 #define TCP_KEEP_DUR(pcb) ((pcb)->keep_cnt * (pcb)->keep_intvl) 70 #define TCP_KEEP_INTVL(pcb) ((pcb)->keep_intvl) 72 #define TCP_KEEP_DUR(pcb) TCP_MAXIDLE 73 #define TCP_KEEP_INTVL(pcb) TCP_KEEPINTVL_DEFAULT 76 const char *
const tcp_state_str[] = {
91 static u16_t tcp_port = TCP_LOCAL_PORT_RANGE_START;
95 const u8_t tcp_backoff[13] =
96 { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7};
98 const u8_t tcp_persist_backoff[7] = { 3, 6, 12, 24, 48, 96, 120 };
103 struct tcp_pcb *tcp_bound_pcbs;
105 union tcp_listen_pcbs_t tcp_listen_pcbs;
108 struct tcp_pcb *tcp_active_pcbs;
110 struct tcp_pcb *tcp_tw_pcbs;
113 struct tcp_pcb **
const tcp_pcb_lists[] = {&tcp_listen_pcbs.pcbs, &tcp_bound_pcbs,
114 &tcp_active_pcbs, &tcp_tw_pcbs};
116 u8_t tcp_active_pcbs_changed;
119 static u8_t tcp_timer;
120 static u8_t tcp_timer_ctr;
121 static u16_t tcp_new_port(
void);
129 #if LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) 130 tcp_port = TCP_ENSURE_LOCAL_PORT_RANGE(
LWIP_RAND());
143 if (++tcp_timer & 1) {
167 tcp_close_shutdown(
struct tcp_pcb *pcb,
u8_t rst_on_unacked_data)
171 if (rst_on_unacked_data && ((pcb->state == ESTABLISHED) || (pcb->state == CLOSE_WAIT))) {
172 if ((pcb->refused_data !=
NULL) || (pcb->rcv_wnd != TCP_WND_MAX(pcb))) {
175 LWIP_ASSERT(
"pcb->flags & TF_RXCLOSED", pcb->flags & TF_RXCLOSED);
179 tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
180 pcb->local_port, pcb->remote_port);
184 if (pcb->state == ESTABLISHED) {
186 pcb->state = TIME_WAIT;
187 TCP_REG(&tcp_tw_pcbs, pcb);
190 if (tcp_input_pcb == pcb) {
192 tcp_trigger_input_pcb_close();
201 switch (pcb->state) {
211 if (pcb->local_port != 0) {
212 TCP_RMV(&tcp_bound_pcbs, pcb);
219 tcp_pcb_remove(&tcp_listen_pcbs.pcbs, pcb);
225 TCP_PCB_REMOVE_ACTIVE(pcb);
231 err = tcp_send_fin(pcb);
234 pcb->state = FIN_WAIT_1;
238 err = tcp_send_fin(pcb);
241 pcb->state = FIN_WAIT_1;
245 err = tcp_send_fin(pcb);
248 pcb->state = LAST_ACK;
284 tcp_close(
struct tcp_pcb *pcb)
287 tcp_debug_print_state(pcb->state);
289 if (pcb->state != LISTEN) {
291 pcb->flags |= TF_RXCLOSED;
294 return tcp_close_shutdown(pcb, 1);
310 tcp_shutdown(
struct tcp_pcb *pcb,
int shut_rx,
int shut_tx)
312 if (pcb->state == LISTEN) {
317 pcb->flags |= TF_RXCLOSED;
320 return tcp_close_shutdown(pcb, 1);
323 if (pcb->refused_data !=
NULL) {
325 pcb->refused_data =
NULL;
331 switch (pcb->state) {
335 return tcp_close_shutdown(pcb, (
u8_t)shut_rx);
354 tcp_abandon(
struct tcp_pcb *pcb,
int reset)
357 #if LWIP_CALLBACK_API 363 LWIP_ASSERT(
"don't call tcp_abort/tcp_abandon for listen-pcbs",
364 pcb->state != LISTEN);
368 if (pcb->state == TIME_WAIT) {
369 tcp_pcb_remove(&tcp_tw_pcbs, pcb);
373 u16_t local_port = 0;
374 seqno = pcb->snd_nxt;
375 ackno = pcb->rcv_nxt;
376 #if LWIP_CALLBACK_API 379 errf_arg = pcb->callback_arg;
380 if ((pcb->state == CLOSED) && (pcb->local_port != 0)) {
382 TCP_RMV(&tcp_bound_pcbs, pcb);
385 local_port = pcb->local_port;
386 TCP_PCB_REMOVE_ACTIVE(pcb);
388 if (pcb->unacked !=
NULL) {
389 tcp_segs_free(pcb->unacked);
391 if (pcb->unsent !=
NULL) {
392 tcp_segs_free(pcb->unsent);
395 if (pcb->ooseq !=
NULL) {
396 tcp_segs_free(pcb->ooseq);
401 tcp_rst(seqno, ackno, &pcb->local_ip, &pcb->remote_ip, local_port, pcb->remote_port);
404 TCP_EVENT_ERR(errf, errf_arg,
ERR_ABRT);
419 tcp_abort(
struct tcp_pcb *pcb)
439 tcp_bind(
struct tcp_pcb *pcb,
const ip_addr_t *ipaddr,
u16_t port)
442 int max_pcb_list = NUM_TCP_PCB_LISTS;
443 struct tcp_pcb *cpcb;
449 LWIP_ERROR(
"tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED,
return ERR_VAL);
458 max_pcb_list = NUM_TCP_PCB_LISTS_NO_TIME_WAIT;
463 port = tcp_new_port();
469 for (i = 0; i < max_pcb_list; i++) {
470 for (cpcb = *tcp_pcb_lists[i]; cpcb !=
NULL; cpcb = cpcb->next) {
471 if (cpcb->local_port == port) {
496 pcb->local_port = port;
497 TCP_REG(&tcp_bound_pcbs, pcb);
501 #if LWIP_CALLBACK_API 506 tcp_accept_null(
void *arg,
struct tcp_pcb *pcb,
err_t err)
532 tcp_listen_with_backlog(
struct tcp_pcb *pcb,
u8_t backlog)
534 struct tcp_pcb_listen *lpcb;
537 LWIP_ERROR(
"tcp_listen: pcb already connected", pcb->state == CLOSED,
return NULL);
540 if (pcb->state == LISTEN) {
548 for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb !=
NULL; lpcb = lpcb->next) {
549 if ((lpcb->local_port == pcb->local_port) &&
551 if (
ip_addr_cmp(&lpcb->local_ip, &pcb->local_ip)) {
559 lpcb = (
struct tcp_pcb_listen *)
memp_malloc(MEMP_TCP_PCB_LISTEN);
563 lpcb->callback_arg = pcb->callback_arg;
564 lpcb->local_port = pcb->local_port;
565 lpcb->state = LISTEN;
566 lpcb->prio = pcb->prio;
567 lpcb->so_options = pcb->so_options;
568 lpcb->ttl = pcb->ttl;
569 lpcb->tos = pcb->tos;
570 #if LWIP_IPV4 && LWIP_IPV6 572 lpcb->accept_any_ip_version = 0;
575 if (pcb->local_port != 0) {
576 TCP_RMV(&tcp_bound_pcbs, pcb);
579 #if LWIP_CALLBACK_API 580 lpcb->accept = tcp_accept_null;
582 #if TCP_LISTEN_BACKLOG 583 lpcb->accepts_pending = 0;
584 lpcb->backlog = (backlog ? backlog : 1);
586 TCP_REG(&tcp_listen_pcbs.pcbs, (
struct tcp_pcb *)lpcb);
587 return (
struct tcp_pcb *)lpcb;
590 #if LWIP_IPV4 && LWIP_IPV6 596 tcp_listen_dual_with_backlog(
struct tcp_pcb *pcb,
u8_t backlog)
598 struct tcp_pcb *lpcb;
599 struct tcp_pcb_listen *l;
601 if (pcb->local_port != 0) {
604 for (l = tcp_listen_pcbs.listen_pcbs; l !=
NULL; l = l->next) {
605 if (l->local_port == pcb->local_port) {
612 lpcb = tcp_listen_with_backlog(pcb, backlog);
613 if ((lpcb !=
NULL) &&
618 ((
struct tcp_pcb_listen*)lpcb)->accept_any_ip_version = 1;
630 u32_t tcp_update_rcv_ann_wnd(
struct tcp_pcb *pcb)
632 u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
634 if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge +
LWIP_MIN((
TCP_WND / 2), pcb->mss))) {
636 pcb->rcv_ann_wnd = pcb->rcv_wnd;
637 return new_right_edge - pcb->rcv_ann_right_edge;
639 if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) {
642 pcb->rcv_ann_wnd = 0;
645 u32_t new_rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt;
647 LWIP_ASSERT(
"new_rcv_ann_wnd <= 0xffff", new_rcv_ann_wnd <= 0xffff);
649 pcb->rcv_ann_wnd = (tcpwnd_size_t)new_rcv_ann_wnd;
664 tcp_recved(
struct tcp_pcb *pcb,
u16_t len)
669 LWIP_ASSERT(
"don't call tcp_recved for listen-pcbs",
670 pcb->state != LISTEN);
673 if (pcb->rcv_wnd > TCP_WND_MAX(pcb)) {
674 pcb->rcv_wnd = TCP_WND_MAX(pcb);
675 }
else if (pcb->rcv_wnd == 0) {
677 if ((pcb->state == CLOSE_WAIT) || (pcb->state == LAST_ACK)) {
681 pcb->rcv_wnd = TCP_WND_MAX(pcb);
683 LWIP_ASSERT(
"tcp_recved: len wrapped rcv_wnd\n", 0);
687 wnd_inflation = tcp_update_rcv_ann_wnd(pcb);
699 len, pcb->rcv_wnd, TCP_WND_MAX(pcb) - pcb->rcv_wnd));
715 if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) {
716 tcp_port = TCP_LOCAL_PORT_RANGE_START;
719 for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
720 for (pcb = *tcp_pcb_lists[i]; pcb !=
NULL; pcb = pcb->next) {
721 if (pcb->local_port == tcp_port) {
722 if (++n > (TCP_LOCAL_PORT_RANGE_END - TCP_LOCAL_PORT_RANGE_START)) {
746 tcp_connect(
struct tcp_pcb *pcb,
const ip_addr_t *ipaddr,
u16_t port,
747 tcp_connected_fn connected)
751 u16_t old_local_port;
757 LWIP_ERROR(
"tcp_connect: can only connect from state CLOSED", pcb->state == CLOSED,
return ERR_ISCONN);
760 if (ipaddr !=
NULL) {
765 pcb->remote_port = port;
773 if ((netif ==
NULL) || (local_ip ==
NULL)) {
782 old_local_port = pcb->local_port;
783 if (pcb->local_port == 0) {
784 pcb->local_port = tcp_new_port();
785 if (pcb->local_port == 0) {
793 struct tcp_pcb *cpcb;
796 for (i = 2; i < NUM_TCP_PCB_LISTS; i++) {
797 for (cpcb = *tcp_pcb_lists[i]; cpcb !=
NULL; cpcb = cpcb->next) {
798 if ((cpcb->local_port == pcb->local_port) &&
799 (cpcb->remote_port == port) &&
812 iss = tcp_next_iss();
815 pcb->lastack = iss - 1;
816 pcb->snd_lbb = iss - 1;
819 pcb->rcv_wnd = pcb->rcv_ann_wnd = TCPWND_MIN16(
TCP_WND);
820 pcb->rcv_ann_right_edge = pcb->rcv_nxt;
825 #if TCP_CALCULATE_EFF_SEND_MSS 826 pcb->mss = tcp_eff_send_mss(pcb->mss, &pcb->local_ip, &pcb->remote_ip,
PCB_ISIPV6(pcb));
830 #if LWIP_CALLBACK_API 831 pcb->connected = connected;
837 ret = tcp_enqueue_flags(pcb, TCP_SYN);
840 pcb->state = SYN_SENT;
841 if (old_local_port != 0) {
842 TCP_RMV(&tcp_bound_pcbs, pcb);
862 struct tcp_pcb *pcb, *prev;
863 tcpwnd_size_t eff_wnd;
876 pcb = tcp_active_pcbs;
880 while (pcb !=
NULL) {
882 LWIP_ASSERT(
"tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED);
883 LWIP_ASSERT(
"tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN);
884 LWIP_ASSERT(
"tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT);
885 if (pcb->last_timer == tcp_timer_ctr) {
890 pcb->last_timer = tcp_timer_ctr;
903 if (pcb->persist_backoff > 0) {
906 u8_t backoff_cnt = tcp_persist_backoff[pcb->persist_backoff-1];
907 if (pcb->persist_cnt < backoff_cnt) {
910 if (pcb->persist_cnt >= backoff_cnt) {
911 if (tcp_zero_window_probe(pcb) ==
ERR_OK) {
912 pcb->persist_cnt = 0;
913 if (pcb->persist_backoff <
sizeof(tcp_persist_backoff)) {
914 pcb->persist_backoff++;
920 if (pcb->rtime >= 0) {
924 if (pcb->unacked !=
NULL && pcb->rtime >= pcb->rto) {
927 " pcb->rto %"S16_F"\n",
928 pcb->rtime, pcb->rto));
932 if (pcb->state != SYN_SENT) {
933 pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[pcb->nrtx];
940 eff_wnd =
LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
941 pcb->ssthresh = eff_wnd >> 1;
942 if (pcb->ssthresh < (tcpwnd_size_t)(pcb->mss << 1)) {
943 pcb->ssthresh = (pcb->mss << 1);
945 pcb->cwnd = pcb->mss;
947 " ssthresh %"TCPWNDSIZE_F
"\n",
948 pcb->cwnd, pcb->ssthresh));
957 if (pcb->state == FIN_WAIT_2) {
959 if (pcb->flags & TF_RXCLOSED) {
962 if ((
u32_t)(tcp_ticks - pcb->tmr) >
963 TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) {
972 ((pcb->state == ESTABLISHED) ||
973 (pcb->state == CLOSE_WAIT))) {
974 if ((
u32_t)(tcp_ticks - pcb->tmr) >
975 (pcb->keep_idle + TCP_KEEP_DUR(pcb)) / TCP_SLOW_INTERVAL)
983 }
else if ((
u32_t)(tcp_ticks - pcb->tmr) >
984 (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEP_INTVL(pcb))
987 err = tcp_keepalive(pcb);
989 pcb->keep_cnt_sent++;
998 if (pcb->ooseq !=
NULL &&
999 (
u32_t)tcp_ticks - pcb->tmr >= pcb->rto * TCP_OOSEQ_TIMEOUT) {
1000 tcp_segs_free(pcb->ooseq);
1007 if (pcb->state == SYN_RCVD) {
1008 if ((
u32_t)(tcp_ticks - pcb->tmr) >
1009 TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) {
1016 if (pcb->state == LAST_ACK) {
1017 if ((
u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
1025 struct tcp_pcb *pcb2;
1031 LWIP_ASSERT(
"tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs);
1032 prev->next = pcb->next;
1035 LWIP_ASSERT(
"tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb);
1036 tcp_active_pcbs = pcb->next;
1040 tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
1041 pcb->local_port, pcb->remote_port);
1045 err_arg = pcb->callback_arg;
1050 tcp_active_pcbs_changed = 0;
1051 TCP_EVENT_ERR(err_fn, err_arg,
ERR_ABRT);
1052 if (tcp_active_pcbs_changed) {
1053 goto tcp_slowtmr_start;
1062 if (prev->polltmr >= prev->pollinterval) {
1065 tcp_active_pcbs_changed = 0;
1066 TCP_EVENT_POLL(prev, err);
1067 if (tcp_active_pcbs_changed) {
1068 goto tcp_slowtmr_start;
1082 while (pcb !=
NULL) {
1083 LWIP_ASSERT(
"tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
1087 if ((
u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
1093 struct tcp_pcb *pcb2;
1097 LWIP_ASSERT(
"tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs);
1098 prev->next = pcb->next;
1101 LWIP_ASSERT(
"tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
1102 tcp_tw_pcbs = pcb->next;
1123 struct tcp_pcb *pcb;
1128 pcb = tcp_active_pcbs;
1130 while (pcb !=
NULL) {
1131 if (pcb->last_timer != tcp_timer_ctr) {
1132 struct tcp_pcb *next;
1133 pcb->last_timer = tcp_timer_ctr;
1135 if (pcb->flags & TF_ACK_DELAY) {
1139 pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
1145 if (pcb->refused_data !=
NULL) {
1146 tcp_active_pcbs_changed = 0;
1147 tcp_process_refused_data(pcb);
1148 if (tcp_active_pcbs_changed) {
1150 goto tcp_fasttmr_start;
1164 struct tcp_pcb *pcb;
1166 for (pcb = tcp_active_pcbs; pcb !=
NULL; pcb = pcb->next) {
1167 if (pcb->flags & TF_NAGLEMEMERR) {
1175 tcp_process_refused_data(
struct tcp_pcb *pcb)
1177 #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE 1179 while (pcb->refused_data !=
NULL)
1183 u8_t refused_flags = pcb->refused_data->
flags;
1186 struct pbuf *refused_data = pcb->refused_data;
1187 #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE 1188 pbuf_split_64k(refused_data, &rest);
1189 pcb->refused_data = rest;
1191 pcb->refused_data =
NULL;
1195 TCP_EVENT_RECV(pcb, refused_data,
ERR_OK, err);
1205 if (pcb->rcv_wnd != TCP_WND_MAX(pcb)) {
1208 TCP_EVENT_CLOSED(pcb, err);
1221 #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE 1226 pcb->refused_data = refused_data;
1239 tcp_segs_free(
struct tcp_seg *seg)
1241 while (seg !=
NULL) {
1242 struct tcp_seg *next = seg->next;
1254 tcp_seg_free(
struct tcp_seg *seg)
1257 if (seg->p !=
NULL) {
1274 tcp_setprio(
struct tcp_pcb *pcb,
u8_t prio)
1288 tcp_seg_copy(
struct tcp_seg *seg)
1290 struct tcp_seg *cseg;
1292 cseg = (
struct tcp_seg *)
memp_malloc(MEMP_TCP_SEG);
1302 #if LWIP_CALLBACK_API 1308 tcp_recv_null(
void *arg,
struct tcp_pcb *pcb,
struct pbuf *p,
err_t err)
1314 }
else if (err ==
ERR_OK) {
1315 return tcp_close(pcb);
1328 tcp_kill_prio(
u8_t prio)
1330 struct tcp_pcb *pcb, *inactive;
1334 mprio =
LWIP_MIN(TCP_PRIO_MAX, prio);
1339 for (pcb = tcp_active_pcbs; pcb !=
NULL; pcb = pcb->next) {
1340 if (pcb->prio <= mprio &&
1341 (
u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
1342 inactivity = tcp_ticks - pcb->tmr;
1347 if (inactive !=
NULL) {
1349 (
void *)inactive, inactivity));
1350 tcp_abort(inactive);
1359 tcp_kill_state(
enum tcp_state state)
1361 struct tcp_pcb *pcb, *inactive;
1364 LWIP_ASSERT(
"invalid state", (state == CLOSING) || (state == LAST_ACK));
1370 for (pcb = tcp_active_pcbs; pcb !=
NULL; pcb = pcb->next) {
1371 if (pcb->state == state) {
1372 if ((
u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
1373 inactivity = tcp_ticks - pcb->tmr;
1378 if (inactive !=
NULL) {
1380 tcp_state_str[state], (
void *)inactive, inactivity));
1382 tcp_abandon(inactive, 0);
1391 tcp_kill_timewait(
void)
1393 struct tcp_pcb *pcb, *inactive;
1399 for (pcb = tcp_tw_pcbs; pcb !=
NULL; pcb = pcb->next) {
1400 if ((
u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
1401 inactivity = tcp_ticks - pcb->tmr;
1405 if (inactive !=
NULL) {
1407 (
void *)inactive, inactivity));
1408 tcp_abort(inactive);
1419 tcp_alloc(
u8_t prio)
1421 struct tcp_pcb *pcb;
1424 pcb = (
struct tcp_pcb *)
memp_malloc(MEMP_TCP_PCB);
1428 tcp_kill_timewait();
1430 pcb = (
struct tcp_pcb *)
memp_malloc(MEMP_TCP_PCB);
1434 tcp_kill_state(LAST_ACK);
1436 pcb = (
struct tcp_pcb *)
memp_malloc(MEMP_TCP_PCB);
1440 tcp_kill_state(CLOSING);
1442 pcb = (
struct tcp_pcb *)
memp_malloc(MEMP_TCP_PCB);
1446 tcp_kill_prio(prio);
1448 pcb = (
struct tcp_pcb *)
memp_malloc(MEMP_TCP_PCB);
1470 memset(pcb, 0,
sizeof(
struct tcp_pcb));
1473 pcb->snd_queuelen = 0;
1476 pcb->rcv_wnd = pcb->rcv_ann_wnd = TCPWND_MIN16(
TCP_WND);
1487 pcb->rto = 3000 / TCP_SLOW_INTERVAL;
1489 pcb->sv = 3000 / TCP_SLOW_INTERVAL;
1492 iss = tcp_next_iss();
1497 pcb->tmr = tcp_ticks;
1498 pcb->last_timer = tcp_timer_ctr;
1502 #if LWIP_CALLBACK_API 1503 pcb->recv = tcp_recv_null;
1507 pcb->keep_idle = TCP_KEEPIDLE_DEFAULT;
1509 #if LWIP_TCP_KEEPALIVE 1510 pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT;
1511 pcb->keep_cnt = TCP_KEEPCNT_DEFAULT;
1514 pcb->keep_cnt_sent = 0;
1534 return tcp_alloc(TCP_PRIO_NORMAL);
1548 struct tcp_pcb * pcb;
1549 pcb = tcp_alloc(TCP_PRIO_NORMAL);
1565 tcp_arg(
struct tcp_pcb *pcb,
void *arg)
1569 pcb->callback_arg = arg;
1571 #if LWIP_CALLBACK_API 1581 tcp_recv(
struct tcp_pcb *pcb, tcp_recv_fn recv)
1583 LWIP_ASSERT(
"invalid socket state for recv callback", pcb->state != LISTEN);
1595 tcp_sent(
struct tcp_pcb *pcb, tcp_sent_fn sent)
1597 LWIP_ASSERT(
"invalid socket state for sent callback", pcb->state != LISTEN);
1610 tcp_err(
struct tcp_pcb *pcb, tcp_err_fn err)
1612 LWIP_ASSERT(
"invalid socket state for err callback", pcb->state != LISTEN);
1625 tcp_accept(
struct tcp_pcb *pcb, tcp_accept_fn accept)
1629 pcb->accept = accept;
1641 tcp_poll(
struct tcp_pcb *pcb, tcp_poll_fn poll,
u8_t interval)
1643 LWIP_ASSERT(
"invalid socket state for poll", pcb->state != LISTEN);
1644 #if LWIP_CALLBACK_API 1649 pcb->pollinterval = interval;
1659 tcp_pcb_purge(
struct tcp_pcb *pcb)
1661 if (pcb->state != CLOSED &&
1662 pcb->state != TIME_WAIT &&
1663 pcb->state != LISTEN) {
1667 #if TCP_LISTEN_BACKLOG 1668 if (pcb->state == SYN_RCVD) {
1670 struct tcp_pcb_listen *lpcb;
1671 LWIP_ASSERT(
"tcp_pcb_purge: pcb->state == SYN_RCVD but tcp_listen_pcbs is NULL",
1672 tcp_listen_pcbs.listen_pcbs !=
NULL);
1673 for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb !=
NULL; lpcb = lpcb->next) {
1674 if ((lpcb->local_port == pcb->local_port) &&
1679 LWIP_ASSERT(
"tcp_pcb_purge: listen pcb does not have accepts pending",
1680 lpcb->accepts_pending > 0);
1681 lpcb->accepts_pending--;
1689 if (pcb->refused_data !=
NULL) {
1692 pcb->refused_data =
NULL;
1694 if (pcb->unsent !=
NULL) {
1697 if (pcb->unacked !=
NULL) {
1701 if (pcb->ooseq !=
NULL) {
1704 tcp_segs_free(pcb->ooseq);
1712 tcp_segs_free(pcb->unsent);
1713 tcp_segs_free(pcb->unacked);
1714 pcb->unacked = pcb->unsent =
NULL;
1716 pcb->unsent_oversize = 0;
1728 tcp_pcb_remove(
struct tcp_pcb **pcblist,
struct tcp_pcb *pcb)
1730 TCP_RMV(pcblist, pcb);
1735 if (pcb->state != TIME_WAIT &&
1736 pcb->state != LISTEN &&
1737 pcb->flags & TF_ACK_DELAY) {
1738 pcb->flags |= TF_ACK_NOW;
1742 if (pcb->state != LISTEN) {
1750 pcb->state = CLOSED;
1752 pcb->local_port = 0;
1754 LWIP_ASSERT(
"tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane());
1765 static u32_t iss = 6510;
1771 #if TCP_CALCULATE_EFF_SEND_MSS 1788 struct netif *outif;
1791 outif = ip_route(isipv6, src, dest);
1798 mtu = nd6_get_destination_mtu(
ip_2_ip6(dest), outif);
1806 if (outif ==
NULL) {
1819 mss_s = mtu - IP6_HLEN - TCP_HLEN;
1827 mss_s = mtu - IP_HLEN - TCP_HLEN;
1834 sendmss =
LWIP_MIN(sendmss, mss_s);
1843 tcp_netif_ipv4_addr_changed_pcblist(
const ip4_addr_t* old_addr,
struct tcp_pcb* pcb_list)
1845 struct tcp_pcb *pcb;
1847 while (pcb !=
NULL) {
1849 if (!
IP_IS_V6_VAL(pcb->local_ip) && ip4_addr_cmp(ip_2_ip4(&pcb->local_ip), old_addr)
1852 && !ip4_addr_islinklocal(ip_2_ip4(&pcb->local_ip))
1856 struct tcp_pcb *next = pcb->next;
1871 void tcp_netif_ipv4_addr_changed(
const ip4_addr_t* old_addr,
const ip4_addr_t* new_addr)
1873 struct tcp_pcb_listen *lpcb, *next;
1875 tcp_netif_ipv4_addr_changed_pcblist(old_addr, tcp_active_pcbs);
1876 tcp_netif_ipv4_addr_changed_pcblist(old_addr, tcp_bound_pcbs);
1878 if (!ip4_addr_isany(new_addr)) {
1880 for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb !=
NULL; lpcb = next) {
1885 if ((!(ip4_addr_isany(ip_2_ip4(&lpcb->local_ip)))) &&
1886 (ip4_addr_cmp(ip_2_ip4(&lpcb->local_ip), old_addr))) {
1889 ip_addr_copy_from_ip4(lpcb->local_ip, *new_addr);
1898 tcp_debug_state_str(
enum tcp_state s)
1900 return tcp_state_str[s];
1903 #if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG 1910 tcp_debug_print(
struct tcp_hdr *tcphdr)
1918 ntohl(tcphdr->seqno)));
1921 ntohl(tcphdr->ackno)));
1923 LWIP_DEBUGF(
TCP_DEBUG, (
"| %2"U16_F
" | |%"U16_F
"%"U16_F
"%"U16_F
"%"U16_F
"%"U16_F
"%"U16_F
"| %5"U16_F
" | (hdrlen, flags (",
1924 TCPH_HDRLEN(tcphdr),
1925 TCPH_FLAGS(tcphdr) >> 5 & 1,
1926 TCPH_FLAGS(tcphdr) >> 4 & 1,
1927 TCPH_FLAGS(tcphdr) >> 3 & 1,
1928 TCPH_FLAGS(tcphdr) >> 2 & 1,
1929 TCPH_FLAGS(tcphdr) >> 1 & 1,
1930 TCPH_FLAGS(tcphdr) & 1,
1931 ntohs(tcphdr->wnd)));
1932 tcp_debug_print_flags(TCPH_FLAGS(tcphdr));
1936 ntohs(tcphdr->chksum),
ntohs(tcphdr->urgp)));
1946 tcp_debug_print_state(
enum tcp_state s)
1957 tcp_debug_print_flags(
u8_t flags)
1959 if (flags & TCP_FIN) {
1962 if (flags & TCP_SYN) {
1965 if (flags & TCP_RST) {
1968 if (flags & TCP_PSH) {
1971 if (flags & TCP_ACK) {
1974 if (flags & TCP_URG) {
1977 if (flags & TCP_ECE) {
1980 if (flags & TCP_CWR) {
1990 tcp_debug_print_pcbs(
void)
1992 struct tcp_pcb *pcb;
1994 for (pcb = tcp_active_pcbs; pcb !=
NULL; pcb = pcb->next) {
1996 pcb->local_port, pcb->remote_port,
1997 pcb->snd_nxt, pcb->rcv_nxt));
1998 tcp_debug_print_state(pcb->state);
2001 for (pcb = (
struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb !=
NULL; pcb = pcb->next) {
2003 pcb->local_port, pcb->remote_port,
2004 pcb->snd_nxt, pcb->rcv_nxt));
2005 tcp_debug_print_state(pcb->state);
2008 for (pcb = tcp_tw_pcbs; pcb !=
NULL; pcb = pcb->next) {
2010 pcb->local_port, pcb->remote_port,
2011 pcb->snd_nxt, pcb->rcv_nxt));
2012 tcp_debug_print_state(pcb->state);
2022 struct tcp_pcb *pcb;
2023 for (pcb = tcp_active_pcbs; pcb !=
NULL; pcb = pcb->next) {
2024 LWIP_ASSERT(
"tcp_pcbs_sane: active pcb->state != CLOSED", pcb->state != CLOSED);
2025 LWIP_ASSERT(
"tcp_pcbs_sane: active pcb->state != LISTEN", pcb->state != LISTEN);
2026 LWIP_ASSERT(
"tcp_pcbs_sane: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
2028 for (pcb = tcp_tw_pcbs; pcb !=
NULL; pcb = pcb->next) {
2029 LWIP_ASSERT(
"tcp_pcbs_sane: tw pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
#define MIB2_STATS_INC(x)
#define ip_route_get_local_ip(isipv6, src, dest, netif, ipaddr)
#define ip_addr_isany(ipaddr)
#define IP_PCB_IPVER_EQ(pcb1, pcb2)
#define SMEMCPY(dst, src, len)
void memp_free(memp_t type, void *mem)
#define IP_ADDR_PCB_VERSION_MATCH(addr, pcb)
u8_t pbuf_free(struct pbuf *p)
#define ip_addr_copy(dest, src)
#define IP_IS_V6_VAL(ipaddr)
#define ip_addr_cmp(addr1, addr2)
#define LWIP_ASSERT(message, assertion)
#define ip_addr_set(dest, src)
#define ip_addr_debug_print(debug, ipaddr)
void pbuf_ref(struct pbuf *p)
#define PBUF_FLAG_TCP_FIN
void pbuf_cat(struct pbuf *h, struct pbuf *t)
#define TCP_WND_UPDATE_THRESHOLD
#define LWIP_ERROR(message, expression, handler)
#define MEMP_STATS_DEC(x, i)
void * memp_malloc(memp_t type)
#define LWIP_DEBUGF(debug, message)
#define LWIP_UNUSED_ARG(x)
#define ip_get_option(pcb, opt)