From nobody@FreeBSD.org  Mon Nov 16 07:15:41 2009
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 2275E106566B
	for <freebsd-gnats-submit@FreeBSD.org>; Mon, 16 Nov 2009 07:15:41 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21])
	by mx1.freebsd.org (Postfix) with ESMTP id 121A58FC1C
	for <freebsd-gnats-submit@FreeBSD.org>; Mon, 16 Nov 2009 07:15:41 +0000 (UTC)
Received: from www.freebsd.org (localhost [127.0.0.1])
	by www.freebsd.org (8.14.3/8.14.3) with ESMTP id nAG7FeY3031472
	for <freebsd-gnats-submit@FreeBSD.org>; Mon, 16 Nov 2009 07:15:40 GMT
	(envelope-from nobody@www.freebsd.org)
Received: (from nobody@localhost)
	by www.freebsd.org (8.14.3/8.14.3/Submit) id nAG7FeZ9031471;
	Mon, 16 Nov 2009 07:15:40 GMT
	(envelope-from nobody)
Message-Id: <200911160715.nAG7FeZ9031471@www.freebsd.org>
Date: Mon, 16 Nov 2009 07:15:40 GMT
From: Richard Scheffenegger <rs@netapp.com>
To: freebsd-gnats-submit@FreeBSD.org
Subject: Lost Retransmission Detection
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         140597
>Category:       kern
>Synopsis:       [netinet] [patch] implement Lost Retransmission Detection
>Confidential:   no
>Severity:       serious
>Priority:       low
>Responsible:    andre
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Nov 16 07:20:00 UTC 2009
>Closed-Date:    
>Last-Modified:  Tue Aug 10 22:16:35 UTC 2010
>Originator:     Richard Scheffenegger
>Release:        8.0-RC2
>Organization:
NetApp
>Environment:
FreeBSD rsFreeBSD.vie.demo 8.0-RC2 FreeBSD 8.0-RC2 #16: Sat Nov 14 22:25:28 CET 2009     root@rsFreeBSD.vie.demo:/usr/obj/usr/src/sys/GENERIC  i386

>Description:
SACK TCP in FreeBSD does not do Lost Retransmission Detection.

Unlike linux, that functionality is not implemented, leading to a RTO when a single segment is lost twice. This reduces Goodput considerably during phases 
of higher congestion.

See http://ubinet.yonsei.ac.kr/v2/publication/hpmn_papaers/ij/29.pdf
And http://projects.itri.aist.go.jp/gnet/pfldnet08kodama.ppt


