From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) (using TLSv1 with cipher CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 0901A81D06 for ; Thu, 27 Oct 2016 23:51:02 -0700 (PDT) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga103.jf.intel.com with ESMTP; 27 Oct 2016 23:14:46 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,556,1473145200"; d="scan'208";a="778919680" Received: from fmsmsx104.amr.corp.intel.com ([10.18.124.202]) by FMSMGA003.fm.intel.com with ESMTP; 27 Oct 2016 23:14:45 -0700 Received: from fmsmsx154.amr.corp.intel.com (10.18.116.70) by fmsmsx104.amr.corp.intel.com (10.18.124.202) with Microsoft SMTP Server (TLS) id 14.3.248.2; Thu, 27 Oct 2016 23:14:43 -0700 Received: from shsmsx151.ccr.corp.intel.com (10.239.6.50) by FMSMSX154.amr.corp.intel.com (10.18.116.70) with Microsoft SMTP Server (TLS) id 14.3.248.2; Thu, 27 Oct 2016 23:14:39 -0700 Received: from shsmsx103.ccr.corp.intel.com ([169.254.4.139]) by SHSMSX151.ccr.corp.intel.com ([169.254.3.96]) with mapi id 14.03.0248.002; Fri, 28 Oct 2016 14:14:35 +0800 From: "Wu, Jiaxin" To: "Fu, Siyuan" , "edk2-devel@lists.01.org" CC: "Ye, Ting" , "Zhang, Lubo" Thread-Topic: [PATCH v3 2/3] MdeModulePkg: Update IP4 stack drivers for classless address unicast check. Thread-Index: AQHSMOGWwNHjok6amkWmdBOdc6EDh6C9Y02w Date: Fri, 28 Oct 2016 06:14:34 +0000 Message-ID: <895558F6EA4E3B41AC93A00D163B7274138A0330@SHSMSX103.ccr.corp.intel.com> References: <1477634835-10368-1-git-send-email-siyuan.fu@intel.com> In-Reply-To: <1477634835-10368-1-git-send-email-siyuan.fu@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiMTA0ZmM3NDgtZWZmNS00Y2NkLWI0YmUtZjg1ZGRiMjhmNmI2IiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX0lDIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE1LjkuNi42IiwiVHJ1c3RlZExhYmVsSGFzaCI6IlI5QzNEVVdpc3AwKzJDblJqWHF1elhISjJ3QXNKa1FOZDVBUkR0eVRncVk9In0= x-ctpclassification: CTP_IC x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [PATCH v3 2/3] MdeModulePkg: Update IP4 stack drivers for classless address unicast check. X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 28 Oct 2016 06:51:02 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-By: Wu Jiaxin Best Regards! Jiaxin > -----Original Message----- > From: Fu, Siyuan > Sent: Friday, October 28, 2016 2:07 PM > To: edk2-devel@lists.01.org > Cc: Ye, Ting ; Zhang, Lubo ; Wu, > Jiaxin > Subject: [PATCH v3 2/3] MdeModulePkg: Update IP4 stack drivers for classl= ess > address unicast check. >=20 > V3: > Keep original logic in EfiDhcp4TransmitReceive() and add comments for it. >=20 > V2 update: > Keep the zero address and broadcast check if network mask is not availabl= e. >=20 > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Fu Siyuan > Cc: Ye Ting > Cc: Zhang Lubo > Cc: Wu Jiaxin > --- > MdeModulePkg/Include/Library/IpIoLib.h | 4 +++- > MdeModulePkg/Library/DxeIpIoLib/DxeIpIoLib.c | 9 +++++++- > MdeModulePkg/Universal/Network/ArpDxe/ArpImpl.c | 4 ++-- > .../Universal/Network/Dhcp4Dxe/Dhcp4Impl.c | 27 +++++++++-------= ------ > MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Io.c | 6 +---- > .../Universal/Network/IScsiDxe/IScsiConfig.c | 15 ++++++++---- > .../Universal/Network/Ip4Dxe/Ip4Config2Impl.c | 9 ++++---- > .../Universal/Network/Ip4Dxe/Ip4Config2Nv.c | 24 +++++++++-------= --- > MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.c | 7 +----- > .../Universal/Network/Mtftp4Dxe/Mtftp4Impl.c | 8 ++----- > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c | 6 ++--- > MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Impl.c | 9 ++++++-- > MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Main.c | 8 +++---- > .../Universal/Network/UefiPxeBcDxe/PxeBcImpl.c | 24 +++++++++++-----= --- > 14 files changed, 83 insertions(+), 77 deletions(-) >=20 > diff --git a/MdeModulePkg/Include/Library/IpIoLib.h > b/MdeModulePkg/Include/Library/IpIoLib.h > index 37cba07..aab0c68 100644 > --- a/MdeModulePkg/Include/Library/IpIoLib.h > +++ b/MdeModulePkg/Include/Library/IpIoLib.h > @@ -2,7 +2,7 @@ > This library is only intended to be used by UEFI network stack modules= . > It provides the combined IpIo layer on the EFI IP4 Protocol and EFI IP= 6 > protocol. >=20 > -Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.
> +Copyright (c) 2005 - 2016, 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 that accompa= nies > this distribution. > The full text of the license may be found at @@ -261,6 +261,8 @@ typedef > struct _IP_IO { > PKT_RCVD_NOTIFY PktRcvdNotify; ///< See > IP_IO_OPEN_DATA::PktRcvdNotify. > PKT_SENT_NOTIFY PktSentNotify; ///< See > IP_IO_OPEN_DATA::PktSentNotify. > UINT8 IpVersion; > + IP4_ADDR StationIp; > + IP4_ADDR SubnetMask; > } IP_IO; >=20 > /// > diff --git a/MdeModulePkg/Library/DxeIpIoLib/DxeIpIoLib.c > b/MdeModulePkg/Library/DxeIpIoLib/DxeIpIoLib.c > index 27fef71..9a70e90 100644 > --- a/MdeModulePkg/Library/DxeIpIoLib/DxeIpIoLib.c > +++ b/MdeModulePkg/Library/DxeIpIoLib/DxeIpIoLib.c > @@ -1029,7 +1029,9 @@ IpIoListenHandlerDpc ( >=20 > if (IpIo->IpVersion =3D=3D IP_VERSION_4) { > if ((EFI_IP4 (RxData->Ip4RxData.Header->SourceAddress) !=3D 0) && > - !NetIp4IsUnicast (EFI_NTOHL (((EFI_IP4_RECEIVE_DATA *) RxData)- > >Header->SourceAddress), 0)) { > + (IpIo->SubnetMask !=3D 0) && > + IP4_NET_EQUAL (IpIo->StationIp, EFI_NTOHL (((EFI_IP4_RECEIVE_DAT= A *) > RxData)->Header->SourceAddress), IpIo->SubnetMask) && > + !NetIp4IsUnicast (EFI_NTOHL (((EFI_IP4_RECEIVE_DATA *) > + RxData)->Header->SourceAddress), IpIo->SubnetMask)) { > // > // The source address is not zero and it's not a unicast IP addres= s, discard it. > // > @@ -1300,6 +1302,11 @@ IpIoOpen ( > if (OpenData->IpConfigData.Ip4CfgData.RawData) { > return EFI_UNSUPPORTED; > } > + > + if (!OpenData->IpConfigData.Ip4CfgData.UseDefaultAddress) { > + IpIo->StationIp =3D EFI_NTOHL (OpenData- > >IpConfigData.Ip4CfgData.StationAddress); > + IpIo->SubnetMask =3D EFI_NTOHL (OpenData- > >IpConfigData.Ip4CfgData.SubnetMask); > + } >=20 > Status =3D IpIo->Ip.Ip4->Configure ( > IpIo->Ip.Ip4, diff --git > a/MdeModulePkg/Universal/Network/ArpDxe/ArpImpl.c > b/MdeModulePkg/Universal/Network/ArpDxe/ArpImpl.c > index afe4929..a02de20 100644 > --- a/MdeModulePkg/Universal/Network/ArpDxe/ArpImpl.c > +++ b/MdeModulePkg/Universal/Network/ArpDxe/ArpImpl.c > @@ -943,9 +943,9 @@ ArpConfigureInstance ( > if (ConfigData->SwAddressType =3D=3D IPV4_ETHER_PROTO_TYPE) { > CopyMem (&Ip, ConfigData->StationAddress, sizeof (IP4_ADDR)); >=20 > - if (!NetIp4IsUnicast (NTOHL (Ip), 0)) { > + if (IP4_IS_UNSPECIFIED (Ip) || IP4_IS_LOCAL_BROADCAST (Ip)) { > // > - // The station address is not a valid IPv4 unicast address. > + // The station address should not be zero or broadcast address= . > // > return EFI_INVALID_PARAMETER; > } > diff --git a/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Impl.c > b/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Impl.c > index 79f7cde..18796fd 100644 > --- a/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Impl.c > +++ b/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Impl.c > @@ -660,9 +660,7 @@ EfiDhcp4Configure ( > } >=20 > CopyMem (&Ip, &Dhcp4CfgData->ClientAddress, sizeof (IP4_ADDR)); > - > - if ((Ip !=3D 0) && !NetIp4IsUnicast (NTOHL (Ip), 0)) { > - > + if (IP4_IS_LOCAL_BROADCAST(NTOHL (Ip))) { > return EFI_INVALID_PARAMETER; > } > } > @@ -1192,9 +1190,9 @@ Dhcp4InstanceConfigUdpIo ( > EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN *Token; > EFI_UDP4_CONFIG_DATA UdpConfigData; > IP4_ADDR ClientAddr; > - IP4_ADDR Ip; > + IP4_ADDR Ip; > INTN Class; > - IP4_ADDR SubnetMask; > + IP4_ADDR SubnetMask; >=20 > Instance =3D (DHCP_PROTOCOL *) Context; > DhcpSb =3D Instance->Service; > @@ -1212,6 +1210,13 @@ Dhcp4InstanceConfigUdpIo ( > CopyMem (&UdpConfigData.StationAddress, &Ip, sizeof (EFI_IPv4_ADDRESS)= ); >=20 > if (DhcpSb->Netmask =3D=3D 0) { > + // > + // The Dhcp4.TransmitReceive() API should be able to used at any tim= e > according to > + // UEFI spec, while in classless addressing network, the netmask mus= t be > explicitly > + // provided together with the station address. > + // If the DHCP instance haven't be configured with a valid netmask, = we > could only > + // compute it accroding to the classful addressing rule. > + // > Class =3D NetGetIpClass (ClientAddr); > ASSERT (Class < IP4_ADDR_CLASSE); > SubnetMask =3D gIp4AllMasks[Class << 3]; @@ -1492,8 +1497,6 @@ > EfiDhcp4TransmitReceive ( > DHCP_SERVICE *DhcpSb; > EFI_IP_ADDRESS Gateway; > IP4_ADDR ClientAddr; > - INTN Class; > - IP4_ADDR SubnetMask; >=20 > if ((This =3D=3D NULL) || (Token =3D=3D NULL) || (Token->Packet =3D=3D= NULL)) { > return EFI_INVALID_PARAMETER; > @@ -1583,19 +1586,11 @@ EfiDhcp4TransmitReceive ( > EndPoint.RemotePort =3D Token->RemotePort; > } >=20 > - if (DhcpSb->Netmask =3D=3D 0) { > - Class =3D NetGetIpClass (ClientAddr); > - ASSERT (Class < IP4_ADDR_CLASSE); > - SubnetMask =3D gIp4AllMasks[Class << 3]; > - } else { > - SubnetMask =3D DhcpSb->Netmask; > - } > - > // > // Get the gateway. > // > ZeroMem (&Gateway, sizeof (Gateway)); > - if (!IP4_NET_EQUAL (ClientAddr, EndPoint.RemoteAddr.Addr[0], SubnetMas= k)) > { > + if (!IP4_NET_EQUAL (ClientAddr, EndPoint.RemoteAddr.Addr[0], > + DhcpSb->Netmask)) { > CopyMem (&Gateway.v4, &Token->GatewayAddress, sizeof > (EFI_IPv4_ADDRESS)); > Gateway.Addr[0] =3D NTOHL (Gateway.Addr[0]); > } > diff --git a/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Io.c > b/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Io.c > index 037d1cc..3898223 100644 > --- a/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Io.c > +++ b/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Io.c > @@ -393,8 +393,6 @@ DhcpLeaseAcquired ( > IN OUT DHCP_SERVICE *DhcpSb > ) > { > - INTN Class; > - > DhcpSb->ClientAddr =3D EFI_NTOHL (DhcpSb->Selected- > >Dhcp4.Header.YourAddr); >=20 > if (DhcpSb->Para !=3D NULL) { > @@ -403,9 +401,7 @@ DhcpLeaseAcquired ( > } >=20 > if (DhcpSb->Netmask =3D=3D 0) { > - Class =3D NetGetIpClass (DhcpSb->ClientAddr); > - ASSERT (Class < IP4_ADDR_CLASSE); > - DhcpSb->Netmask =3D gIp4AllMasks[Class << 3]; > + return EFI_ABORTED; > } >=20 > if (DhcpSb->LeaseIoPort !=3D NULL) { > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c > index ca53fd5..77ccd67 100644 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c > +++ b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c > @@ -1,7 +1,7 @@ > /** @file > Helper functions for configuring or getting the parameters relating to= iSCSI. >=20 > -Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.
> +Copyright (c) 2004 - 2016, 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 @@ > -727,7 +727,9 @@ IScsiFormCallback ( > case KEY_LOCAL_IP: > IScsiUnicodeStrToAsciiStr (IfrNvData->LocalIp, Ip4String); > Status =3D IScsiAsciiStrToIp (Ip4String, &HostIp.v4); > - if (EFI_ERROR (Status) || !NetIp4IsUnicast (NTOHL (HostIp.Addr[0])= , 0)) { > + if (EFI_ERROR (Status) || > + ((Private->Current->SessionConfigData.SubnetMask.Addr[0] !=3D = 0) && > + !NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), > + NTOHL(*(UINT32*)Private->Current->SessionConfigData.SubnetMask.Addr))) > + ) { > CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invali= d > IP address!", NULL); > Status =3D EFI_INVALID_PARAMETER; > } else { > @@ -751,7 +753,10 @@ IScsiFormCallback ( > case KEY_GATE_WAY: > IScsiUnicodeStrToAsciiStr (IfrNvData->Gateway, Ip4String); > Status =3D IScsiAsciiStrToIp (Ip4String, &Gateway.v4); > - if (EFI_ERROR (Status) || ((Gateway.Addr[0] !=3D 0) && !NetIp4IsUn= icast > (NTOHL (Gateway.Addr[0]), 0))) { > + if (EFI_ERROR (Status) || > + ((Gateway.Addr[0] !=3D 0) && > + (Private->Current->SessionConfigData.SubnetMask.Addr[0] !=3D = 0) && > + !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]), > + NTOHL(*(UINT32*)Private->Current->SessionConfigData.SubnetMask.Addr))) > + ) { > CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invali= d > Gateway!", NULL); > Status =3D EFI_INVALID_PARAMETER; > } else { > @@ -763,7 +768,7 @@ IScsiFormCallback ( > case KEY_TARGET_IP: > IScsiUnicodeStrToAsciiStr (IfrNvData->TargetIp, Ip4String); > Status =3D IScsiAsciiStrToIp (Ip4String, &HostIp.v4); > - if (EFI_ERROR (Status) || !NetIp4IsUnicast (NTOHL (HostIp.Addr[0])= , 0)) { > + if (EFI_ERROR (Status) || IP4_IS_LOCAL_BROADCAST > + (EFI_NTOHL(HostIp.v4)) || IP4_IS_UNSPECIFIED (EFI_NTOHL(HostIp.v4))) { > CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invali= d > IP address!", NULL); > Status =3D EFI_INVALID_PARAMETER; > } else { > @@ -867,7 +872,7 @@ IScsiFormCallback ( > // > if (!Private->Current->SessionConfigData.TargetInfoFromDhcp) { > CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.Targ= etIp, > sizeof (HostIp.v4)); > - if (!NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) { > + if (IP4_IS_UNSPECIFIED (NTOHL (HostIp.Addr[0])) || > + IP4_IS_LOCAL_BROADCAST (NTOHL (HostIp.Addr[0]))) { > CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > L"Target IP is invalid!", NULL); > Status =3D EFI_INVALID_PARAMETER; > break; > diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c > b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c > index d868957..a931bb3 100644 > --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c > +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c > @@ -737,8 +737,7 @@ Ip4Config2SetDnsServerWorker ( >=20 > for (NewIndex =3D 0; NewIndex < NewDnsCount; NewIndex++) { > CopyMem (&DnsAddress, NewDns + NewIndex, sizeof (IP4_ADDR)); > - > - if (!NetIp4IsUnicast (NTOHL (DnsAddress), 0)) { > + if (IP4_IS_UNSPECIFIED (NTOHL (DnsAddress)) || > + IP4_IS_LOCAL_BROADCAST (NTOHL (DnsAddress))) { > // > // The dns server address must be unicast. > // > @@ -1347,14 +1346,15 @@ Ip4Config2SetGateway ( > return EFI_WRITE_PROTECTED; > } >=20 > + IpSb =3D IP4_SERVICE_FROM_IP4_CONFIG2_INSTANCE (Instance); >=20 > NewGateway =3D (EFI_IPv4_ADDRESS *) Data; > NewGatewayCount =3D DataSize / sizeof (EFI_IPv4_ADDRESS); > for (Index1 =3D 0; Index1 < NewGatewayCount; Index1++) { > CopyMem (&Gateway, NewGateway + Index1, sizeof (IP4_ADDR)); > - > - if (!NetIp4IsUnicast (NTOHL (Gateway), 0)) { >=20 > + if ((IpSb->DefaultInterface->SubnetMask !=3D 0) && > + !NetIp4IsUnicast (NTOHL (Gateway), > + IpSb->DefaultInterface->SubnetMask)) { > return EFI_INVALID_PARAMETER; > } >=20 > @@ -1365,7 +1365,6 @@ Ip4Config2SetGateway ( > } > } >=20 > - IpSb =3D IP4_SERVICE_FROM_IP4_CONFIG2_INSTANCE (Instance); > DataItem =3D &Instance->DataItem[Ip4Config2DataTypeGateway]; > OldGateway =3D DataItem->Data.Gateway; > OldGatewayCount =3D DataItem->DataSize / sizeof (EFI_IPv4_ADDRESS); di= ff -- > git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Nv.c > b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Nv.c > index ee771e3..8eea887 100644 > --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Nv.c > +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Nv.c > @@ -1,7 +1,7 @@ > /** @file > Helper functions for configuring or getting the parameters relating to= Ip4. >=20 > -Copyright (c) 2015, Intel Corporation. All rights reserved.
> +Copyright (c) 2015 - 2016, 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 @@ > -608,20 +608,20 @@ Ip4Config2ConvertIfrNvDataToConfigNvData ( > // > Ip4NvData->Policy =3D Ip4Config2PolicyStatic; >=20 > - Status =3D Ip4Config2StrToIp (IfrFormNvData->StationAddress, > &StationAddress.v4); > - if (EFI_ERROR (Status) || !NetIp4IsUnicast (NTOHL (StationAddress.Ad= dr[0]), > 0)) { > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid > IP address!", NULL); > - return EFI_INVALID_PARAMETER; > - } > - > Status =3D Ip4Config2StrToIp (IfrFormNvData->SubnetMask, &SubnetMask= .v4); > if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] !=3D 0) && > (GetSubnetMaskPrefixLength (&SubnetMask.v4) =3D=3D 0))) { > CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid > Subnet Mask!", NULL); > return EFI_INVALID_PARAMETER; > } > + > + Status =3D Ip4Config2StrToIp (IfrFormNvData->StationAddress, > &StationAddress.v4); > + if (EFI_ERROR (Status) || !NetIp4IsUnicast (NTOHL (StationAddress.Ad= dr[0]), > NTOHL (SubnetMask.Addr[0]))) { > + CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid > IP address!", NULL); > + return EFI_INVALID_PARAMETER; > + } >=20 > Status =3D Ip4Config2StrToIp (IfrFormNvData->GatewayAddress, &Gatewa= y.v4); > - if (EFI_ERROR (Status) || ((Gateway.Addr[0] !=3D 0) && !NetIp4IsUnic= ast > (NTOHL (Gateway.Addr[0]), 0))) { > + if (EFI_ERROR (Status) || ((Gateway.Addr[0] !=3D 0) && > + !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]), NTOHL > + (SubnetMask.Addr[0])))) { > CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid > Gateway!", NULL); > return EFI_INVALID_PARAMETER; > } > @@ -630,7 +630,7 @@ Ip4Config2ConvertIfrNvDataToConfigNvData ( > if (!EFI_ERROR (Status) && DnsCount > 0) { > for (Index =3D 0; Index < DnsCount; Index ++) { > CopyMem (&Ip, &DnsAddress[Index], sizeof (IP4_ADDR)); > - if (!NetIp4IsUnicast (NTOHL (Ip), 0)) { > + if (IP4_IS_UNSPECIFIED (NTOHL (Ip)) || IP4_IS_LOCAL_BROADCAST > + (NTOHL (Ip))) { > CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > L"Invalid Dns Server!", NULL); > FreePool(DnsAddress); > return EFI_INVALID_PARAMETER; @@ -1146,7 +1146,7 @@ > Ip4FormCallback ( > switch (QuestionId) { > case KEY_LOCAL_IP: > Status =3D Ip4Config2StrToIp (IfrFormNvData->StationAddress, > &StationAddress.v4); > - if (EFI_ERROR (Status) || !NetIp4IsUnicast (NTOHL (StationAddress.= Addr[0]), > 0)) { > + if (EFI_ERROR (Status) || IP4_IS_UNSPECIFIED (NTOHL > + (StationAddress.Addr[0])) || IP4_IS_LOCAL_BROADCAST (NTOHL > + (StationAddress.Addr[0]))) { > CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invali= d > IP address!", NULL); > Status =3D EFI_INVALID_PARAMETER; > } > @@ -1162,7 +1162,7 @@ Ip4FormCallback ( >=20 > case KEY_GATE_WAY: > Status =3D Ip4Config2StrToIp (IfrFormNvData->GatewayAddress, > &Gateway.v4); > - if (EFI_ERROR (Status) || ((Gateway.Addr[0] !=3D 0) && !NetIp4IsUn= icast > (NTOHL (Gateway.Addr[0]), 0))) { > + if (EFI_ERROR (Status) || > + IP4_IS_LOCAL_BROADCAST(NTOHL(Gateway.Addr[0]))) { > CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invali= d > Gateway!", NULL); > Status =3D EFI_INVALID_PARAMETER; > } > @@ -1173,7 +1173,7 @@ Ip4FormCallback ( > if (!EFI_ERROR (Status) && DnsCount > 0) { > for (Index =3D 0; Index < DnsCount; Index ++) { > CopyMem (&Ip, &DnsAddress[Index], sizeof (IP4_ADDR)); > - if (!NetIp4IsUnicast (NTOHL (Ip), 0)) { > + if (IP4_IS_UNSPECIFIED (NTOHL (Ip)) || IP4_IS_LOCAL_BROADCAST > + (NTOHL (Ip))) { > CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > L"Invalid Dns Server!", NULL); > Status =3D EFI_INVALID_PARAMETER; > break; > diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.c > b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.c > index e457276..9cd5dd5 100644 > --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.c > +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.c > @@ -560,9 +560,7 @@ Ip4SetAddress ( > { > EFI_ARP_CONFIG_DATA ArpConfig; > EFI_STATUS Status; > - INTN Type; > INTN Len; > - IP4_ADDR Netmask; >=20 > NET_CHECK_SIGNATURE (Interface, IP4_INTERFACE_SIGNATURE); >=20 > @@ -578,12 +576,9 @@ Ip4SetAddress ( > Interface->SubnetMask =3D SubnetMask; > Interface->SubnetBrdcast =3D (IpAddr | ~SubnetMask); >=20 > - Type =3D NetGetIpClass (IpAddr); > - ASSERT (Type <=3D IP4_ADDR_CLASSC); > Len =3D NetGetMaskLength (SubnetMask); > ASSERT (Len <=3D IP4_MASK_MAX); > - Netmask =3D gIp4AllMasks[MIN (Len, Type << 3)]; > - Interface->NetBrdcast =3D (IpAddr | ~Netmask); > + Interface->NetBrdcast =3D (IpAddr | ~SubnetMask); >=20 > // > // Do clean up for Arp child > diff --git a/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Impl.c > b/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Impl.c > index 7ed2e52..6223895 100644 > --- a/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Impl.c > +++ b/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Impl.c > @@ -2,7 +2,7 @@ > Interface routine for Mtftp4. >=20 > (C) Copyright 2014 Hewlett-Packard Development Company, L.P.
- > Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
> +Copyright (c) 2006 - 2016, 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 @@ > -192,7 +192,7 @@ Mtftp4OverrideValid ( > IP4_ADDR Gateway; >=20 > CopyMem (&Ip, &Override->ServerIp, sizeof (IP4_ADDR)); > - if (!NetIp4IsUnicast (NTOHL (Ip), 0)) { > + if (IP4_IS_UNSPECIFIED (NTOHL (Ip)) || IP4_IS_LOCAL_BROADCAST (NTOHL > + (Ip))) { > return FALSE; > } >=20 > @@ -667,10 +667,6 @@ EfiMtftp4Configure ( > Gateway =3D NTOHL (Gateway); > ServerIp =3D NTOHL (ServerIp); >=20 > - if (!NetIp4IsUnicast (ServerIp, 0)) { > - return EFI_INVALID_PARAMETER; > - } > - > if (!ConfigData->UseDefaultSetting && > ((!IP4_IS_VALID_NETMASK (Netmask) || !NetIp4IsUnicast (Ip, Netmas= k)))) { >=20 > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c > index c7d3d32..8e70e01 100644 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c > +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c > @@ -1,7 +1,7 @@ > /** @file > Implementation of TCP4 protocol services. >=20 > -Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved.
> +Copyright (c) 2005 - 2016, 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 @@ > -170,7 +170,7 @@ Tcp4Configure ( > if (NULL !=3D TcpConfigData) { >=20 > CopyMem (&Ip, &TcpConfigData->AccessPoint.RemoteAddress, sizeof > (IP4_ADDR)); > - if ((Ip !=3D 0) && !NetIp4IsUnicast (NTOHL (Ip), 0)) { > + if (IP4_IS_LOCAL_BROADCAST (NTOHL (Ip))) { > return EFI_INVALID_PARAMETER; > } >=20 > @@ -183,7 +183,7 @@ Tcp4Configure ( >=20 > CopyMem (&Ip, &TcpConfigData->AccessPoint.StationAddress, sizeof > (IP4_ADDR)); > CopyMem (&SubnetMask, &TcpConfigData->AccessPoint.SubnetMask, > sizeof (IP4_ADDR)); > - if (!NetIp4IsUnicast (NTOHL (Ip), 0) || !IP4_IS_VALID_NETMASK (NTO= HL > (SubnetMask))) { > + if (!IP4_IS_VALID_NETMASK (NTOHL (SubnetMask)) || > + !NetIp4IsUnicast (NTOHL (Ip), NTOHL (SubnetMask))) { > return EFI_INVALID_PARAMETER; > } > } > diff --git a/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Impl.c > b/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Impl.c > index 20dbeff..df41433 100644 > --- a/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Impl.c > +++ b/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Impl.c > @@ -827,7 +827,9 @@ Udp4ValidateTxToken ( > if (TxData->GatewayAddress !=3D NULL) { > CopyMem (&GatewayAddress, TxData->GatewayAddress, sizeof > (IP4_ADDR)); >=20 > - if (!NetIp4IsUnicast (NTOHL (GatewayAddress), 0)) { > + if (!Instance->ConfigData.UseDefaultAddress && > + (EFI_NTOHL(Instance->ConfigData.SubnetMask) !=3D 0) && > + !NetIp4IsUnicast (NTOHL (GatewayAddress), > + EFI_NTOHL(Instance->ConfigData.SubnetMask))) { > // > // The specified GatewayAddress is not a unicast IPv4 address whil= e it's not > 0. > // > @@ -842,7 +844,10 @@ Udp4ValidateTxToken ( >=20 > CopyMem (&SourceAddress, &UdpSessionData->SourceAddress, sizeof > (IP4_ADDR)); >=20 > - if ((SourceAddress !=3D 0) && !NetIp4IsUnicast (HTONL (SourceAddress= ), 0)) { > + if ((SourceAddress !=3D 0) && > + !Instance->ConfigData.UseDefaultAddress && > + (EFI_NTOHL(Instance->ConfigData.SubnetMask) !=3D 0) && > + !NetIp4IsUnicast (HTONL (SourceAddress), > + EFI_NTOHL(Instance->ConfigData.SubnetMask))) { > // > // Check whether SourceAddress is a valid IPv4 address in case it'= s not zero. > // The configured station address is used if SourceAddress is zero= . > diff --git a/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Main.c > b/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Main.c > index 5ea22ac..bdb79b3 100644 > --- a/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Main.c > +++ b/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Main.c > @@ -1,7 +1,7 @@ > /** @file >=20 > (C) Copyright 2014 Hewlett-Packard Development Company, L.P.
- > Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
> +Copyright (c) 2006 - 2016, 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 @@ > -171,9 +171,9 @@ Udp4Configure ( >=20 >=20 > if (!UdpConfigData->UseDefaultAddress && > - (!IP4_IS_VALID_NETMASK (SubnetMask) || > - !((StationAddress =3D=3D 0) || NetIp4IsUnicast (StationAddress, Su= bnetMask)) > || > - !((RemoteAddress =3D=3D 0) || NetIp4IsUnicast (RemoteAddress, 0))= )) { > + (!IP4_IS_VALID_NETMASK (SubnetMask) || > + !((StationAddress =3D=3D 0) || NetIp4IsUnicast (StationAddress,= SubnetMask)) > || > + IP4_IS_LOCAL_BROADCAST (RemoteAddress))) { > // > // Don't use default address, and subnet mask is invalid or Statio= nAddress is > not > // a valid unicast IPv4 address or RemoteAddress is not a valid un= icast IPv4 > address diff --git > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c > index cf7b7b5..4746256 100644 > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c > +++ b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c > @@ -176,7 +176,9 @@ IcmpErrorListenHandlerDpc ( > } >=20 > if (EFI_IP4 (RxData->Header->SourceAddress) !=3D 0 && > - !NetIp4IsUnicast (EFI_NTOHL (RxData->Header->SourceAddress), 0)) { > + (NTOHL (Mode->SubnetMask.Addr[0]) !=3D 0) && > + IP4_NET_EQUAL (NTOHL(Mode->StationIp.Addr[0]), EFI_NTOHL (RxData- > >Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0])) && > + !NetIp4IsUnicast (EFI_NTOHL (RxData->Header->SourceAddress), > + NTOHL (Mode->SubnetMask.Addr[0]))) { > // > // The source address is not zero and it's not a unicast IP address,= discard it. > // > @@ -1163,7 +1165,9 @@ EfiPxeBcMtftp ( > if ((This =3D=3D NULL) = || > (Filename =3D=3D NULL) = || > (BufferSize =3D=3D NULL) = || > - ((ServerIp =3D=3D NULL) || !NetIp4IsUnicast (NTOHL (ServerIp->Addr= [0]), 0)) || > + ((ServerIp =3D=3D NULL) || > + (IP4_IS_UNSPECIFIED (NTOHL (ServerIp->Addr[0])) || > + IP4_IS_LOCAL_BROADCAST (NTOHL (ServerIp->Addr[0])))) = || > ((BufferPtr =3D=3D NULL) && DontUseBuffer) = || > ((BlockSize !=3D NULL) && (*BlockSize < 512))) { >=20 > @@ -1378,7 +1382,7 @@ EfiPxeBcUdpWrite ( > return EFI_INVALID_PARAMETER; > } >=20 > - if ((GatewayIp !=3D NULL) && !NetIp4IsUnicast (NTOHL (GatewayIp->Addr[= 0]), > 0)) { > + if ((GatewayIp !=3D NULL) && (IP4_IS_UNSPECIFIED (NTOHL > + (GatewayIp->Addr[0])) || IP4_IS_LOCAL_BROADCAST (NTOHL > + (GatewayIp->Addr[0])))) { > // > // Gateway is provided but it's not a unicast IP address. > // > @@ -1964,9 +1968,11 @@ EfiPxeBcSetIpFilter ( > DEBUG ((EFI_D_ERROR, "There is broadcast address in NewFilter.\n")= ); > return EFI_INVALID_PARAMETER; > } > - if (NetIp4IsUnicast (EFI_IP4 (NewFilter->IpList[Index].v4), 0) && > - ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != =3D 0) > - ) { > + if ((EFI_NTOHL(Mode->StationIp) !=3D 0) && > + (EFI_NTOHL(Mode->SubnetMask) !=3D 0) && > + IP4_NET_EQUAL(EFI_NTOHL(Mode->StationIp), EFI_NTOHL(NewFilter- > >IpList[Index].v4), EFI_NTOHL(Mode->SubnetMask)) && > + NetIp4IsUnicast (EFI_IP4 (NewFilter->IpList[Index].v4), EFI_NTOH= L(Mode- > >SubnetMask)) && > + ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) > + !=3D 0)) { > // > // If EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP is set and IP4 addres= s is > in IpList, > // promiscuous mode is needed. > @@ -2308,11 +2314,11 @@ EfiPxeBcSetStationIP ( > return EFI_INVALID_PARAMETER; > } >=20 > - if (NewStationIp !=3D NULL && !NetIp4IsUnicast (NTOHL (NewStationIp- > >Addr[0]), 0)) { > + if (NewSubnetMask !=3D NULL && !IP4_IS_VALID_NETMASK (NTOHL > + (NewSubnetMask->Addr[0]))) { > return EFI_INVALID_PARAMETER; > } > - > - if (NewSubnetMask !=3D NULL && !IP4_IS_VALID_NETMASK (NTOHL > (NewSubnetMask->Addr[0]))) { > + > + if (NewStationIp !=3D NULL && !NetIp4IsUnicast (NTOHL > + (NewStationIp->Addr[0]), NTOHL (NewSubnetMask->Addr[0]))) { > return EFI_INVALID_PARAMETER; > } >=20 > -- > 2.7.4.windows.1