]> git.proxmox.com Git - mirror_edk2.git/commitdiff
1. Enabled SetIpFilter() in UefiPxeBcDxe module.
authorvanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 10 Mar 2008 06:55:15 +0000 (06:55 +0000)
committervanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 10 Mar 2008 06:55:15 +0000 (06:55 +0000)
2. Ported Arp() in UefiPxeBcDxe module.
3. Sync tracker: enabled unload() for PxeBcDxe module.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4813 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Library/DxeNetLib/NetBuffer.c
MdeModulePkg/Universal/Network/PxeBcDxe/Bc.c
MdeModulePkg/Universal/Network/PxeBcDxe/Bc.h
MdeModulePkg/Universal/Network/PxeBcDxe/PxeBcDxe.inf
MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c
MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c
MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h
MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf

index d1dbd0aee52c1edf43e250f91a5fd4e3ecf4f67c..69e9082f02f60bc289b8bd64db9502eb015a6aa0 100644 (file)
@@ -653,7 +653,7 @@ NetbufGetFragment (
     CurBlockOp++\r
     );\r
 \r
-  for (Index = First + 1; Index < Last; Index++) {\r
+  for (Index = First + 1; Index <= Last - 1 ; Index++) {\r
     NetbufSetBlockOp (\r
       Child,\r
       BlockOp[Index].Head,\r
index fbdeba5d5277a90cade07c439583970300d3dc67..cd0ef4a27b2beb143ce97501d7ddeff5fe8a853b 100644 (file)
@@ -2344,6 +2344,41 @@ PxeBcDriverStop (
   return Status;\r
 }\r
 \r
+EFI_STATUS\r
+EFIAPI\r
+PxeBcUnload (\r
+  IN EFI_HANDLE  ImageHandle\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+  UINTN       DeviceHandleCount;\r
+  EFI_HANDLE  *DeviceHandleBuffer;\r
+  UINTN       Index;\r
+\r
+  Status = gBS->LocateHandleBuffer (\r
+                  AllHandles,\r
+                  NULL,\r
+                  NULL,\r
+                  &DeviceHandleCount,\r
+                  &DeviceHandleBuffer\r
+                  );\r
+  if (!EFI_ERROR (Status)) {\r
+    for (Index = 0; Index < DeviceHandleCount; Index++) {\r
+      Status = gBS->DisconnectController (\r
+                      DeviceHandleBuffer[Index],\r
+                      mPxeBcDriverBinding.DriverBindingHandle,\r
+                      NULL\r
+                      );\r
+    }\r
+\r
+    if (DeviceHandleBuffer != NULL) {\r
+      gBS->FreePool (DeviceHandleBuffer);\r
+    }\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
 \r
 /**\r
   Initialize the base code drivers and install the driver binding\r
@@ -2360,7 +2395,8 @@ InitializeBCDriver (
   IN EFI_SYSTEM_TABLE *SystemTable\r
   )\r
 {\r
-  EFI_STATUS  Status;\r
+  EFI_STATUS                 Status;\r
+  EFI_LOADED_IMAGE_PROTOCOL  *LoadedImage;\r
 \r
   //\r
   // Initialize EFI library\r
@@ -2374,6 +2410,17 @@ InitializeBCDriver (
              &gPxeBcComponentName2\r
              );\r
 \r
+  Status = gBS->HandleProtocol (\r
+                  ImageHandle,\r
+                  &gEfiLoadedImageProtocolGuid,\r
+                  (VOID **) &LoadedImage\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  } else {\r
+    LoadedImage->Unload = PxeBcUnload;\r
+  }\r
+\r
   InitArpHeader ();\r
   OptionsStrucInit ();\r
 \r
index 8d09ee6e7141335cf1ce10346483123c2c71367e..31162e4971484a0abecb235aec93336e97be5d98 100644 (file)
@@ -32,6 +32,7 @@ Abstract:
 #include <Protocol/LoadFile.h>\r
 #include <Protocol/DevicePath.h>\r
 #include <Protocol/Tcp.h>\r
+#include <Protocol/LoadedImage.h>\r
 \r
 #include <Library/DebugLib.h>\r
 #include <Library/BaseMemoryLib.h>\r
index 1971731e08005973b1450eda5811c22d8eb503ad..9fac52867fc299bf3e8335884317b4920b4174dd 100644 (file)
@@ -88,4 +88,5 @@
   gEfiDevicePathProtocolGuid                      # PROTOCOL ALWAYS_CONSUMED\r
   gEfiTcpProtocolGuid                             # PROTOCOL ALWAYS_CONSUMED\r
   gEfiNetworkInterfaceIdentifierProtocolGuid_31   # PROTOCOL ALWAYS_CONSUMED\r
+  gEfiLoadedImageProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED\r
 \r
index d6907955a5b7510573b747bda69457496d8ba895..91ebd8c27fbf438dcacc55dc871488e1eea716ee 100644 (file)
@@ -141,6 +141,7 @@ PxeBcDriverBindingStart (
   UINTN               Index;\r
   EFI_STATUS          Status;\r
 \r
+  CpuDeadLoop ();\r
   Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA));\r
   if (Private == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
@@ -176,6 +177,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
@@ -247,7 +270,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
@@ -322,6 +345,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
@@ -433,6 +472,19 @@ PxeBcDriverBindingStop (
       Private->Mtftp4Child\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
index 85542f2b2e02ef1752e1af3c63fa47d92e29bb57..193daf1f869636fb421c83d2b801fecf2b30fefd 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright (c) 2007, Intel Corporation\r
+Copyright (c) 2007 - 2008, Intel Corporation\r
 All rights reserved. This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -128,6 +128,11 @@ EfiPxeBcStop (
 \r
   Mode->Started = FALSE;\r
 \r
+  //\r
+  // Reset and leave joined groups\r
+  //\r
+  Private->Udp4->Groups (Private->Udp4, FALSE, NULL);\r
+\r
   Private->Udp4->Configure (Private->Udp4, NULL);\r
 \r
   Private->Dhcp4->Stop (Private->Dhcp4);\r
@@ -170,6 +175,7 @@ EfiPxeBcDhcp (
   UINT32                  DiscoverTimeout;\r
   UINTN                   Index;\r
   EFI_STATUS              Status;\r
+  EFI_ARP_CONFIG_DATA     ArpConfigData;\r
 \r
   if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -266,6 +272,21 @@ EfiPxeBcDhcp (
     Dhcp4->Configure (Dhcp4, &Dhcp4CfgData);\r
 \r
     Private->AddressIsOk = TRUE;\r
+\r
+    if (!Mode->UsingIpv6) {\r
+      //\r
+      // If in IPv4 mode, configure the corresponding ARP with this new\r
+      // station IP address.\r
+      //\r
+      ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA));\r
+\r
+      ArpConfigData.SwAddressType   = 0x0800;\r
+      ArpConfigData.SwAddressLength = sizeof (EFI_IPv4_ADDRESS);\r
+      ArpConfigData.StationAddress  = &Private->StationIp.v4;\r
+\r
+      Private->Arp->Configure (Private->Arp, NULL);\r
+      Private->Arp->Configure (Private->Arp, &ArpConfigData);\r
+    }\r
   }\r
 \r
   return Status;\r
@@ -831,6 +852,62 @@ ON_EXIT:
   return Status;\r
 }\r
 \r
+/**\r
+  Validate IP packages by IP filter settings\r
+\r
+  @param  PxeBcMode          Pointer to EFI_PXEBC_MODE\r
+\r
+  @param  Session            Received UDP session\r
+\r
+  @retval TRUE               The UDP package matches IP filters\r
+\r
+  @retval FLASE              The UDP package doesn't matches IP filters\r
+\r
+**/\r
+STATIC\r
+BOOLEAN\r
+CheckIpByFilter (\r
+  EFI_PXE_BASE_CODE_MODE    *PxeBcMode,\r
+  EFI_UDP4_SESSION_DATA     *Session\r
+  )\r
+{\r
+  UINTN                   Index;\r
+  EFI_IPv4_ADDRESS        Ip4Address;\r
+  EFI_IPv4_ADDRESS        DestIp4Address;\r
+\r
+  if (PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) {\r
+    return TRUE;\r
+  }\r
+\r
+  CopyMem (&DestIp4Address, &Session->DestinationAddress, sizeof (DestIp4Address));\r
+  if ((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) &&\r
+      IP4_IS_MULTICAST (NTOHL (EFI_IP4 (DestIp4Address)))\r
+      ) {\r
+    return TRUE;\r
+  }\r
+\r
+  if ((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) &&\r
+      IP4_IS_LOCAL_BROADCAST (EFI_NTOHL (DestIp4Address))\r
+      ) {\r
+    return TRUE;\r
+  }\r
+\r
+  CopyMem (&Ip4Address, &PxeBcMode->StationIp.v4, sizeof (Ip4Address));\r
+  if ((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) &&\r
+      EFI_IP4_EQUAL (&PxeBcMode->StationIp.v4, &DestIp4Address)\r
+      ) {\r
+    return TRUE;\r
+  }\r
+\r
+  for (Index = 0; Index < PxeBcMode->IpFilter.IpCnt; ++Index) {\r
+    CopyMem (&Ip4Address, &PxeBcMode->IpFilter.IpList[Index].v4, sizeof (Ip4Address));\r
+    if (EFI_IP4_EQUAL (&Ip4Address, &DestIp4Address)) {\r
+      return TRUE;\r
+    }\r
+  }\r
+\r
+  return FALSE;\r
+}\r
 \r
 /**\r
   GC_NOTO: Add function description\r
@@ -900,10 +977,6 @@ EfiPxeBcUdpRead (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  if (OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
   if ((!(OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) && (DestPort == NULL)) ||\r
       (!(OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) && (SrcIp == NULL)) ||\r
       (!(OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT) && (SrcPort == NULL))) {\r
@@ -961,23 +1034,34 @@ EfiPxeBcUdpRead (
 \r
     Matched = FALSE;\r
 \r
-    //\r
-    // Match the destination ip of the received udp dgram\r
-    //\r
-    if (OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP) {\r
-      Matched = TRUE;\r
-\r
-      if (DestIp != NULL) {\r
-        CopyMem (DestIp, &Session->DestinationAddress, sizeof (EFI_IPv4_ADDRESS));\r
+    if (OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER) {\r
+      //\r
+      // Check UDP package by IP filter settings\r
+      //\r
+      if (CheckIpByFilter (Mode, Session)) {\r
+        Matched = TRUE;\r
       }\r
-    } else {\r
-      if (DestIp != NULL) {\r
-        if (EFI_IP4_EQUAL (DestIp, &Session->DestinationAddress)) {\r
-          Matched = TRUE;\r
+    }\r
+\r
+    if (Matched) {\r
+      //\r
+      // Match the destination ip of the received udp dgram\r
+      //\r
+      if (OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP) {\r
+        Matched = TRUE;\r
+\r
+        if (DestIp != NULL) {\r
+          CopyMem (DestIp, &Session->DestinationAddress, sizeof (EFI_IPv4_ADDRESS));\r
         }\r
       } else {\r
-        if (EFI_IP4_EQUAL (&Private->StationIp, &Session->DestinationAddress)) {\r
-          Matched = TRUE;\r
+        if (DestIp != NULL) {\r
+          if (EFI_IP4_EQUAL (DestIp, &Session->DestinationAddress)) {\r
+            Matched = TRUE;\r
+          }\r
+        } else {\r
+          if (EFI_IP4_EQUAL (&Private->StationIp, &Session->DestinationAddress)) {\r
+            Matched = TRUE;\r
+          }\r
         }\r
       }\r
     }\r
@@ -1091,7 +1175,120 @@ EfiPxeBcSetIpFilter (
   IN EFI_PXE_BASE_CODE_IP_FILTER      *NewFilter\r
   )\r
 {\r
-  return EFI_UNSUPPORTED;\r
+  EFI_STATUS                Status;\r
+  PXEBC_PRIVATE_DATA        *Private;\r
+  EFI_PXE_BASE_CODE_MODE    *Mode;\r
+  UINTN                     Index;\r
+  BOOLEAN                   PromiscuousNeed;\r
+\r
+  if (This == NULL) {\r
+    DEBUG ((EFI_D_ERROR, "BC *This pointer == NULL.\n"));\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);\r
+  Mode = Private->PxeBc.Mode;\r
+\r
+  if (Private == NULL) {\r
+    DEBUG ((EFI_D_ERROR, "PXEBC_PRIVATE_DATA poiner == NULL.\n"));\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if (NewFilter == NULL) {\r
+    DEBUG ((EFI_D_ERROR, "IP Filter *NewFilter == NULL.\n"));\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if (!Mode->Started) {\r
+    DEBUG ((EFI_D_ERROR, "BC was not started.\n"));\r
+    return EFI_NOT_STARTED;\r
+  }\r
+\r
+  PromiscuousNeed = FALSE;\r
+  for (Index = 0; Index < NewFilter->IpCnt; ++Index) {\r
+    if (IP4_IS_LOCAL_BROADCAST (EFI_IP4 (NewFilter->IpList[Index].v4))) {\r
+      //\r
+      // The IP is a broadcast address.\r
+      //\r
+      DEBUG ((EFI_D_ERROR, "There is broadcast address in NewFilter.\n"));\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+    if (Ip4IsUnicast (EFI_IP4 (NewFilter->IpList[Index].v4), 0) &&\r
+        (NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP)\r
+       ) {\r
+      //\r
+      // If EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP is set and IP4 address is in IpList,\r
+      // promiscuous mode is needed.\r
+      //\r
+      PromiscuousNeed = TRUE;\r
+    }\r
+  }\r
+\r
+  //\r
+  // Clear the UDP instance configuration, all joined groups will be left\r
+  // during the operation.\r
+  //\r
+  Private->Udp4->Configure (Private->Udp4, NULL);\r
+  Private->Udp4CfgData.AcceptPromiscuous  = FALSE;\r
+  Private->Udp4CfgData.AcceptBroadcast    = FALSE;\r
+\r
+  if (PromiscuousNeed ||\r
+      NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS ||\r
+      NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST\r
+     ) {\r
+    //\r
+    // Configure the udp4 filter to receive all packages\r
+    //\r
+    Private->Udp4CfgData.AcceptPromiscuous  = TRUE;\r
+\r
+    //\r
+    // Configure the UDP instance with the new configuration.\r
+    //\r
+    Status = Private->Udp4->Configure (Private->Udp4, &Private->Udp4CfgData);\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+\r
+  } else {\r
+\r
+    if (NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) {\r
+      //\r
+      // Configure the udp4 filter to receive all broadcast packages\r
+      //\r
+      Private->Udp4CfgData.AcceptBroadcast    = TRUE;\r
+    }\r
+\r
+    //\r
+    // Configure the UDP instance with the new configuration.\r
+    //\r
+    Status = Private->Udp4->Configure (Private->Udp4, &Private->Udp4CfgData);\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+\r
+    if (NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) {\r
+\r
+      for (Index = 0; Index < NewFilter->IpCnt; ++Index) {\r
+        if (IP4_IS_MULTICAST (EFI_NTOHL (NewFilter->IpList[Index].v4))) {\r
+          //\r
+          // Join the mutilcast group\r
+          //\r
+          Status = Private->Udp4->Groups (Private->Udp4, TRUE, &NewFilter->IpList[Index].v4);\r
+          if (EFI_ERROR (Status)) {\r
+            return Status;\r
+          }\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+\r
+  //\r
+  // Save the new filter.\r
+  //\r
+  CopyMem (&Mode->IpFilter, NewFilter, sizeof (Mode->IpFilter));\r
+\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 \r
@@ -1117,10 +1314,44 @@ EfiPxeBcArp (
   IN EFI_MAC_ADDRESS                  * MacAddr OPTIONAL\r
   )\r
 {\r
-  return EFI_UNSUPPORTED;\r
+  PXEBC_PRIVATE_DATA      *Private;\r
+  EFI_PXE_BASE_CODE_MODE  *Mode;\r
+  EFI_STATUS              Status;\r
+  EFI_MAC_ADDRESS         TempMacAddr;\r
+\r
+  if (This == NULL || IpAddr == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);\r
+  Mode    = Private->PxeBc.Mode;\r
+\r
+  if (!Mode->Started) {\r
+    return EFI_NOT_STARTED;\r
+  }\r
+\r
+  if (!Private->AddressIsOk || Mode->UsingIpv6) {\r
+    //\r
+    // We can't resolve the IP address if we don't have a local address now.\r
+    // Don't have ARP for IPv6.\r
+    //\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Status = Private->Arp->Request (Private->Arp, &IpAddr->v4, NULL, &TempMacAddr);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  if (MacAddr != NULL) {\r
+    CopyMem (MacAddr, &TempMacAddr, sizeof (EFI_MAC_ADDRESS));\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 \r
+\r
 /**\r
   GC_NOTO: Add function description\r
 \r
@@ -1266,6 +1497,7 @@ EfiPxeBcSetStationIP (
 {\r
   PXEBC_PRIVATE_DATA      *Private;\r
   EFI_PXE_BASE_CODE_MODE  *Mode;\r
+  EFI_ARP_CONFIG_DATA     ArpConfigData;\r
 \r
   if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -1296,6 +1528,21 @@ EfiPxeBcSetStationIP (
 \r
   Private->AddressIsOk = TRUE;\r
 \r
+  if (!Mode->UsingIpv6) {\r
+    //\r
+    // If in IPv4 mode, configure the corresponding ARP with this new\r
+    // station IP address.\r
+    //\r
+    ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA));\r
+\r
+    ArpConfigData.SwAddressType   = 0x0800;\r
+    ArpConfigData.SwAddressLength = sizeof (EFI_IPv4_ADDRESS);\r
+    ArpConfigData.StationAddress  = &Private->StationIp.v4;\r
+\r
+    Private->Arp->Configure (Private->Arp, NULL);\r
+    Private->Arp->Configure (Private->Arp, &ArpConfigData);\r
+  }\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
index 61992521b981cb9c20a5f2aa8e59783ac8e2cff6..6bd7a55531c6eda622d93d082479cd634be41335 100644 (file)
@@ -35,6 +35,7 @@ typedef struct _PXEBC_PRIVATE_DATA  PXEBC_PRIVATE_DATA;
 #include <Protocol/LoadFile.h>\r
 #include <Protocol/NetworkInterfaceIdentifier.h>\r
 #include <Protocol/PxeBaseCodeCallBack.h>\r
+#include <Protocol/Arp.h>
 \r
 #include <Library/DebugLib.h>\r
 #include <Library/BaseMemoryLib.h>\r
@@ -58,6 +59,7 @@ struct _PXEBC_PRIVATE_DATA {
   UINT32                                    Signature;
   EFI_HANDLE                                Controller;
   EFI_HANDLE                                Image;
+  EFI_HANDLE                                ArpChild;
   EFI_HANDLE                                Dhcp4Child;
   EFI_HANDLE                                Mtftp4Child;
   EFI_HANDLE                                Udp4Child;
@@ -68,6 +70,7 @@ struct _PXEBC_PRIVATE_DATA {
   EFI_LOAD_FILE_PROTOCOL                    LoadFile;
   EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL       LoadFileCallback;
   EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL       *PxeBcCallback;
+  EFI_ARP_PROTOCOL                          *Arp;
   EFI_DHCP4_PROTOCOL                        *Dhcp4;
   EFI_MTFTP4_PROTOCOL                       *Mtftp4;
   EFI_UDP4_PROTOCOL                         *Udp4;
index fd4ab6be685a335dfe5ba320fd2934fa3e421548..9e24a7bc7a463c0ab177de6d303013eb17d5eedb 100644 (file)
@@ -79,6 +79,8 @@
 \r
 \r
 [Protocols]\r
+  gEfiArpServiceBindingProtocolGuid                # PROTOCOL ALWAYS_CONSUMED\r
+  gEfiArpProtocolGuid                              # PROTOCOL ALWAYS_CONSUMED\r
   gEfiMtftp4ServiceBindingProtocolGuid             # PROTOCOL ALWAYS_CONSUMED\r
   gEfiMtftp4ProtocolGuid                           # PROTOCOL ALWAYS_CONSUMED\r
   gEfiUdp4ServiceBindingProtocolGuid               # PROTOCOL ALWAYS_CONSUMED\r
@@ -90,4 +92,3 @@
   gEfiUdp4ProtocolGuid                             # PROTOCOL ALWAYS_CONSUMED\r
   gEfiNetworkInterfaceIdentifierProtocolGuid_31    # PROTOCOL ALWAYS_CONSUMED\r
 \r
-\r