public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH v3 2/3] MdeModulePkg: Update IP4 stack drivers for classless address unicast check.
@ 2016-10-28  6:07 Fu Siyuan
  2016-10-28  6:14 ` Wu, Jiaxin
  0 siblings, 1 reply; 2+ messages in thread
From: Fu Siyuan @ 2016-10-28  6:07 UTC (permalink / raw)
  To: edk2-devel; +Cc: Ye Ting, Zhang Lubo, Wu Jiaxin

V3:
Keep original logic in EfiDhcp4TransmitReceive() and add comments for it. 

V2 update:
Keep the zero address and broadcast check if network mask is not available.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Fu Siyuan <siyuan.fu@intel.com>
Cc: Ye Ting <ting.ye@intel.com>
Cc: Zhang Lubo <lubo.zhang@intel.com>
Cc: Wu Jiaxin <jiaxin.wu@intel.com>
---
 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(-)

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 IP6 protocol.
 
-Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved.<BR>
 This program and the accompanying materials are licensed and made available under 
 the terms and conditions of the BSD License that accompanies 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;
 
 ///
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 (
 
   if (IpIo->IpVersion == IP_VERSION_4) {
     if ((EFI_IP4 (RxData->Ip4RxData.Header->SourceAddress) != 0) &&
-        !NetIp4IsUnicast (EFI_NTOHL (((EFI_IP4_RECEIVE_DATA *) RxData)->Header->SourceAddress), 0)) {
+        (IpIo->SubnetMask != 0) &&
+        IP4_NET_EQUAL (IpIo->StationIp, EFI_NTOHL (((EFI_IP4_RECEIVE_DATA *) 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 address, discard it.
       //
@@ -1300,6 +1302,11 @@ IpIoOpen (
     if (OpenData->IpConfigData.Ip4CfgData.RawData) {
       return EFI_UNSUPPORTED;
     }
+
+    if (!OpenData->IpConfigData.Ip4CfgData.UseDefaultAddress) {
+      IpIo->StationIp = EFI_NTOHL (OpenData->IpConfigData.Ip4CfgData.StationAddress);
+      IpIo->SubnetMask = EFI_NTOHL (OpenData->IpConfigData.Ip4CfgData.SubnetMask);
+    }
     
     Status = 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 == IPV4_ETHER_PROTO_TYPE) {
         CopyMem (&Ip, ConfigData->StationAddress, sizeof (IP4_ADDR));
 
-        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 (
     }
 
     CopyMem (&Ip, &Dhcp4CfgData->ClientAddress, sizeof (IP4_ADDR));
-
-    if ((Ip != 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;  
 
   Instance = (DHCP_PROTOCOL *) Context;
   DhcpSb   = Instance->Service;
@@ -1212,6 +1210,13 @@ Dhcp4InstanceConfigUdpIo (
   CopyMem (&UdpConfigData.StationAddress, &Ip, sizeof (EFI_IPv4_ADDRESS));
 
   if (DhcpSb->Netmask == 0) {
+    //
+    // The Dhcp4.TransmitReceive() API should be able to used at any time according to
+    // UEFI spec, while in classless addressing network, the netmask must 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 = NetGetIpClass (ClientAddr);
     ASSERT (Class < IP4_ADDR_CLASSE);
     SubnetMask = gIp4AllMasks[Class << 3];
@@ -1492,8 +1497,6 @@ EfiDhcp4TransmitReceive (
   DHCP_SERVICE   *DhcpSb;
   EFI_IP_ADDRESS Gateway;
   IP4_ADDR       ClientAddr;
-  INTN           Class;
-  IP4_ADDR       SubnetMask;
 
   if ((This == NULL) || (Token == NULL) || (Token->Packet == NULL)) {
     return EFI_INVALID_PARAMETER;
@@ -1583,19 +1586,11 @@ EfiDhcp4TransmitReceive (
     EndPoint.RemotePort = Token->RemotePort;
   }
 
-  if (DhcpSb->Netmask == 0) {
-    Class = NetGetIpClass (ClientAddr);
-    ASSERT (Class < IP4_ADDR_CLASSE);
-    SubnetMask = gIp4AllMasks[Class << 3];
-  } else {
-    SubnetMask = DhcpSb->Netmask;
-  }
-  
   //
   // Get the gateway.
   //
   ZeroMem (&Gateway, sizeof (Gateway));
-  if (!IP4_NET_EQUAL (ClientAddr, EndPoint.RemoteAddr.Addr[0], SubnetMask)) {
+  if (!IP4_NET_EQUAL (ClientAddr, EndPoint.RemoteAddr.Addr[0], DhcpSb->Netmask)) {
     CopyMem (&Gateway.v4, &Token->GatewayAddress, sizeof (EFI_IPv4_ADDRESS));
     Gateway.Addr[0] = 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 = EFI_NTOHL (DhcpSb->Selected->Dhcp4.Header.YourAddr);
 
   if (DhcpSb->Para != NULL) {
@@ -403,9 +401,7 @@ DhcpLeaseAcquired (
   }
 
   if (DhcpSb->Netmask == 0) {
-    Class           = NetGetIpClass (DhcpSb->ClientAddr);
-    ASSERT (Class < IP4_ADDR_CLASSE);
-    DhcpSb->Netmask = gIp4AllMasks[Class << 3];
+    return EFI_ABORTED;
   }
 
   if (DhcpSb->LeaseIoPort != 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.
 
-Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
 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 = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);
-      if (EFI_ERROR (Status) || !NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {
+      if (EFI_ERROR (Status) || 
+          ((Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) && 
+           !NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), NTOHL(*(UINT32*)Private->Current->SessionConfigData.SubnetMask.Addr)))) {
         CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);
         Status = EFI_INVALID_PARAMETER;
       } else {
@@ -751,7 +753,10 @@ IScsiFormCallback (
     case KEY_GATE_WAY:
       IScsiUnicodeStrToAsciiStr (IfrNvData->Gateway, Ip4String);
       Status = IScsiAsciiStrToIp (Ip4String, &Gateway.v4);
-      if (EFI_ERROR (Status) || ((Gateway.Addr[0] != 0) && !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]), 0))) {
+      if (EFI_ERROR (Status) || 
+          ((Gateway.Addr[0] != 0) && 
+           (Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) && 
+           !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]), NTOHL(*(UINT32*)Private->Current->SessionConfigData.SubnetMask.Addr)))) {
         CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Gateway!", NULL);
         Status = EFI_INVALID_PARAMETER;
       } else {
@@ -763,7 +768,7 @@ IScsiFormCallback (
     case KEY_TARGET_IP:
       IScsiUnicodeStrToAsciiStr (IfrNvData->TargetIp, Ip4String);
       Status = 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"Invalid IP address!", NULL);
         Status = EFI_INVALID_PARAMETER;
       } else {
@@ -867,7 +872,7 @@ IScsiFormCallback (
         //
         if (!Private->Current->SessionConfigData.TargetInfoFromDhcp) {
           CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.TargetIp, 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 = 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 (
 
   for (NewIndex = 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;
   }
 
+  IpSb = IP4_SERVICE_FROM_IP4_CONFIG2_INSTANCE (Instance);
 
   NewGateway      = (EFI_IPv4_ADDRESS *) Data;
   NewGatewayCount = DataSize / sizeof (EFI_IPv4_ADDRESS);
   for (Index1 = 0; Index1 < NewGatewayCount; Index1++) {
     CopyMem (&Gateway, NewGateway + Index1, sizeof (IP4_ADDR));
-    
-    if (!NetIp4IsUnicast (NTOHL (Gateway), 0)) {
 
+    if ((IpSb->DefaultInterface->SubnetMask != 0) && 
+        !NetIp4IsUnicast (NTOHL (Gateway), IpSb->DefaultInterface->SubnetMask)) {
       return EFI_INVALID_PARAMETER;
     }
 
@@ -1365,7 +1365,6 @@ Ip4Config2SetGateway (
     }
   }
  
-  IpSb = IP4_SERVICE_FROM_IP4_CONFIG2_INSTANCE (Instance);
   DataItem = &Instance->DataItem[Ip4Config2DataTypeGateway];
   OldGateway      = DataItem->Data.Gateway;
   OldGatewayCount = DataItem->DataSize / sizeof (EFI_IPv4_ADDRESS);
diff --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.
 
-Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
 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 = Ip4Config2PolicyStatic;
 
-    Status = Ip4Config2StrToIp (IfrFormNvData->StationAddress, &StationAddress.v4);
-    if (EFI_ERROR (Status) || !NetIp4IsUnicast (NTOHL (StationAddress.Addr[0]), 0)) {
-      CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);
-      return EFI_INVALID_PARAMETER;
-    }
-    
     Status = Ip4Config2StrToIp (IfrFormNvData->SubnetMask, &SubnetMask.v4);
     if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) && (GetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) {
       CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Subnet Mask!", NULL);
       return EFI_INVALID_PARAMETER;
     }
+
+    Status = Ip4Config2StrToIp (IfrFormNvData->StationAddress, &StationAddress.v4);
+    if (EFI_ERROR (Status) || !NetIp4IsUnicast (NTOHL (StationAddress.Addr[0]), NTOHL (SubnetMask.Addr[0]))) {
+      CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);
+      return EFI_INVALID_PARAMETER;
+    }
     
     Status = Ip4Config2StrToIp (IfrFormNvData->GatewayAddress, &Gateway.v4);
-    if (EFI_ERROR (Status) || ((Gateway.Addr[0] != 0) && !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]), 0))) {
+    if (EFI_ERROR (Status) || ((Gateway.Addr[0] != 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 = 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 = 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"Invalid IP address!", NULL);
         Status = EFI_INVALID_PARAMETER;
       }
@@ -1162,7 +1162,7 @@ Ip4FormCallback (
 
     case KEY_GATE_WAY:
       Status = Ip4Config2StrToIp (IfrFormNvData->GatewayAddress, &Gateway.v4);
-      if (EFI_ERROR (Status) || ((Gateway.Addr[0] != 0) && !NetIp4IsUnicast (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"Invalid Gateway!", NULL);
         Status = EFI_INVALID_PARAMETER;
       }
@@ -1173,7 +1173,7 @@ Ip4FormCallback (
       if (!EFI_ERROR (Status) && DnsCount > 0) {
         for (Index = 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 = 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;
 
   NET_CHECK_SIGNATURE (Interface, IP4_INTERFACE_SIGNATURE);
 
@@ -578,12 +576,9 @@ Ip4SetAddress (
   Interface->SubnetMask     = SubnetMask;
   Interface->SubnetBrdcast  = (IpAddr | ~SubnetMask);
 
-  Type                      = NetGetIpClass (IpAddr);
-  ASSERT (Type <= IP4_ADDR_CLASSC);
   Len                       = NetGetMaskLength (SubnetMask);
   ASSERT (Len <= IP4_MASK_MAX);
-  Netmask                   = gIp4AllMasks[MIN (Len, Type << 3)];
-  Interface->NetBrdcast     = (IpAddr | ~Netmask);
+  Interface->NetBrdcast     = (IpAddr | ~SubnetMask);
 
   //
   // 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.
   
 (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
 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;
 
   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;
   }
 
@@ -667,10 +667,6 @@ EfiMtftp4Configure (
     Gateway  = NTOHL (Gateway);
     ServerIp = NTOHL (ServerIp);
 
-    if (!NetIp4IsUnicast (ServerIp, 0)) {
-      return EFI_INVALID_PARAMETER;
-    }
-
     if (!ConfigData->UseDefaultSetting &&
        ((!IP4_IS_VALID_NETMASK (Netmask) || !NetIp4IsUnicast (Ip, Netmask)))) {
 
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.
 
-Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved.<BR>
 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 != TcpConfigData) {
 
     CopyMem (&Ip, &TcpConfigData->AccessPoint.RemoteAddress, sizeof (IP4_ADDR));
-    if ((Ip != 0) && !NetIp4IsUnicast (NTOHL (Ip), 0)) {
+    if (IP4_IS_LOCAL_BROADCAST (NTOHL (Ip))) {
       return EFI_INVALID_PARAMETER;
     }
 
@@ -183,7 +183,7 @@ Tcp4Configure (
 
       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 (NTOHL (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 != NULL) {
     CopyMem (&GatewayAddress, TxData->GatewayAddress, sizeof (IP4_ADDR));
 
-    if (!NetIp4IsUnicast (NTOHL (GatewayAddress), 0)) {
+    if (!Instance->ConfigData.UseDefaultAddress &&
+        (EFI_NTOHL(Instance->ConfigData.SubnetMask) != 0) &&
+        !NetIp4IsUnicast (NTOHL (GatewayAddress), EFI_NTOHL(Instance->ConfigData.SubnetMask))) {
       //
       // The specified GatewayAddress is not a unicast IPv4 address while it's not 0.
       //
@@ -842,7 +844,10 @@ Udp4ValidateTxToken (
 
     CopyMem (&SourceAddress, &UdpSessionData->SourceAddress, sizeof (IP4_ADDR));
 
-    if ((SourceAddress != 0) && !NetIp4IsUnicast (HTONL (SourceAddress), 0)) {
+    if ((SourceAddress != 0) && 
+        !Instance->ConfigData.UseDefaultAddress &&
+        (EFI_NTOHL(Instance->ConfigData.SubnetMask) != 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
 
 (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
 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 (
 
 
     if (!UdpConfigData->UseDefaultAddress &&
-      (!IP4_IS_VALID_NETMASK (SubnetMask) ||
-      !((StationAddress == 0) || NetIp4IsUnicast (StationAddress, SubnetMask)) ||
-      !((RemoteAddress  == 0) || NetIp4IsUnicast (RemoteAddress, 0)))) {
+        (!IP4_IS_VALID_NETMASK (SubnetMask) ||
+         !((StationAddress == 0) || NetIp4IsUnicast (StationAddress, SubnetMask)) ||
+         IP4_IS_LOCAL_BROADCAST (RemoteAddress))) {
       //
       // Don't use default address, and subnet mask is invalid or StationAddress is not
       // a valid unicast IPv4 address or RemoteAddress is not a valid unicast 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 (
   }
 
   if (EFI_IP4 (RxData->Header->SourceAddress) != 0 &&
-      !NetIp4IsUnicast (EFI_NTOHL (RxData->Header->SourceAddress), 0)) {
+      (NTOHL (Mode->SubnetMask.Addr[0]) != 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 == NULL)                                                          ||
       (Filename == NULL)                                                      ||
       (BufferSize == NULL)                                                    ||
-      ((ServerIp == NULL) || !NetIp4IsUnicast (NTOHL (ServerIp->Addr[0]), 0)) ||
+      ((ServerIp == NULL) || 
+       (IP4_IS_UNSPECIFIED (NTOHL (ServerIp->Addr[0])) || 
+        IP4_IS_LOCAL_BROADCAST (NTOHL (ServerIp->Addr[0]))))                  ||
       ((BufferPtr == NULL) && DontUseBuffer)                                  ||
       ((BlockSize != NULL) && (*BlockSize < 512))) {
 
@@ -1378,7 +1382,7 @@ EfiPxeBcUdpWrite (
     return EFI_INVALID_PARAMETER;
   }
 
-  if ((GatewayIp != NULL) && !NetIp4IsUnicast (NTOHL (GatewayIp->Addr[0]), 0)) {
+  if ((GatewayIp != 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) != 0)
-       ) {
+    if ((EFI_NTOHL(Mode->StationIp) != 0) &&
+        (EFI_NTOHL(Mode->SubnetMask) != 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_NTOHL(Mode->SubnetMask)) &&
+        ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0)) {
       //
       // If EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP is set and IP4 address is in IpList,
       // promiscuous mode is needed.
@@ -2308,11 +2314,11 @@ EfiPxeBcSetStationIP (
     return EFI_INVALID_PARAMETER;
   }
 
-  if (NewStationIp != NULL && !NetIp4IsUnicast (NTOHL (NewStationIp->Addr[0]), 0)) {
+  if (NewSubnetMask != NULL && !IP4_IS_VALID_NETMASK (NTOHL (NewSubnetMask->Addr[0]))) {
     return EFI_INVALID_PARAMETER;
   }
-
-  if (NewSubnetMask != NULL && !IP4_IS_VALID_NETMASK (NTOHL (NewSubnetMask->Addr[0]))) {
+  
+  if (NewStationIp != NULL && !NetIp4IsUnicast (NTOHL (NewStationIp->Addr[0]), NTOHL (NewSubnetMask->Addr[0]))) {
     return EFI_INVALID_PARAMETER;
   }
 
-- 
2.7.4.windows.1



^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH v3 2/3] MdeModulePkg: Update IP4 stack drivers for classless address unicast check.
  2016-10-28  6:07 [PATCH v3 2/3] MdeModulePkg: Update IP4 stack drivers for classless address unicast check Fu Siyuan
@ 2016-10-28  6:14 ` Wu, Jiaxin
  0 siblings, 0 replies; 2+ messages in thread
