lwip-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[lwip-users] fix for tcp_slowtmr


From: Oleg Tychev
Subject: [lwip-users] fix for tcp_slowtmr
Date: Thu, 22 Jun 2006 17:44:16 +0200
User-agent: Thunderbird 1.5.0.4 (Windows/20060516)

Hello, All!

In processing of keepalive timers we can see following code:

/* Check if KEEPALIVE should be sent */
if((pcb->so_options & SOF_KEEPALIVE) && ((pcb->state == ESTABLISHED) || (pcb->state == CLOSE_WAIT))) { if((u32_t)(tcp_ticks - pcb->tmr) > (pcb->keepalive + TCP_MAXIDLE) / TCP_SLOW_INTERVAL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: KEEPALIVE timeout. Aborting connection to %"U16_F".%"U16_F".%"U16_F".%"U16_F".\n", ip4_addr1(&pcb->remote_ip), ip4_addr2(&pcb->remote_ip), ip4_addr3(&pcb->remote_ip), ip4_addr4(&pcb->remote_ip)));

     tcp_abort(pcb);
  }
else if((u32_t)(tcp_ticks - pcb->tmr) > (pcb->keepalive + pcb->keep_cnt * TCP_KEEPINTVL) / TCP_SLOW_INTERVAL) {
     tcp_keepalive(pcb);
     pcb->keep_cnt++;
  }
}

tcp_abort destroys pcb, but processing goes further.

Poka poka,
Oleg

I suggest following patch against version lwip-1.1.1:
*** lwip-1.1.1/src/core/1/tcp.c    Tue Dec 20 11:03:18 2005
--- lwip-1.1.1/src/core/2/tcp.c    Thu Jun 22 17:38:30 2006
***************
*** 531,537 ****
--- 531,540 ----
ip4_addr1(&pcb->remote_ip), ip4_addr2(&pcb->remote_ip), ip4_addr3(&pcb->remote_ip), ip4_addr4(&pcb->remote_ip)));

+          pcb2 = pcb->next;
          tcp_abort(pcb);
+          pcb = pcb2;
+          continue;
       }
else if((u32_t)(tcp_ticks - pcb->tmr) > (pcb->keepalive + pcb->keep_cnt * TCP_KEEPINTVL) / TCP_SLOW_INTERVAL) {
          tcp_keepalive(pcb);

*** lwip-1.1.1/src/core/1/tcp.c Tue Dec 20 11:03:18 2005
--- lwip-1.1.1/src/core/2/tcp.c Thu Jun 22 17:38:30 2006
***************
*** 531,537 ****
--- 531,540 ----
                                   ip4_addr1(&pcb->remote_ip), 
ip4_addr2(&pcb->remote_ip),
                                   ip4_addr3(&pcb->remote_ip), 
ip4_addr4(&pcb->remote_ip)));
  
+          pcb2 = pcb->next;
           tcp_abort(pcb);
+          pcb = pcb2;
+          continue;
        }
        else if((u32_t)(tcp_ticks - pcb->tmr) > (pcb->keepalive + pcb->keep_cnt 
* TCP_KEEPINTVL) / TCP_SLOW_INTERVAL) {
           tcp_keepalive(pcb);

reply via email to

[Prev in Thread] Current Thread [Next in Thread]