>How-To-Repeat:
Drop the same segment of a TCP Stram twice, when cwnd is open enough (3+ segments).
>Fix:
Simple fix is rather easy (doesn't work perfectly under all circumstances,
but doesn't need new state variable and runs in constant time):

When sending the last segment in a sackhole, store snd.max in rxmit.
During SACK Ack processing, check the value of rxmit from the lowest 
hole against snd.fack; if snd.fack <= rxmit of that hole, set rxmit to 
start, and sackhint.nexthole == sackhole[0]. 

Care must be taken during hole-splitting (if rxmit > end of lower hole, set
rxmit to snd.max), and all checks of sackhole[].rxmit need to deal with
the signal rxmit > end.

See http://www.ietf.org/mail-archive/web/tcpm/current/msg05003.html ff.

>Release-Note:
>Audit-Trail:
State-Changed-From-To: open->suspended 
State-Changed-By: linimon 
State-Changed-When: Mon Nov 16 08:39:23 UTC 2009 
State-Changed-Why:  
Mark suspended awaiting patches. 


Responsible-Changed-From-To: freebsd-bugs->freebsd-net 
Responsible-Changed-By: linimon 
Responsible-Changed-When: Mon Nov 16 08:39:23 UTC 2009 
Responsible-Changed-Why:  
Over to maintainer(s). 

http://www.freebsd.org/cgi/query-pr.cgi?pr=140597 

From: "Scheffenegger, Richard" <rs@netapp.com>
To: <bug-followup@freebsd.org>, "Lawrence Stewart" <lastewart@swin.edu.au>
Cc: "Biswas, Anumita" <Anumita.Biswas@netapp.com>
Subject: Re: kern/140597 implement Lost Retransmission Detection
Date: Fri, 2 Apr 2010 18:48:04 +0100

 As discussed earlier, here is a simple fix.
 
 Caveat: Doesn't work at the end of a session or when cwnd is very small
 (<4 segments). Also, during heavy reordering, some spurious
 re-retransmissions might occur (but that would only affect very few
 re-retransmitted segments, as holes would still close with each
 additional received SACK, reducing the chance of spurious
 re-transmissions).=20
 
 Benefit: during LAN burst drop events, TCP will not revert to
 retransmission timeouts in order to recover. In a LAN, the RTO is
 typically many orders of magnitude larger than the RTT. Not relying on
 RTO whenever possible can help keep throughput up..
 
 
 Simple Patch:
 
 
 ------------------------------------------
 diff -u netinet.orig/tcp_output.c netinet/tcp_output.c
 --- netinet.orig/tcp_output.c   2009-10-25 02:10:29.000000000 +0100
 +++ netinet/tcp_output.c        2010-04-02 16:55:14.000000000 +0200
 @@ -953,6 +953,10 @@
         } else {
                 th->th_seq =3D htonl(p->rxmit);
                 p->rxmit +=3D len;
 +               /* lost again detection */
 +               if (SEQ_GEQ(p->rxmit, p->end)) {
 +                       p->rxmit =3D tp->snd_nxt;
 +               }
                 tp->sackhint.sack_bytes_rexmit +=3D len;
         }
         th->th_ack =3D htonl(tp->rcv_nxt);
 diff -u netinet.orig/tcp_sack.c netinet/tcp_sack.c
 --- netinet.orig/tcp_sack.c     2009-10-25 02:10:29.000000000 +0100
 +++ netinet/tcp_sack.c  2010-04-02 16:46:42.000000000 +0200
 @@ -460,6 +460,13 @@
         /* We must have at least one SACK hole in scoreboard. */
         KASSERT(!TAILQ_EMPTY(&tp->snd_holes),
             ("SACK scoreboard must not be empty"));
 +       /* lost again - then restart */
 +       if ((temp =3D TAILQ_FIRST(&tp->snd_holes)) !=3D NULL) {
 +               if (SEQ_GT(tp->snd_fack, temp->rxmit)) {
 +                       temp->rxmit =3D temp->start;
 +                       tp->sackhint.nexthole =3D temp;
 +               }
 +       }
         cur =3D TAILQ_LAST(&tp->snd_holes, sackhole_head); /* Last SACK
 hole. */
         /*
          * Since the incoming sack blocks are sorted, we can process
 them
 @@ -508,7 +515,9 @@
                         if (SEQ_GEQ(sblkp->end, cur->end)) {
                                 /* Move end of hole backward. */
                                 cur->end =3D sblkp->start;
 -                               cur->rxmit =3D SEQ_MIN(cur->rxmit,
 cur->end);
 +                               if (SEQ_GEQ(cur->rxmit, cur->end)) {
 +                                       cur->rxmit =3D tp->snd_nxt;
 +                               }
                         } else {
                                 /*
                                  * ACKs some data in middle of a hole;
 need
 @@ -524,8 +533,9 @@
                                                     - temp->start);
                                         }
                                         cur->end =3D sblkp->start;
 -                                       cur->rxmit =3D =
 SEQ_MIN(cur->rxmit,
 -                                           cur->end);
 +                                       if (SEQ_GEQ(cur->rxmit,
 cur->end)) {
 +                                               cur->rxmit =3D
 tp->snd_nxt;
 +                                       }
                                 }
                         }
                 }
 
State-Changed-From-To: suspended->open 
State-Changed-By: linimon 
State-Changed-When: Sat Apr 3 17:54:12 UTC 2010 
State-Changed-Why:  
New patch received. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=140597 

From: Mark Linimon <linimon@lonesome.com>
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/140597: [netinet] [patch] implement Lost Retransmission
	Detection
Date: Sun, 4 Apr 2010 23:09:23 -0500

 uuencoded version of patch received in private email (should fix the
 problems with quoted-printable):
 
 ----- Forwarded message from "Scheffenegger, Richard" <rs@netapp.com> -----
 
 begin 600 patch.tar
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
 "`0``
 `
 end
 
 ----- End forwarded message -----

From: "Scheffenegger, Richard" <rs@netapp.com>
To: <bug-followup@freebsd.org>, "Lawrence Stewart" <lastewart@swin.edu.au>
Cc: "Biswas, Anumita" <Anumita.Biswas@netapp.com>
Subject: Re: kern/140597 implement Lost Retransmission Detection
Date: Wed, 21 Apr 2010 02:16:01 +0100

 I found a small oversight (bug) in my earlier simple fix. If we had sent
 out multiple holes already, all of which get (partially) lost in the
 retransmission again, the original simple patch would only work for the
 very first hole. So, subsequent holes would not get re-sent, unless
 another ACK (SACK) would be received - however, seeing more SACKs
 becomes less likely the more loss is expirienced.
 
 This is a updated patch diff, which accounts for that case as well - but
 at the cost of O(n) time, instead of O(c).
 
 (Just check all holes from the hint backwards to the head, if any
 already fully resent hole needs to be reset, instead of only the first
 one - which might go away during subsequent processing in the original
 patch).
 
 
 
 diff -u netinet.orig/tcp_output.c netinet/tcp_output.c
 --- netinet.orig/tcp_output.c   2009-10-25 02:10:29.000000000 +0100
 +++ netinet/tcp_output.c        2010-04-02 16:55:14.000000000 +0200
 @@ -953,6 +953,10 @@
         } else {
                 th->th_seq =3D htonl(p->rxmit);
                 p->rxmit +=3D len;
 +               /* lost again detection */
 +               if (SEQ_GEQ(p->rxmit, p->end)) {
 +                       p->rxmit =3D tp->snd_nxt;
 +               }
                 tp->sackhint.sack_bytes_rexmit +=3D len;
         }
         th->th_ack =3D htonl(tp->rcv_nxt);
 diff -u netinet.orig/tcp_sack.c netinet.simple_mod/tcp_sack.c
 --- netinet.orig/tcp_sack.c     2009-10-25 02:10:29.000000000 +0100
 +++ netinet/tcp_sack.c          2010-04-21 00:48:23.000000000 +0200
 @@ -508,7 +508,9 @@
                         if (SEQ_GEQ(sblkp->end, cur->end)) {
                                 /* Move end of hole backward. */
                                 cur->end =3D sblkp->start;
 -                               cur->rxmit =3D SEQ_MIN(cur->rxmit,
 cur->end);
 +                               if (SEQ_GEQ(cur->rxmit, cur->end)) {
 +                                       cur->rxmit =3D tp->snd_nxt;
 +                               }
                         } else {
                                 /*
                                  * ACKs some data in middle of a hole;
 need
 @@ -524,8 +526,9 @@
                                                     - temp->start);
                                         }
                                         cur->end =3D sblkp->start;
 -                                       cur->rxmit =3D =
 SEQ_MIN(cur->rxmit,
 -                                           cur->end);
 +                                       if (SEQ_GEQ(cur->rxmit,
 cur->end)) {
 +                                               cur->rxmit =3D
 tp->snd_nxt;
 +                                       }
                                 }
                         }
                 }
 @@ -540,6 +543,15 @@
                 else
                         sblkp--;
         }
 +       /* retransmission lost again - then restart */
 +       if ((temp =3D tp->sackhint.nexthole) !=3D NULL) {
 +               do {
 +                       if (SEQ_GT(tp->snd_fack, temp->rxmit)) {
 +                               temp->rxmit =3D temp->start;
 +                               tp->sackhint.nexthole =3D temp;
 +                       }
 +               } while ((temp =3D TAILQ_PREV(temp, sackhole_head,
 scblink)) !=3D NULL);
 +       }
  }
 
  /*
 
 
 
 
 Richard Scheffenegger
 
 =20
 
Responsible-Changed-From-To: freebsd-net->andre 
Responsible-Changed-By: andre 
Responsible-Changed-When: Tue Aug 10 22:15:15 UTC 2010 
Responsible-Changed-Why:  
Take over. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=140597 
>Unformatted:
