]> git.proxmox.com Git - mirror_edk2.git/commitdiff
NetworkPkg: Handling timeout case in httpboot driver
authorJiaxin Wu <jiaxin.wu@intel.com>
Tue, 31 May 2016 14:17:28 +0000 (22:17 +0800)
committerJiaxin Wu <jiaxin.wu@intel.com>
Mon, 13 Jun 2016 03:51:58 +0000 (11:51 +0800)
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 <siyuan.fu@intel.com>
Cc: Ye Ting <ting.ye@intel.com>
Cc: Zhang Lubo <lubo.zhang@intel.com>
Cc: Hegde Nagaraj P <nagaraj-p.hegde@hpe.com>
Cc: Gary Lin <glin@suse.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jiaxin Wu <jiaxin.wu@intel.com>
Reviewed-by: Gary Lin <glin@suse.com>
Reviewed-by: Hegde Nagaraj P <nagaraj-p.hegde@hpe.com>
Reviewed-by: Ye Ting <ting.ye@intel.com>
Tested-by: Gary Lin <glin@suse.com>
Tested-by: Hegde Nagaraj P <nagaraj-p.hegde@hpe.com>
NetworkPkg/HttpBootDxe/HttpBootClient.c
NetworkPkg/HttpBootDxe/HttpBootClient.h
NetworkPkg/HttpBootDxe/HttpBootSupport.c
NetworkPkg/HttpBootDxe/HttpBootSupport.h

index 46cf9ca6fb78e49cc48ed5cf1cb1f7c5d3b94133..378bf02880808b0df0d8b7cc6af3a3526b6f8e8f 100644 (file)
@@ -1008,7 +1008,10 @@ HttpBootGetBootFile (
                    FALSE,\r
                    &ResponseBody\r
                    );\r
-        if (EFI_ERROR (Status)) {\r
+        if (EFI_ERROR (Status) || EFI_ERROR (ResponseBody.Status)) {\r
+          if (EFI_ERROR (ResponseBody.Status)) {\r
+            Status = ResponseBody.Status;\r
+          }\r
           goto ERROR_6;\r
         }\r
         ReceivedSize += ResponseBody.BodyLength;\r
@@ -1045,7 +1048,10 @@ HttpBootGetBootFile (
                    FALSE,\r
                    &ResponseBody\r
                    );\r
-        if (EFI_ERROR (Status)) {\r
+        if (EFI_ERROR (Status) || EFI_ERROR (ResponseBody.Status)) {\r
+          if (EFI_ERROR (ResponseBody.Status)) {\r
+            Status = ResponseBody.Status;\r
+          }\r
           goto ERROR_6;\r
         }\r
 \r
index 2fd7dfc7160724ffd3d318ab508bceca09fea572..2c32341460b7f2b2c8c08dbf9570b315297c302b 100644 (file)
@@ -17,6 +17,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #define __EFI_HTTP_BOOT_HTTP_H__\r
 \r
 #define HTTP_BOOT_REQUEST_TIMEOUT            5000      // 5 seconds in uints of millisecond.\r
+#define HTTP_BOOT_RESPONSE_TIMEOUT           5000      // 5 seconds in uints of millisecond.\r
 #define HTTP_BOOT_BLOCK_SIZE                 1500\r
 \r
 \r
index 66eca783af712e13457bc79ab9884b35e5a62b23..9410bf9e15209cf2c21eaf0121fef297985247ad 100644 (file)
@@ -754,6 +754,21 @@ HttpIoCreateIo (
   HttpIo->RspToken.Event = Event;\r
   HttpIo->RspToken.Message = &HttpIo->RspMessage;\r
 \r
+  //\r
+  // Create TimeoutEvent for response\r
+  //\r
+  Status = gBS->CreateEvent (\r
+                  EVT_TIMER,\r
+                  TPL_CALLBACK,\r
+                  NULL,\r
+                  NULL,\r
+                  &Event\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    goto ON_ERROR;\r
+  }\r
+  HttpIo->TimeoutEvent = Event;\r
+\r
   return EFI_SUCCESS;\r
   \r
 ON_ERROR:\r
@@ -789,6 +804,11 @@ HttpIoDestroyIo (
   if (Event != NULL) {\r
     gBS->CloseEvent (Event);\r
   }\r
+\r
+  Event = HttpIo->TimeoutEvent;\r
+  if (Event != NULL) {\r
+    gBS->CloseEvent (Event);\r
+  }\r
   \r
   Http = HttpIo->Http;\r
   if (Http != NULL) {\r
@@ -902,6 +922,14 @@ HttpIoRecvResponse (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  //\r
+  // Start the timer, and wait Timeout seconds to receive the header packet.\r
+  //\r
+  Status = gBS->SetTimer (HttpIo->TimeoutEvent, TimerRelative, HTTP_BOOT_RESPONSE_TIMEOUT * TICKS_PER_MS);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
   //\r
   // Queue the response token to HTTP instances.\r
   //\r
@@ -924,16 +952,32 @@ HttpIoRecvResponse (
                    );\r
   \r
   if (EFI_ERROR (Status)) {\r
+    gBS->SetTimer (HttpIo->TimeoutEvent, TimerCancel, 0);\r
     return Status;\r
   }\r
 \r
   //\r
   // Poll the network until receive finish.\r
   //\r
-  while (!HttpIo->IsRxDone) {\r
+  while (!HttpIo->IsRxDone && ((HttpIo->TimeoutEvent == NULL) || EFI_ERROR (gBS->CheckEvent (HttpIo->TimeoutEvent)))) {\r
     Http->Poll (Http);\r
   }\r
 \r
+  gBS->SetTimer (HttpIo->TimeoutEvent, TimerCancel, 0);\r
+\r
+  if (!HttpIo->IsRxDone) {\r
+    //\r
+    // Timeout occurs, cancel the response token.\r
+    //\r
+    Http->Cancel (Http, &HttpIo->RspToken);\r
+   \r
+    Status = EFI_TIMEOUT;\r
+    \r
+    return Status;\r
+  } else {\r
+    HttpIo->IsRxDone = FALSE;\r
+  }\r
+\r
   //\r
   // Store the received data into the wrapper.\r
   //\r
index 28e8005d21585224b0792767fd88fedf7eeeb350..4d024277b5d87e410d33fe4883e2a77e649a00b3 100644 (file)
@@ -196,6 +196,8 @@ typedef struct {
 \r
   BOOLEAN                   IsTxDone;\r
   BOOLEAN                   IsRxDone;\r
+\r
+  EFI_EVENT                 TimeoutEvent;\r
 } HTTP_IO;\r
 \r
 //\r