X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=NetworkPkg%2FUefiPxeBcDxe%2FPxeBcSupport.c;h=8eb1558d30a963301652f95b798186980d53d737;hp=720287583e5ff12ba8e065fbf005f8ef8cf9b436;hb=5add2c557773a1e07245926e4768c5d69f666213;hpb=673abfb7491b4abd73bb6a770cf8cd293fbbccb4
diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcSupport.c b/NetworkPkg/UefiPxeBcDxe/PxeBcSupport.c
index 720287583e..8eb1558d30 100644
--- a/NetworkPkg/UefiPxeBcDxe/PxeBcSupport.c
+++ b/NetworkPkg/UefiPxeBcDxe/PxeBcSupport.c
@@ -1,15 +1,9 @@
/** @file
Support functions implementation for UefiPxeBc Driver.
- Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.
+ Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
- This program and the accompanying materials
- are licensed and made available under the terms and conditions of the BSD License
- which accompanies this distribution. The full text of the license may be found at
- http://opensource.org/licenses/bsd-license.php.
-
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+ SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -17,7 +11,7 @@
/**
- Flush the previous configration using the new station Ip address.
+ Flush the previous configuration using the new station Ip address.
@param[in] Private The pointer to the PxeBc private data.
@param[in] StationIp The pointer to the station Ip address.
@@ -36,16 +30,18 @@ PxeBcFlushStationIp (
{
EFI_PXE_BASE_CODE_MODE *Mode;
EFI_STATUS Status;
+ EFI_ARP_CONFIG_DATA ArpConfigData;
Mode = Private->PxeBc.Mode;
Status = EFI_SUCCESS;
+ ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA));
- if (Mode->UsingIpv6) {
-
- if (StationIp != NULL) {
- CopyMem (&Private->Udp6CfgData.StationAddress, StationIp, sizeof (EFI_IPv6_ADDRESS));
- CopyMem (&Private->Ip6CfgData.StationAddress, StationIp, sizeof (EFI_IPv6_ADDRESS));
- }
+ if (Mode->UsingIpv6 && StationIp != NULL) {
+ //
+ // Overwrite Udp6CfgData/Ip6CfgData StationAddress.
+ //
+ CopyMem (&Private->Udp6CfgData.StationAddress, StationIp, sizeof (EFI_IPv6_ADDRESS));
+ CopyMem (&Private->Ip6CfgData.StationAddress, StationIp, sizeof (EFI_IPv6_ADDRESS));
//
// Reconfigure the Ip6 instance to capture background ICMP6 packets with new station Ip address.
@@ -61,27 +57,55 @@ PxeBcFlushStationIp (
Status = Private->Ip6->Receive (Private->Ip6, &Private->Icmp6Token);
} else {
if (StationIp != NULL) {
+ //
+ // Reconfigure the ARP instance with station Ip address.
+ //
+ ArpConfigData.SwAddressType = 0x0800;
+ ArpConfigData.SwAddressLength = (UINT8) sizeof (EFI_IPv4_ADDRESS);
+ ArpConfigData.StationAddress = StationIp;
+
+ Private->Arp->Configure (Private->Arp, NULL);
+ Private->Arp->Configure (Private->Arp, &ArpConfigData);
+
+ //
+ // Overwrite Udp4CfgData/Ip4CfgData StationAddress.
+ //
CopyMem (&Private->Udp4CfgData.StationAddress, StationIp, sizeof (EFI_IPv4_ADDRESS));
CopyMem (&Private->Ip4CfgData.StationAddress, StationIp, sizeof (EFI_IPv4_ADDRESS));
}
-
+
if (SubnetMask != NULL) {
+ //
+ // Overwrite Udp4CfgData/Ip4CfgData SubnetMask.
+ //
CopyMem (&Private->Udp4CfgData.SubnetMask, SubnetMask, sizeof (EFI_IPv4_ADDRESS));
CopyMem (&Private->Ip4CfgData.SubnetMask, SubnetMask, sizeof (EFI_IPv4_ADDRESS));
}
- //
- // Reconfigure the Ip4 instance to capture background ICMP packets with new station Ip address.
- //
- Private->Ip4->Cancel (Private->Ip4, &Private->IcmpToken);
- Private->Ip4->Configure (Private->Ip4, NULL);
-
- Status = Private->Ip4->Configure (Private->Ip4, &Private->Ip4CfgData);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
+ if (StationIp != NULL && SubnetMask != NULL) {
+ //
+ // Updated the route table.
+ //
+ Mode->RouteTableEntries = 1;
+ Mode->RouteTable[0].IpAddr.Addr[0] = StationIp->Addr[0] & SubnetMask->Addr[0];
+ Mode->RouteTable[0].SubnetMask.Addr[0] = SubnetMask->Addr[0];
+ Mode->RouteTable[0].GwAddr.Addr[0] = 0;
}
- Status = Private->Ip4->Receive (Private->Ip4, &Private->IcmpToken);
+ if (StationIp != NULL || SubnetMask != NULL) {
+ //
+ // Reconfigure the Ip4 instance to capture background ICMP packets with new station Ip address.
+ //
+ Private->Ip4->Cancel (Private->Ip4, &Private->IcmpToken);
+ Private->Ip4->Configure (Private->Ip4, NULL);
+
+ Status = Private->Ip4->Configure (Private->Ip4, &Private->Ip4CfgData);
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }
+
+ Status = Private->Ip4->Receive (Private->Ip4, &Private->IcmpToken);
+ }
}
ON_EXIT:
@@ -112,7 +136,7 @@ PxeBcCommonNotify (
@param Mode The pointer to EFI_PXE_BASE_CODE_MODE.
@param Ip4Addr The Ip4 address for resolution.
- @param MacAddress The resoluted MAC address if the resolution is successful.
+ @param MacAddress The resolved MAC address if the resolution is successful.
The value is undefined if the resolution fails.
@retval TRUE Found an matched entry.
@@ -257,8 +281,7 @@ PxeBcIcmpErrorDpcHandle (
//
// The return status should be recognized as EFI_ICMP_ERROR.
//
- gBS->SignalEvent (RxData->RecycleSignal);
- goto ON_EXIT;
+ goto ON_RECYCLE;
}
if (EFI_IP4 (RxData->Header->SourceAddress) != 0 &&
@@ -268,18 +291,16 @@ PxeBcIcmpErrorDpcHandle (
//
// The source address of the received packet should be a valid unicast address.
//
- gBS->SignalEvent (RxData->RecycleSignal);
- goto ON_EXIT;
+ goto ON_RECYCLE;
}
if (!EFI_IP4_EQUAL (&RxData->Header->DestinationAddress, &Mode->StationIp.v4)) {
//
// The destination address of the received packet should be equal to the host address.
//
- gBS->SignalEvent (RxData->RecycleSignal);
- goto ON_EXIT;
+ goto ON_RECYCLE;
}
-
+
//
// The protocol has been configured to only receive ICMP packet.
//
@@ -295,8 +316,7 @@ PxeBcIcmpErrorDpcHandle (
//
// The type of the receveid ICMP message should be ICMP_ERROR_MESSAGE.
//
- gBS->SignalEvent (RxData->RecycleSignal);
- goto ON_EXIT;
+ goto ON_RECYCLE;
}
//
@@ -323,6 +343,9 @@ PxeBcIcmpErrorDpcHandle (
IcmpError += CopiedLen;
}
+ON_RECYCLE:
+ gBS->SignalEvent (RxData->RecycleSignal);
+
ON_EXIT:
Private->IcmpToken.Status = EFI_NOT_READY;
Ip4->Receive (Ip4, &Private->IcmpToken);
@@ -392,16 +415,14 @@ PxeBcIcmp6ErrorDpcHandle (
//
// The return status should be recognized as EFI_ICMP_ERROR.
//
- gBS->SignalEvent (RxData->RecycleSignal);
- goto ON_EXIT;
+ goto ON_RECYCLE;
}
if (!NetIp6IsValidUnicast (&RxData->Header->SourceAddress)) {
//
// The source address of the received packet should be a valid unicast address.
//
- gBS->SignalEvent (RxData->RecycleSignal);
- goto ON_EXIT;
+ goto ON_RECYCLE;
}
if (!NetIp6IsUnspecifiedAddr (&Mode->StationIp.v6) &&
@@ -409,8 +430,7 @@ PxeBcIcmp6ErrorDpcHandle (
//
// The destination address of the received packet should be equal to the host address.
//
- gBS->SignalEvent (RxData->RecycleSignal);
- goto ON_EXIT;
+ goto ON_RECYCLE;
}
//
@@ -427,8 +447,7 @@ PxeBcIcmp6ErrorDpcHandle (
//
// The type of the receveid packet should be an ICMP6 error message.
//
- gBS->SignalEvent (RxData->RecycleSignal);
- goto ON_EXIT;
+ goto ON_RECYCLE;
}
//
@@ -455,6 +474,9 @@ PxeBcIcmp6ErrorDpcHandle (
Icmp6Error += CopiedLen;
}
+ON_RECYCLE:
+ gBS->SignalEvent (RxData->RecycleSignal);
+
ON_EXIT:
Private->Icmp6Token.Status = EFI_NOT_READY;
Ip6->Receive (Ip6, &Private->Icmp6Token);
@@ -489,7 +511,7 @@ PxeBcIcmp6ErrorUpdate (
@param[in, out] SrcPort The pointer to the source port.
@param[in] DoNotFragment If TRUE, fragment is not enabled.
Otherwise, fragment is enabled.
- @param[in] Ttl The time to live field of the IP header.
+ @param[in] Ttl The time to live field of the IP header.
@param[in] ToS The type of service field of the IP header.
@retval EFI_SUCCESS Successfully configured this instance.
@@ -1154,7 +1176,7 @@ PxeBcUdp4Read (
Token->Status == EFI_NOT_READY &&
EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) {
//
- // Poll the token utill reply/ICMPv6 error message received or timeout.
+ // Poll the token until reply/ICMPv6 error message received or timeout.
//
Udp4->Poll (Udp4);
if (Token->Status == EFI_ICMP_ERROR ||
@@ -1258,7 +1280,7 @@ PxeBcUdp6Read (
Token->Status == EFI_NOT_READY &&
EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) {
//
- // Poll the token utill reply/ICMPv6 error message received or timeout.
+ // Poll the token until reply/ICMPv6 error message received or timeout.
//
Udp6->Poll (Udp6);
if (Token->Status == EFI_ICMP_ERROR ||
@@ -1482,14 +1504,14 @@ CalcElapsedTime (
//
ZeroMem (&Time, sizeof (EFI_TIME));
gRT->GetTime (&Time, NULL);
- CurrentStamp = (UINT64)
- (
- ((((((Time.Year - 1900) * 360 +
- (Time.Month - 1)) * 30 +
- (Time.Day - 1)) * 24 + Time.Hour) * 60 +
- Time.Minute) * 60 + Time.Second) * 100
- + DivU64x32(Time.Nanosecond, 10000000)
- );
+ CurrentStamp = MultU64x32 (
+ ((((UINT32)(Time.Year - 1900) * 360 + (Time.Month - 1) * 30 + (Time.Day - 1)) * 24 + Time.Hour) * 60 + Time.Minute) * 60 + Time.Second,
+ 100
+ ) +
+ DivU64x32 (
+ Time.Nanosecond,
+ 10000000
+ );
//
// Sentinel value of 0 means that this is the first DHCP packet that we are