From 5c70cb3285dbceae65d135c73e865986a50b2ad2 Mon Sep 17 00:00:00 2001 From: eric_tian Date: Fri, 11 Apr 2008 07:20:05 +0000 Subject: [PATCH] [Description] solve the big file transfer issue using ISCSI [Impaction] change the control flow on IScsiExecuteScsiCommand function [Reference Info] The original design incorrectly uses a timer (its span is usually 2 seconds) to ensure the timely execution of CMD PDU send by initiator. For example: When initiator delivers a CMD PDU(WRITE command) in which the ExpDataXferLength filed is larger than DataSegmentLength field, according to ISCSI protocol spec, the target will respond it with a R2T PDU which is followed by a sequential DATA-OUT PDUs. In this situation, the original code may loop to deal with the arrival packet until initiator receives a RESPONSE PDU or the timer is expired. This way may cause the bigger file is more likely to fail. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5044 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Universal/Network/IScsiDxe/IScsiProto.c | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c index 3298b95769..93b7f715e1 100644 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c +++ b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c @@ -2776,6 +2776,7 @@ Returns: Status = EFI_SUCCESS; Tcb = NULL; TimeoutEvent = NULL; + Timeout = 0; if (Session->State != SESSION_STATE_LOGGED_IN) { return EFI_DEVICE_ERROR; @@ -2790,15 +2791,6 @@ Returns: if (Packet->Timeout != 0) { Timeout = MultU64x32 (Packet->Timeout, 2); - // - // Start the timeout timer. - // - Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, Timeout); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - TimeoutEvent = Conn->TimeoutEvent; } Status = IScsiNewTcb (Conn, &Tcb); @@ -2854,6 +2846,16 @@ Returns: InBufferContext.InDataLen = Packet->InTransferLength; while (!Tcb->StatusXferd) { + // + // Start the timeout timer. + // + if (Timeout) { + Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, Timeout); + if (EFI_ERROR (Status)) { + goto ON_EXIT; + } + TimeoutEvent = Conn->TimeoutEvent; + } // // try to receive PDU from target. // -- 2.39.2