230 lines
4.9 KiB
C
230 lines
4.9 KiB
C
/*++
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|