From a2e619821a791de5cd65cd2c757de0a8aa7f138c Mon Sep 17 00:00:00 2001 From: Zhang Lubo Date: Fri, 13 Nov 2015 09:35:54 +0000 Subject: [PATCH] NetworkPkg: Httpboot will fail the 2nd time result by wrong TCP state. 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 Reviewed-by: Ye Ting Reviewed-by: Fu Siyuan git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18783 6f19259b-4bc3-4df7-8a09-765794883524 --- NetworkPkg/HttpDxe/HttpImpl.c | 25 ++++++++++++++-------- NetworkPkg/HttpDxe/HttpProto.c | 38 ++++++++++++++++++++++------------ NetworkPkg/HttpDxe/HttpProto.h | 4 +++- 3 files changed, 44 insertions(+), 23 deletions(-) diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c index 2f4ce89ddb..4ad07d4f23 100644 --- a/NetworkPkg/HttpDxe/HttpImpl.c +++ b/NetworkPkg/HttpDxe/HttpImpl.c @@ -317,7 +317,11 @@ EfiHttpRequest ( if (EFI_ERROR (Status)) { RemotePort = HTTP_DEFAULT_PORT; } - + // + // If Configure is TRUE, it indicates the first time to call Request(); + // If ReConfigure is TRUE, it indicates the request URL is not same + // with the previous call to Request(); + // Configure = TRUE; ReConfigure = TRUE; @@ -427,7 +431,11 @@ EfiHttpRequest ( // // The request URL is different from previous calls to Request(), close existing TCP instance. // - ASSERT (HttpInstance->Tcp4 != NULL &&HttpInstance->Tcp6 != NULL); + if (!HttpInstance->LocalAddressIsIPv6) { + ASSERT (HttpInstance->Tcp4 != NULL); + } else { + ASSERT (HttpInstance->Tcp6 != NULL); + } HttpCloseConnection (HttpInstance); EfiHttpCancel (This, NULL); } @@ -445,13 +453,12 @@ EfiHttpRequest ( Wrap->HttpInstance = HttpInstance; Wrap->TcpWrap.Method = Request->Method; - if (Configure) { - Status = HttpInitTcp (HttpInstance, Wrap); - if (EFI_ERROR (Status)) { - goto Error2; - } + Status = HttpInitTcp (HttpInstance, Wrap, Configure); + if (EFI_ERROR (Status)) { + goto Error2; + } - } else { + if (!Configure) { // // For the new HTTP token, create TX TCP token events. // @@ -460,7 +467,7 @@ EfiHttpRequest ( goto Error1; } } - + // // Create request message. // diff --git a/NetworkPkg/HttpDxe/HttpProto.c b/NetworkPkg/HttpDxe/HttpProto.c index 39837a3c82..999695125e 100644 --- a/NetworkPkg/HttpDxe/HttpProto.c +++ b/NetworkPkg/HttpDxe/HttpProto.c @@ -1179,7 +1179,7 @@ HttpConnectTcp4 ( EFI_TCP4_CONNECTION_STATE Tcp4State; - if (HttpInstance->State != HTTP_STATE_TCP_CONFIGED || HttpInstance->Tcp4 == NULL) { + if (HttpInstance->State < HTTP_STATE_TCP_CONFIGED || HttpInstance->Tcp4 == NULL) { return EFI_NOT_READY; } @@ -1196,9 +1196,11 @@ HttpConnectTcp4 ( return Status; } - if (Tcp4State > Tcp4StateEstablished) { + if (Tcp4State == Tcp4StateEstablished) { + return EFI_SUCCESS; + } else if (Tcp4State > Tcp4StateEstablished ) { HttpCloseConnection(HttpInstance); - } + } return HttpCreateConnection (HttpInstance); } @@ -1221,7 +1223,7 @@ HttpConnectTcp6 ( EFI_STATUS Status; EFI_TCP6_CONNECTION_STATE Tcp6State; - if (HttpInstance->State != HTTP_STATE_TCP_CONFIGED || HttpInstance->Tcp6 == NULL) { + if (HttpInstance->State < HTTP_STATE_TCP_CONFIGED || HttpInstance->Tcp6 == NULL) { return EFI_NOT_READY; } @@ -1239,8 +1241,10 @@ HttpConnectTcp6 ( return Status; } - if (Tcp6State > Tcp6StateEstablished) { - HttpCloseConnection (HttpInstance); + if (Tcp6State == Tcp6StateEstablished) { + return EFI_SUCCESS; + } else if (Tcp6State > Tcp6StateEstablished ) { + HttpCloseConnection(HttpInstance); } return HttpCreateConnection (HttpInstance); @@ -1251,6 +1255,7 @@ HttpConnectTcp6 ( @param[in] HttpInstance The HTTP instance private data. @param[in] Wrap The HTTP token's wrap data. + @param[in] Configure The Flag indicates whether the first time to initialize Tcp. @retval EFI_SUCCESS The initialization of TCP instance is done. @retval Others Other error as indicated. @@ -1259,7 +1264,8 @@ HttpConnectTcp6 ( EFI_STATUS HttpInitTcp ( IN HTTP_PROTOCOL *HttpInstance, - IN HTTP_TOKEN_WRAP *Wrap + IN HTTP_TOKEN_WRAP *Wrap, + IN BOOLEAN Configure ) { EFI_STATUS Status; @@ -1269,10 +1275,13 @@ HttpInitTcp ( // // Configure TCP instance. // - Status = HttpConfigureTcp4 (HttpInstance, Wrap); - if (EFI_ERROR (Status)) { - return Status; + if (Configure) { + Status = HttpConfigureTcp4 (HttpInstance, Wrap); + if (EFI_ERROR (Status)) { + return Status; + } } + // // Connect TCP. // @@ -1284,10 +1293,13 @@ HttpInitTcp ( // // Configure TCP instance. // - Status = HttpConfigureTcp6 (HttpInstance, Wrap); - if (EFI_ERROR (Status)) { - return Status; + if (Configure) { + Status = HttpConfigureTcp6 (HttpInstance, Wrap); + if (EFI_ERROR (Status)) { + return Status; + } } + // // Connect TCP. // diff --git a/NetworkPkg/HttpDxe/HttpProto.h b/NetworkPkg/HttpDxe/HttpProto.h index a15e0a87be..e43a2dc01c 100644 --- a/NetworkPkg/HttpDxe/HttpProto.h +++ b/NetworkPkg/HttpDxe/HttpProto.h @@ -456,6 +456,7 @@ HttpTcpNotReady ( @param[in] HttpInstance The HTTP instance private data. @param[in] Wrap The HTTP token's wrap data. + @param[in] Configure The Flag indicates whether the first time to initialize Tcp. @retval EFI_SUCCESS The initialization of TCP instance is done. @retval Others Other error as indicated. @@ -464,7 +465,8 @@ HttpTcpNotReady ( EFI_STATUS HttpInitTcp ( IN HTTP_PROTOCOL *HttpInstance, - IN HTTP_TOKEN_WRAP *Wrap + IN HTTP_TOKEN_WRAP *Wrap, + IN BOOLEAN Configure ); /** -- 2.39.2