MdeModulePkg/Ip4Dxe: Add Ip/Netmask pair check for Ip4Config2

v2:
* Add the check in Ip4Config2SetDefaultIf to avoid the DHCP configuration
case.

Ip4config2 doesn't check the validity of Ip/Netmask pair, which
leads to the invalid combination of Ip and Netmask setting.
This patch is to resolve the issue.

Cc: Hegde Nagaraj P <nagaraj-p.hegde@hpe.com>
Cc: Subramanian Sriram <sriram-s@hpe.com>
Cc: Ye Ting <ting.ye@intel.com>
Cc: Fu Siyuan <siyuan.fu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Wu Jiaxin <jiaxin.wu@intel.com>
Reviewed-by: Sriram Subramanian <sriram-s@hpe.com>
Reviewed-by: Hegde Nagaraj P <nagaraj-p.hegde@hpe.com>
This commit is contained in:
Jiaxin Wu
2017-03-16 09:39:34 +08:00
parent d948cf838e
commit f1222593f2
5 changed files with 94 additions and 71 deletions

View File

@@ -1,6 +1,6 @@
/** @file
Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2005 - 2017, 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
@@ -809,66 +809,6 @@ Ip4CleanProtocol (
}
/**
Validate that Ip/Netmask pair is OK to be used as station
address. Only continuous netmasks are supported. and check
that StationAddress is a unicast address on the newtwork.
@param[in] Ip The IP address to validate.
@param[in] Netmask The netmaks of the IP.
@retval TRUE The Ip/Netmask pair is valid.
@retval FALSE The Ip/Netmask pair is invalid.
**/
BOOLEAN
Ip4StationAddressValid (
IN IP4_ADDR Ip,
IN IP4_ADDR Netmask
)
{
IP4_ADDR NetBrdcastMask;
INTN Len;
INTN Type;
//
// Only support the station address with 0.0.0.0/0 to enable DHCP client.
//
if (Netmask == IP4_ALLZERO_ADDRESS) {
return (BOOLEAN) (Ip == IP4_ALLZERO_ADDRESS);
}
//
// Only support the continuous net masks
//
if ((Len = NetGetMaskLength (Netmask)) == (IP4_MASK_MAX + 1)) {
return FALSE;
}
//
// Station address can't be class D or class E address
//
if ((Type = NetGetIpClass (Ip)) > IP4_ADDR_CLASSC) {
return FALSE;
}
//
// Station address can't be subnet broadcast/net broadcast address
//
if ((Ip == (Ip & Netmask)) || (Ip == (Ip | ~Netmask))) {
return FALSE;
}
NetBrdcastMask = gIp4AllMasks[MIN (Len, Type << 3)];
if (Ip == (Ip | ~NetBrdcastMask)) {
return FALSE;
}
return TRUE;
}
/**
Assigns an IPv4 address and subnet mask to this EFI IPv4 Protocol driver instance.