]> rtime.felk.cvut.cz Git - pes-rpp/rpp-lwip.git/blob - src/core/tcp.c
a39857cf7c93aa0936e2ecfd6869e66ce6b572c0
[pes-rpp/rpp-lwip.git] / src / core / tcp.c
1 /**
2  * @file
3  * Transmission Control Protocol for IP
4  *
5  * This file contains common functions for the TCP implementation, such as functinos
6  * for manipulating the data structures and the TCP timer functions. TCP functions
7  * related to input and output is found in tcp_in.c and tcp_out.c respectively.
8  *
9  */
10
11 /*
12  * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
13  * All rights reserved. 
14  * 
15  * Redistribution and use in source and binary forms, with or without modification, 
16  * are permitted provided that the following conditions are met:
17  *
18  * 1. Redistributions of source code must retain the above copyright notice,
19  *    this list of conditions and the following disclaimer.
20  * 2. Redistributions in binary form must reproduce the above copyright notice,
21  *    this list of conditions and the following disclaimer in the documentation
22  *    and/or other materials provided with the distribution.
23  * 3. The name of the author may not be used to endorse or promote products
24  *    derived from this software without specific prior written permission. 
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 
27  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
28  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
29  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
30  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
31  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
32  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
33  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
34  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
35  * OF SUCH DAMAGE.
36  *
37  * This file is part of the lwIP TCP/IP stack.
38  * 
39  * Author: Adam Dunkels <adam@sics.se>
40  *
41  */
42
43 #include "lwip/opt.h"
44
45 #if LWIP_TCP /* don't build if not configured for use in lwipopts.h */
46
47 #include "lwip/def.h"
48 #include "lwip/mem.h"
49 #include "lwip/memp.h"
50 #include "lwip/snmp.h"
51 #include "lwip/tcp.h"
52 #include "lwip/debug.h"
53 #include "lwip/stats.h"
54
55 #include <string.h>
56
57 const char *tcp_state_str[] = {
58   "CLOSED",      
59   "LISTEN",      
60   "SYN_SENT",    
61   "SYN_RCVD",    
62   "ESTABLISHED", 
63   "FIN_WAIT_1",  
64   "FIN_WAIT_2",  
65   "CLOSE_WAIT",  
66   "CLOSING",     
67   "LAST_ACK",    
68   "TIME_WAIT"   
69 };
70
71 /* Incremented every coarse grained timer shot (typically every 500 ms). */
72 u32_t tcp_ticks;
73 const u8_t tcp_backoff[13] =
74     { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7};
75  /* Times per slowtmr hits */
76 const u8_t tcp_persist_backoff[7] = { 3, 6, 12, 24, 48, 96, 120 };
77
78 /* The TCP PCB lists. */
79
80 /** List of all TCP PCBs bound but not yet (connected || listening) */
81 struct tcp_pcb *tcp_bound_pcbs;
82 /** List of all TCP PCBs in LISTEN state */
83 union tcp_listen_pcbs_t tcp_listen_pcbs;
84 /** List of all TCP PCBs that are in a state in which
85  * they accept or send data. */
86 struct tcp_pcb *tcp_active_pcbs;
87 /** List of all TCP PCBs in TIME-WAIT state */
88 struct tcp_pcb *tcp_tw_pcbs;
89
90 /** Only used for temporary storage. */
91 struct tcp_pcb *tcp_tmp_pcb;
92
93 /** Timer counter to handle calling slow-timer from tcp_tmr() */ 
94 static u8_t tcp_timer;
95 static u16_t tcp_new_port(void);
96
97 /**
98  * Called periodically to dispatch TCP timers.
99  *
100  */
101 void
102 tcp_tmr(void)
103 {
104   /* Call tcp_fasttmr() every 250 ms */
105   tcp_fasttmr();
106
107   if (++tcp_timer & 1) {
108     /* Call tcp_tmr() every 500 ms, i.e., every other timer
109        tcp_tmr() is called. */
110     tcp_slowtmr();
111   }
112 }
113
114 /**
115  * Closes the connection held by the PCB.
116  *
117  * Listening pcbs are freed and may not be referenced any more.
118  * Connection pcbs are freed if not yet connected and may not be referenced
119  * any more. If a connection is established (at least SYN received or in
120  * a closing state), the connection is closed, and put in a closing state.
121  * The pcb is then automatically freed in tcp_slowtmr(). It is therefore
122  * unsafe to reference it.
123  *
124  * @param pcb the tcp_pcb to close
125  * @return ERR_OK if connection has been closed
126  *         another err_t if closing failed and pcb is not freed
127  */
128 err_t
129 tcp_close(struct tcp_pcb *pcb)
130 {
131   err_t err;
132
133 #if TCP_DEBUG
134   LWIP_DEBUGF(TCP_DEBUG, ("tcp_close: closing in "));
135   tcp_debug_print_state(pcb->state);
136 #endif /* TCP_DEBUG */
137
138   switch (pcb->state) {
139   case CLOSED:
140     /* Closing a pcb in the CLOSED state might seem erroneous,
141      * however, it is in this state once allocated and as yet unused
142      * and the user needs some way to free it should the need arise.
143      * Calling tcp_close() with a pcb that has already been closed, (i.e. twice)
144      * or for a pcb that has been used and then entered the CLOSED state 
145      * is erroneous, but this should never happen as the pcb has in those cases
146      * been freed, and so any remaining handles are bogus. */
147     err = ERR_OK;
148     TCP_RMV(&tcp_bound_pcbs, pcb);
149     memp_free(MEMP_TCP_PCB, pcb);
150     pcb = NULL;
151     break;
152   case LISTEN:
153     err = ERR_OK;
154     tcp_pcb_remove((struct tcp_pcb **)&tcp_listen_pcbs.pcbs, pcb);
155     memp_free(MEMP_TCP_PCB_LISTEN, pcb);
156     pcb = NULL;
157     break;
158   case SYN_SENT:
159     err = ERR_OK;
160     tcp_pcb_remove(&tcp_active_pcbs, pcb);
161     memp_free(MEMP_TCP_PCB, pcb);
162     pcb = NULL;
163     snmp_inc_tcpattemptfails();
164     break;
165   case SYN_RCVD:
166     err = tcp_send_ctrl(pcb, TCP_FIN);
167     if (err == ERR_OK) {
168       snmp_inc_tcpattemptfails();
169       pcb->state = FIN_WAIT_1;
170     }
171     break;
172   case ESTABLISHED:
173     err = tcp_send_ctrl(pcb, TCP_FIN);
174     if (err == ERR_OK) {
175       snmp_inc_tcpestabresets();
176       pcb->state = FIN_WAIT_1;
177     }
178     break;
179   case CLOSE_WAIT:
180     err = tcp_send_ctrl(pcb, TCP_FIN);
181     if (err == ERR_OK) {
182       snmp_inc_tcpestabresets();
183       pcb->state = LAST_ACK;
184     }
185     break;
186   default:
187     /* Has already been closed, do nothing. */
188     err = ERR_OK;
189     pcb = NULL;
190     break;
191   }
192
193   if (pcb != NULL && err == ERR_OK) {
194     /* To ensure all data has been sent when tcp_close returns, we have
195        to make sure tcp_output doesn't fail.
196        Since we don't really have to ensure all data has been sent when tcp_close
197        returns (unsent data is sent from tcp timer functions, also), we don't care
198        for the return value of tcp_output for now. */
199     /* @todo: When implementing SO_LINGER, this must be changed somehow:
200        If SOF_LINGER is set, the data should be sent when tcp_close returns. */
201     tcp_output(pcb);
202   }
203   return err;
204 }
205
206 /**
207  * Abandons a connection and optionally sends a RST to the remote
208  * host.  Deletes the local protocol control block. This is done when
209  * a connection is killed because of shortage of memory.
210  *
211  * @param pcb the tcp_pcb to abort
212  * @param reset boolean to indicate whether a reset should be sent
213  */
214 void
215 tcp_abandon(struct tcp_pcb *pcb, int reset)
216 {
217   u32_t seqno, ackno;
218   u16_t remote_port, local_port;
219   struct ip_addr remote_ip, local_ip;
220 #if LWIP_CALLBACK_API  
221   tcp_err_fn errf;
222 #endif /* LWIP_CALLBACK_API */
223   void *errf_arg;
224
225   
226   /* Figure out on which TCP PCB list we are, and remove us. If we
227      are in an active state, call the receive function associated with
228      the PCB with a NULL argument, and send an RST to the remote end. */
229   if (pcb->state == TIME_WAIT) {
230     tcp_pcb_remove(&tcp_tw_pcbs, pcb);
231     memp_free(MEMP_TCP_PCB, pcb);
232   } else {
233     seqno = pcb->snd_nxt;
234     ackno = pcb->rcv_nxt;
235     ip_addr_set(&local_ip, &(pcb->local_ip));
236     ip_addr_set(&remote_ip, &(pcb->remote_ip));
237     local_port = pcb->local_port;
238     remote_port = pcb->remote_port;
239 #if LWIP_CALLBACK_API
240     errf = pcb->errf;
241 #endif /* LWIP_CALLBACK_API */
242     errf_arg = pcb->callback_arg;
243     tcp_pcb_remove(&tcp_active_pcbs, pcb);
244     if (pcb->unacked != NULL) {
245       tcp_segs_free(pcb->unacked);
246     }
247     if (pcb->unsent != NULL) {
248       tcp_segs_free(pcb->unsent);
249     }
250 #if TCP_QUEUE_OOSEQ    
251     if (pcb->ooseq != NULL) {
252       tcp_segs_free(pcb->ooseq);
253     }
254 #endif /* TCP_QUEUE_OOSEQ */
255     memp_free(MEMP_TCP_PCB, pcb);
256     TCP_EVENT_ERR(errf, errf_arg, ERR_ABRT);
257     if (reset) {
258       LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_abandon: sending RST\n"));
259       tcp_rst(seqno, ackno, &local_ip, &remote_ip, local_port, remote_port);
260     }
261   }
262 }
263
264 /**
265  * Binds the connection to a local portnumber and IP address. If the
266  * IP address is not given (i.e., ipaddr == NULL), the IP address of
267  * the outgoing network interface is used instead.
268  *
269  * @param pcb the tcp_pcb to bind (no check is done whether this pcb is
270  *        already bound!)
271  * @param ipaddr the local ip address to bind to (use IP_ADDR_ANY to bind
272  *        to any local address
273  * @param port the local port to bind to
274  * @return ERR_USE if the port is already in use
275  *         ERR_OK if bound
276  */
277 err_t
278 tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
279 {
280   struct tcp_pcb *cpcb;
281
282   LWIP_ERROR("tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_ISCONN);
283
284   if (port == 0) {
285     port = tcp_new_port();
286   }
287   /* Check if the address already is in use. */
288   /* Check the listen pcbs. */
289   for(cpcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs;
290       cpcb != NULL; cpcb = cpcb->next) {
291     if (cpcb->local_port == port) {
292       if (ip_addr_isany(&(cpcb->local_ip)) ||
293           ip_addr_isany(ipaddr) ||
294           ip_addr_cmp(&(cpcb->local_ip), ipaddr)) {
295         return ERR_USE;
296       }
297     }
298   }
299   /* Check the connected pcbs. */
300   for(cpcb = tcp_active_pcbs;
301       cpcb != NULL; cpcb = cpcb->next) {
302     if (cpcb->local_port == port) {
303       if (ip_addr_isany(&(cpcb->local_ip)) ||
304           ip_addr_isany(ipaddr) ||
305           ip_addr_cmp(&(cpcb->local_ip), ipaddr)) {
306         return ERR_USE;
307       }
308     }
309   }
310   /* Check the bound, not yet connected pcbs. */
311   for(cpcb = tcp_bound_pcbs; cpcb != NULL; cpcb = cpcb->next) {
312     if (cpcb->local_port == port) {
313       if (ip_addr_isany(&(cpcb->local_ip)) ||
314           ip_addr_isany(ipaddr) ||
315           ip_addr_cmp(&(cpcb->local_ip), ipaddr)) {
316         return ERR_USE;
317       }
318     }
319   }
320   /* @todo: until SO_REUSEADDR is implemented (see task #6995 on savannah),
321    * we have to check the pcbs in TIME-WAIT state, also: */
322   for(cpcb = tcp_tw_pcbs; cpcb != NULL; cpcb = cpcb->next) {
323     if (cpcb->local_port == port) {
324       if (ip_addr_cmp(&(cpcb->local_ip), ipaddr)) {
325         return ERR_USE;
326       }
327     }
328   }
329
330   if (!ip_addr_isany(ipaddr)) {
331     pcb->local_ip = *ipaddr;
332   }
333   pcb->local_port = port;
334   TCP_REG(&tcp_bound_pcbs, pcb);
335   LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %"U16_F"\n", port));
336   return ERR_OK;
337 }
338 #if LWIP_CALLBACK_API
339 /**
340  * Default accept callback if no accept callback is specified by the user.
341  */
342 static err_t
343 tcp_accept_null(void *arg, struct tcp_pcb *pcb, err_t err)
344 {
345   LWIP_UNUSED_ARG(arg);
346   LWIP_UNUSED_ARG(pcb);
347   LWIP_UNUSED_ARG(err);
348
349   return ERR_ABRT;
350 }
351 #endif /* LWIP_CALLBACK_API */
352
353 /**
354  * Set the state of the connection to be LISTEN, which means that it
355  * is able to accept incoming connections. The protocol control block
356  * is reallocated in order to consume less memory. Setting the
357  * connection to LISTEN is an irreversible process.
358  *
359  * @param pcb the original tcp_pcb
360  * @param backlog the incoming connections queue limit
361  * @return tcp_pcb used for listening, consumes less memory.
362  *
363  * @note The original tcp_pcb is freed. This function therefore has to be
364  *       called like this:
365  *             tpcb = tcp_listen(tpcb);
366  */
367 struct tcp_pcb *
368 tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)
369 {
370   struct tcp_pcb_listen *lpcb;
371
372   LWIP_UNUSED_ARG(backlog);
373   LWIP_ERROR("tcp_listen: pcb already connected", pcb->state == CLOSED, return NULL);
374
375   /* already listening? */
376   if (pcb->state == LISTEN) {
377     return pcb;
378   }
379   lpcb = memp_malloc(MEMP_TCP_PCB_LISTEN);
380   if (lpcb == NULL) {
381     return NULL;
382   }
383   lpcb->callback_arg = pcb->callback_arg;
384   lpcb->local_port = pcb->local_port;
385   lpcb->state = LISTEN;
386   lpcb->so_options = pcb->so_options;
387   lpcb->so_options |= SOF_ACCEPTCONN;
388   lpcb->ttl = pcb->ttl;
389   lpcb->tos = pcb->tos;
390   ip_addr_set(&lpcb->local_ip, &pcb->local_ip);
391   TCP_RMV(&tcp_bound_pcbs, pcb);
392   memp_free(MEMP_TCP_PCB, pcb);
393 #if LWIP_CALLBACK_API
394   lpcb->accept = tcp_accept_null;
395 #endif /* LWIP_CALLBACK_API */
396 #if TCP_LISTEN_BACKLOG
397   lpcb->accepts_pending = 0;
398   lpcb->backlog = (backlog ? backlog : 1);
399 #endif /* TCP_LISTEN_BACKLOG */
400   TCP_REG(&tcp_listen_pcbs.listen_pcbs, lpcb);
401   return (struct tcp_pcb *)lpcb;
402 }
403
404 /** 
405  * Update the state that tracks the available window space to advertise.
406  *
407  * Returns how much extra window would be advertised if we sent an
408  * update now.
409  */
410 u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
411 {
412   u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
413
414   if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) {
415     /* we can advertise more window */
416     pcb->rcv_ann_wnd = pcb->rcv_wnd;
417     return new_right_edge - pcb->rcv_ann_right_edge;
418   } else {
419     if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) {
420       /* Can happen due to other end sending out of advertised window,
421        * but within actual available (but not yet advertised) window */
422       pcb->rcv_ann_wnd = 0;
423     } else {
424       /* keep the right edge of window constant */
425       pcb->rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt;
426     }
427     return 0;
428   }
429 }
430
431 /**
432  * This function should be called by the application when it has
433  * processed the data. The purpose is to advertise a larger window
434  * when the data has been processed.
435  *
436  * @param pcb the tcp_pcb for which data is read
437  * @param len the amount of bytes that have been read by the application
438  */
439 void
440 tcp_recved(struct tcp_pcb *pcb, u16_t len)
441 {
442   int wnd_inflation;
443
444   LWIP_ASSERT("tcp_recved: len would wrap rcv_wnd\n",
445               len <= 0xffff - pcb->rcv_wnd );
446
447   pcb->rcv_wnd += len;
448   if (pcb->rcv_wnd > TCP_WND)
449     pcb->rcv_wnd = TCP_WND;
450
451   wnd_inflation = tcp_update_rcv_ann_wnd(pcb);
452
453   /* If the change in the right edge of window is significant (default
454    * watermark is TCP_WND/2), then send an explicit update now.
455    * Otherwise wait for a packet to be sent in the normal course of
456    * events (or more window to be available later) */
457   if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) {
458     tcp_ack_now(pcb);
459     tcp_output(pcb);
460   }
461
462   LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: recveived %"U16_F" bytes, wnd %"U16_F" (%"U16_F").\n",
463          len, pcb->rcv_wnd, TCP_WND - pcb->rcv_wnd));
464 }
465
466 /**
467  * A nastly hack featuring 'goto' statements that allocates a
468  * new TCP local port.
469  *
470  * @return a new (free) local TCP port number
471  */
472 static u16_t
473 tcp_new_port(void)
474 {
475   struct tcp_pcb *pcb;
476 #ifndef TCP_LOCAL_PORT_RANGE_START
477 #define TCP_LOCAL_PORT_RANGE_START 4096
478 #define TCP_LOCAL_PORT_RANGE_END   0x7fff
479 #endif
480   static u16_t port = TCP_LOCAL_PORT_RANGE_START;
481   
482  again:
483   if (++port > TCP_LOCAL_PORT_RANGE_END) {
484     port = TCP_LOCAL_PORT_RANGE_START;
485   }
486   
487   for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
488     if (pcb->local_port == port) {
489       goto again;
490     }
491   }
492   for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
493     if (pcb->local_port == port) {
494       goto again;
495     }
496   }
497   for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next) {
498     if (pcb->local_port == port) {
499       goto again;
500     }
501   }
502   return port;
503 }
504
505 /**
506  * Connects to another host. The function given as the "connected"
507  * argument will be called when the connection has been established.
508  *
509  * @param pcb the tcp_pcb used to establish the connection
510  * @param ipaddr the remote ip address to connect to
511  * @param port the remote tcp port to connect to
512  * @param connected callback function to call when connected (or on error)
513  * @return ERR_VAL if invalid arguments are given
514  *         ERR_OK if connect request has been sent
515  *         other err_t values if connect request couldn't be sent
516  */
517 err_t
518 tcp_connect(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port,
519       tcp_connected_fn connected)
520 {
521   err_t ret;
522   u32_t iss;
523
524   LWIP_ERROR("tcp_connect: can only connected from state CLOSED", pcb->state == CLOSED, return ERR_ISCONN);
525
526   LWIP_DEBUGF(TCP_DEBUG, ("tcp_connect to port %"U16_F"\n", port));
527   if (ipaddr != NULL) {
528     pcb->remote_ip = *ipaddr;
529   } else {
530     return ERR_VAL;
531   }
532   pcb->remote_port = port;
533   if (pcb->local_port == 0) {
534     pcb->local_port = tcp_new_port();
535   }
536   iss = tcp_next_iss();
537   pcb->rcv_nxt = 0;
538   pcb->snd_nxt = iss;
539   pcb->lastack = iss - 1;
540   pcb->snd_lbb = iss - 1;
541   pcb->rcv_wnd = TCP_WND;
542   pcb->rcv_ann_wnd = TCP_WND;
543   pcb->rcv_ann_right_edge = pcb->rcv_nxt;
544   pcb->snd_wnd = TCP_WND;
545   /* As initial send MSS, we use TCP_MSS but limit it to 536.
546      The send MSS is updated when an MSS option is received. */
547   pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
548 #if TCP_CALCULATE_EFF_SEND_MSS
549   pcb->mss = tcp_eff_send_mss(pcb->mss, ipaddr);
550 #endif /* TCP_CALCULATE_EFF_SEND_MSS */
551   pcb->cwnd = 1;
552   pcb->ssthresh = pcb->mss * 10;
553 #if LWIP_CALLBACK_API
554   pcb->connected = connected;
555 #endif /* LWIP_CALLBACK_API */
556
557   ret = tcp_enqueue(pcb, NULL, 0, TCP_SYN, 0, TF_SEG_OPTS_MSS
558 #if LWIP_TCP_TIMESTAMPS
559                     | TF_SEG_OPTS_TS
560 #endif
561                     );
562   if (ret == ERR_OK) {
563     /* SYN segment was enqueued, changed the pcbs state now */
564     pcb->state = SYN_SENT;
565     TCP_RMV(&tcp_bound_pcbs, pcb);
566     TCP_REG(&tcp_active_pcbs, pcb);
567     snmp_inc_tcpactiveopens();
568
569     tcp_output(pcb);
570   }
571   return ret;
572 }
573
574 /**
575  * Called every 500 ms and implements the retransmission timer and the timer that
576  * removes PCBs that have been in TIME-WAIT for enough time. It also increments
577  * various timers such as the inactivity timer in each PCB.
578  *
579  * Automatically called from tcp_tmr().
580  */
581 void
582 tcp_slowtmr(void)
583 {
584   struct tcp_pcb *pcb, *pcb2, *prev;
585   u16_t eff_wnd;
586   u8_t pcb_remove;      /* flag if a PCB should be removed */
587   u8_t pcb_reset;       /* flag if a RST should be sent when removing */
588   err_t err;
589
590   err = ERR_OK;
591
592   ++tcp_ticks;
593
594   /* Steps through all of the active PCBs. */
595   prev = NULL;
596   pcb = tcp_active_pcbs;
597   if (pcb == NULL) {
598     LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs\n"));
599   }
600   while (pcb != NULL) {
601     LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb\n"));
602     LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED);
603     LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN);
604     LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT);
605
606     pcb_remove = 0;
607     pcb_reset = 0;
608
609     if (pcb->state == SYN_SENT && pcb->nrtx == TCP_SYNMAXRTX) {
610       ++pcb_remove;
611       LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max SYN retries reached\n"));
612     }
613     else if (pcb->nrtx == TCP_MAXRTX) {
614       ++pcb_remove;
615       LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
616     } else {
617       if (pcb->persist_backoff > 0) {
618         /* If snd_wnd is zero, use persist timer to send 1 byte probes
619          * instead of using the standard retransmission mechanism. */
620         pcb->persist_cnt++;
621         if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
622           pcb->persist_cnt = 0;
623           if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) {
624             pcb->persist_backoff++;
625           }
626           tcp_zero_window_probe(pcb);
627         }
628       } else {
629         /* Increase the retransmission timer if it is running */
630         if(pcb->rtime >= 0)
631           ++pcb->rtime;
632
633         if (pcb->unacked != NULL && pcb->rtime >= pcb->rto) {
634           /* Time for a retransmission. */
635           LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_slowtmr: rtime %"S16_F
636                                       " pcb->rto %"S16_F"\n",
637                                       pcb->rtime, pcb->rto));
638
639           /* Double retransmission time-out unless we are trying to
640            * connect to somebody (i.e., we are in SYN_SENT). */
641           if (pcb->state != SYN_SENT) {
642             pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[pcb->nrtx];
643           }
644
645           /* Reset the retransmission timer. */
646           pcb->rtime = 0;
647
648           /* Reduce congestion window and ssthresh. */
649           eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
650           pcb->ssthresh = eff_wnd >> 1;
651           if (pcb->ssthresh < pcb->mss) {
652             pcb->ssthresh = pcb->mss * 2;
653           }
654           pcb->cwnd = pcb->mss;
655           LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: cwnd %"U16_F
656                                        " ssthresh %"U16_F"\n",
657                                        pcb->cwnd, pcb->ssthresh));
658  
659           /* The following needs to be called AFTER cwnd is set to one
660              mss - STJ */
661           tcp_rexmit_rto(pcb);
662         }
663       }
664     }
665     /* Check if this PCB has stayed too long in FIN-WAIT-2 */
666     if (pcb->state == FIN_WAIT_2) {
667       if ((u32_t)(tcp_ticks - pcb->tmr) >
668           TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) {
669         ++pcb_remove;
670         LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in FIN-WAIT-2\n"));
671       }
672     }
673
674     /* Check if KEEPALIVE should be sent */
675     if((pcb->so_options & SOF_KEEPALIVE) &&
676        ((pcb->state == ESTABLISHED) ||
677         (pcb->state == CLOSE_WAIT))) {
678 #if LWIP_TCP_KEEPALIVE
679       if((u32_t)(tcp_ticks - pcb->tmr) >
680          (pcb->keep_idle + (pcb->keep_cnt*pcb->keep_intvl))
681          / TCP_SLOW_INTERVAL)
682 #else      
683       if((u32_t)(tcp_ticks - pcb->tmr) >
684          (pcb->keep_idle + TCP_MAXIDLE) / TCP_SLOW_INTERVAL)
685 #endif /* LWIP_TCP_KEEPALIVE */
686       {
687         LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: KEEPALIVE timeout. Aborting connection to %"U16_F".%"U16_F".%"U16_F".%"U16_F".\n",
688                                 ip4_addr1(&pcb->remote_ip), ip4_addr2(&pcb->remote_ip),
689                                 ip4_addr3(&pcb->remote_ip), ip4_addr4(&pcb->remote_ip)));
690         
691         ++pcb_remove;
692         ++pcb_reset;
693       }
694 #if LWIP_TCP_KEEPALIVE
695       else if((u32_t)(tcp_ticks - pcb->tmr) > 
696               (pcb->keep_idle + pcb->keep_cnt_sent * pcb->keep_intvl)
697               / TCP_SLOW_INTERVAL)
698 #else
699       else if((u32_t)(tcp_ticks - pcb->tmr) > 
700               (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEPINTVL_DEFAULT) 
701               / TCP_SLOW_INTERVAL)
702 #endif /* LWIP_TCP_KEEPALIVE */
703       {
704         tcp_keepalive(pcb);
705         pcb->keep_cnt_sent++;
706       }
707     }
708
709     /* If this PCB has queued out of sequence data, but has been
710        inactive for too long, will drop the data (it will eventually
711        be retransmitted). */
712 #if TCP_QUEUE_OOSEQ
713     if (pcb->ooseq != NULL &&
714         (u32_t)tcp_ticks - pcb->tmr >= pcb->rto * TCP_OOSEQ_TIMEOUT) {
715       tcp_segs_free(pcb->ooseq);
716       pcb->ooseq = NULL;
717       LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: dropping OOSEQ queued data\n"));
718     }
719 #endif /* TCP_QUEUE_OOSEQ */
720
721     /* Check if this PCB has stayed too long in SYN-RCVD */
722     if (pcb->state == SYN_RCVD) {
723       if ((u32_t)(tcp_ticks - pcb->tmr) >
724           TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) {
725         ++pcb_remove;
726         LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in SYN-RCVD\n"));
727       }
728     }
729
730     /* Check if this PCB has stayed too long in LAST-ACK */
731     if (pcb->state == LAST_ACK) {
732       if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
733         ++pcb_remove;
734         LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in LAST-ACK\n"));
735       }
736     }
737
738     /* If the PCB should be removed, do it. */
739     if (pcb_remove) {
740       tcp_pcb_purge(pcb);
741       /* Remove PCB from tcp_active_pcbs list. */
742       if (prev != NULL) {
743         LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs);
744         prev->next = pcb->next;
745       } else {
746         /* This PCB was the first. */
747         LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb);
748         tcp_active_pcbs = pcb->next;
749       }
750
751       TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_ABRT);
752       if (pcb_reset) {
753         tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
754           pcb->local_port, pcb->remote_port);
755       }
756
757       pcb2 = pcb->next;
758       memp_free(MEMP_TCP_PCB, pcb);
759       pcb = pcb2;
760     } else {
761
762       /* We check if we should poll the connection. */
763       ++pcb->polltmr;
764       if (pcb->polltmr >= pcb->pollinterval) {
765         pcb->polltmr = 0;
766         LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: polling application\n"));
767         TCP_EVENT_POLL(pcb, err);
768         if (err == ERR_OK) {
769           tcp_output(pcb);
770         }
771       }
772       
773       prev = pcb;
774       pcb = pcb->next;
775     }
776   }
777
778   
779   /* Steps through all of the TIME-WAIT PCBs. */
780   prev = NULL;    
781   pcb = tcp_tw_pcbs;
782   while (pcb != NULL) {
783     LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
784     pcb_remove = 0;
785
786     /* Check if this PCB has stayed long enough in TIME-WAIT */
787     if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
788       ++pcb_remove;
789     }
790     
791
792
793     /* If the PCB should be removed, do it. */
794     if (pcb_remove) {
795       tcp_pcb_purge(pcb);
796       /* Remove PCB from tcp_tw_pcbs list. */
797       if (prev != NULL) {
798         LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs);
799         prev->next = pcb->next;
800       } else {
801         /* This PCB was the first. */
802         LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
803         tcp_tw_pcbs = pcb->next;
804       }
805       pcb2 = pcb->next;
806       memp_free(MEMP_TCP_PCB, pcb);
807       pcb = pcb2;
808     } else {
809       prev = pcb;
810       pcb = pcb->next;
811     }
812   }
813 }
814
815 /**
816  * Is called every TCP_FAST_INTERVAL (250 ms) and process data previously
817  * "refused" by upper layer (application) and sends delayed ACKs.
818  *
819  * Automatically called from tcp_tmr().
820  */
821 void
822 tcp_fasttmr(void)
823 {
824   struct tcp_pcb *pcb;
825
826   for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
827     /* If there is data which was previously "refused" by upper layer */
828     if (pcb->refused_data != NULL) {
829       /* Notify again application with data previously received. */
830       err_t err;
831       LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_fasttmr: notify kept packet\n"));
832       TCP_EVENT_RECV(pcb, pcb->refused_data, ERR_OK, err);
833       if (err == ERR_OK) {
834         pcb->refused_data = NULL;
835       }
836     }
837
838     /* send delayed ACKs */  
839     if (pcb->flags & TF_ACK_DELAY) {
840       LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: delayed ACK\n"));
841       tcp_ack_now(pcb);
842       tcp_output(pcb);
843       pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
844     }
845   }
846 }
847
848 /**
849  * Deallocates a list of TCP segments (tcp_seg structures).
850  *
851  * @param seg tcp_seg list of TCP segments to free
852  * @return the number of pbufs that were deallocated
853  */
854 u8_t
855 tcp_segs_free(struct tcp_seg *seg)
856 {
857   u8_t count = 0;
858   struct tcp_seg *next;
859   while (seg != NULL) {
860     next = seg->next;
861     count += tcp_seg_free(seg);
862     seg = next;
863   }
864   return count;
865 }
866
867 /**
868  * Frees a TCP segment (tcp_seg structure).
869  *
870  * @param seg single tcp_seg to free
871  * @return the number of pbufs that were deallocated
872  */
873 u8_t
874 tcp_seg_free(struct tcp_seg *seg)
875 {
876   u8_t count = 0;
877   
878   if (seg != NULL) {
879     if (seg->p != NULL) {
880       count = pbuf_free(seg->p);
881 #if TCP_DEBUG
882       seg->p = NULL;
883 #endif /* TCP_DEBUG */
884     }
885     memp_free(MEMP_TCP_SEG, seg);
886   }
887   return count;
888 }
889
890 /**
891  * Sets the priority of a connection.
892  *
893  * @param pcb the tcp_pcb to manipulate
894  * @param prio new priority
895  */
896 void
897 tcp_setprio(struct tcp_pcb *pcb, u8_t prio)
898 {
899   pcb->prio = prio;
900 }
901 #if TCP_QUEUE_OOSEQ
902
903 /**
904  * Returns a copy of the given TCP segment.
905  * The pbuf and data are not copied, only the pointers
906  *
907  * @param seg the old tcp_seg
908  * @return a copy of seg
909  */ 
910 struct tcp_seg *
911 tcp_seg_copy(struct tcp_seg *seg)
912 {
913   struct tcp_seg *cseg;
914
915   cseg = memp_malloc(MEMP_TCP_SEG);
916   if (cseg == NULL) {
917     return NULL;
918   }
919   SMEMCPY((u8_t *)cseg, (const u8_t *)seg, sizeof(struct tcp_seg)); 
920   pbuf_ref(cseg->p);
921   return cseg;
922 }
923 #endif
924
925 #if LWIP_CALLBACK_API
926 /**
927  * Default receive callback that is called if the user didn't register
928  * a recv callback for the pcb.
929  */
930 err_t
931 tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
932 {
933   LWIP_UNUSED_ARG(arg);
934   if (p != NULL) {
935     tcp_recved(pcb, p->tot_len);
936     pbuf_free(p);
937   } else if (err == ERR_OK) {
938     return tcp_close(pcb);
939   }
940   return ERR_OK;
941 }
942 #endif /* LWIP_CALLBACK_API */
943
944 /**
945  * Kills the oldest active connection that has lower priority than prio.
946  *
947  * @param prio minimum priority
948  */
949 static void
950 tcp_kill_prio(u8_t prio)
951 {
952   struct tcp_pcb *pcb, *inactive;
953   u32_t inactivity;
954   u8_t mprio;
955
956
957   mprio = TCP_PRIO_MAX;
958   
959   /* We kill the oldest active connection that has lower priority than prio. */
960   inactivity = 0;
961   inactive = NULL;
962   for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
963     if (pcb->prio <= prio &&
964        pcb->prio <= mprio &&
965        (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
966       inactivity = tcp_ticks - pcb->tmr;
967       inactive = pcb;
968       mprio = pcb->prio;
969     }
970   }
971   if (inactive != NULL) {
972     LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_prio: killing oldest PCB %p (%"S32_F")\n",
973            (void *)inactive, inactivity));
974     tcp_abort(inactive);
975   }      
976 }
977
978 /**
979  * Kills the oldest connection that is in TIME_WAIT state.
980  * Called from tcp_alloc() if no more connections are available.
981  */
982 static void
983 tcp_kill_timewait(void)
984 {
985   struct tcp_pcb *pcb, *inactive;
986   u32_t inactivity;
987
988   inactivity = 0;
989   inactive = NULL;
990   /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */
991   for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
992     if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
993       inactivity = tcp_ticks - pcb->tmr;
994       inactive = pcb;
995     }
996   }
997   if (inactive != NULL) {
998     LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_timewait: killing oldest TIME-WAIT PCB %p (%"S32_F")\n",
999            (void *)inactive, inactivity));
1000     tcp_abort(inactive);
1001   }      
1002 }
1003
1004 /**
1005  * Allocate a new tcp_pcb structure.
1006  *
1007  * @param prio priority for the new pcb
1008  * @return a new tcp_pcb that initially is in state CLOSED
1009  */
1010 struct tcp_pcb *
1011 tcp_alloc(u8_t prio)
1012 {
1013   struct tcp_pcb *pcb;
1014   u32_t iss;
1015   
1016   pcb = memp_malloc(MEMP_TCP_PCB);
1017   if (pcb == NULL) {
1018     /* Try killing oldest connection in TIME-WAIT. */
1019     LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest TIME-WAIT connection\n"));
1020     tcp_kill_timewait();
1021     /* Try to allocate a tcp_pcb again. */
1022     pcb = memp_malloc(MEMP_TCP_PCB);
1023     if (pcb == NULL) {
1024       /* Try killing active connections with lower priority than the new one. */
1025       LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing connection with prio lower than %d\n", prio));
1026       tcp_kill_prio(prio);
1027       /* Try to allocate a tcp_pcb again. */
1028       pcb = memp_malloc(MEMP_TCP_PCB);
1029       if (pcb != NULL) {
1030         /* adjust err stats: memp_malloc failed twice before */
1031         MEMP_STATS_DEC(err, MEMP_TCP_PCB);
1032       }
1033     }
1034     if (pcb != NULL) {
1035       /* adjust err stats: timewait PCB was freed above */
1036       MEMP_STATS_DEC(err, MEMP_TCP_PCB);
1037     }
1038   }
1039   if (pcb != NULL) {
1040     memset(pcb, 0, sizeof(struct tcp_pcb));
1041     pcb->prio = TCP_PRIO_NORMAL;
1042     pcb->snd_buf = TCP_SND_BUF;
1043     pcb->snd_queuelen = 0;
1044     pcb->rcv_wnd = TCP_WND;
1045     pcb->rcv_ann_wnd = TCP_WND;
1046     pcb->tos = 0;
1047     pcb->ttl = TCP_TTL;
1048     /* As initial send MSS, we use TCP_MSS but limit it to 536.
1049        The send MSS is updated when an MSS option is received. */
1050     pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
1051     pcb->rto = 3000 / TCP_SLOW_INTERVAL;
1052     pcb->sa = 0;
1053     pcb->sv = 3000 / TCP_SLOW_INTERVAL;
1054     pcb->rtime = -1;
1055     pcb->cwnd = 1;
1056     iss = tcp_next_iss();
1057     pcb->snd_wl2 = iss;
1058     pcb->snd_nxt = iss;
1059     pcb->lastack = iss;
1060     pcb->snd_lbb = iss;   
1061     pcb->tmr = tcp_ticks;
1062
1063     pcb->polltmr = 0;
1064
1065 #if LWIP_CALLBACK_API
1066     pcb->recv = tcp_recv_null;
1067 #endif /* LWIP_CALLBACK_API */  
1068     
1069     /* Init KEEPALIVE timer */
1070     pcb->keep_idle  = TCP_KEEPIDLE_DEFAULT;
1071     
1072 #if LWIP_TCP_KEEPALIVE
1073     pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT;
1074     pcb->keep_cnt   = TCP_KEEPCNT_DEFAULT;
1075 #endif /* LWIP_TCP_KEEPALIVE */
1076
1077     pcb->keep_cnt_sent = 0;
1078   }
1079   return pcb;
1080 }
1081
1082 /**
1083  * Creates a new TCP protocol control block but doesn't place it on
1084  * any of the TCP PCB lists.
1085  * The pcb is not put on any list until binding using tcp_bind().
1086  *
1087  * @internal: Maybe there should be a idle TCP PCB list where these
1088  * PCBs are put on. Port reservation using tcp_bind() is implemented but
1089  * allocated pcbs that are not bound can't be killed automatically if wanting
1090  * to allocate a pcb with higher prio (@see tcp_kill_prio())
1091  *
1092  * @return a new tcp_pcb that initially is in state CLOSED
1093  */
1094 struct tcp_pcb *
1095 tcp_new(void)
1096 {
1097   return tcp_alloc(TCP_PRIO_NORMAL);
1098 }
1099
1100 /**
1101  * Used to specify the argument that should be passed callback
1102  * functions.
1103  *
1104  * @param pcb tcp_pcb to set the callback argument
1105  * @param arg void pointer argument to pass to callback functions
1106  */ 
1107 void
1108 tcp_arg(struct tcp_pcb *pcb, void *arg)
1109 {  
1110   pcb->callback_arg = arg;
1111 }
1112 #if LWIP_CALLBACK_API
1113
1114 /**
1115  * Used to specify the function that should be called when a TCP
1116  * connection receives data.
1117  *
1118  * @param pcb tcp_pcb to set the recv callback
1119  * @param recv callback function to call for this pcb when data is received
1120  */ 
1121 void
1122 tcp_recv(struct tcp_pcb *pcb, tcp_recv_fn recv)
1123 {
1124   pcb->recv = recv;
1125 }
1126
1127 /**
1128  * Used to specify the function that should be called when TCP data
1129  * has been successfully delivered to the remote host.
1130  *
1131  * @param pcb tcp_pcb to set the sent callback
1132  * @param sent callback function to call for this pcb when data is successfully sent
1133  */ 
1134 void
1135 tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent)
1136 {
1137   pcb->sent = sent;
1138 }
1139
1140 /**
1141  * Used to specify the function that should be called when a fatal error
1142  * has occured on the connection.
1143  *
1144  * @param pcb tcp_pcb to set the err callback
1145  * @param err callback function to call for this pcb when a fatal error
1146  *        has occured on the connection
1147  */ 
1148 void
1149 tcp_err(struct tcp_pcb *pcb, tcp_err_fn err)
1150 {
1151   pcb->errf = err;
1152 }
1153
1154 /**
1155  * Used for specifying the function that should be called when a
1156  * LISTENing connection has been connected to another host.
1157  *
1158  * @param pcb tcp_pcb to set the accept callback
1159  * @param accept callback function to call for this pcb when LISTENing
1160  *        connection has been connected to another host
1161  */ 
1162 void
1163 tcp_accept(struct tcp_pcb *pcb, tcp_accept_fn accept)
1164 {
1165   pcb->accept = accept;
1166 }
1167 #endif /* LWIP_CALLBACK_API */
1168
1169
1170 /**
1171  * Used to specify the function that should be called periodically
1172  * from TCP. The interval is specified in terms of the TCP coarse
1173  * timer interval, which is called twice a second.
1174  *
1175  */ 
1176 void
1177 tcp_poll(struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval)
1178 {
1179 #if LWIP_CALLBACK_API
1180   pcb->poll = poll;
1181 #endif /* LWIP_CALLBACK_API */  
1182   pcb->pollinterval = interval;
1183 }
1184
1185 /**
1186  * Purges a TCP PCB. Removes any buffered data and frees the buffer memory
1187  * (pcb->ooseq, pcb->unsent and pcb->unacked are freed).
1188  *
1189  * @param pcb tcp_pcb to purge. The pcb itself is not deallocated!
1190  */
1191 void
1192 tcp_pcb_purge(struct tcp_pcb *pcb)
1193 {
1194   if (pcb->state != CLOSED &&
1195      pcb->state != TIME_WAIT &&
1196      pcb->state != LISTEN) {
1197
1198     LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge\n"));
1199
1200 #if TCP_LISTEN_BACKLOG
1201     if (pcb->state == SYN_RCVD) {
1202       /* Need to find the corresponding listen_pcb and decrease its accepts_pending */
1203       struct tcp_pcb_listen *lpcb;
1204       LWIP_ASSERT("tcp_pcb_purge: pcb->state == SYN_RCVD but tcp_listen_pcbs is NULL",
1205         tcp_listen_pcbs.listen_pcbs != NULL);
1206       for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
1207         if ((lpcb->local_port == pcb->local_port) &&
1208             (ip_addr_isany(&lpcb->local_ip) ||
1209              ip_addr_cmp(&pcb->local_ip, &lpcb->local_ip))) {
1210             /* port and address of the listen pcb match the timed-out pcb */
1211             LWIP_ASSERT("tcp_pcb_purge: listen pcb does not have accepts pending",
1212               lpcb->accepts_pending > 0);
1213             lpcb->accepts_pending--;
1214             break;
1215           }
1216       }
1217     }
1218 #endif /* TCP_LISTEN_BACKLOG */
1219
1220
1221     if (pcb->refused_data != NULL) {
1222       LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->refused_data\n"));
1223       pbuf_free(pcb->refused_data);
1224       pcb->refused_data = NULL;
1225     }
1226     if (pcb->unsent != NULL) {
1227       LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: not all data sent\n"));
1228     }
1229     if (pcb->unacked != NULL) {
1230       LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->unacked\n"));
1231     }
1232 #if TCP_QUEUE_OOSEQ /* LW */
1233     if (pcb->ooseq != NULL) {
1234       LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->ooseq\n"));
1235     }
1236     tcp_segs_free(pcb->ooseq);
1237     pcb->ooseq = NULL;
1238 #endif /* TCP_QUEUE_OOSEQ */
1239
1240     /* Stop the retransmission timer as it will expect data on unacked
1241        queue if it fires */
1242     pcb->rtime = -1;
1243
1244     tcp_segs_free(pcb->unsent);
1245     tcp_segs_free(pcb->unacked);
1246     pcb->unacked = pcb->unsent = NULL;
1247   }
1248 }
1249
1250 /**
1251  * Purges the PCB and removes it from a PCB list. Any delayed ACKs are sent first.
1252  *
1253  * @param pcblist PCB list to purge.
1254  * @param pcb tcp_pcb to purge. The pcb itself is NOT deallocated!
1255  */
1256 void
1257 tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb)
1258 {
1259   TCP_RMV(pcblist, pcb);
1260
1261   tcp_pcb_purge(pcb);
1262   
1263   /* if there is an outstanding delayed ACKs, send it */
1264   if (pcb->state != TIME_WAIT &&
1265      pcb->state != LISTEN &&
1266      pcb->flags & TF_ACK_DELAY) {
1267     pcb->flags |= TF_ACK_NOW;
1268     tcp_output(pcb);
1269   }
1270
1271   if (pcb->state != LISTEN) {
1272     LWIP_ASSERT("unsent segments leaking", pcb->unsent == NULL);
1273     LWIP_ASSERT("unacked segments leaking", pcb->unacked == NULL);
1274 #if TCP_QUEUE_OOSEQ
1275     LWIP_ASSERT("ooseq segments leaking", pcb->ooseq == NULL);
1276 #endif /* TCP_QUEUE_OOSEQ */
1277   }
1278
1279   pcb->state = CLOSED;
1280
1281   LWIP_ASSERT("tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane());
1282 }
1283
1284 /**
1285  * Calculates a new initial sequence number for new connections.
1286  *
1287  * @return u32_t pseudo random sequence number
1288  */
1289 u32_t
1290 tcp_next_iss(void)
1291 {
1292   static u32_t iss = 6510;
1293   
1294   iss += tcp_ticks;       /* XXX */
1295   return iss;
1296 }
1297
1298 #if TCP_CALCULATE_EFF_SEND_MSS
1299 /**
1300  * Calcluates the effective send mss that can be used for a specific IP address
1301  * by using ip_route to determin the netif used to send to the address and
1302  * calculating the minimum of TCP_MSS and that netif's mtu (if set).
1303  */
1304 u16_t
1305 tcp_eff_send_mss(u16_t sendmss, struct ip_addr *addr)
1306 {
1307   u16_t mss_s;
1308   struct netif *outif;
1309
1310   outif = ip_route(addr);
1311   if ((outif != NULL) && (outif->mtu != 0)) {
1312     mss_s = outif->mtu - IP_HLEN - TCP_HLEN;
1313     /* RFC 1122, chap 4.2.2.6:
1314      * Eff.snd.MSS = min(SendMSS+20, MMS_S) - TCPhdrsize - IPoptionsize
1315      * We correct for TCP options in tcp_enqueue(), and don't support
1316      * IP options
1317      */
1318     sendmss = LWIP_MIN(sendmss, mss_s);
1319   }
1320   return sendmss;
1321 }
1322 #endif /* TCP_CALCULATE_EFF_SEND_MSS */
1323
1324 const char*
1325 tcp_debug_state_str(enum tcp_state s)
1326 {
1327   return tcp_state_str[s];
1328 }
1329
1330 #if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG
1331 /**
1332  * Print a tcp header for debugging purposes.
1333  *
1334  * @param tcphdr pointer to a struct tcp_hdr
1335  */
1336 void
1337 tcp_debug_print(struct tcp_hdr *tcphdr)
1338 {
1339   LWIP_DEBUGF(TCP_DEBUG, ("TCP header:\n"));
1340   LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
1341   LWIP_DEBUGF(TCP_DEBUG, ("|    %5"U16_F"      |    %5"U16_F"      | (src port, dest port)\n",
1342          ntohs(tcphdr->src), ntohs(tcphdr->dest)));
1343   LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
1344   LWIP_DEBUGF(TCP_DEBUG, ("|           %010"U32_F"          | (seq no)\n",
1345           ntohl(tcphdr->seqno)));
1346   LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
1347   LWIP_DEBUGF(TCP_DEBUG, ("|           %010"U32_F"          | (ack no)\n",
1348          ntohl(tcphdr->ackno)));
1349   LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
1350   LWIP_DEBUGF(TCP_DEBUG, ("| %2"U16_F" |   |%"U16_F"%"U16_F"%"U16_F"%"U16_F"%"U16_F"%"U16_F"|     %5"U16_F"     | (hdrlen, flags (",
1351        TCPH_HDRLEN(tcphdr),
1352          TCPH_FLAGS(tcphdr) >> 5 & 1,
1353          TCPH_FLAGS(tcphdr) >> 4 & 1,
1354          TCPH_FLAGS(tcphdr) >> 3 & 1,
1355          TCPH_FLAGS(tcphdr) >> 2 & 1,
1356          TCPH_FLAGS(tcphdr) >> 1 & 1,
1357          TCPH_FLAGS(tcphdr) & 1,
1358          ntohs(tcphdr->wnd)));
1359   tcp_debug_print_flags(TCPH_FLAGS(tcphdr));
1360   LWIP_DEBUGF(TCP_DEBUG, ("), win)\n"));
1361   LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
1362   LWIP_DEBUGF(TCP_DEBUG, ("|    0x%04"X16_F"     |     %5"U16_F"     | (chksum, urgp)\n",
1363          ntohs(tcphdr->chksum), ntohs(tcphdr->urgp)));
1364   LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
1365 }
1366
1367 /**
1368  * Print a tcp state for debugging purposes.
1369  *
1370  * @param s enum tcp_state to print
1371  */
1372 void
1373 tcp_debug_print_state(enum tcp_state s)
1374 {
1375   LWIP_DEBUGF(TCP_DEBUG, ("State: %s\n", tcp_state_str[s]));
1376 }
1377
1378 /**
1379  * Print tcp flags for debugging purposes.
1380  *
1381  * @param flags tcp flags, all active flags are printed
1382  */
1383 void
1384 tcp_debug_print_flags(u8_t flags)
1385 {
1386   if (flags & TCP_FIN) {
1387     LWIP_DEBUGF(TCP_DEBUG, ("FIN "));
1388   }
1389   if (flags & TCP_SYN) {
1390     LWIP_DEBUGF(TCP_DEBUG, ("SYN "));
1391   }
1392   if (flags & TCP_RST) {
1393     LWIP_DEBUGF(TCP_DEBUG, ("RST "));
1394   }
1395   if (flags & TCP_PSH) {
1396     LWIP_DEBUGF(TCP_DEBUG, ("PSH "));
1397   }
1398   if (flags & TCP_ACK) {
1399     LWIP_DEBUGF(TCP_DEBUG, ("ACK "));
1400   }
1401   if (flags & TCP_URG) {
1402     LWIP_DEBUGF(TCP_DEBUG, ("URG "));
1403   }
1404   if (flags & TCP_ECE) {
1405     LWIP_DEBUGF(TCP_DEBUG, ("ECE "));
1406   }
1407   if (flags & TCP_CWR) {
1408     LWIP_DEBUGF(TCP_DEBUG, ("CWR "));
1409   }
1410   LWIP_DEBUGF(TCP_DEBUG, ("\n"));
1411 }
1412
1413 /**
1414  * Print all tcp_pcbs in every list for debugging purposes.
1415  */
1416 void
1417 tcp_debug_print_pcbs(void)
1418 {
1419   struct tcp_pcb *pcb;
1420   LWIP_DEBUGF(TCP_DEBUG, ("Active PCB states:\n"));
1421   for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
1422     LWIP_DEBUGF(TCP_DEBUG, ("Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ",
1423                        pcb->local_port, pcb->remote_port,
1424                        pcb->snd_nxt, pcb->rcv_nxt));
1425     tcp_debug_print_state(pcb->state);
1426   }    
1427   LWIP_DEBUGF(TCP_DEBUG, ("Listen PCB states:\n"));
1428   for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next) {
1429     LWIP_DEBUGF(TCP_DEBUG, ("Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ",
1430                        pcb->local_port, pcb->remote_port,
1431                        pcb->snd_nxt, pcb->rcv_nxt));
1432     tcp_debug_print_state(pcb->state);
1433   }    
1434   LWIP_DEBUGF(TCP_DEBUG, ("TIME-WAIT PCB states:\n"));
1435   for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
1436     LWIP_DEBUGF(TCP_DEBUG, ("Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ",
1437                        pcb->local_port, pcb->remote_port,
1438                        pcb->snd_nxt, pcb->rcv_nxt));
1439     tcp_debug_print_state(pcb->state);
1440   }    
1441 }
1442
1443 /**
1444  * Check state consistency of the tcp_pcb lists.
1445  */
1446 s16_t
1447 tcp_pcbs_sane(void)
1448 {
1449   struct tcp_pcb *pcb;
1450   for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
1451     LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != CLOSED", pcb->state != CLOSED);
1452     LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != LISTEN", pcb->state != LISTEN);
1453     LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
1454   }
1455   for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
1456     LWIP_ASSERT("tcp_pcbs_sane: tw pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
1457   }
1458   return 1;
1459 }
1460 #endif /* TCP_DEBUG */
1461
1462 #endif /* LWIP_TCP */