/**\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
\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
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
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
\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
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
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
{\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