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
This commit is contained in:
Ye Ting 2013-06-14 08:18:34 +00:00 committed by tye1
parent 7a1f59476d
commit 8fedfc04d9
1 changed files with 49 additions and 38 deletions

View File

@ -1,7 +1,7 @@
/** @file /** @file
The driver binding and service binding protocol for IP6 driver. 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 This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
@ -412,39 +412,6 @@ Ip6CreateService (
goto ON_ERROR; 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;
}
Status = gBS->CreateEvent (
EVT_NOTIFY_SIGNAL,
TPL_NOTIFY,
Ip6OnFrameReceived,
&IpSb->RecvRequest,
&MnpToken->Event
);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
Status = Ip6ReceiveFrame (Ip6AcceptFrame, IpSb);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
Status = NetLibGetMacString (IpSb->Controller, IpSb->Image, &IpSb->MacString); Status = NetLibGetMacString (IpSb->Controller, IpSb->Image, &IpSb->MacString);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto ON_ERROR; goto ON_ERROR;
@ -461,6 +428,17 @@ Ip6CreateService (
goto ON_ERROR; goto ON_ERROR;
} }
Status = gBS->CreateEvent (
EVT_NOTIFY_SIGNAL,
TPL_NOTIFY,
Ip6OnFrameReceived,
&IpSb->RecvRequest,
&MnpToken->Event
);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
// //
// If there is any manual address, set it. // If there is any manual address, set it.
// //
@ -557,19 +535,52 @@ Ip6DriverBindingStart (
NULL 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 // Initialize the IP6 ID
// //
mIp6Id = NET_RANDOM (NetRandomInitSeed ()); mIp6Id = NET_RANDOM (NetRandomInitSeed ());
Ip6SetVariableData (IpSb); Ip6SetVariableData (IpSb);
return EFI_SUCCESS;
} }
ON_ERROR:
Ip6CleanService (IpSb);
FreePool (IpSb);
return Status; return Status;
} }