MdeModulePkg: Addressing TCP Window Retraction when window scale factor is used.
authorFu Siyuan <siyuan.fu@intel.com>
Wed, 3 May 2017 07:22:08 +0000 (15:22 +0800)
committerFu Siyuan <siyuan.fu@intel.com>
Tue, 9 May 2017 00:48:11 +0000 (08:48 +0800)
The RFC1323 which defines the TCP window scale option has been obsoleted by RFC7323.
This patch is to follow the RFC7323 to address the TCP window retraction problem
when a non-zero scale factor is used.
The changes has been test in high packet loss rate network by using HTTP boot and
iSCSI file read/write.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Fu Siyuan <siyuan.fu@intel.com>
Reviewed-by: Wu Jiaxin <jiaxin.wu@intel.com>
Reviewed-by: Ye Ting <ting.ye@intel.com>
MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c
MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c
MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h

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