/*++ Copyright (c) 1995 Microsoft Corporation Module Name: Abstract: File contains the following functions PortCmp Cmp InetCmp UdpCmp Udp6Cmp TcpCmp Tcp6Cmp IpNetCmp All these functions behave like strcmp. They return >0 if first argument is greater than the second, <0 if the second is greater than the first and 0 if they are equal These functions should be revised to make them more effecient Revision History: Amritansh Raghav 6/8/95 Created Amritansh Raghav 10/18/95 The functions now return >0,0,<0 instead of +1,0,-1 --*/ #include "allinc.h" LONG UdpCmp( DWORD dwAddr1, DWORD dwPort1, DWORD dwAddr2, DWORD dwPort2 ) { LONG lResult; // Addrs are in network byte order if (InetCmp(dwAddr1, dwAddr2, lResult)) { return lResult; } else { // Ports are in host byte order return Cmp(dwPort1, dwPort2, lResult); } } LONG Udp6Cmp( BYTE rgbyLocalAddrEx1[20], DWORD dwLocalPort1, BYTE rgbyLocalAddrEx2[20], DWORD dwLocalPort2 ) { LONG lResult; // Addr+scopeid is in network byte order. They're together // in one buffer since that's how the INET-ADDRESS-MIB expresses them. lResult = memcmp(rgbyLocalAddrEx1, rgbyLocalAddrEx2, 20); if (lResult isnot 0) { return lResult; } else { // Ports are in host byte order return Cmp(dwLocalPort1, dwLocalPort2, lResult); } } LONG TcpCmp( DWORD dwLocalAddr1, DWORD dwLocalPort1, DWORD dwRemAddr1, DWORD dwRemPort1, DWORD dwLocalAddr2, DWORD dwLocalPort2, DWORD dwRemAddr2, DWORD dwRemPort2 ) { LONG lResult; // Addrs are in network byte order if (InetCmp(dwLocalAddr1, dwLocalAddr2, lResult) isnot 0) { return lResult; } else { // Ports are in host byte order if (Cmp(dwLocalPort1, dwLocalPort2, lResult) isnot 0) { return lResult; } else { // Addrs are in network byte order if (InetCmp(dwRemAddr1, dwRemAddr2, lResult) isnot 0) { return lResult; } else { // Ports are in host byte order return Cmp(dwRemPort1, dwRemPort2, lResult); } } } } LONG Tcp6Cmp( BYTE rgbyLocalAddrEx1[20], DWORD dwLocalPort1, BYTE rgbyRemAddrEx1[20], DWORD dwRemPort1, BYTE rgbyLocalAddrEx2[20], DWORD dwLocalPort2, BYTE rgbyRemAddrEx2[20], DWORD dwRemPort2 ) { LONG lResult; // Addr+scopeid is in network byte order. They're together // in one buffer since that's how the INET-ADDRESS-MIB expresses them. lResult = memcmp(rgbyLocalAddrEx1, rgbyLocalAddrEx2, 20); if (lResult isnot 0) { return lResult; } else { // Ports are in host byte order if (Cmp(dwLocalPort1, dwLocalPort2, lResult) isnot 0) { return lResult; } else { // Addr+scopeid is in network byte order lResult = memcmp(rgbyRemAddrEx1, rgbyRemAddrEx2, 20); if (lResult isnot 0) { return lResult; } else { // Ports are in host byte order return Cmp(dwRemPort1, dwRemPort2, lResult); } } } } LONG IpNetCmp( DWORD dwIfIndex1, DWORD dwAddr1, DWORD dwIfIndex2, DWORD dwAddr2 ) { LONG lResult; // Index is a simple DWORD, not a port if (Cmp(dwIfIndex1, dwIfIndex2, lResult) isnot 0) { return lResult; } else { // Addrs are in network byte order return InetCmp(dwAddr1, dwAddr2, lResult); } } LONG IpForwardCmp( DWORD dwIpDest1, DWORD dwProto1, DWORD dwPolicy1, DWORD dwIpNextHop1, DWORD dwIpDest2, DWORD dwProto2, DWORD dwPolicy2, DWORD dwIpNextHop2 ) { LONG lResult; // Addrs are in network byte order if (InetCmp(dwIpDest1, dwIpDest2, lResult) isnot 0) { return lResult; } else { // Proto is a simple DWORD, not a port if (Cmp(dwProto1, dwProto2, lResult) isnot 0) { return lResult; } else { // Policy is a simple DWORD, not a port if (Cmp(dwPolicy1, dwPolicy2, lResult) isnot 0) { return lResult; } else { // Addrs are in network byte order return InetCmp(dwIpNextHop1, dwIpNextHop2, lResult); } } } }