]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg: Fix bug in TCP which not sending out ACK in certain circumstance.
authorFu Siyuan <siyuan.fu@intel.com>
Tue, 12 Jul 2016 01:47:58 +0000 (09:47 +0800)
committerFu Siyuan <siyuan.fu@intel.com>
Mon, 18 Jul 2016 02:08:43 +0000 (10:08 +0800)
Consider the situation as shown in below chart. The last ACK message has
acknowledged the Tcb->RcvWl2, and all the segments until Tcb->RcvNxt have
been received by TCP driver. The Tcb->RcvNxt is not acknowledged due to the
delayed ACK. In this case an incoming segment (Seg->Seq, Seg->End) should
not be accepted by TCP driver, and an immediate ACK is required.

Current TcpSeqAcceptable() thought it’s an acceptable segment incorrectly, it
continues the TcpInput() process instead of sending out an ACK and droping the
segment immediately.

Tcb->RcvWl2                       Tcb->RcvNxt        Tcb->RcvWl2 + Tcb->RcvWnd
        Seg->Seq       Seg->End         |                          |
    |     |               |             |                          |
 ---+-----+---------------+-------------+--------------------------+-----------
           <income segment>             <----Acceptable Range--- -->

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Fu Siyuan <siyuan.fu@intel.com>
Reviewed-By: Eugene Cohen <eugene@hp.com>
Reviewed-By: Wu Jiaxin <jiaxin.wu@intel.com>
Reviewed-By: Ye Ting <ting.ye@intel.com>
MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c

index 11936ad7f14e880c4f12e01f0ae95e9774e10bc8..b7f329be7a64d7ff8cd157141693dcab65b86724 100644 (file)
@@ -32,7 +32,7 @@ TcpSeqAcceptable (
   IN TCP_SEG *Seg\r
   )\r
 {\r
-  return (TCP_SEQ_LEQ (Tcb->RcvWl2, Seg->End) &&\r
+  return (TCP_SEQ_LEQ (Tcb->RcvNxt, Seg->End) &&\r
           TCP_SEQ_LT (Seg->Seq, Tcb->RcvWl2 + Tcb->RcvWnd));\r
 }\r
 \r