/** @file\r
Support functions implementation for UefiPxeBc Driver.\r
\r
- Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2007 - 2017, 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
EFI_STATUS\r
PxeBcFlushStationIp (\r
PXEBC_PRIVATE_DATA *Private,\r
- EFI_IP_ADDRESS *StationIp,\r
+ EFI_IP_ADDRESS *StationIp, OPTIONAL\r
EFI_IP_ADDRESS *SubnetMask OPTIONAL\r
)\r
{\r
EFI_PXE_BASE_CODE_MODE *Mode;\r
EFI_STATUS Status;\r
\r
- ASSERT (StationIp != NULL);\r
-\r
Mode = Private->PxeBc.Mode;\r
Status = EFI_SUCCESS;\r
\r
if (Mode->UsingIpv6) {\r
\r
- CopyMem (&Private->Udp6CfgData.StationAddress, StationIp, sizeof (EFI_IPv6_ADDRESS));\r
- CopyMem (&Private->Ip6CfgData.StationAddress, StationIp, sizeof (EFI_IPv6_ADDRESS));\r
+ if (StationIp != NULL) {\r
+ CopyMem (&Private->Udp6CfgData.StationAddress, StationIp, sizeof (EFI_IPv6_ADDRESS));\r
+ CopyMem (&Private->Ip6CfgData.StationAddress, StationIp, sizeof (EFI_IPv6_ADDRESS));\r
+ }\r
\r
//\r
// Reconfigure the Ip6 instance to capture background ICMP6 packets with new station Ip address.\r
\r
Status = Private->Ip6->Receive (Private->Ip6, &Private->Icmp6Token);\r
} else {\r
- ASSERT (SubnetMask != NULL);\r
- CopyMem (&Private->Udp4CfgData.StationAddress, StationIp, sizeof (EFI_IPv4_ADDRESS));\r
- CopyMem (&Private->Udp4CfgData.SubnetMask, SubnetMask, sizeof (EFI_IPv4_ADDRESS));\r
- CopyMem (&Private->Ip4CfgData.StationAddress, StationIp, sizeof (EFI_IPv4_ADDRESS));\r
- CopyMem (&Private->Ip4CfgData.SubnetMask, SubnetMask, sizeof (EFI_IPv4_ADDRESS));\r
+ if (StationIp != NULL) {\r
+ CopyMem (&Private->Udp4CfgData.StationAddress, StationIp, sizeof (EFI_IPv4_ADDRESS));\r
+ CopyMem (&Private->Ip4CfgData.StationAddress, StationIp, sizeof (EFI_IPv4_ADDRESS));\r
+ }\r
+ \r
+ if (SubnetMask != NULL) {\r
+ CopyMem (&Private->Udp4CfgData.SubnetMask, SubnetMask, sizeof (EFI_IPv4_ADDRESS));\r
+ CopyMem (&Private->Ip4CfgData.SubnetMask, SubnetMask, sizeof (EFI_IPv4_ADDRESS));\r
+ }\r
\r
//\r
// Reconfigure the Ip4 instance to capture background ICMP packets with new station Ip address.\r
//\r
// The return status should be recognized as EFI_ICMP_ERROR.\r
//\r
- gBS->SignalEvent (RxData->RecycleSignal);\r
- goto ON_EXIT;\r
+ goto ON_RECYCLE;\r
}\r
\r
if (EFI_IP4 (RxData->Header->SourceAddress) != 0 &&\r
//\r
// The source address of the received packet should be a valid unicast address.\r
//\r
- gBS->SignalEvent (RxData->RecycleSignal);\r
- goto ON_EXIT;\r
+ goto ON_RECYCLE;\r
}\r
\r
if (!EFI_IP4_EQUAL (&RxData->Header->DestinationAddress, &Mode->StationIp.v4)) {\r
//\r
// The destination address of the received packet should be equal to the host address.\r
//\r
- gBS->SignalEvent (RxData->RecycleSignal);\r
- goto ON_EXIT;\r
- }\r
-\r
- if (RxData->Header->Protocol != EFI_IP_PROTO_ICMP) {\r
- //\r
- // The protocol value in the header of the receveid packet should be EFI_IP_PROTO_ICMP.\r
- //\r
- gBS->SignalEvent (RxData->RecycleSignal);\r
- goto ON_EXIT;\r
+ goto ON_RECYCLE;\r
}\r
+ \r
+ //\r
+ // The protocol has been configured to only receive ICMP packet.\r
+ //\r
+ ASSERT (RxData->Header->Protocol == EFI_IP_PROTO_ICMP);\r
\r
Type = *((UINT8 *) RxData->FragmentTable[0].FragmentBuffer);\r
\r
//\r
// The type of the receveid ICMP message should be ICMP_ERROR_MESSAGE.\r
//\r
- gBS->SignalEvent (RxData->RecycleSignal);\r
- goto ON_EXIT;\r
+ goto ON_RECYCLE;\r
}\r
\r
//\r
IcmpError += CopiedLen;\r
}\r
\r
+ON_RECYCLE:\r
+ gBS->SignalEvent (RxData->RecycleSignal);\r
+\r
ON_EXIT:\r
Private->IcmpToken.Status = EFI_NOT_READY;\r
Ip4->Receive (Ip4, &Private->IcmpToken);\r
//\r
// The return status should be recognized as EFI_ICMP_ERROR.\r
//\r
- gBS->SignalEvent (RxData->RecycleSignal);\r
- goto ON_EXIT;\r
+ goto ON_RECYCLE;\r
}\r
\r
if (!NetIp6IsValidUnicast (&RxData->Header->SourceAddress)) {\r
//\r
// The source address of the received packet should be a valid unicast address.\r
//\r
- gBS->SignalEvent (RxData->RecycleSignal);\r
- goto ON_EXIT;\r
+ goto ON_RECYCLE;\r
}\r
\r
if (!NetIp6IsUnspecifiedAddr (&Mode->StationIp.v6) &&\r
//\r
// The destination address of the received packet should be equal to the host address.\r
//\r
- gBS->SignalEvent (RxData->RecycleSignal);\r
- goto ON_EXIT;\r
+ goto ON_RECYCLE;\r
}\r
\r
- if (RxData->Header->NextHeader != IP6_ICMP) {\r
- //\r
- // The nextheader in the header of the receveid packet should be IP6_ICMP.\r
- //\r
- gBS->SignalEvent (RxData->RecycleSignal);\r
- goto ON_EXIT;\r
- }\r
+ //\r
+ // The protocol has been configured to only receive ICMP packet.\r
+ //\r
+ ASSERT (RxData->Header->NextHeader == IP6_ICMP);\r
\r
Type = *((UINT8 *) RxData->FragmentTable[0].FragmentBuffer);\r
\r
if (Type != ICMP_V6_DEST_UNREACHABLE &&\r
Type != ICMP_V6_PACKET_TOO_BIG &&\r
- Type != ICMP_V6_PACKET_TOO_BIG &&\r
+ Type != ICMP_V6_TIME_EXCEEDED &&\r
Type != ICMP_V6_PARAMETER_PROBLEM) {\r
//\r
// The type of the receveid packet should be an ICMP6 error message.\r
//\r
- gBS->SignalEvent (RxData->RecycleSignal);\r
- goto ON_EXIT;\r
+ goto ON_RECYCLE;\r
}\r
\r
//\r
Icmp6Error += CopiedLen;\r
}\r
\r
+ON_RECYCLE:\r
+ gBS->SignalEvent (RxData->RecycleSignal);\r
+ \r
ON_EXIT:\r
Private->Icmp6Token.Status = EFI_NOT_READY;\r
Ip6->Receive (Ip6, &Private->Icmp6Token);\r