/** @file\r
The implementation of the Udp4 protocol.\r
- \r
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>\r
-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
-http://opensource.org/licenses/bsd-license.php\r
\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
);\r
\r
/**\r
- This function demultiplexes the received udp datagram to the apropriate instances.\r
+ This function demultiplexes the received udp datagram to the appropriate instances.\r
\r
@param[in] Udp4Service Pointer to the udp service context data.\r
- @param[in] NetSession Pointer to the EFI_NET_SESSION_DATA abstrated from\r
+ @param[in] NetSession Pointer to the EFI_NET_SESSION_DATA abstracted from\r
the received datagram.\r
@param[in] Packet Pointer to the buffer containing the received udp\r
datagram.\r
if (TxData->GatewayAddress != NULL) {\r
CopyMem (&GatewayAddress, TxData->GatewayAddress, sizeof (IP4_ADDR));\r
\r
- if (!NetIp4IsUnicast (NTOHL (GatewayAddress), 0)) {\r
+ if (!Instance->ConfigData.UseDefaultAddress &&\r
+ (EFI_NTOHL(Instance->ConfigData.SubnetMask) != 0) &&\r
+ !NetIp4IsUnicast (NTOHL (GatewayAddress), EFI_NTOHL(Instance->ConfigData.SubnetMask))) {\r
//\r
// The specified GatewayAddress is not a unicast IPv4 address while it's not 0.\r
//\r
\r
CopyMem (&SourceAddress, &UdpSessionData->SourceAddress, sizeof (IP4_ADDR));\r
\r
- if ((SourceAddress != 0) && !NetIp4IsUnicast (HTONL (SourceAddress), 0)) {\r
+ if ((SourceAddress != 0) &&\r
+ !Instance->ConfigData.UseDefaultAddress &&\r
+ (EFI_NTOHL(Instance->ConfigData.SubnetMask) != 0) &&\r
+ !NetIp4IsUnicast (HTONL (SourceAddress), EFI_NTOHL(Instance->ConfigData.SubnetMask))) {\r
//\r
// Check whether SourceAddress is a valid IPv4 address in case it's not zero.\r
// The configured station address is used if SourceAddress is zero.\r
\r
\r
/**\r
- This function demultiplexes the received udp datagram to the apropriate instances.\r
+ This function demultiplexes the received udp datagram to the appropriate instances.\r
\r
@param[in] Udp4Service Pointer to the udp service context data.\r
- @param[in] NetSession Pointer to the EFI_NET_SESSION_DATA abstrated from\r
+ @param[in] NetSession Pointer to the EFI_NET_SESSION_DATA abstracted from\r
the received datagram.\r
@param[in] Packet Pointer to the buffer containing the received udp\r
datagram.\r
EFI_UDP4_SESSION_DATA *Udp4Session;\r
UINTN Enqueued;\r
\r
+ if (Packet->TotalSize < sizeof (EFI_UDP_HEADER)) {\r
+ NetbufFree (Packet);\r
+ return;\r
+ }\r
+\r
//\r
// Get the datagram header from the packet buffer.\r
//\r
//\r
// Wrong checksum.\r
//\r
+ NetbufFree (Packet);\r
return;\r
}\r
}\r
IpSender = IpIoFindSender (&IpIo, NetSession->IpVersion, &NetSession->Dest);\r
if (IpSender == NULL) {\r
//\r
- // No apropriate sender, since we cannot send out the ICMP message through\r
+ // No appropriate sender, since we cannot send out the ICMP message through\r
// the default zero station address IP instance, abort.\r
//\r
return;\r
IpHdr = NetSession->IpHdr.Ip4Hdr;\r
\r
//\r
- // Calculate the requried length of the icmp error message.\r
+ // Calculate the required length of the icmp error message.\r
//\r
Len = sizeof (IP4_ICMP_ERROR_HEAD) + (EFI_IP4_HEADER_LEN (IpHdr) -\r
sizeof (IP4_HEAD)) + ICMP_ERROR_PACKET_LENGTH;\r
LIST_ENTRY *Entry;\r
UDP4_INSTANCE_DATA *Instance;\r
\r
+ if (Packet->TotalSize < sizeof (EFI_UDP_HEADER)) {\r
+ NetbufFree (Packet);\r
+ return;\r
+ }\r
+\r
Udp4Header = (EFI_UDP_HEADER *) NetbufGetByte (Packet, 0, NULL);\r
ASSERT (Udp4Header != NULL);\r
\r