]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c
1. Fix a bug in PXE driver that the PXE boot do not restart if a new boot option...
[mirror_edk2.git] / NetworkPkg / UefiPxeBcDxe / PxeBcDriver.c
index 769d1971d74962e5e4afa84f88b609e87f7177eb..080b751cb19637541e81ef9bdec8db16c3302aaf 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Driver Binding functions implementationfor for UefiPxeBc Driver.\r
 \r
-  Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.<BR>\r
 \r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
@@ -25,14 +25,6 @@ EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding = {
   NULL\r
 };\r
 \r
-//\r
-// PXE_PRIVATE_GUID is only used to keep the relationship between \r
-// NIC handle and virtual child handles.\r
-//\r
-EFI_GUID mPxeBcPrivateGuid = PXEBC_PRIVATE_GUID;\r
-\r
-\r
-\r
 /**\r
   Get the Nic handle using any child handle in the IPv4 stack.\r
 \r
@@ -237,7 +229,7 @@ PxeBcDestroyIp4Children (
     //\r
     gBS->CloseProtocol (\r
            Private->Controller,\r
-           &mPxeBcPrivateGuid,\r
+           &gEfiCallerIdGuid,\r
            This->DriverBindingHandle,\r
            Private->Ip4Nic->Controller\r
            );\r
@@ -397,7 +389,7 @@ PxeBcDestroyIp6Children (
     //\r
     gBS->CloseProtocol (\r
            Private->Controller,\r
-           &mPxeBcPrivateGuid,\r
+           &gEfiCallerIdGuid,\r
            This->DriverBindingHandle,\r
            Private->Ip6Nic->Controller\r
            );\r
@@ -722,7 +714,7 @@ PxeBcCreateIp4Children (
   //\r
   Status = gBS->OpenProtocol (\r
                   ControllerHandle,\r
-                  &mPxeBcPrivateGuid,\r
+                  &gEfiCallerIdGuid,\r
                   (VOID **) &Id,\r
                   This->DriverBindingHandle,\r
                   Private->Ip4Nic->Controller,\r
@@ -739,7 +731,7 @@ PxeBcCreateIp4Children (
   Udp4CfgData                     = &Private->Udp4CfgData;\r
   Ip4CfgData                      = &Private->Ip4CfgData;\r
 \r
-  Udp4CfgData->AcceptBroadcast    = TRUE;\r
+  Udp4CfgData->AcceptBroadcast    = FALSE;\r
   Udp4CfgData->AcceptAnyPort      = TRUE;\r
   Udp4CfgData->AllowDuplicatePort = TRUE;\r
   Udp4CfgData->TypeOfService      = Mode->ToS;\r
@@ -787,6 +779,7 @@ PxeBcCreateIp6Children (
   EFI_IP6_MODE_DATA               Ip6ModeData;\r
   PXEBC_PRIVATE_PROTOCOL          *Id;\r
   EFI_SIMPLE_NETWORK_PROTOCOL     *Snp;\r
+  UINTN                           Index;\r
 \r
   if (Private->Ip6Nic != NULL) {\r
     //\r
@@ -829,6 +822,16 @@ PxeBcCreateIp6Children (
     goto ON_ERROR;\r
   }\r
 \r
+  //\r
+  // Generate a random IAID for the Dhcp6 assigned address.\r
+  //\r
+  Private->IaId = NET_RANDOM (NetRandomInitSeed ());\r
+  if (Private->Snp != NULL) {\r
+    for (Index = 0; Index < Private->Snp->Mode->HwAddressSize; Index++) {\r
+      Private->IaId |= (Private->Snp->Mode->CurrentAddress.Addr[Index] << ((Index << 3) & 31));\r
+    }  \r
+  }\r
+\r
   //\r
   // Create Mtftp6 child and open Mtftp6 protocol for PxeBc->Mtftp.\r
   //\r
@@ -957,7 +960,7 @@ PxeBcCreateIp6Children (
   ZeroMem (&Ip6Node, sizeof (IPv6_DEVICE_PATH));\r
   Ip6Node.Header.Type     = MESSAGING_DEVICE_PATH;\r
   Ip6Node.Header.SubType  = MSG_IPv6_DP;\r
-  Ip6Node.StaticIpAddress = FALSE;\r
+  Ip6Node.PrefixLength    = IP6_PREFIX_LENGTH;\r
 \r
   SetDevicePathNodeLength (&Ip6Node.Header, sizeof (Ip6Node));\r
 \r
@@ -1030,7 +1033,7 @@ PxeBcCreateIp6Children (
   //\r
   Status = gBS->OpenProtocol (\r
                   ControllerHandle,\r
-                  &mPxeBcPrivateGuid,\r
+                  &gEfiCallerIdGuid,\r
                   (VOID **) &Id,\r
                   This->DriverBindingHandle,\r
                   Private->Ip6Nic->Controller,\r
@@ -1214,7 +1217,7 @@ PxeBcDriverBindingStart (
 \r
   Status = gBS->OpenProtocol (\r
                   ControllerHandle,\r
-                  &mPxeBcPrivateGuid,\r
+                  &gEfiCallerIdGuid,\r
                   (VOID **) &Id,\r
                   This->DriverBindingHandle,\r
                   ControllerHandle,\r
@@ -1282,10 +1285,13 @@ PxeBcDriverBindingStart (
 \r
     //\r
     // Install PxeBaseCodePrivate protocol onto the real NIC handler.\r
+    // PxeBaseCodePrivate protocol is only used to keep the relationship between \r
+    // NIC handle and virtual child handles.\r
+    // gEfiCallerIdGuid will be used as its protocol guid.\r
     //\r
     Status = gBS->InstallProtocolInterface (\r
                     &ControllerHandle,\r
-                    &mPxeBcPrivateGuid,\r
+                    &gEfiCallerIdGuid,\r
                     EFI_NATIVE_INTERFACE,\r
                     &Private->Id\r
                     );\r
@@ -1322,7 +1328,7 @@ PxeBcDriverBindingStart (
 ON_ERROR:\r
   gBS->UninstallProtocolInterface (\r
          ControllerHandle,\r
-         &mPxeBcPrivateGuid,\r
+         &gEfiCallerIdGuid,\r
          &Private->Id\r
          );\r
   PxeBcDestroyIp4Children (This, Private);\r
@@ -1403,7 +1409,7 @@ PxeBcDriverBindingStop (
     //\r
     Status = gBS->OpenProtocol (\r
                     NicHandle,\r
-                    &mPxeBcPrivateGuid,\r
+                    &gEfiCallerIdGuid,\r
                     (VOID **) &Id,\r
                     This->DriverBindingHandle,\r
                     ControllerHandle,\r
@@ -1439,6 +1445,15 @@ PxeBcDriverBindingStop (
     }\r
   }\r
 \r
+  //\r
+  // Stop functionality of PXE Base Code protocol\r
+  //\r
+  Status = Private->PxeBc.Stop (&Private->PxeBc);\r
+  if (Status != EFI_SUCCESS && Status != EFI_NOT_STARTED) {\r
+    return Status;\r
+  }\r
+\r
+\r
   if (Private->Ip4Nic != NULL && !IsIpv6) {\r
     PxeBcDestroyIp4Children (This, Private);\r
   }\r
@@ -1450,7 +1465,7 @@ PxeBcDriverBindingStop (
   if (Private->Ip4Nic == NULL && Private->Ip6Nic == NULL) {\r
     gBS->UninstallProtocolInterface (\r
            NicHandle,\r
-           &mPxeBcPrivateGuid,\r
+           &gEfiCallerIdGuid,\r
            &Private->Id\r
            );\r
     FreePool (Private);\r