]> git.proxmox.com Git - mirror_edk2.git/commitdiff
To comply w/ UEFI spec , In Dhcp(), Discover(), and Mtftp() interfaces, set the IP...
authorhhuan13 <hhuan13@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 27 Aug 2010 05:11:32 +0000 (05:11 +0000)
committerhhuan13 <hhuan13@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 27 Aug 2010 05:11:32 +0000 (05:11 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10829 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c

index 989da79b850f042341631f7eb7d4ce7efcd5546c..ba8fe5c429ba6e3e19d757001f49b11b73aca7d5 100644 (file)
@@ -561,15 +561,16 @@ EfiPxeBcDhcp (
   IN BOOLEAN                          SortOffers\r
   )\r
 {\r
-  PXEBC_PRIVATE_DATA      *Private;\r
-  EFI_PXE_BASE_CODE_MODE  *Mode;\r
-  EFI_DHCP4_PROTOCOL      *Dhcp4;\r
-  EFI_DHCP4_CONFIG_DATA   Dhcp4CfgData;\r
-  EFI_DHCP4_MODE_DATA     Dhcp4Mode;\r
-  EFI_DHCP4_PACKET_OPTION *OptList[PXEBC_DHCP4_MAX_OPTION_NUM];\r
-  UINT32                  OptCount;\r
-  EFI_STATUS              Status;\r
-  EFI_ARP_CONFIG_DATA     ArpConfigData;\r
+  PXEBC_PRIVATE_DATA           *Private;\r
+  EFI_PXE_BASE_CODE_MODE       *Mode;\r
+  EFI_DHCP4_PROTOCOL           *Dhcp4;\r
+  EFI_DHCP4_CONFIG_DATA        Dhcp4CfgData;\r
+  EFI_DHCP4_MODE_DATA          Dhcp4Mode;\r
+  EFI_DHCP4_PACKET_OPTION      *OptList[PXEBC_DHCP4_MAX_OPTION_NUM];\r
+  UINT32                       OptCount;\r
+  EFI_STATUS                   Status;\r
+  EFI_ARP_CONFIG_DATA          ArpConfigData;\r
+  EFI_PXE_BASE_CODE_IP_FILTER  IpFilter;\r
 \r
   if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -588,6 +589,11 @@ EfiPxeBcDhcp (
 \r
   Mode->IcmpErrorReceived = FALSE;\r
 \r
+  //\r
+  // Stop Udp4Read instance\r
+  //\r
+  Private->Udp4Read->Configure (Private->Udp4Read, NULL);\r
+\r
   //\r
   // Initialize the DHCP options and build the option list\r
   //\r
@@ -694,9 +700,41 @@ ON_EXIT:
         Mode->RouteTable[1].SubnetMask.Addr[0] = 0;\r
         Mode->RouteTable[1].GwAddr.Addr[0]     = Private->GatewayIp.Addr[0];\r
       }\r
+\r
+      //\r
+      // Flush new station IP address into Udp4CfgData and Ip4ConfigData\r
+      //\r
+      CopyMem (&Private->Udp4CfgData.StationAddress, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS));\r
+      CopyMem (&Private->Udp4CfgData.SubnetMask, &Private->SubnetMask, sizeof (EFI_IPv4_ADDRESS));\r
+      CopyMem (&Private->Ip4ConfigData.StationAddress, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS));\r
+      CopyMem (&Private->Ip4ConfigData.SubnetMask, &Private->SubnetMask, sizeof (EFI_IPv4_ADDRESS));\r
+  \r
+      //\r
+      // Reconfigure the Ip4 instance to capture background ICMP packets with new station Ip address.\r
+      //\r
+      Private->Ip4->Cancel (Private->Ip4, &Private->IcmpErrorRcvToken);\r
+      Private->Ip4->Configure (Private->Ip4, NULL);\r
+  \r
+      Status = Private->Ip4->Configure (Private->Ip4, &Private->Ip4ConfigData);\r
+      if (EFI_ERROR (Status)) {\r
+        goto ON_EXIT;\r
+      }\r
+  \r
+      Status = Private->Ip4->Receive (Private->Ip4, &Private->IcmpErrorRcvToken);\r
+      if (EFI_ERROR (Status)) {\r
+        goto ON_EXIT;\r
+      } \r
     }\r
   }\r
 \r
+  //\r
+  // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP \r
+  // receive filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP.\r
+  //\r
+  ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER));\r
+  IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP;\r
+  This->SetIpFilter (This, &IpFilter);\r
+  \r
   return Status;\r
 }\r
 \r
