Free (GPLv2) TCP/IP stack developed by TASS Belgium
Fork of PicoTCP by
Diff: modules/pico_tcp.c
- 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;