NetworkPkg: Httpboot will fail the 2nd time result by wrong TCP state.
authorZhang Lubo <lubo.zhang@intel.com>
Fri, 13 Nov 2015 09:35:54 +0000 (09:35 +0000)
committerluobozhang <luobozhang@Edk2>
Fri, 13 Nov 2015 09:35:54 +0000 (09:35 +0000)
If the 2nd boot quickly after the first succeed boot, it will function well.
But if you wait for some time after 1nd succeed boot and boot again, the
TCP state may change from established to closed wait as the http server send
fin flag, then boot fail occurred.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Zhang Lubo <lubo.zhang@intel.com>
Reviewed-by: Ye Ting <ting.ye@intel.com>
Reviewed-by: Fu Siyuan <siyuan.fu@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18783 6f19259b-4bc3-4df7-8a09-765794883524

NetworkPkg/HttpDxe/HttpImpl.c
NetworkPkg/HttpDxe/HttpProto.c
NetworkPkg/HttpDxe/HttpProto.h

index 2f4ce89ddbd1d05f1168cb66a10890a7787ffd20..4ad07d4f230b5cf72d0187c3ece1f225a66450fe 100644 (file)
@@ -317,7 +317,11 @@ EfiHttpRequest (
   if (EFI_ERROR (Status)) {\r
     RemotePort = HTTP_DEFAULT_PORT;\r
   }\r
-\r
+  //\r
+  // If Configure is TRUE, it indicates the first time to call Request();\r
+  // If ReConfigure is TRUE, it indicates the request URL is not same\r
+  // with the previous call to Request();\r
+  //\r
   Configure   = TRUE;\r
   ReConfigure = TRUE;  \r
 \r
@@ -427,7 +431,11 @@ EfiHttpRequest (
     //\r
     // The request URL is different from previous calls to Request(), close existing TCP instance.\r
     //\r
-    ASSERT (HttpInstance->Tcp4 != NULL &&HttpInstance->Tcp6 != NULL);\r
+    if (!HttpInstance->LocalAddressIsIPv6) {\r
+      ASSERT (HttpInstance->Tcp4 != NULL);\r
+    } else {\r
+      ASSERT (HttpInstance->Tcp6 != NULL);\r
+    }\r
     HttpCloseConnection (HttpInstance);\r
     EfiHttpCancel (This, NULL);\r
   }\r
@@ -445,13 +453,12 @@ EfiHttpRequest (
   Wrap->HttpInstance   = HttpInstance;\r
   Wrap->TcpWrap.Method = Request->Method;\r
 \r
-  if (Configure) {\r
-    Status = HttpInitTcp (HttpInstance, Wrap);\r
-    if (EFI_ERROR (Status)) {\r
-      goto Error2;\r
-    }\r
+  Status = HttpInitTcp (HttpInstance, Wrap, Configure);\r
+  if (EFI_ERROR (Status)) {\r
+    goto Error2;\r
+  }  \r
 \r
-  } else {\r
+  if (!Configure) {\r
     //\r
     // For the new HTTP token, create TX TCP token events.    \r
     //\r
@@ -460,7 +467,7 @@ EfiHttpRequest (
       goto Error1;\r
     }\r
   }\r
-\r
+  \r
   //\r
   // Create request message.\r
   //\r
index 39837a3c827dd53d5a13fd096db070cc329f77c5..999695125e5152554d3c3f2426d97549fab0a37d 100644 (file)
@@ -1179,7 +1179,7 @@ HttpConnectTcp4 (
   EFI_TCP4_CONNECTION_STATE Tcp4State;\r
 \r
 \r
-  if (HttpInstance->State != HTTP_STATE_TCP_CONFIGED || HttpInstance->Tcp4 == NULL) {\r
+  if (HttpInstance->State < HTTP_STATE_TCP_CONFIGED || HttpInstance->Tcp4 == NULL) {\r
     return EFI_NOT_READY;\r
   }\r
 \r
@@ -1196,9 +1196,11 @@ HttpConnectTcp4 (
     return Status;\r
   }\r
 \r
-  if (Tcp4State > Tcp4StateEstablished) {\r
+  if (Tcp4State == Tcp4StateEstablished) {\r
+    return EFI_SUCCESS;\r
+  } else if (Tcp4State > Tcp4StateEstablished ) {\r
     HttpCloseConnection(HttpInstance);\r
-  }  \r
+  }\r
 \r
   return HttpCreateConnection (HttpInstance);\r
 }\r
@@ -1221,7 +1223,7 @@ HttpConnectTcp6 (
   EFI_STATUS                Status;\r
   EFI_TCP6_CONNECTION_STATE Tcp6State;\r
 \r
-  if (HttpInstance->State != HTTP_STATE_TCP_CONFIGED || HttpInstance->Tcp6 == NULL) {\r
+  if (HttpInstance->State < HTTP_STATE_TCP_CONFIGED || HttpInstance->Tcp6 == NULL) {\r
     return EFI_NOT_READY;\r
   }\r
 \r
@@ -1239,8 +1241,10 @@ HttpConnectTcp6 (
      return Status;\r
   }\r
 \r
-  if (Tcp6State > Tcp6StateEstablished) {\r
-    HttpCloseConnection (HttpInstance);\r
+  if (Tcp6State == Tcp6StateEstablished) {\r
+    return EFI_SUCCESS;\r
+  } else if (Tcp6State > Tcp6StateEstablished ) {\r
+    HttpCloseConnection(HttpInstance);\r
   }\r
 \r
   return HttpCreateConnection (HttpInstance);\r
@@ -1251,6 +1255,7 @@ HttpConnectTcp6 (
 \r
   @param[in]  HttpInstance       The HTTP instance private data.\r
   @param[in]  Wrap               The HTTP token's wrap data.\r
+  @param[in]  Configure          The Flag indicates whether the first time to initialize Tcp.\r
 \r
   @retval EFI_SUCCESS            The initialization of TCP instance is done. \r
   @retval Others                 Other error as indicated.\r
@@ -1259,7 +1264,8 @@ HttpConnectTcp6 (
 EFI_STATUS\r
 HttpInitTcp (\r
   IN  HTTP_PROTOCOL    *HttpInstance,\r
-  IN  HTTP_TOKEN_WRAP  *Wrap\r
+  IN  HTTP_TOKEN_WRAP  *Wrap,\r
+  IN  BOOLEAN          Configure\r
   )\r
 {\r
   EFI_STATUS           Status;\r
@@ -1269,10 +1275,13 @@ HttpInitTcp (
     //\r
     // Configure TCP instance.\r
     //\r
-    Status = HttpConfigureTcp4 (HttpInstance, Wrap);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
+    if (Configure) {\r
+      Status = HttpConfigureTcp4 (HttpInstance, Wrap);\r
+      if (EFI_ERROR (Status)) {\r
+        return Status;\r
+      }\r
     }\r
+\r
     //\r
     // Connect TCP.\r
     //\r
@@ -1284,10 +1293,13 @@ HttpInitTcp (
     //\r
     // Configure TCP instance.\r
     //\r
-    Status = HttpConfigureTcp6 (HttpInstance, Wrap);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
+    if (Configure) {\r
+      Status = HttpConfigureTcp6 (HttpInstance, Wrap);\r
+      if (EFI_ERROR (Status)) {\r
+        return Status;\r
+      }\r
     }\r
+\r
     //\r
     // Connect TCP.\r
     //\r
index a15e0a87be53bd1678187cf5edbf2dec789363b9..e43a2dc01c54e669a9cd4c887117f8d61a8d7716 100644 (file)
@@ -456,6 +456,7 @@ HttpTcpNotReady (
 \r
   @param[in]  HttpInstance       The HTTP instance private data.\r
   @param[in]  Wrap               The HTTP token's wrap data.\r
+  @param[in]  Configure          The Flag indicates whether the first time to initialize Tcp.\r
 \r
   @retval EFI_SUCCESS            The initialization of TCP instance is done. \r
   @retval Others                 Other error as indicated.\r
@@ -464,7 +465,8 @@ HttpTcpNotReady (
 EFI_STATUS\r
 HttpInitTcp (\r
   IN  HTTP_PROTOCOL    *HttpInstance,\r
-  IN  HTTP_TOKEN_WRAP  *Wrap\r
+  IN  HTTP_TOKEN_WRAP  *Wrap,\r
+  IN  BOOLEAN          Configure\r
   );\r
 \r
 /**\r