svn commit: r229665 - head/sys/netinet
Sergey Kandaurov
pluknet at freebsd.org
Fri Jan 6 00:19:31 UTC 2012
On 6 January 2012 02:29, John Baldwin <jhb at freebsd.org> wrote:
> Author: jhb
> Date: Thu Jan 5 22:29:11 2012
> New Revision: 229665
> URL: http://svn.freebsd.org/changeset/base/229665
>
> Log:
> Remove the assertion from tcp_input() that rcv_nxt is always greater
> than or equal to rcv_adv and fix tcp_twstart() to handle this case by
> assuming the last window was zero rather than a negative value.
>
> The code in tcp_input() already safely handled this case. It can happen
> due to delayed ACKs along with a remote sender that sends data beyond
> the window we previously advertised. If we have room in our socket buffer
> for the extra data beyond the advertised window, we will accept it.
> However, if the ACK for that segment is delayed, then we will not
> effectively fixup rcv_adv to account for that extra data until the
> next segment arrives and forces out an ACK. When that next segment
> arrives, rcv_nxt will be beyond rcv_adv.
>
> Tested by: pjd
> MFC after: 1 week
>
> Modified:
> head/sys/netinet/tcp_input.c
> head/sys/netinet/tcp_timewait.c
>
> Modified: head/sys/netinet/tcp_input.c
> ==============================================================================
> --- head/sys/netinet/tcp_input.c Thu Jan 5 22:28:40 2012 (r229664)
> +++ head/sys/netinet/tcp_input.c Thu Jan 5 22:29:11 2012 (r229665)
> @@ -1795,9 +1795,6 @@ tcp_do_segment(struct mbuf *m, struct tc
> win = sbspace(&so->so_rcv);
> if (win < 0)
> win = 0;
> - KASSERT(SEQ_GEQ(tp->rcv_adv, tp->rcv_nxt),
> - ("tcp_input negative window: tp %p rcv_nxt %u rcv_adv %u", tp,
> - tp->rcv_nxt, tp->rcv_adv));
> tp->rcv_wnd = imax(win, (int)(tp->rcv_adv - tp->rcv_nxt));
>
> /* Reset receive buffer auto scaling when not in bulk receive mode. */
>
> Modified: head/sys/netinet/tcp_timewait.c
> ==============================================================================
> --- head/sys/netinet/tcp_timewait.c Thu Jan 5 22:28:40 2012 (r229664)
> +++ head/sys/netinet/tcp_timewait.c Thu Jan 5 22:29:11 2012 (r229665)
> @@ -242,10 +242,10 @@ tcp_twstart(struct tcpcb *tp)
> /*
> * Recover last window size sent.
> */
> - KASSERT(SEQ_GEQ(tp->rcv_adv, tp->rcv_nxt),
> - ("tcp_twstart negative window: tp %p rcv_nxt %u rcv_adv %u", tp,
> - tp->rcv_nxt, tp->rcv_adv));
> - tw->last_win = (tp->rcv_adv - tp->rcv_nxt) >> tp->rcv_scale;
> + if (SEQ_GE(tp->rcv_adv, tp->rcv_nxt))
> + tw->last_win = (tp->rcv_adv - tp->rcv_nxt) >> tp->rcv_scale;
> + else
> + tw->last_win = 0;
>
> /*
> * Set t_recent if timestamps are used on the connection.
Hi, Looks like a typo there:
/usr/src/sys/netinet/tcp_timewait.c: In function 'tcp_twstart':
/usr/src/sys/netinet/tcp_timewait.c:245: warning: implicit declaration
of function 'SEQ_GE'
/usr/src/sys/netinet/tcp_timewait.c:245: warning: nested extern
declaration of 'SEQ_GE' [-Wnested-externs]
--
wbr,
pluknet
More information about the svn-src-head
mailing list