Siyuan, I agree Http->Response() is designed to a unblocking interface. Actually, current implementation is blocking one. So, handling EFI_TIMEOUT status in the token (HttpBootDxe driver) or return directly, both of them are fine to me . But Tcp->Cancel() still should be necessary calling if we handle the case in HttpBootDxe driver.
Thanks. Jiaxin > -----Original Message----- > From: Fu, Siyuan > Sent: Tuesday, May 24, 2016 9:17 AM > To: Wu, Jiaxin <[email protected]>; [email protected] > Cc: Ye, Ting <[email protected]>; Gary Lin <[email protected]>; Samer El-Haj- > Mahmoud <[email protected]>; Hegde Nagaraj P <[email protected]> > Subject: RE: [Patch] NetworkPkg: Need update Http token status while > timeout happened > > Hi, Jiaxin > > The Http->Response() is a unblocking interface, that the function return > status should be SUCCESS once the token has been queued to the driver. > Then if there is an error later, the Status in the token should be updated and > Event will be signaled. > So I think the original code in HTTP driver does make sense, but the HTTP > boot driver function has bug that, when download the message body, it > should also check the Status in the token, not only the function. > > Best Regards > Siyuan > > > > -----Original Message----- > > From: Wu, Jiaxin > > Sent: Friday, May 20, 2016 3:24 PM > > To: [email protected] > > Cc: Ye, Ting <[email protected]>; Fu, Siyuan <[email protected]>; > > Gary Lin <[email protected]>; Samer El-Haj-Mahmoud <[email protected]>; > Hegde > > Nagaraj P <[email protected]> > > Subject: [Patch] NetworkPkg: Need update Http token status while > > timeout happened > > > > Http token status should be updated to EFI_TIMEOUT while timeout > > happened by any abruptly interrupted (e.g. network disconnection, > > cable plug/unplug...). Otherwise, HttpBootDxe driver will continue > > treat it as no error happened, and its ReceivedSize will be updated to > > ContentLength directly. Moreover, If download image type is RAM Disk, > > the corresponding info will be registered to system. > > > > Cc: Ye Ting <[email protected]> > > Cc: Fu Siyuan <[email protected]> > > Cc: Gary Lin <[email protected]> > > Cc: Samer El-Haj-Mahmoud <[email protected]> > > Cc: Hegde Nagaraj P <[email protected]> > > Contributed-under: TianoCore Contribution Agreement 1.0 > > Signed-off-by: Jiaxin Wu <[email protected]> > > --- > > NetworkPkg/HttpDxe/HttpImpl.c | 3 +++ > > NetworkPkg/HttpDxe/HttpProto.c | 16 +++++++++++----- > > 2 files changed, 14 insertions(+), 5 deletions(-) > > > > diff --git a/NetworkPkg/HttpDxe/HttpImpl.c > > b/NetworkPkg/HttpDxe/HttpImpl.c index f4ae28a..05a96e9 100644 > > --- a/NetworkPkg/HttpDxe/HttpImpl.c > > +++ b/NetworkPkg/HttpDxe/HttpImpl.c > > @@ -1259,10 +1259,13 @@ Exit: > > > > Error2: > > NetMapInsertHead (&HttpInstance->TxTokens, ValueInItem->HttpToken, > > ValueInItem); > > > > Error: > > + > > + HttpCloseConnection (HttpInstance); > > + > > HttpTcpTokenCleanup (Wrap); > > > > if (HttpHeaders != NULL) { > > FreePool (HttpHeaders); > > } > > diff --git a/NetworkPkg/HttpDxe/HttpProto.c > > b/NetworkPkg/HttpDxe/HttpProto.c index afa7fe4..c3608c0 100644 > > --- a/NetworkPkg/HttpDxe/HttpProto.c > > +++ b/NetworkPkg/HttpDxe/HttpProto.c > > @@ -1,9 +1,9 @@ > > /** @file > > Miscellaneous routines for HttpDxe driver. > > > > -Copyright (c) 2015, Intel Corporation. All rights reserved.<BR> > > +Copyright (c) 2015 - 2016, Intel Corporation. All rights > > +reserved.<BR> > > (C) Copyright 2016 Hewlett Packard Enterprise Development LP<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 http://opensource.org/licenses/bsd-license.php > > @@ -1605,10 +1605,11 @@ HttpTcpReceiveHeader ( > > while (!HttpInstance->IsRxDone && ((Timeout == NULL) || > > EFI_ERROR (gBS->CheckEvent (Timeout)))) { > > Tcp4->Poll (Tcp4); > > } > > > > if (!HttpInstance->IsRxDone) { > > + Tcp4->Cancel (Tcp4, &Rx4Token->CompletionToken); > > gBS->CloseEvent (Rx4Token->CompletionToken.Event); > > Rx4Token->CompletionToken.Status = EFI_TIMEOUT; > > } > > > > Status = Rx4Token->CompletionToken.Status; @@ -1671,10 +1672,11 > > @@ HttpTcpReceiveHeader ( > > while (!HttpInstance->IsRxDone && ((Timeout == NULL) || > > EFI_ERROR (gBS->CheckEvent (Timeout)))) { > > Tcp6->Poll (Tcp6); > > } > > > > if (!HttpInstance->IsRxDone) { > > + Tcp6->Cancel (Tcp6, &Rx6Token->CompletionToken); > > gBS->CloseEvent (Rx6Token->CompletionToken.Event); > > Rx6Token->CompletionToken.Status = EFI_TIMEOUT; > > } > > > > Status = Rx6Token->CompletionToken.Status; @@ -1745,11 +1747,12 > > @@ HttpTcpReceiveBody ( > > HTTP_PROTOCOL *HttpInstance; > > EFI_TCP6_PROTOCOL *Tcp6; > > EFI_TCP6_IO_TOKEN *Rx6Token; > > EFI_TCP4_PROTOCOL *Tcp4; > > EFI_TCP4_IO_TOKEN *Rx4Token; > > - > > + > > + Status = EFI_SUCCESS; > > HttpInstance = Wrap->HttpInstance; > > Tcp4 = HttpInstance->Tcp4; > > Tcp6 = HttpInstance->Tcp6; > > Rx4Token = NULL; > > Rx6Token = NULL; > > @@ -1776,14 +1779,15 @@ HttpTcpReceiveBody ( > > while (!Wrap->TcpWrap.IsRxDone && ((Timeout == NULL) || EFI_ERROR > > (gBS->CheckEvent (Timeout)))) { > > Tcp6->Poll (Tcp6); > > } > > > > if (!Wrap->TcpWrap.IsRxDone) { > > + Tcp6->Cancel (Tcp6, &Rx6Token->CompletionToken); > > gBS->CloseEvent (Rx6Token->CompletionToken.Event); > > + Rx6Token->CompletionToken.Event = NULL; > > Rx6Token->CompletionToken.Status = EFI_TIMEOUT; > > Wrap->HttpToken->Status = Rx6Token->CompletionToken.Status; > > - gBS->SignalEvent (Wrap->HttpToken->Event); > > } > > } else { > > Rx4Token = &Wrap->TcpWrap.Rx4Token; > > Rx4Token->Packet.RxData->DataLength = (UINT32) HttpMsg- > >BodyLength; > > Rx4Token->Packet.RxData->FragmentTable[0].FragmentLength = > > (UINT32) > > HttpMsg->BodyLength; > > @@ -1799,19 +1803,21 @@ HttpTcpReceiveBody ( > > while (!Wrap->TcpWrap.IsRxDone && ((Timeout == NULL) || EFI_ERROR > > (gBS->CheckEvent (Timeout)))) { > > Tcp4->Poll (Tcp4); > > } > > > > if (!Wrap->TcpWrap.IsRxDone) { > > + Tcp4->Cancel (Tcp4, &Rx4Token->CompletionToken); > > gBS->CloseEvent (Rx4Token->CompletionToken.Event); > > + Rx4Token->CompletionToken.Event = NULL; > > Rx4Token->CompletionToken.Status = EFI_TIMEOUT; > > Wrap->HttpToken->Status = Rx4Token->CompletionToken.Status; > > - gBS->SignalEvent (Wrap->HttpToken->Event); > > } > > } > > > > - return EFI_SUCCESS; > > + Status = Wrap->HttpToken->Status; > > > > + return Status; > > } > > > > /** > > Clean up Tcp Tokens while the Tcp transmission error occurs. > > > > -- > > 1.9.5.msysgit.1 _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

