Bug in TCP window update?

Girish Rayas grayas at gmail.com
Mon Jan 10 17:37:52 PST 2005


In tcp_input.c, window is updated when below condition is true,

if ((thflags & TH_ACK) &&
(SEQ_LT(tp->snd_wl1, th->th_seq) ||
(tp->snd_wl1 == th->th_seq && (SEQ_LT(tp->snd_wl2, th->th_ack) ||
(tp->snd_wl2 == th->th_ack && tiwin > tp->snd_wnd)))))

This check is to prevent old segments from affecting the send window.
But, left trim logic that was executed earlier in tcp_input.c sets the
th->th_seq to
tp->rcv_nxt for old segments. In many scenarios this effectively causes
snd_wl1 < th_seq and results in incorrect window update by old
segments.

Using actual sequence number of received segment in the above if
statement will fix the problem. Any comments?


More information about the freebsd-net mailing list