Dear all
I have observed while testing with windows client that some times on
retransmission of packets from window the window advertises smaller window .
In that case lwip does not update its snd_wnd which ultimately leads to more
data sent by lwip than the advertised window by windows .The window discrads
the extra data ,which does not fit in its window ,and ask lwip to send this
lost data again as soon its window opens. But some times this demanded sequence
number does not lie on segment boundary . Lwip resend a segement which
contains that sequence somewhere in middle ,as lwip cannot fragment that
segment to send the exact sequence , but windows keep on insisting for exact
sequence .In that case the deadlock is created and ultimately the connection
gets stuck .
The check that seems responsible for this is in tcp_in.c in function tcp_receive
if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
(pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
(pcb->snd_wl2 == ackno && seg->tcphdr->wnd > pcb->snd_wnd))
{
pcb->snd_wnd = seg->tcphdr->wnd;
pcb->snd_wl1 = seqno;
pcb->snd_wl2 = ackno;
The if check is failed for retransmitted received packets with a smaller
advertised window causing a no window update and causing a dead lock.
This problem may be solved if we add a new check before this check like
if(seg->tcphdr->wnd < pcb->snd_wnd)
pcb->snd_wnd = seg->tcphdr->wnd;
This new if sets the snd_wnd whenever any small window is advertised
Any one comment please
Best Regards
Mumtaz Ahmad
Manager Network Systems Group
SN Pakistan
92-52-3335228327
_______________________________________________
lwip-users mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/lwip-users