]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/HttpDxe/HttpProto.c
NetworkPkg: Update Http driver to use DPC mechanism.
[mirror_edk2.git] / NetworkPkg / HttpDxe / HttpProto.c
index 50ade4c230571bd13c74f9f75a6986b0ab28f1a8..8fbd45411064df8c787efd3de2182aca44b00764 100644 (file)
@@ -38,20 +38,18 @@ HttpCommonNotify (
 /**\r
   The notify function associated with TxToken for Tcp4->Transmit().\r
 \r
-  @param[in]  Event   The event signaled.\r
   @param[in]  Context The context.\r
 \r
 **/\r
 VOID\r
 EFIAPI\r
-HttpTcpTransmitNotify (\r
-  IN EFI_EVENT  Event,\r
+HttpTcpTransmitNotifyDpc (\r
   IN VOID       *Context\r
   )\r
 {\r
   HTTP_TOKEN_WRAP          *Wrap;\r
 \r
-  if ((Event == NULL) || (Context == NULL)) {\r
+  if (Context == NULL) {\r
     return ;\r
   }\r
 \r
@@ -79,17 +77,36 @@ HttpTcpTransmitNotify (
 \r
 }\r
 \r
+/**\r
+  Request HttpTcpTransmitNotifyDpc as a DPC at TPL_CALLBACK.\r
+\r
+  @param  Event                 The receive event delivered to TCP for transmit.\r
+  @param  Context               Context for the callback.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+HttpTcpTransmitNotify (\r
+  IN EFI_EVENT                Event,\r
+  IN VOID                     *Context\r
+  )\r
+{\r
+  //\r
+  // Request HttpTcpTransmitNotifyDpc as a DPC at TPL_CALLBACK\r
+  //\r
+  QueueDpc (TPL_CALLBACK, HttpTcpTransmitNotifyDpc, Context);\r
+}\r
+\r
+\r
 /**\r
   The notify function associated with RxToken for Tcp4->Receive ().\r
 \r
-  @param[in]  Event   The event signaled.\r
   @param[in]  Context The context.\r
 \r
 **/\r
 VOID\r
 EFIAPI\r
-HttpTcpReceiveNotify (\r
-  IN EFI_EVENT  Event,\r
+HttpTcpReceiveNotifyDpc (\r
   IN VOID       *Context\r
   )\r
 {\r
@@ -99,11 +116,12 @@ HttpTcpReceiveNotify (
   EFI_STATUS               Status;\r
   HTTP_PROTOCOL            *HttpInstance;\r
 \r
-  if ((Event == NULL) || (Context == NULL)) {\r
+  if (Context == NULL) {\r
     return ;\r
   }\r
 \r
   Wrap = (HTTP_TOKEN_WRAP *) Context;\r
+  gBS->CloseEvent (Wrap->TcpWrap.RxToken.CompletionToken.Event);\r
   if (EFI_ERROR (Wrap->TcpWrap.RxToken.CompletionToken.Status)) {\r
     return ;\r
   }\r
@@ -172,6 +190,27 @@ HttpTcpReceiveNotify (
   FreePool (Wrap);\r
 }\r
 \r
+/**\r
+  Request HttpTcpReceiveNotifyDpc as a DPC at TPL_CALLBACK.\r
+\r
+  @param  Event                 The receive event delivered to TCP for receive.\r
+  @param  Context               Context for the callback.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+HttpTcpReceiveNotify (\r
+  IN EFI_EVENT                Event,\r
+  IN VOID                     *Context\r
+  )\r
+{\r
+  //\r
+  // Request HttpTcpTransmitNotifyDpc as a DPC at TPL_CALLBACK\r
+  //\r
+  QueueDpc (TPL_CALLBACK, HttpTcpReceiveNotifyDpc, Context);\r
+}\r
+\r
+\r
 /**\r
   Create events for the TCP4 connection token and TCP4 close token.\r
 \r
@@ -243,10 +282,12 @@ HttpCloseTcp4ConnCloseEvent (
 \r
   if (NULL != HttpInstance->ConnToken.CompletionToken.Event) {\r
     gBS->CloseEvent (HttpInstance->ConnToken.CompletionToken.Event);\r
+    HttpInstance->ConnToken.CompletionToken.Event = NULL;\r
   }\r
 \r
   if (NULL != HttpInstance->CloseToken.CompletionToken.Event) {\r
     gBS->CloseEvent(HttpInstance->CloseToken.CompletionToken.Event);\r
+    HttpInstance->CloseToken.CompletionToken.Event = NULL;\r
   }  \r
 }\r
 \r
@@ -429,6 +470,12 @@ HttpInitProtocol (
     goto ON_ERROR;\r
   }\r
 \r
+  HttpInstance->Url = AllocateZeroPool (HTTP_URL_BUFFER_LEN);\r
+  if (HttpInstance->Url == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto ON_ERROR;\r
+  }\r
+\r
   NetMapInit (&HttpInstance->TxTokens);\r
   NetMapInit (&HttpInstance->RxTokens);\r
 \r
@@ -494,6 +541,11 @@ HttpCleanProtocol (
     HttpInstance->MsgParser = NULL;\r
   }\r
 \r
+  if (HttpInstance->Url != NULL) {\r
+    FreePool (HttpInstance->Url);\r
+    HttpInstance->Url = NULL;\r
+  }\r
+\r
   NetMapClean (&HttpInstance->TxTokens);\r
   NetMapClean (&HttpInstance->RxTokens);\r
 \r
@@ -581,21 +633,22 @@ HttpCloseConnection (
 {\r
   EFI_STATUS                Status;\r
 \r
-  HttpInstance->CloseToken.AbortOnClose = TRUE;\r
-  HttpInstance->IsCloseDone             = FALSE;\r
-  \r
-\r
-  Status = HttpInstance->Tcp4->Close (HttpInstance->Tcp4, &HttpInstance->CloseToken);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
+  if (HttpInstance->State == HTTP_STATE_TCP_CONNECTED) {\r
+    HttpInstance->CloseToken.AbortOnClose = TRUE;\r
+    HttpInstance->IsCloseDone             = FALSE;\r
+    \r
+    Status = HttpInstance->Tcp4->Close (HttpInstance->Tcp4, &HttpInstance->CloseToken);\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
 \r
-  while (!HttpInstance->IsCloseDone) {\r
-    HttpInstance->Tcp4->Poll (HttpInstance->Tcp4);\r
+    while (!HttpInstance->IsCloseDone) {\r
+      HttpInstance->Tcp4->Poll (HttpInstance->Tcp4);\r
+    }\r
   }\r
 \r
   HttpInstance->State = HTTP_STATE_TCP_CLOSED;\r
-  return Status;\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
@@ -1071,19 +1124,27 @@ HttpGenRequestString (
     AppendList[Index] = &Message->Headers[Index];\r
   }\r
 \r
+  //\r
+  // Check whether the EFI_HTTP_UTILITIES_PROTOCOL is available.\r
+  //\r
+  if (mHttpUtilities == NULL) {\r
+    return NULL;\r
+  }\r
+\r
   //\r
   // Build raw unformatted HTTP headers.\r
-  //  \r
-  Status = HttpUtilitiesBuild (\r
-             0,\r
-             NULL,\r
-             0,\r
-             NULL,\r
-             Message->HeaderCount,\r
-             AppendList,\r
-             &HttpHdrSize,\r
-             &HttpHdr\r
-             );\r
+  //\r
+  Status = mHttpUtilities->Build (\r
+                             mHttpUtilities,\r
+                             0,\r
+                             NULL,\r
+                             0,\r
+                             NULL,\r
+                             Message->HeaderCount,\r
+                             AppendList,\r
+                             &HttpHdrSize,\r
+                             &HttpHdr\r
+                             );\r
   FreePool (AppendList);\r
   if (EFI_ERROR (Status) || HttpHdr == NULL) {\r
     return NULL;\r