lwip-users
[Top][All Lists]
Advanced

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

[lwip-users] processing Fast retransmit bag


From: Oleg Tychev
Subject: [lwip-users] processing Fast retransmit bag
Date: Wed, 21 Jun 2006 18:38:36 +0200
User-agent: Thunderbird 1.5.0.4 (Windows/20060516)

Hello All!

My hub have found another bug:)

For example we have two node.
Data are sent in both destination.

node1                              node2(lwip)
[data1]--->
                                  <---[data2] (1 byte/sec)
ACK
                                  <---[data3]
data3 packet is dropped
dup ACK 1->
                                      pcb->dupacks==1
dup ACK 2->
                                  <---[data4]
                                      pcb->dupacks==2
dup ACK 3->
                                      pcb->dupacks==3

Node2 starts Fast Retransmission
see tcp_receive
           if (!(pcb->flags & TF_INFR)) {
                pcb->flags |= TF_INFR;
                tcp_rexmit(pcb);
} <---data3
data3 packet is dropped again

node1 sends dup ACKs again and again
but we have TF_INFR flag set, it means no tcp_rexmit!!!

We doesn't have retrasmission timeout too, because data are sent in both destination.

You can use this patch, but I don't now how behaves fast recovery and slow start with it.
At least it works:)

Poka poka,
Oleg

Here is patch against version lwip-1.1.1:
*** lwip-1.1.1/src/core/1/tcp_in.c      Wed Mar  1 16:53:42 2006
--- lwip-1.1.1/src/core/2/tcp_in.c      Wed Jun 21 18:13:18 2006
***************
*** 683,688 ****
--- 683,691 ----
             if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
               pcb->cwnd += pcb->mss;
             }
+             if ((pcb->dupacks % 3) == 0) {
+               pcb->flags &= ~TF_INFR;
+             }
           }
         }
       } else {

*** lwip-1.1.1/src/core/1/tcp_in.c      Wed Mar  1 16:53:42 2006
--- lwip-1.1.1/src/core/2/tcp_in.c      Wed Jun 21 18:13:18 2006
***************
*** 683,688 ****
--- 683,691 ----
              if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
                pcb->cwnd += pcb->mss;
              }
+             if ((pcb->dupacks % 3) == 0) {
+               pcb->flags &= ~TF_INFR;
+             }
            }
          }
        } else {

reply via email to

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