public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Fu Siyuan <siyuan.fu@intel.com>
To: edk2-devel@lists.01.org
Cc: Wu Jiaxin <jiaxin.wu@intel.com>,
	Andrey Tepin <atepin@kraftway.ru>, Ye Ting <ting.ye@intel.com>
Subject: [Patch] MdeModulePkg: Addressing TCP Window Retraction when window scale factor is used.
Date: Wed,  3 May 2017 15:25:32 +0800	[thread overview]
Message-ID: <1493796332-91632-1-git-send-email-siyuan.fu@intel.com> (raw)

The RFC1323 which defines the TCP window scale option has been obsoleted by RFC7323.
This patch is to follow the RFC3723 to address the TCP window retraction problem
when a non-zero scale factor is used.

Cc: Wu Jiaxin <jiaxin.wu@intel.com>
Cc: Andrey Tepin <atepin@kraftway.ru>
Cc: Ye Ting <ting.ye@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Fu Siyuan <siyuan.fu@intel.com>
---
 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c  |  5 +--
 .../Universal/Network/Tcp4Dxe/Tcp4Output.c         | 41 +++++++++++++++++-----
 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h |  8 ++++-
 3 files changed, 43 insertions(+), 11 deletions(-)

diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c
index 1a7c41a..892d19b 100644
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c
+++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c
@@ -1,7 +1,7 @@
 /** @file
   Misc support routines for tcp.
 
-Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR>
 This program and the accompanying materials
 are licensed and made available under the terms and conditions of the BSD License
 which accompanies this distribution.  The full text of the license may be found at
@@ -78,7 +78,8 @@ TcpInitTcbLocal (
   // First window size is never scaled
   //
   Tcb->RcvWndScale  = 0;
-
+  Tcb->RetxmitSeqMax = 0;
+  
   Tcb->ProbeTimerOn = FALSE;
 }
 
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c
index 0eec8f0..ed71f97 100644
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c
+++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c
@@ -1,7 +1,7 @@
 /** @file
   TCP output process routines.
     
-Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR>
 This program and the accompanying materials
 are licensed and made available under the terms and conditions of the BSD License
 which accompanies this distribution.  The full text of the license may be found at
@@ -671,17 +671,38 @@ TcpRetransmit (
   // 2. must in the current send window
   // 3. will not change the boundaries of queued segments.
   //
-  if (TCP_SEQ_LT (Tcb->SndWl2 + Tcb->SndWnd, Seq)) {
-    DEBUG ((EFI_D_WARN, "TcpRetransmit: retransmission cancelled "
-      "because send window too small for TCB %p\n", Tcb));
+  if ((Tcb->SndWndScale != 0) &&
+      (TCP_SEQ_GT (Seq, Tcb->RetxmitSeqMax) || TCP_SEQ_GT (Tcb->SndWl2 + Tcb->SndWnd + (1 << Tcb->SndWndScale), Seq))) {
+    //
+    // Handle the Window Retraction if TCP window scale is enabled according to RFC7323:
+    //   On first retransmission, or if the sequence number is out of
+    //   window by less than 2^Rcv.Wind.Shift, then do normal
+    //   retransmission(s) without regard to the receiver window as long
+    //   as the original segment was in window when it was sent.
+    //
+    Len = TCP_SUB_SEQ (Tcb->SndNxt, Seq);
+    DEBUG (
+      (EFI_D_WARN,
+      "TcpRetransmit: retransmission without regard to the receiver window for TCB %p\n",
+      Tcb)
+      );
+    
+  } else if (TCP_SEQ_GEQ (Tcb->SndWl2 + Tcb->SndWnd, Seq)) {
+    Len = TCP_SUB_SEQ (Tcb->SndWl2 + Tcb->SndWnd, Seq);
+    
+  } else {
+    DEBUG (
+      (EFI_D_WARN,
+      "TcpRetransmit: retransmission cancelled because send window too small for TCB %p\n",
+      Tcb)
+      );
 
     return 0;
   }
+  
+  Len = MIN (Len, Tcb->SndMss);
 
-  Len   = TCP_SUB_SEQ (Tcb->SndWl2 + Tcb->SndWnd, Seq);
-  Len   = MIN (Len, Tcb->SndMss);
-
-  Nbuf  = TcpGetSegmentSndQue (Tcb, Seq, Len);
+  Nbuf = TcpGetSegmentSndQue (Tcb, Seq, Len);
   if (Nbuf == NULL) {
     return -1;
   }
@@ -691,6 +712,10 @@ TcpRetransmit (
   if (TcpTransmitSegment (Tcb, Nbuf) != 0) {
     goto OnError;
   }
+  
+  if (TCP_SEQ_GT (Seq, Tcb->RetxmitSeqMax)) {
+    Tcb->RetxmitSeqMax = Seq;
+  }
 
   //
   // The retransmitted buffer may be on the SndQue,
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h
index 01d6034..49d8a1d 100644
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h
+++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h
@@ -1,7 +1,7 @@
 /** @file
   Tcp Protocol header file.
 
-Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR>
 This program and the accompanying materials
 are licensed and made available under the terms and conditions of the BSD License
 which accompanies this distribution.  The full text of the license may be found at
@@ -251,6 +251,12 @@ struct _TCP_CB {
   UINT32            ConnectTimeout;  ///< The connect establishment time out
 
   //
+  // RFC7323
+  // Addressing Window Retraction for TCP Window Scale Option.
+  //
+  TCP_SEQNO         RetxmitSeqMax;       ///< Max Seq number in previous retransmission.
+
+  //
   // configuration for tcp provided by user
   //
   BOOLEAN           UseDefaultAddr;
-- 
1.9.5.msysgit.1



                 reply	other threads:[~2017-05-03  7:25 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1493796332-91632-1-git-send-email-siyuan.fu@intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox