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
\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
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
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
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
\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
//\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
}\r
\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto ON_EXIT;\r
}\r
\r
DefaultInfo.IpCnt = BootSvrEntry->IpCnt;\r
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
}\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
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
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
}\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
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