MdeModulePkg: Update NetLib interface to support classless addressing.
The classful addressing (IP class A/B/C) has been deprecated according to RFC4632. This patch updates the NetLib NetGetIpClass() and NetIp4IsUnicast() accordingly. NetGetIpClass() The function is kept for compatibility, while the caller of this function could only check the returned value against with IP4_ADDR_CLASSD (multicast) or IP4_ADDR_CLASSE (reserved) now. The function has been updated to note this. NetIp4IsUnicast() The NetMask becomes a required parameter to check the unicast address. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> Reviewed-by: Ye Ting <ting.ye@intel.com> Reviewed-by: Wu Jiaxin <jiaxin.wu@intel.com>
This commit is contained in:
@ -43,9 +43,9 @@ typedef UINT16 TCP_PORTNO;
|
|||||||
//
|
//
|
||||||
// The address classification
|
// The address classification
|
||||||
//
|
//
|
||||||
#define IP4_ADDR_CLASSA 1
|
#define IP4_ADDR_CLASSA 1 // Deprecated
|
||||||
#define IP4_ADDR_CLASSB 2
|
#define IP4_ADDR_CLASSB 2 // Deprecated
|
||||||
#define IP4_ADDR_CLASSC 3
|
#define IP4_ADDR_CLASSC 3 // Deprecated
|
||||||
#define IP4_ADDR_CLASSD 4
|
#define IP4_ADDR_CLASSD 4
|
||||||
#define IP4_ADDR_CLASSE 5
|
#define IP4_ADDR_CLASSE 5
|
||||||
|
|
||||||
@ -231,6 +231,7 @@ typedef struct {
|
|||||||
// Test the IP's attribute, All the IPs are in host byte order.
|
// Test the IP's attribute, All the IPs are in host byte order.
|
||||||
//
|
//
|
||||||
#define IP4_IS_MULTICAST(Ip) (((Ip) & 0xF0000000) == 0xE0000000)
|
#define IP4_IS_MULTICAST(Ip) (((Ip) & 0xF0000000) == 0xE0000000)
|
||||||
|
#define IP4_IS_UNSPECIFIED(Ip) ((Ip) == 0)
|
||||||
#define IP4_IS_LOCAL_BROADCAST(Ip) ((Ip) == 0xFFFFFFFF)
|
#define IP4_IS_LOCAL_BROADCAST(Ip) ((Ip) == 0xFFFFFFFF)
|
||||||
#define IP4_NET_EQUAL(Ip1, Ip2, NetMask) (((Ip1) & (NetMask)) == ((Ip2) & (NetMask)))
|
#define IP4_NET_EQUAL(Ip1, Ip2, NetMask) (((Ip1) & (NetMask)) == ((Ip2) & (NetMask)))
|
||||||
#define IP4_IS_VALID_NETMASK(Ip) (NetGetMaskLength (Ip) != (IP4_MASK_MAX + 1))
|
#define IP4_IS_VALID_NETMASK(Ip) (NetGetMaskLength (Ip) != (IP4_MASK_MAX + 1))
|
||||||
@ -379,6 +380,11 @@ NetGetMaskLength (
|
|||||||
Return the class of the IP address, such as class A, B, C.
|
Return the class of the IP address, such as class A, B, C.
|
||||||
Addr is in host byte order.
|
Addr is in host byte order.
|
||||||
|
|
||||||
|
[ATTENTION]
|
||||||
|
Classful addressing (IP class A/B/C) has been deprecated according to RFC4632.
|
||||||
|
Caller of this function could only check the returned value against
|
||||||
|
IP4_ADDR_CLASSD (multicast) or IP4_ADDR_CLASSE (reserved) now.
|
||||||
|
|
||||||
The address of class A starts with 0.
|
The address of class A starts with 0.
|
||||||
If the address belong to class A, return IP4_ADDR_CLASSA.
|
If the address belong to class A, return IP4_ADDR_CLASSA.
|
||||||
The address of class B starts with 10.
|
The address of class B starts with 10.
|
||||||
@ -404,17 +410,16 @@ NetGetIpClass (
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
Check whether the IP is a valid unicast address according to
|
Check whether the IP is a valid unicast address according to
|
||||||
the netmask. If NetMask is zero, use the IP address's class to get the default mask.
|
the netmask.
|
||||||
|
|
||||||
If Ip is 0, IP is not a valid unicast address.
|
ASSERT if NetMask is zero.
|
||||||
Class D address is used for multicasting and class E address is reserved for future. If Ip
|
|
||||||
belongs to class D or class E, Ip is not a valid unicast address.
|
If all bits of the host address of IP are 0 or 1, IP is also not a valid unicast address.
|
||||||
If all bits of the host address of Ip are 0 or 1, Ip is not a valid unicast address.
|
|
||||||
|
|
||||||
@param[in] Ip The IP to check against.
|
@param[in] Ip The IP to check against.
|
||||||
@param[in] NetMask The mask of the IP.
|
@param[in] NetMask The mask of the IP.
|
||||||
|
|
||||||
@return TRUE if Ip is a valid unicast address on the network, otherwise FALSE.
|
@return TRUE if IP is a valid unicast address on the network, otherwise FALSE.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
|
@ -580,6 +580,11 @@ NetGetMaskLength (
|
|||||||
Return the class of the IP address, such as class A, B, C.
|
Return the class of the IP address, such as class A, B, C.
|
||||||
Addr is in host byte order.
|
Addr is in host byte order.
|
||||||
|
|
||||||
|
[ATTENTION]
|
||||||
|
Classful addressing (IP class A/B/C) has been deprecated according to RFC4632.
|
||||||
|
Caller of this function could only check the returned value against
|
||||||
|
IP4_ADDR_CLASSD (multicast) or IP4_ADDR_CLASSE (reserved) now.
|
||||||
|
|
||||||
The address of class A starts with 0.
|
The address of class A starts with 0.
|
||||||
If the address belong to class A, return IP4_ADDR_CLASSA.
|
If the address belong to class A, return IP4_ADDR_CLASSA.
|
||||||
The address of class B starts with 10.
|
The address of class B starts with 10.
|
||||||
@ -628,11 +633,10 @@ NetGetIpClass (
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
Check whether the IP is a valid unicast address according to
|
Check whether the IP is a valid unicast address according to
|
||||||
the netmask. If NetMask is zero, use the IP address's class to get the default mask.
|
the netmask.
|
||||||
|
|
||||||
If Ip is 0, IP is not a valid unicast address.
|
ASSERT if NetMask is zero.
|
||||||
Class D address is used for multicasting and class E address is reserved for future. If Ip
|
|
||||||
belongs to class D or class E, IP is not a valid unicast address.
|
|
||||||
If all bits of the host address of IP are 0 or 1, IP is also not a valid unicast address.
|
If all bits of the host address of IP are 0 or 1, IP is also not a valid unicast address.
|
||||||
|
|
||||||
@param[in] Ip The IP to check against.
|
@param[in] Ip The IP to check against.
|
||||||
@ -648,18 +652,12 @@ NetIp4IsUnicast (
|
|||||||
IN IP4_ADDR NetMask
|
IN IP4_ADDR NetMask
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
INTN Class;
|
ASSERT (NetMask != 0);
|
||||||
|
|
||||||
Class = NetGetIpClass (Ip);
|
if (Ip == 0 || IP4_IS_LOCAL_BROADCAST (Ip)) {
|
||||||
|
|
||||||
if ((Ip == 0) || (Class >= IP4_ADDR_CLASSD)) {
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NetMask == 0) {
|
|
||||||
NetMask = gIp4AllMasks[Class << 3];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (((Ip &~NetMask) == ~NetMask) || ((Ip &~NetMask) == 0)) {
|
if (((Ip &~NetMask) == ~NetMask) || ((Ip &~NetMask) == 0)) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user