]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c
fixed one bug in stop(), adding get NicHandle by gEfiArpProtocolGuid.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / UefiPxeBcDxe / PxeBcDriver.c
index b947340abc234218b7074acdc64fa4d68ebb8eb4..48a52ce55d39f075006ae4512bc73e80776f134e 100644 (file)
@@ -141,7 +141,7 @@ PxeBcDriverBindingStart (
   UINTN               Index;\r
   EFI_STATUS          Status;\r
 \r
-  Private = NetAllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA));\r
+  Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA));\r
   if (Private == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
@@ -176,6 +176,28 @@ PxeBcDriverBindingStart (
     goto ON_ERROR;\r
   }\r
 \r
+  Status = NetLibCreateServiceChild (\r
+            ControllerHandle,\r
+            This->DriverBindingHandle,\r
+            &gEfiArpServiceBindingProtocolGuid,\r
+            &Private->ArpChild\r
+            );\r
+  if (EFI_ERROR (Status)) {\r
+    goto ON_ERROR;\r
+  }\r
+\r
+  Status = gBS->OpenProtocol (\r
+                  Private->ArpChild,\r
+                  &gEfiArpProtocolGuid,\r
+                  (VOID **) &Private->Arp,\r
+                  This->DriverBindingHandle,\r
+                  ControllerHandle,\r
+                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    goto ON_ERROR;\r
+  }\r
+\r
   Status = NetLibCreateServiceChild (\r
             ControllerHandle,\r
             This->DriverBindingHandle,\r
@@ -246,8 +268,8 @@ PxeBcDriverBindingStart (
     goto ON_ERROR;\r
   }\r
 \r
-  NetZeroMem (&Private->Udp4CfgData, sizeof (EFI_UDP4_CONFIG_DATA));\r
-  Private->Udp4CfgData.AcceptBroadcast    = TRUE;\r
+  ZeroMem (&Private->Udp4CfgData, sizeof (EFI_UDP4_CONFIG_DATA));\r
+  Private->Udp4CfgData.AcceptBroadcast    = FALSE;\r
   Private->Udp4CfgData.AcceptPromiscuous  = FALSE;\r
   Private->Udp4CfgData.AcceptAnyPort      = FALSE;\r
   Private->Udp4CfgData.AllowDuplicatePort = TRUE;\r
@@ -322,7 +344,23 @@ ON_ERROR:
       );\r
   }\r
 \r
-  NetFreePool (Private);\r
+  if (Private->ArpChild != NULL) {\r
+    gBS->CloseProtocol (\r
+          Private->ArpChild,\r
+          &gEfiArpProtocolGuid,\r
+          This->DriverBindingHandle,\r
+          ControllerHandle\r
+          );\r
+\r
+    NetLibDestroyServiceChild (\r
+      ControllerHandle,\r
+      This->DriverBindingHandle,\r
+      &gEfiArpServiceBindingProtocolGuid,\r
+      Private->ArpChild\r
+      );\r
+  }\r
+\r
+  gBS->FreePool (Private);\r
 \r
   return Status;\r
 }\r
@@ -356,15 +394,21 @@ PxeBcDriverBindingStop (
   EFI_HANDLE                  NicHandle;\r
   EFI_STATUS                  Status;\r
 \r
-  NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid);\r
+  NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid);\r
 \r
   if (NicHandle == NULL) {\r
 \r
-    NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp4ProtocolGuid);\r
+    NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid);\r
 \r
     if (NicHandle == NULL) {\r
 \r
-      return EFI_DEVICE_ERROR;\r
+      NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp4ProtocolGuid);\r
+\r
+      if (NicHandle == NULL) {\r
+\r
+        return EFI_DEVICE_ERROR;\r
+\r
+      }\r
     }\r
   }\r
 \r
@@ -433,7 +477,20 @@ PxeBcDriverBindingStop (
       Private->Mtftp4Child\r
       );\r
 \r
-    NetFreePool (Private);\r
+    gBS->CloseProtocol (\r
+          Private->ArpChild,\r
+          &gEfiArpProtocolGuid,\r
+          This->DriverBindingHandle,\r
+          NicHandle\r
+          );\r
+    NetLibDestroyServiceChild (\r
+      NicHandle,\r
+      This->DriverBindingHandle,\r
+      &gEfiArpServiceBindingProtocolGuid,\r
+      Private->ArpChild\r
+      );\r
+\r
+    gBS->FreePool (Private);\r
   }\r
 \r
   return Status;\r