diff options
author | Ye Ting <ting.ye@intel.com> | 2013-06-14 08:18:34 +0000 |
---|---|---|
committer | tye1 <tye1@6f19259b-4bc3-4df7-8a09-765794883524> | 2013-06-14 08:18:34 +0000 |
commit | 8fedfc04d95cc372b3835c52139e80ef51665f53 (patch) | |
tree | 5fd18c882525fe641b7b13375c40fef115431c78 | |
parent | 7a1f59476d40348429575b26b5612b219ddb83e2 (diff) | |
download | edk2-8fedfc04d95cc372b3835c52139e80ef51665f53.zip edk2-8fedfc04d95cc372b3835c52139e80ef51665f53.tar.gz edk2-8fedfc04d95cc372b3835c52139e80ef51665f53.tar.bz2 |
Fixed the issue that IPv6 network stack assert infrequently – assert once every 300~400 PXE boots.
Signed-off-by: Ye Ting <ting.ye@intel.com>
Reviewed-by: Fu Siyuan <siyuan.fu@intel.com>
Reviewed-by: Ouyang Qian <qian.ouyang@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14422 6f19259b-4bc3-4df7-8a09-765794883524
-rw-r--r-- | NetworkPkg/Ip6Dxe/Ip6Driver.c | 79 |
1 files changed, 45 insertions, 34 deletions
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.<BR>
+ Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
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;
}
|