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);