]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c
sync alignment issue on IPF.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / UefiPxeBcDxe / PxeBcDriver.c
index d6907955a5b7510573b747bda69457496d8ba895..9d26b135f5140baae1abe1fc522d0d2c1d0cc660 100644 (file)
@@ -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
@@ -198,6 +220,28 @@ PxeBcDriverBindingStart (
     goto ON_ERROR;\r
   }\r
 \r
+  Status = NetLibCreateServiceChild (\r
+             ControllerHandle,\r
+             This->DriverBindingHandle,\r
+             &gEfiIp4ServiceBindingProtocolGuid,\r
+             &Private->Ip4Child\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    goto ON_ERROR;\r
+  }\r
+\r
+  Status = gBS->OpenProtocol (\r
+                  Private->Ip4Child,\r
+                  &gEfiIp4ProtocolGuid,\r
+                  (VOID **) &Private->Ip4,\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
@@ -247,7 +291,7 @@ PxeBcDriverBindingStart (
   }\r
 \r
   ZeroMem (&Private->Udp4CfgData, sizeof (EFI_UDP4_CONFIG_DATA));\r
-  Private->Udp4CfgData.AcceptBroadcast    = TRUE;\r
+  Private->Udp4CfgData.AcceptBroadcast    = FALSE;\r
   Private->Udp4CfgData.AcceptPromiscuous  = FALSE;\r
   Private->Udp4CfgData.AcceptAnyPort      = FALSE;\r
   Private->Udp4CfgData.AllowDuplicatePort = TRUE;\r
@@ -258,6 +302,17 @@ PxeBcDriverBindingStart (
   Private->Udp4CfgData.UseDefaultAddress  = FALSE;\r
 \r
   PxeBcInitSeedPacket (&Private->SeedPacket, Private->Udp4);\r
+  Private->MacLen = Private->SeedPacket.Dhcp4.Header.HwAddrLen;\r
+  CopyMem (&Private->Mac, &Private->SeedPacket.Dhcp4.Header.ClientHwAddr[0], Private->MacLen);\r
+\r
+\r
+  ZeroMem (&Private->Ip4ConfigData, sizeof (EFI_IP4_CONFIG_DATA));\r
+  Private->Ip4ConfigData.DefaultProtocol   = EFI_IP_PROTO_ICMP;\r
+  Private->Ip4ConfigData.AcceptIcmpErrors  = TRUE;\r
+  Private->Ip4ConfigData.TypeOfService     = DEFAULT_ToS;\r
+  Private->Ip4ConfigData.TimeToLive        = DEFAULT_TTL;\r
+  Private->Ip4ConfigData.DoNotFragment     = FALSE;\r
+  Private->Ip4ConfigData.RawData           = FALSE;\r
 \r
   Status = gBS->InstallMultipleProtocolInterfaces (\r
                   &ControllerHandle,\r
@@ -306,6 +361,22 @@ ON_ERROR:
       );\r
   }\r
 \r
+  if (Private->Ip4Child != NULL) {\r
+    gBS->CloseProtocol (\r
+          Private->Ip4Child,\r
+          &gEfiIp4ProtocolGuid,\r
+          This->DriverBindingHandle,\r
+          ControllerHandle\r
+          );\r
+\r
+    NetLibDestroyServiceChild (\r
+      ControllerHandle,\r
+      This->DriverBindingHandle,\r
+      &gEfiIp4ServiceBindingProtocolGuid,\r
+      Private->Ip4Child\r
+      );\r
+  }\r
+\r
   if (Private->Dhcp4Child != NULL) {\r
     gBS->CloseProtocol (\r
           Private->Dhcp4Child,\r
@@ -322,6 +393,22 @@ ON_ERROR:
       );\r
   }\r
 \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
@@ -356,15 +443,24 @@ PxeBcDriverBindingStop (
   EFI_HANDLE                  NicHandle;\r
   EFI_STATUS                  Status;\r
 \r
-  NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid);\r
-\r
+  NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid);\r
   if (NicHandle == NULL) {\r
-\r
-    NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp4ProtocolGuid);\r
+    NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid);\r
 \r
     if (NicHandle == NULL) {\r
+      NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid);\r
 \r
-      return EFI_DEVICE_ERROR;\r
+      if (NicHandle == NULL) {\r
+        NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiUdp4ProtocolGuid);\r
+\r
+        if (NicHandle == NULL) {\r
+          NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp4ProtocolGuid);\r
+\r
+          if (NicHandle == NULL) {\r
+            return EFI_DEVICE_ERROR;\r
+          }\r
+        }\r
+      }\r
     }\r
   }\r
 \r
@@ -433,6 +529,32 @@ PxeBcDriverBindingStop (
       Private->Mtftp4Child\r
       );\r
 \r
+    gBS->CloseProtocol (\r
+          Private->Ip4Child,\r
+          &gEfiIp4ProtocolGuid,\r
+          This->DriverBindingHandle,\r
+          NicHandle\r
+          );\r
+    NetLibDestroyServiceChild (\r
+      NicHandle,\r
+      This->DriverBindingHandle,\r
+      &gEfiIp4ServiceBindingProtocolGuid,\r
+      Private->Ip4Child\r
+      );\r
+\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