// empty resources, so if any thing goes wrong when allocating\r
// resources, Ip4CleanService can be called to clean it up.\r
//\r
- IpSb = NetAllocatePool (sizeof (IP4_SERVICE));\r
+ IpSb = AllocatePool (sizeof (IP4_SERVICE));\r
\r
if (IpSb == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
IpSb->InDestory = FALSE;\r
\r
IpSb->NumChildren = 0;\r
- NetListInit (&IpSb->Children);\r
+ InitializeListHead (&IpSb->Children);\r
\r
- NetListInit (&IpSb->Interfaces);\r
+ InitializeListHead (&IpSb->Interfaces);\r
IpSb->DefaultInterface = NULL;\r
IpSb->DefaultRouteTable = NULL;\r
\r
Ip4InitAssembleTable (&IpSb->Assemble);\r
\r
IpSb->IgmpCtrl.Igmpv1QuerySeen = 0;\r
- NetListInit (&IpSb->IgmpCtrl.Groups);\r
+ InitializeListHead (&IpSb->IgmpCtrl.Groups);\r
\r
IpSb->Image = ImageHandle;\r
IpSb->Controller = Controller;\r
IpSb->MnpConfigData.EnableReceiveTimestamps = FALSE;\r
IpSb->MnpConfigData.DisableBackgroundPolling = FALSE;\r
\r
- NetZeroMem (&IpSb->SnpMode, sizeof (EFI_SIMPLE_NETWORK_MODE));\r
+ ZeroMem (&IpSb->SnpMode, sizeof (EFI_SIMPLE_NETWORK_MODE));\r
\r
IpSb->Timer = NULL;\r
IpSb->Ip4Config = NULL;\r
IpSb->DoneEvent = NULL;\r
IpSb->ReconfigEvent = NULL;\r
+ IpSb->ActiveEvent = NULL;\r
\r
//\r
// Create various resources. First create the route table, timer\r
goto ON_ERROR;\r
}\r
\r
- NetListInsertHead (&IpSb->Interfaces, &IpSb->DefaultInterface->Link);\r
+ InsertHeadList (&IpSb->Interfaces, &IpSb->DefaultInterface->Link);\r
\r
IpSb->MacString = NULL;\r
\r
\r
ON_ERROR:\r
Ip4CleanService (IpSb);\r
- NetFreePool (IpSb);\r
+ gBS->FreePool (IpSb);\r
\r
return Status;\r
}\r
\r
gBS->CloseEvent (IpSb->DoneEvent);\r
gBS->CloseEvent (IpSb->ReconfigEvent);\r
+ IpSb->ActiveEvent = NULL;\r
IpSb->Ip4Config = NULL;\r
}\r
\r
\r
FREE_SERVICE:\r
Ip4CleanService (IpSb);\r
- NetFreePool (IpSb);\r
+ gBS->FreePool (IpSb);\r
\r
return Status;\r
}\r
EFI_STATUS Status;\r
EFI_TPL OldTpl;\r
INTN State;\r
+ BOOLEAN IsArp;\r
\r
//\r
// IP4 driver opens the MNP child, ARP children or the IP4_CONFIG protocol\r
);\r
\r
if (EFI_ERROR (Status)) {\r
- return EFI_SUCCESS;\r
+ return EFI_DEVICE_ERROR;\r
}\r
\r
IpSb = IP4_SERVICE_FROM_PROTOCOL (ServiceBinding);\r
\r
- OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
\r
if (IpSb->Ip4Config && (IpSb->State != IP4_SERVICE_DESTORY)) {\r
\r
);\r
\r
if (EFI_ERROR (Status)) {\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
return Status;\r
}\r
\r
gBS->CloseEvent (IpSb->ReconfigEvent);\r
}\r
\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
return EFI_SUCCESS;\r
}\r
\r
// service binding is installed on the NIC handle. So, need to open\r
// the protocol info to find the NIC handle.\r
//\r
+ IsArp = FALSE;\r
NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiManagedNetworkProtocolGuid);\r
\r
if (NicHandle == NULL) {\r
NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid);\r
+ IsArp = TRUE;\r
}\r
\r
if (NicHandle == NULL) {\r
- return EFI_SUCCESS;\r
+ return EFI_DEVICE_ERROR;\r
}\r
\r
//\r
\r
IpSb = IP4_SERVICE_FROM_PROTOCOL (ServiceBinding);\r
\r
- OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
\r
if (IpSb->InDestory) {\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
return EFI_SUCCESS;\r
}\r
\r
- IpSb->InDestory = TRUE;\r
+ if (IsArp) {\r
+ while (!IsListEmpty (&IpSb->Children)) {\r
+ IpInstance = NET_LIST_HEAD (&IpSb->Children, IP4_PROTOCOL, Link);\r
\r
- State = IpSb->State;\r
- IpSb->State = IP4_SERVICE_DESTORY;\r
+ ServiceBinding->DestroyChild (ServiceBinding, IpInstance->Handle);\r
+ }\r
\r
- //\r
- // Destory all the children first. If not all children are destoried,\r
- // the IP driver can operate correctly, so restore it state. Don't\r
- // use NET_LIST_FOR_EACH_SAFE here, because it will cache the next\r
- // pointer, which may point to the child that has already been destoried.\r
- // For example, if there are two child in the list, the first is UDP\r
- // listen child, the send is the MTFTP's child. When Udp child is\r
- // destoried, it will destory the MTFTP's child. Then Next point to\r
- // a invalid child.\r
- //\r
- while (!NetListIsEmpty (&IpSb->Children)) {\r
- IpInstance = NET_LIST_HEAD (&IpSb->Children, IP4_PROTOCOL, Link);\r
- Ip4ServiceBindingDestroyChild (ServiceBinding, IpInstance->Handle);\r
- }\r
+ if (IpSb->NumChildren != 0) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ goto ON_ERROR;\r
+ }\r
\r
- if (IpSb->NumChildren != 0) {\r
- IpSb->State = State;\r
- Status = EFI_DEVICE_ERROR;\r
- goto ON_ERROR;\r
- }\r
+ IpSb->InDestory = TRUE;\r
\r
- //\r
- // Clear the variable data.\r
- //\r
- Ip4ClearVariableData (IpSb);\r
+ State = IpSb->State;\r
+ IpSb->State = IP4_SERVICE_DESTORY;\r
\r
- //\r
- // OK, clean other resources then uninstall the service binding protocol.\r
- //\r
- Status = Ip4CleanService (IpSb);\r
+ //\r
+ // Clear the variable data.\r
+ //\r
+ Ip4ClearVariableData (IpSb);\r
\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
+ //\r
+ // OK, clean other resources then uninstall the service binding protocol.\r
+ //\r
+ Status = Ip4CleanService (IpSb);\r
\r
- Status = gBS->UninstallProtocolInterface (\r
- NicHandle,\r
- &gEfiIp4ServiceBindingProtocolGuid,\r
- ServiceBinding\r
- );\r
+ if (EFI_ERROR (Status)) {\r
+ IpSb->State = State;\r
+ goto ON_ERROR;\r
+ }\r
\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
+ gBS->UninstallProtocolInterface (\r
+ NicHandle,\r
+ &gEfiIp4ServiceBindingProtocolGuid,\r
+ ServiceBinding\r
+ );\r
\r
- NET_RESTORE_TPL (OldTpl);\r
- NetFreePool (IpSb);\r
- return EFI_SUCCESS;\r
+ gBS->FreePool (IpSb);\r
+ } else if (NumberOfChildren == 0) {\r
+ IpSb->InDestory = TRUE;\r
+\r
+ State = IpSb->State;\r
+ IpSb->State = IP4_SERVICE_DESTORY;\r
+\r
+ //\r
+ // Clear the variable data.\r
+ //\r
+ Ip4ClearVariableData (IpSb);\r
+\r
+ //\r
+ // OK, clean other resources then uninstall the service binding protocol.\r
+ //\r
+ Status = Ip4CleanService (IpSb);\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ IpSb->State = State;\r
+ goto ON_ERROR;\r
+ }\r
+\r
+ gBS->UninstallProtocolInterface (\r
+ NicHandle,\r
+ &gEfiIp4ServiceBindingProtocolGuid,\r
+ ServiceBinding\r
+ );\r
+\r
+ gBS->FreePool (IpSb);\r
+ } else {\r
+\r
+ while (!IsListEmpty (&IpSb->Children)) {\r
+ IpInstance = NET_LIST_HEAD (&IpSb->Children, IP4_PROTOCOL, Link);\r
+\r
+ ServiceBinding->DestroyChild (ServiceBinding, IpInstance->Handle);\r
+ }\r
+\r
+ if (IpSb->NumChildren != 0) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ }\r
+ }\r
\r
ON_ERROR:\r
- IpSb->InDestory = FALSE;\r
- NET_RESTORE_TPL (OldTpl);\r
+\r
+ gBS->RestoreTPL (OldTpl);\r
return Status;\r
}\r
\r
}\r
\r
IpSb = IP4_SERVICE_FROM_PROTOCOL (This);\r
- IpInstance = NetAllocatePool (sizeof (IP4_PROTOCOL));\r
+ IpInstance = AllocatePool (sizeof (IP4_PROTOCOL));\r
\r
if (IpInstance == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
//\r
// Insert it into the service binding instance.\r
//\r
- OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
\r
- NetListInsertTail (&IpSb->Children, &IpInstance->Link);\r
+ InsertTailList (&IpSb->Children, &IpInstance->Link);\r
IpSb->NumChildren++;\r
\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
\r
ON_ERROR:\r
\r
\r
Ip4CleanProtocol (IpInstance);\r
\r
- NetFreePool (IpInstance);\r
+ gBS->FreePool (IpInstance);\r
}\r
\r
return Status;\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
\r
//\r
// A child can be destoried more than once. For example,\r
// the IP child it opens.\r
//\r
if (IpInstance->State == IP4_STATE_DESTORY) {\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
return EFI_SUCCESS;\r
}\r
\r
goto ON_ERROR;\r
}\r
\r
- NetListRemoveEntry (&IpInstance->Link);\r
+ RemoveEntryList (&IpInstance->Link);\r
IpSb->NumChildren--;\r
\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
\r
- NetFreePool (IpInstance);\r
+ gBS->FreePool (IpInstance);\r
return EFI_SUCCESS;\r
\r
ON_ERROR:\r
IpInstance->State = State;\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
\r
return Status;\r
}\r