From 7570696c57d446f163050c2befb78b8fc6cfeb02 Mon Sep 17 00:00:00 2001 From: Jiaxin Wu Date: Tue, 31 May 2016 22:17:28 +0800 Subject: NetworkPkg: Handling timeout case in httpboot driver This patch is used to handle timeout case when downloading the message. The Status in the token should also be checked to handle any response error case including timeout case. Cc: Fu Siyuan Cc: Ye Ting Cc: Zhang Lubo Cc: Hegde Nagaraj P Cc: Gary Lin Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jiaxin Wu Reviewed-by: Gary Lin Reviewed-by: Hegde Nagaraj P Reviewed-by: Ye Ting Tested-by: Gary Lin Tested-by: Hegde Nagaraj P --- NetworkPkg/HttpBootDxe/HttpBootSupport.c | 46 +++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) (limited to 'NetworkPkg/HttpBootDxe/HttpBootSupport.c') diff --git a/NetworkPkg/HttpBootDxe/HttpBootSupport.c b/NetworkPkg/HttpBootDxe/HttpBootSupport.c index 66eca783af..9410bf9e15 100644 --- a/NetworkPkg/HttpBootDxe/HttpBootSupport.c +++ b/NetworkPkg/HttpBootDxe/HttpBootSupport.c @@ -754,6 +754,21 @@ HttpIoCreateIo ( HttpIo->RspToken.Event = Event; HttpIo->RspToken.Message = &HttpIo->RspMessage; + // + // Create TimeoutEvent for response + // + Status = gBS->CreateEvent ( + EVT_TIMER, + TPL_CALLBACK, + NULL, + NULL, + &Event + ); + if (EFI_ERROR (Status)) { + goto ON_ERROR; + } + HttpIo->TimeoutEvent = Event; + return EFI_SUCCESS; ON_ERROR: @@ -789,6 +804,11 @@ HttpIoDestroyIo ( if (Event != NULL) { gBS->CloseEvent (Event); } + + Event = HttpIo->TimeoutEvent; + if (Event != NULL) { + gBS->CloseEvent (Event); + } Http = HttpIo->Http; if (Http != NULL) { @@ -902,6 +922,14 @@ HttpIoRecvResponse ( return EFI_INVALID_PARAMETER; } + // + // Start the timer, and wait Timeout seconds to receive the header packet. + // + Status = gBS->SetTimer (HttpIo->TimeoutEvent, TimerRelative, HTTP_BOOT_RESPONSE_TIMEOUT * TICKS_PER_MS); + if (EFI_ERROR (Status)) { + return Status; + } + // // Queue the response token to HTTP instances. // @@ -924,16 +952,32 @@ HttpIoRecvResponse ( ); if (EFI_ERROR (Status)) { + gBS->SetTimer (HttpIo->TimeoutEvent, TimerCancel, 0); return Status; } // // Poll the network until receive finish. // - while (!HttpIo->IsRxDone) { + while (!HttpIo->IsRxDone && ((HttpIo->TimeoutEvent == NULL) || EFI_ERROR (gBS->CheckEvent (HttpIo->TimeoutEvent)))) { Http->Poll (Http); } + gBS->SetTimer (HttpIo->TimeoutEvent, TimerCancel, 0); + + if (!HttpIo->IsRxDone) { + // + // Timeout occurs, cancel the response token. + // + Http->Cancel (Http, &HttpIo->RspToken); + + Status = EFI_TIMEOUT; + + return Status; + } else { + HttpIo->IsRxDone = FALSE; + } + // // Store the received data into the wrapper. // -- cgit v1.2.3