Free (GPLv2) TCP/IP stack developed by TASS Belgium

Fork of PicoTCP by Daniele Lacamera

Revision:
49:40fc4462265c
Parent:
45:ca30069e49bb
--- a/modules/pico_tcp.c	Thu Jul 25 09:36:23 2013 +0000
+++ b/modules/pico_tcp.c	Fri Aug 02 07:28:05 2013 +0000
@@ -24,6 +24,7 @@
 #define PICO_TCP_RTO_MAX 120000
 #define PICO_TCP_IW          2
 #define PICO_TCP_SYN_TO  1000
+#define PICO_TCP_ZOMBIE_TO 30000
 
 #define PICO_TCP_MAX_CONNECT_RETRIES 7
 
@@ -1999,6 +2000,20 @@
   }
 }
 
+void zombie_timer(unsigned long time, void *param)
+{
+    struct pico_socket_tcp * t = (struct pico_socket_tcp *)param;
+    if(pico_sockets_find(param) && ((t->sock.state & PICO_SOCKET_STATE_TCP ) == PICO_SOCKET_STATE_TCP_LAST_ACK) )
+    {
+        (t->sock).state &= 0x00FFU;
+        (t->sock).state |= PICO_SOCKET_STATE_TCP_CLOSED;
+        (t->sock).state &= 0xFF00U;
+        (t->sock).state |= PICO_SOCKET_STATE_CLOSED;
+        tcp_dbg("Deleting zombie socket %p\n",param);
+        pico_socket_del(&t->sock);
+    }
+}
+
 int pico_tcp_output(struct pico_socket *s, int loop_score)
 {
   struct pico_socket_tcp *t = (struct pico_socket_tcp *)s;
@@ -2074,6 +2089,8 @@
       s->state &= 0x00FFU;
       s->state |= PICO_SOCKET_STATE_TCP_LAST_ACK;
       tcp_dbg("TCP> STATE: LAST_ACK.\n");
+      // start zombie timer
+      pico_timer_add(PICO_TCP_ZOMBIE_TO,&zombie_timer,(void *)t);
     }
   }
   return loop_score;