From 8fedfc04d95cc372b3835c52139e80ef51665f53 Mon Sep 17 00:00:00 2001 From: Ye Ting Date: Fri, 14 Jun 2013 08:18:34 +0000 Subject: =?UTF-8?q?Fixed=20the=20issue=20that=20IPv6=20network=20stack=20a?= =?UTF-8?q?ssert=20infrequently=20=E2=80=93=20assert=20once=20every=20300~?= =?UTF-8?q?400=20PXE=20boots.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ye Ting Reviewed-by: Fu Siyuan Reviewed-by: Ouyang Qian git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14422 6f19259b-4bc3-4df7-8a09-765794883524 --- NetworkPkg/Ip6Dxe/Ip6Driver.c | 79 ++++++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 34 deletions(-) (limited to 'NetworkPkg/Ip6Dxe') diff --git a/NetworkPkg/Ip6Dxe/Ip6Driver.c b/NetworkPkg/Ip6Dxe/Ip6Driver.c index 8095ed1..b9a64a8 100644 --- a/NetworkPkg/Ip6Dxe/Ip6Driver.c +++ b/NetworkPkg/Ip6Dxe/Ip6Driver.c @@ -1,7 +1,7 @@ /** @file The driver binding and service binding protocol for IP6 driver. - Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.
+ Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License @@ -412,22 +412,21 @@ Ip6CreateService ( 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); + Status = NetLibGetMacString (IpSb->Controller, IpSb->Image, &IpSb->MacString); 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); + Status = Ip6ConfigInitInstance (&IpSb->Ip6ConfigInstance); if (EFI_ERROR (Status)) { goto ON_ERROR; } + IpSb->DefaultInterface = Ip6CreateInterface (IpSb, TRUE); + if (IpSb->DefaultInterface == NULL) { + Status = EFI_DEVICE_ERROR; + goto ON_ERROR; + } Status = gBS->CreateEvent ( EVT_NOTIFY_SIGNAL, @@ -440,27 +439,6 @@ Ip6CreateService ( goto ON_ERROR; } - Status = Ip6ReceiveFrame (Ip6AcceptFrame, IpSb); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = NetLibGetMacString (IpSb->Controller, IpSb->Image, &IpSb->MacString); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = Ip6ConfigInitInstance (&IpSb->Ip6ConfigInstance); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - IpSb->DefaultInterface = Ip6CreateInterface (IpSb, TRUE); - if (IpSb->DefaultInterface == NULL) { - Status = EFI_DEVICE_ERROR; - goto ON_ERROR; - } - // // If there is any manual address, set it. // @@ -557,19 +535,52 @@ Ip6DriverBindingStart ( NULL ); - if (EFI_ERROR (Status)) { + 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; + } - Ip6CleanService (IpSb); - FreePool (IpSb); - } else { // // Initialize the IP6 ID // mIp6Id = NET_RANDOM (NetRandomInitSeed ()); Ip6SetVariableData (IpSb); + + return EFI_SUCCESS; } +ON_ERROR: + Ip6CleanService (IpSb); + FreePool (IpSb); return Status; } -- cgit v1.1