From: Wu, Jiaxin @ 2016-10-28  6:14 UTC (permalink / raw)
  To: Fu, Siyuan, edk2-devel@lists.01.org; +Cc: Ye, Ting, Zhang, Lubo

Reviewed-By: Wu Jiaxin <jiaxin.wu@intel.com>

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 <ting.ye@intel.com>; Zhang, Lubo <lubo.zhang@intel.com>; Wu,
> Jiaxin <jiaxin.wu@intel.com>
> Subject: [PATCH v3 2/3] MdeModulePkg: Update IP4 stack drivers for classless
> address unicast check.
> 
> V3:
> Keep original logic in EfiDhcp4TransmitReceive() and add comments for it.
> 
> V2 update:
> Keep the zero address and broadcast check if network mask is not available.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Fu Siyuan <siyuan.fu@intel.com>
> Cc: Ye Ting <ting.ye@intel.com>
> Cc: Zhang Lubo <lubo.zhang@intel.com>
> Cc: Wu Jiaxin <jiaxin.wu@intel.com>
> ---
>  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(-)
> 
> 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 IP6
> protocol.
> 
> -Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved.<BR>
>  This program and the accompanying materials are licensed and made
> available under  the terms and conditions of the BSD License that accompanies
> 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;
> 
>  ///
> 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 (
> 
>    if (IpIo->IpVersion == IP_VERSION_4) {
>      if ((EFI_IP4 (RxData->Ip4RxData.Header->SourceAddress) != 0) &&
> -        !NetIp4IsUnicast (EFI_NTOHL (((EFI_IP4_RECEIVE_DATA *) RxData)-
> >Header->SourceAddress), 0)) {
> +        (IpIo->SubnetMask != 0) &&
> +        IP4_NET_EQUAL (IpIo->StationIp, EFI_NTOHL (((EFI_IP4_RECEIVE_DATA *)
> 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 address, discard it.
>        //
> @@ -1300,6 +1302,11 @@ IpIoOpen (
>      if (OpenData->IpConfigData.Ip4CfgData.RawData) {
>        return EFI_UNSUPPORTED;
>      }
> +
> +    if (!OpenData->IpConfigData.Ip4CfgData.UseDefaultAddress) {
> +      IpIo->StationIp = EFI_NTOHL (OpenData-
> >IpConfigData.Ip4CfgData.StationAddress);
> +      IpIo->SubnetMask = EFI_NTOHL (OpenData-
> >IpConfigData.Ip4CfgData.SubnetMask);
> +    }
> 
>      Status = 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 == IPV4_ETHER_PROTO_TYPE) {
>          CopyMem (&Ip, ConfigData->StationAddress, sizeof (IP4_ADDR));
> 
> -        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 (
>      }
> 
>      CopyMem (&Ip, &Dhcp4CfgData->ClientAddress, sizeof (IP4_ADDR));
> -
> -    if ((Ip != 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;
> 
>    Instance = (DHCP_PROTOCOL *) Context;
>    DhcpSb   = Instance->Service;
> @@ -1212,6 +1210,13 @@ Dhcp4InstanceConfigUdpIo (
>    CopyMem (&UdpConfigData.StationAddress, &Ip, sizeof (EFI_IPv4_ADDRESS));
> 
>    if (DhcpSb->Netmask == 0) {
> +    //
> +    // The Dhcp4.TransmitReceive() API should be able to used at any time
> according to
> +    // UEFI spec, while in classless addressing network, the netmask must 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 = NetGetIpClass (ClientAddr);
>      ASSERT (Class < IP4_ADDR_CLASSE);
>      SubnetMask = gIp4AllMasks[Class << 3]; @@ -1492,8 +1497,6 @@
> EfiDhcp4TransmitReceive (
>    DHCP_SERVICE   *DhcpSb;
>    EFI_IP_ADDRESS Gateway;
>    IP4_ADDR       ClientAddr;
> -  INTN           Class;
> -  IP4_ADDR       SubnetMask;
> 
>    if ((This == NULL) || (Token == NULL) || (Token->Packet == NULL)) {
>      return EFI_INVALID_PARAMETER;
> @@ -1583,19 +1586,11 @@ EfiDhcp4TransmitReceive (
>      EndPoint.RemotePort = Token->RemotePort;
>    }
> 
> -  if (DhcpSb->Netmask == 0) {
> -    Class = NetGetIpClass (ClientAddr);
> -    ASSERT (Class < IP4_ADDR_CLASSE);
> -    SubnetMask = gIp4AllMasks[Class << 3];
> -  } else {
> -    SubnetMask = DhcpSb->Netmask;
> -  }
> -
>    //
>    // Get the gateway.
>    //
>    ZeroMem (&Gateway, sizeof (Gateway));
> -  if (!IP4_NET_EQUAL (ClientAddr, EndPoint.RemoteAddr.Addr[0], SubnetMask))
> {
> +  if (!IP4_NET_EQUAL (ClientAddr, EndPoint.RemoteAddr.Addr[0],
> + DhcpSb->Netmask)) {
>      CopyMem (&Gateway.v4, &Token->GatewayAddress, sizeof
> (EFI_IPv4_ADDRESS));
>      Gateway.Addr[0] = 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 = EFI_NTOHL (DhcpSb->Selected-
> >Dhcp4.Header.YourAddr);
> 
>    if (DhcpSb->Para != NULL) {
> @@ -403,9 +401,7 @@ DhcpLeaseAcquired (
>    }
> 
>    if (DhcpSb->Netmask == 0) {
> -    Class           = NetGetIpClass (DhcpSb->ClientAddr);
> -    ASSERT (Class < IP4_ADDR_CLASSE);
> -    DhcpSb->Netmask = gIp4AllMasks[Class << 3];
> +    return EFI_ABORTED;
>    }
> 
>    if (DhcpSb->LeaseIoPort != 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.
> 
> -Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
>  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 = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);
> -      if (EFI_ERROR (Status) || !NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {
> +      if (EFI_ERROR (Status) ||
> +          ((Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) &&
> +           !NetIp4IsUnicast (NTOHL (HostIp.Addr[0]),
> + NTOHL(*(UINT32*)Private->Current->SessionConfigData.SubnetMask.Addr)))
> + ) {
>          CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid
> IP address!", NULL);
>          Status = EFI_INVALID_PARAMETER;
>        } else {
> @@ -751,7 +753,10 @@ IScsiFormCallback (
>      case KEY_GATE_WAY:
>        IScsiUnicodeStrToAsciiStr (IfrNvData->Gateway, Ip4String);
>        Status = IScsiAsciiStrToIp (Ip4String, &Gateway.v4);
> -      if (EFI_ERROR (Status) || ((Gateway.Addr[0] != 0) && !NetIp4IsUnicast
> (NTOHL (Gateway.Addr[0]), 0))) {
> +      if (EFI_ERROR (Status) ||
> +          ((Gateway.Addr[0] != 0) &&
> +           (Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) &&
> +           !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]),
> + NTOHL(*(UINT32*)Private->Current->SessionConfigData.SubnetMask.Addr)))
> + ) {
>          CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid
> Gateway!", NULL);
>          Status = EFI_INVALID_PARAMETER;
>        } else {
> @@ -763,7 +768,7 @@ IScsiFormCallback (
>      case KEY_TARGET_IP:
>        IScsiUnicodeStrToAsciiStr (IfrNvData->TargetIp, Ip4String);
>        Status = 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"Invalid
> IP address!", NULL);
>          Status = EFI_INVALID_PARAMETER;
>        } else {
> @@ -867,7 +872,7 @@ IScsiFormCallback (
>          //
>          if (!Private->Current->SessionConfigData.TargetInfoFromDhcp) {
>            CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.TargetIp,
> 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 = 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 (
> 
>    for (NewIndex = 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;
>    }
> 
> +  IpSb = IP4_SERVICE_FROM_IP4_CONFIG2_INSTANCE (Instance);
> 
>    NewGateway      = (EFI_IPv4_ADDRESS *) Data;
>    NewGatewayCount = DataSize / sizeof (EFI_IPv4_ADDRESS);
>    for (Index1 = 0; Index1 < NewGatewayCount; Index1++) {
>      CopyMem (&Gateway, NewGateway + Index1, sizeof (IP4_ADDR));
> -
> -    if (!NetIp4IsUnicast (NTOHL (Gateway), 0)) {
> 
> +    if ((IpSb->DefaultInterface->SubnetMask != 0) &&
> +        !NetIp4IsUnicast (NTOHL (Gateway),
> + IpSb->DefaultInterface->SubnetMask)) {
>        return EFI_INVALID_PARAMETER;
>      }
> 
> @@ -1365,7 +1365,6 @@ Ip4Config2SetGateway (
>      }
>    }
> 
> -  IpSb = IP4_SERVICE_FROM_IP4_CONFIG2_INSTANCE (Instance);
>    DataItem = &Instance->DataItem[Ip4Config2DataTypeGateway];
>    OldGateway      = DataItem->Data.Gateway;
>    OldGatewayCount = DataItem->DataSize / sizeof (EFI_IPv4_ADDRESS); diff --
> 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.
> 
> -Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
>  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 = Ip4Config2PolicyStatic;
> 
> -    Status = Ip4Config2StrToIp (IfrFormNvData->StationAddress,
> &StationAddress.v4);
> -    if (EFI_ERROR (Status) || !NetIp4IsUnicast (NTOHL (StationAddress.Addr[0]),
> 0)) {
> -      CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid
> IP address!", NULL);
> -      return EFI_INVALID_PARAMETER;
> -    }
> -
>      Status = Ip4Config2StrToIp (IfrFormNvData->SubnetMask, &SubnetMask.v4);
>      if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) &&
> (GetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) {
>        CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid
> Subnet Mask!", NULL);
>        return EFI_INVALID_PARAMETER;
>      }
> +
> +    Status = Ip4Config2StrToIp (IfrFormNvData->StationAddress,
> &StationAddress.v4);
> +    if (EFI_ERROR (Status) || !NetIp4IsUnicast (NTOHL (StationAddress.Addr[0]),
> NTOHL (SubnetMask.Addr[0]))) {
> +      CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid
> IP address!", NULL);
> +      return EFI_INVALID_PARAMETER;
> +    }
> 
>      Status = Ip4Config2StrToIp (IfrFormNvData->GatewayAddress, &Gateway.v4);
> -    if (EFI_ERROR (Status) || ((Gateway.Addr[0] != 0) && !NetIp4IsUnicast
> (NTOHL (Gateway.Addr[0]), 0))) {
> +    if (EFI_ERROR (Status) || ((Gateway.Addr[0] != 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 = 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 = 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"Invalid
> IP address!", NULL);
>          Status = EFI_INVALID_PARAMETER;
>        }
> @@ -1162,7 +1162,7 @@ Ip4FormCallback (
> 
>      case KEY_GATE_WAY:
>        Status = Ip4Config2StrToIp (IfrFormNvData->GatewayAddress,
> &Gateway.v4);
> -      if (EFI_ERROR (Status) || ((Gateway.Addr[0] != 0) && !NetIp4IsUnicast
> (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"Invalid
> Gateway!", NULL);
>          Status = EFI_INVALID_PARAMETER;
>        }
> @@ -1173,7 +1173,7 @@ Ip4FormCallback (
>        if (!EFI_ERROR (Status) && DnsCount > 0) {
>          for (Index = 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 = 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;
> 
>    NET_CHECK_SIGNATURE (Interface, IP4_INTERFACE_SIGNATURE);
> 
> @@ -578,12 +576,9 @@ Ip4SetAddress (
>    Interface->SubnetMask     = SubnetMask;
>    Interface->SubnetBrdcast  = (IpAddr | ~SubnetMask);
> 
> -  Type                      = NetGetIpClass (IpAddr);
> -  ASSERT (Type <= IP4_ADDR_CLASSC);
>    Len                       = NetGetMaskLength (SubnetMask);
>    ASSERT (Len <= IP4_MASK_MAX);
> -  Netmask                   = gIp4AllMasks[MIN (Len, Type << 3)];
> -  Interface->NetBrdcast     = (IpAddr | ~Netmask);
> +  Interface->NetBrdcast     = (IpAddr | ~SubnetMask);
> 
>    //
>    // 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.
> 
>  (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR> -
> Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>  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;
> 
>    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;
>    }
> 
> @@ -667,10 +667,6 @@ EfiMtftp4Configure (
>      Gateway  = NTOHL (Gateway);
>      ServerIp = NTOHL (ServerIp);
> 
> -    if (!NetIp4IsUnicast (ServerIp, 0)) {
> -      return EFI_INVALID_PARAMETER;
> -    }
> -
>      if (!ConfigData->UseDefaultSetting &&
>         ((!IP4_IS_VALID_NETMASK (Netmask) || !NetIp4IsUnicast (Ip, Netmask)))) {
> 
> 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.
> 
> -Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved.<BR>
>  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 != TcpConfigData) {
> 
>      CopyMem (&Ip, &TcpConfigData->AccessPoint.RemoteAddress, sizeof
> (IP4_ADDR));
> -    if ((Ip != 0) && !NetIp4IsUnicast (NTOHL (Ip), 0)) {
> +    if (IP4_IS_LOCAL_BROADCAST (NTOHL (Ip))) {
>        return EFI_INVALID_PARAMETER;
>      }
> 
> @@ -183,7 +183,7 @@ Tcp4Configure (
> 
>        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 (NTOHL
> (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 != NULL) {
>      CopyMem (&GatewayAddress, TxData->GatewayAddress, sizeof
> (IP4_ADDR));
> 
> -    if (!NetIp4IsUnicast (NTOHL (GatewayAddress), 0)) {
> +    if (!Instance->ConfigData.UseDefaultAddress &&
> +        (EFI_NTOHL(Instance->ConfigData.SubnetMask) != 0) &&
> +        !NetIp4IsUnicast (NTOHL (GatewayAddress),
> + EFI_NTOHL(Instance->ConfigData.SubnetMask))) {
>        //
>        // The specified GatewayAddress is not a unicast IPv4 address while it's not
> 0.
>        //
> @@ -842,7 +844,10 @@ Udp4ValidateTxToken (
> 
>      CopyMem (&SourceAddress, &UdpSessionData->SourceAddress, sizeof
> (IP4_ADDR));
> 
> -    if ((SourceAddress != 0) && !NetIp4IsUnicast (HTONL (SourceAddress), 0)) {
> +    if ((SourceAddress != 0) &&
> +        !Instance->ConfigData.UseDefaultAddress &&
> +        (EFI_NTOHL(Instance->ConfigData.SubnetMask) != 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
> 
>  (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR> -
> Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>  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 (
> 
> 
>      if (!UdpConfigData->UseDefaultAddress &&
> -      (!IP4_IS_VALID_NETMASK (SubnetMask) ||
> -      !((StationAddress == 0) || NetIp4IsUnicast (StationAddress, SubnetMask))
> ||
> -      !((RemoteAddress  == 0) || NetIp4IsUnicast (RemoteAddress, 0)))) {
> +        (!IP4_IS_VALID_NETMASK (SubnetMask) ||
> +         !((StationAddress == 0) || NetIp4IsUnicast (StationAddress, SubnetMask))
> ||
> +         IP4_IS_LOCAL_BROADCAST (RemoteAddress))) {
>        //
>        // Don't use default address, and subnet mask is invalid or StationAddress is
> not
>        // a valid unicast IPv4 address or RemoteAddress is not a valid unicast 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 (
>    }
> 
>    if (EFI_IP4 (RxData->Header->SourceAddress) != 0 &&
> -      !NetIp4IsUnicast (EFI_NTOHL (RxData->Header->SourceAddress), 0)) {
> +      (NTOHL (Mode->SubnetMask.Addr[0]) != 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 == NULL)                                                          ||
>        (Filename == NULL)                                                      ||
>        (BufferSize == NULL)                                                    ||
> -      ((ServerIp == NULL) || !NetIp4IsUnicast (NTOHL (ServerIp->Addr[0]), 0)) ||
> +      ((ServerIp == NULL) ||
> +       (IP4_IS_UNSPECIFIED (NTOHL (ServerIp->Addr[0])) ||
> +        IP4_IS_LOCAL_BROADCAST (NTOHL (ServerIp->Addr[0]))))                  ||
>        ((BufferPtr == NULL) && DontUseBuffer)                                  ||
>        ((BlockSize != NULL) && (*BlockSize < 512))) {
> 
> @@ -1378,7 +1382,7 @@ EfiPxeBcUdpWrite (
>      return EFI_INVALID_PARAMETER;
>    }
> 
> -  if ((GatewayIp != NULL) && !NetIp4IsUnicast (NTOHL (GatewayIp->Addr[0]),
> 0)) {
> +  if ((GatewayIp != 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) != 0)
> -       ) {
> +    if ((EFI_NTOHL(Mode->StationIp) != 0) &&
> +        (EFI_NTOHL(Mode->SubnetMask) != 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_NTOHL(Mode-
> >SubnetMask)) &&
> +        ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP)
> + != 0)) {
>        //
>        // If EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP is set and IP4 address is
> in IpList,
>        // promiscuous mode is needed.
> @@ -2308,11 +2314,11 @@ EfiPxeBcSetStationIP (
>      return EFI_INVALID_PARAMETER;
>    }
> 
> -  if (NewStationIp != NULL && !NetIp4IsUnicast (NTOHL (NewStationIp-
> >Addr[0]), 0)) {
> +  if (NewSubnetMask != NULL && !IP4_IS_VALID_NETMASK (NTOHL
> + (NewSubnetMask->Addr[0]))) {
>      return EFI_INVALID_PARAMETER;
>    }
> -
> -  if (NewSubnetMask != NULL && !IP4_IS_VALID_NETMASK (NTOHL
> (NewSubnetMask->Addr[0]))) {
> +
> +  if (NewStationIp != NULL && !NetIp4IsUnicast (NTOHL
> + (NewStationIp->Addr[0]), NTOHL (NewSubnetMask->Addr[0]))) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> --
> 2.7.4.windows.1



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-10-28  6:54 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-10-28  6:07 [PATCH v3 2/3] MdeModulePkg: Update IP4 stack drivers for classless address unicast check Fu Siyuan
2016-10-28  6:14 ` Wu, Jiaxin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox