+ if (EFI_ERROR (DataItem->Status) && DataItem->Status != EFI_NOT_READY) {\r
+ if (Ptr != NULL) {\r
+ FreePool (Ptr);\r
+ }\r
+ DataItem->Data.Ptr = NULL; \r
+ }\r
+ } else {\r
+ //\r
+ // DataSize is 0 and Data is NULL, clean up the manual address.\r
+ //\r
+ if (DataItem->Data.Ptr != NULL) {\r
+ FreePool (DataItem->Data.Ptr);\r
+ }\r
+ DataItem->Data.Ptr = NULL;\r
+ DataItem->DataSize = 0;\r
+ DataItem->Status = EFI_NOT_FOUND;\r
+\r
+ //\r
+ // Free the default router table and Interface, clean up the assemble table.\r
+ //\r
+ if (IpSb->DefaultInterface != NULL) {\r
+ if (IpSb->DefaultRouteTable != NULL) {\r
+ Ip4FreeRouteTable (IpSb->DefaultRouteTable);\r
+ IpSb->DefaultRouteTable = NULL; \r
+ }\r
+\r
+ Ip4CancelReceive (IpSb->DefaultInterface);\r
+\r
+ Ip4FreeInterface (IpSb->DefaultInterface, NULL);\r
+ IpSb->DefaultInterface = NULL;\r
+ }\r
+\r
+ Ip4CleanAssembleTable (&IpSb->Assemble);\r
+\r
+ //\r
+ // Create new default interface and route table.\r
+ // \r
+ IpIf = Ip4CreateInterface (IpSb->Mnp, IpSb->Controller, IpSb->Image);\r
+ if (IpIf == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ RouteTable = Ip4CreateRouteTable ();\r
+ if (RouteTable == NULL) {\r
+ Ip4FreeInterface (IpIf, NULL);\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ \r
+ IpSb->DefaultInterface = IpIf;\r
+ InsertHeadList (&IpSb->Interfaces, &IpIf->Link);\r
+ IpSb->DefaultRouteTable = RouteTable;\r
+ Ip4ReceiveFrame (IpIf, NULL, Ip4AccpetFrame, IpSb);\r
+\r
+ //\r
+ // Reset the State to unstarted. \r
+ //\r
+ if (IpSb->State == IP4_SERVICE_CONFIGED || IpSb->State == IP4_SERVICE_STARTED) {\r
+ IpSb->State = IP4_SERVICE_UNSTARTED;\r