From 7959b06748495da65d268de2c6643001e069ff80 Mon Sep 17 00:00:00 2001 From: Jiaxin Wu Date: Wed, 13 Apr 2016 11:07:07 +0800 Subject: [PATCH] NetworkPkg: Fix issue in Ip6Dxe SetData EFI_NOT_READY should not be treated as an error status returned from SetData for Ip6ConfigDataTypeManualAddress since there is an asynchronous operation for DAD process. Cc: Ye Ting Cc: Fu Siyuan Cc: Hegde Nagaraj P Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jiaxin Wu Reviewed-by: Hegde Nagaraj P Reviewed-by: Sriram Subramanian Tested-by: Hegde Nagaraj P --- NetworkPkg/Ip6Dxe/Ip6Driver.c | 78 +++++++++++++++++------------------ 1 file changed, 38 insertions(+), 40 deletions(-) diff --git a/NetworkPkg/Ip6Dxe/Ip6Driver.c b/NetworkPkg/Ip6Dxe/Ip6Driver.c index ba702904b5..16617c12b1 100644 --- a/NetworkPkg/Ip6Dxe/Ip6Driver.c +++ b/NetworkPkg/Ip6Dxe/Ip6Driver.c @@ -578,7 +578,7 @@ Ip6DriverBindingStart ( DataItem->DataSize, DataItem->Data.Ptr ); - if (EFI_ERROR(Status)) { + if (EFI_ERROR(Status) && Status != EFI_NOT_READY) { goto ON_ERROR; } } @@ -599,47 +599,45 @@ Ip6DriverBindingStart ( } } - if (!EFI_ERROR (Status)) { - // - // ready to go: start the receiving and timer - // - Status = Ip6ReceiveFrame (Ip6AcceptFrame, IpSb); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - // - // The timer expires every 100 (IP6_TIMER_INTERVAL_IN_MS) milliseconds. - // - Status = gBS->SetTimer ( - IpSb->FasterTimer, - TimerPeriodic, - TICKS_PER_MS * IP6_TIMER_INTERVAL_IN_MS - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - // - // The timer expires every 1000 (IP6_ONE_SECOND_IN_MS) milliseconds. - // - Status = gBS->SetTimer ( - IpSb->Timer, - TimerPeriodic, - TICKS_PER_MS * IP6_ONE_SECOND_IN_MS - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - // - // Initialize the IP6 ID - // - mIp6Id = NET_RANDOM (NetRandomInitSeed ()); - - return EFI_SUCCESS; + // + // ready to go: start the receiving and timer + // + Status = Ip6ReceiveFrame (Ip6AcceptFrame, IpSb); + if (EFI_ERROR (Status)) { + goto ON_ERROR; } + // + // The timer expires every 100 (IP6_TIMER_INTERVAL_IN_MS) milliseconds. + // + Status = gBS->SetTimer ( + IpSb->FasterTimer, + TimerPeriodic, + TICKS_PER_MS * IP6_TIMER_INTERVAL_IN_MS + ); + if (EFI_ERROR (Status)) { + goto ON_ERROR; + } + + // + // The timer expires every 1000 (IP6_ONE_SECOND_IN_MS) milliseconds. + // + Status = gBS->SetTimer ( + IpSb->Timer, + TimerPeriodic, + TICKS_PER_MS * IP6_ONE_SECOND_IN_MS + ); + if (EFI_ERROR (Status)) { + goto ON_ERROR; + } + + // + // Initialize the IP6 ID + // + mIp6Id = NET_RANDOM (NetRandomInitSeed ()); + + return EFI_SUCCESS; + ON_ERROR: Ip6CleanService (IpSb); FreePool (IpSb);