Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 30 Sep 2002 11:55:46 -0700 (PDT)
From:      Matt Dillon <dillon@FreeBSD.org>
To:        cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org
Subject:   cvs commit: src/sys/netinet tcp_input.c
Message-ID:  <200209301855.g8UItkxn064226@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
dillon      2002/09/30 11:55:46 PDT

  Modified files:
    sys/netinet          tcp_input.c 
  Log:
  Guido found another bug.  There is a situation with
  timestamped TCP packets where FreeBSD will send DATA+FIN and
  A W2K box will ack just the DATA portion.  If this occurs
  after FreeBSD has done a (NewReno) fast-retransmit and is
  recovering it (dupacks > threshold) it triggers a case in
  tcp_newreno_partial_ack() (tcp_newreno() in stable) where
  tcp_output() is called with the expectation that the retransmit
  timer will be reloaded.  But tcp_output() falls through and
  returns without doing anything, causing the persist timer to be
  loaded instead.  This causes the connection to hang until W2K gives up.
  This occurs because in the case where only the FIN must be acked, the
  'len' calculation in tcp_output() will be 0, a lot of checks will be
  skipped, and the FIN check will also be skipped because it is designed
  to handle FIN retransmits, not forced transmits from tcp_newreno().
  
  The solution is to simply set TF_ACKNOW before calling tcp_output()
  to absolute guarentee that it will run the send code and reset the
  retransmit timer.  TF_ACKNOW is already used for this purpose in other
  cases.
  
  For some unknown reason this patch also seems to greatly reduce
  the number of duplicate acks received when Guido runs his tests over
  a lossy network.  It is quite possible that there are other
  tcp_newreno{_partial_ack()} cases which were not generating the expected
  output which this patch also fixes.
  
  X-MFC after:    Will be MFC'd after the freeze is over
  
  Revision  Changes    Path
  1.176     +1 -0      src/sys/netinet/tcp_input.c

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200209301855.g8UItkxn064226>