@@ -765,6 +803,7 @@ EfiPxeBcDiscover (
   UINT16                          Index;\r
   EFI_STATUS                      Status;\r
   PXEBC_BOOT_SVR_ENTRY            *BootSvrEntry;\r
+  EFI_PXE_BASE_CODE_IP_FILTER     IpFilter;\r
 \r
   if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -786,6 +825,11 @@ EfiPxeBcDiscover (
     return EFI_NOT_STARTED;\r
   }\r
 \r
+  //\r
+  // Stop Udp4Read instance\r
+  //\r
+  Private->Udp4Read->Configure (Private->Udp4Read, NULL);\r
+\r
   Mode->IcmpErrorReceived = FALSE;\r
 \r
   //\r
@@ -798,7 +842,8 @@ EfiPxeBcDiscover (
 \r
     if (!Mode->PxeDiscoverValid || !Mode->PxeReplyReceived || (!Mode->PxeBisReplyReceived && UseBis)) {\r
 \r
-      return EFI_INVALID_PARAMETER;\r
+      Status = EFI_INVALID_PARAMETER;\r
+      goto ON_EXIT;  \r
     }\r
 \r
     DefaultInfo.IpCnt                 = 1;\r
@@ -821,7 +866,8 @@ EfiPxeBcDiscover (
       //\r
       // Address is not acquired or no discovery options.\r
       //\r
-      return EFI_INVALID_PARAMETER;\r
+      Status = EFI_INVALID_PARAMETER;\r
+      goto ON_EXIT;  \r
     }\r
 \r
     DefaultInfo.UseMCast    = (BOOLEAN)!IS_DISABLE_MCAST_DISCOVER (VendorOpt->DiscoverCtrl);\r
@@ -859,7 +905,7 @@ EfiPxeBcDiscover (
       }\r
 \r
       if (EFI_ERROR (Status)) {\r
-        return Status;\r
+        goto ON_EXIT;\r
       }\r
 \r
       DefaultInfo.IpCnt = BootSvrEntry->IpCnt;\r
@@ -867,7 +913,9 @@ EfiPxeBcDiscover (
       if (DefaultInfo.IpCnt >= 1) {\r
         CreatedInfo = AllocatePool (sizeof (DefaultInfo) + (DefaultInfo.IpCnt - 1) * sizeof (*SrvList));\r
         if (CreatedInfo == NULL) {\r
-          return EFI_OUT_OF_RESOURCES;\r
+          Status = EFI_OUT_OF_RESOURCES;\r
+          goto ON_EXIT;\r
+          \r
         }     \r
       \r
         CopyMem (CreatedInfo, &DefaultInfo, sizeof (DefaultInfo));\r
@@ -895,14 +943,16 @@ EfiPxeBcDiscover (
       }\r
 \r
       if (Index != Info->IpCnt) {\r
-        return EFI_INVALID_PARAMETER;\r
+        Status = EFI_INVALID_PARAMETER;\r
+        goto ON_EXIT;        \r
       }\r
     }\r
   }\r
 \r
   if ((!Info->UseUCast && !Info->UseBCast && !Info->UseMCast) || (Info->MustUseList && Info->IpCnt == 0)) {\r
 \r
-    return EFI_INVALID_PARAMETER;\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto ON_EXIT;\r
   }\r
   //\r
   // Execute discover by UniCast/BroadCast/MultiCast\r
@@ -987,6 +1037,16 @@ EfiPxeBcDiscover (
   if (CreatedInfo != NULL) {\r
     FreePool (CreatedInfo);\r
   }\r
+\r
+ON_EXIT:\r
+\r
+  //\r
+  // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP \r
+  // receive filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP.\r
+  //\r
+  ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER));\r
+  IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP;\r
+  This->SetIpFilter (This, &IpFilter);\r
   \r
   return Status;\r
 }\r
@@ -1078,11 +1138,12 @@ EfiPxeBcMtftp (
   IN BOOLEAN                          DontUseBuffer\r
   )\r
 {\r
-  PXEBC_PRIVATE_DATA      *Private;\r
-  EFI_MTFTP4_CONFIG_DATA  Mtftp4Config;\r
-  EFI_STATUS              Status;\r
-  EFI_PXE_BASE_CODE_MODE  *Mode;\r
-  EFI_MAC_ADDRESS         TempMacAddr;\r
+  PXEBC_PRIVATE_DATA           *Private;\r
+  EFI_MTFTP4_CONFIG_DATA       Mtftp4Config;\r
+  EFI_STATUS                   Status;\r
+  EFI_PXE_BASE_CODE_MODE       *Mode;\r
+  EFI_MAC_ADDRESS              TempMacAddr;\r
+  EFI_PXE_BASE_CODE_IP_FILTER  IpFilter;\r
 \r
   if ((This == NULL)                                                          ||\r
       (Filename == NULL)                                                      ||\r
@@ -1108,6 +1169,11 @@ EfiPxeBcMtftp (
     }\r
   }\r
 \r
+  //\r
+  // Stop Udp4Read instance\r
+  //\r
+  Private->Udp4Read->Configure (Private->Udp4Read, NULL);\r
+\r
   Mode->TftpErrorReceived = FALSE;\r
   Mode->IcmpErrorReceived = FALSE;\r
 \r
@@ -1208,6 +1274,14 @@ EfiPxeBcMtftp (
     Mode->IcmpErrorReceived = TRUE;\r
   }\r
 \r
+  //\r
+  // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP \r
+  // receive filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP.\r
+  //\r
+  ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER));\r
+  IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP;\r
+  This->SetIpFilter (This, &IpFilter);\r
+\r
   return Status;\r
 }\r
 \r