diff --git a/MdeModulePkg/Include/Library/NetLib.h b/MdeModulePkg/Include/Library/NetLib.h index c5c0fc212b..26709af091 100644 --- a/MdeModulePkg/Include/Library/NetLib.h +++ b/MdeModulePkg/Include/Library/NetLib.h @@ -43,9 +43,9 @@ typedef UINT16 TCP_PORTNO; // // The address classification // -#define IP4_ADDR_CLASSA 1 -#define IP4_ADDR_CLASSB 2 -#define IP4_ADDR_CLASSC 3 +#define IP4_ADDR_CLASSA 1 // Deprecated +#define IP4_ADDR_CLASSB 2 // Deprecated +#define IP4_ADDR_CLASSC 3 // Deprecated #define IP4_ADDR_CLASSD 4 #define IP4_ADDR_CLASSE 5 @@ -231,6 +231,7 @@ typedef struct { // Test the IP's attribute, All the IPs are in host byte order. // #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_NET_EQUAL(Ip1, Ip2, NetMask) (((Ip1) & (NetMask)) == ((Ip2) & (NetMask))) #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. 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. If the address belong to class A, return IP4_ADDR_CLASSA. The address of class B starts with 10. @@ -404,17 +410,16 @@ NetGetIpClass ( /** 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. - 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 not a valid unicast address. + ASSERT if NetMask is zero. + + 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] 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 diff --git a/MdeModulePkg/Library/DxeNetLib/DxeNetLib.c b/MdeModulePkg/Library/DxeNetLib/DxeNetLib.c index 148bebf4e7..04d8345a6d 100644 --- a/MdeModulePkg/Library/DxeNetLib/DxeNetLib.c +++ b/MdeModulePkg/Library/DxeNetLib/DxeNetLib.c @@ -580,6 +580,11 @@ NetGetMaskLength ( Return the class of the IP address, such as class A, B, C. 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. If the address belong to class A, return IP4_ADDR_CLASSA. The address of class B starts with 10. @@ -628,11 +633,10 @@ NetGetIpClass ( /** 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. - 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. + ASSERT if NetMask is zero. + 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. @@ -648,18 +652,12 @@ NetIp4IsUnicast ( IN IP4_ADDR NetMask ) { - INTN Class; - - Class = NetGetIpClass (Ip); - - if ((Ip == 0) || (Class >= IP4_ADDR_CLASSD)) { + ASSERT (NetMask != 0); + + if (Ip == 0 || IP4_IS_LOCAL_BROADCAST (Ip)) { return FALSE; } - - if (NetMask == 0) { - NetMask = gIp4AllMasks[Class << 3]; - } - + if (((Ip &~NetMask) == ~NetMask) || ((Ip &~NetMask) == 0)) { return FALSE; }