windows-nt/Source/XPSP1/NT/base/cluster/bh/parsers/clusnet/cnp.c
2020-09-26 16:20:57 +08:00

552 lines
17 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//=============================================================================
// MODULE: cnp.c
//
// Description:
//
// Bloodhound Parser DLL for the Cluster Network Protocol
//
// Modification History
//
// Mike Massa 03/21/97 Created
//=============================================================================
#include "precomp.h"
#pragma hdrstop
//
// Constants
//
#define CNP_VERSION_1 0x1 // original CNP
#define CNP_VERSION_2 0x2 // original CNP + multicast
#define CNP_VERSION_UNICAST CNP_VERSION_1
#define CNP_VERSION_MULTICAST CNP_VERSION_2
#define PROTOCOL_CDP 2
#define PROTOCOL_CCMP 1
#define ClusterAnyNodeId 0 // from clusdef.h
//
// Types
//
typedef struct {
UCHAR Version;
UCHAR NextHeader;
USHORT PayloadLength;
ULONG SourceAddress;
ULONG DestinationAddress;
} CNP_HEADER, *PCNP_HEADER;
//
// Multicast signature data.
//
#include <packon.h>
typedef ULONG CL_NETWORK_ID, *PCL_NETWORK_ID;
typedef struct {
UCHAR Version;
UCHAR Reserved;
USHORT PayloadOffset;
CL_NETWORK_ID NetworkId;
ULONG ClusterNetworkBrand;
USHORT SigBufferLen;
UCHAR SigBuffer[1]; // dynamic
} CNP_SIGNATURE, *PCNP_SIGNATURE;
#include <packoff.h>
//
// Data
//
LPSTR CdpName = "CDP";
LPSTR CcmpName = "CCMP";
LPSTR UnknownProtocolName = "Unknown";
//=============================================================================
// Forward references.
//=============================================================================
VOID WINAPIV CnpFormatSummary(LPPROPERTYINST lpPropertyInst);
DWORD WINAPIV CnpFormatSigData(LPPROPERTYINST lpPropertyInst);
DWORD WINAPIV CnpFormatSignature(HFRAME hFrame,
CNP_SIGNATURE UNALIGNED * CnpSig);
//=============================================================================
// CNP database.
//=============================================================================
#define CNP_SUMMARY 0
#define CNP_VERSION 1
#define CNP_NEXT_HEADER 2
#define CNP_PAYLOAD_LENGTH 3
#define CNP_SOURCE_ADDRESS 4
#define CNP_DESTINATION_ADDRESS 5
// CNP signature properties
#define CNP_SIG_SIGDATA 6
#define CNP_SIG_VERSION 7
#define CNP_SIG_PAYLOADOFFSET 8
#define CNP_SIG_NETWORK_ID 9
#define CNP_SIG_NETWORK_BRAND 10
#define CNP_SIG_SIGBUFFERLEN 11
#define CNP_SIG_SIGNATURE 12
PROPERTYINFO CnpDatabase[] =
{
{ // CNP_SUMMARY 0
0,0,
"Summary",
"Summary of the CNP packet",
PROP_TYPE_SUMMARY,
PROP_QUAL_NONE,
NULL,
132,
CnpFormatSummary},
{ // CNP_VERSION 1
0,0,
"Version",
"Version of CNP that created this packet",
PROP_TYPE_BYTE,
PROP_QUAL_NONE,
NULL,
80,
FormatPropertyInstance},
{ // CNP_NEXT_HEADER 2
0,0,
"Next Header",
"Protocol ID of the header following the CNP header",
PROP_TYPE_BYTE,
PROP_QUAL_NONE,
NULL,
80,
FormatPropertyInstance},
{ // CNP_PAYLOAD_LENGTH 3
0,0,
"Payload Length",
"Number of data bytes carried by the packet",
PROP_TYPE_WORD,
PROP_QUAL_NONE,
NULL,
80,
FormatPropertyInstance},
{ // CNP_SOURCE_ADDRESS 4
0,0,
"Source Address",
"ID of the node which originated the packet",
PROP_TYPE_DWORD,
PROP_QUAL_NONE,
NULL,
80,
FormatPropertyInstance},
{ // CNP_DESTINATION_ADDRESS 5
0,0,
"Destination Address",
"ID of the node for which the packet is destined",
PROP_TYPE_DWORD,
PROP_QUAL_NONE,
NULL,
80,
FormatPropertyInstance},
{ // CNP_SIG_SIGDATA 6
0,0,
"Signature Data",
"CNP Multicast Signature Data",
PROP_TYPE_SUMMARY,
PROP_QUAL_NONE,
NULL,
80,
CnpFormatSigData},
{ // CNP_SIG_VERSION 7
0,0,
"Signature Version",
"Identifies algorithm to sign and verify messages.",
PROP_TYPE_BYTE,
PROP_QUAL_NONE,
NULL,
80,
FormatPropertyInstance},
{ // CNP_SIG_PAYLOADOFFSET 8
0,0,
"Payload Offset",
"Offset of message payload from start of CNP signature data",
PROP_TYPE_WORD,
PROP_QUAL_NONE,
NULL,
80,
FormatPropertyInstance},
{ // CNP_SIG_NETWORK_ID 9
0,0,
"Network ID",
"Network ID number assigned by the cluster",
PROP_TYPE_DWORD,
PROP_QUAL_NONE,
NULL,
80,
FormatPropertyInstance},
{ // CNP_SIG_NETWORK_BRAND 10
0,0,
"Network Brand",
"Pseudo-random 32-bit value differentiating this "
"network from networks in other clusters",
PROP_TYPE_DWORD,
PROP_QUAL_NONE,
NULL,
80,
FormatPropertyInstance},
{ // CNP_SIG_SIGBUFFERLEN 11
0,0,
"Signature Buffer Length",
"Length of signature buffer following node data",
PROP_TYPE_WORD,
PROP_QUAL_NONE,
NULL,
80,
FormatPropertyInstance},
{ // CNP_SIG_SIGNATURE 12
0,0,
"Signature",
"Signature",
PROP_TYPE_RAW_DATA,
PROP_QUAL_NONE,
NULL,
80,
FormatPropertyInstance},
};
DWORD nCnpProperties = ((sizeof CnpDatabase) / PROPERTYINFO_SIZE);
//=============================================================================
// FUNCTION: CnpRegister()
//
// Modification History
//
// Steve Hiskey 07/07/94 Created
//=============================================================================
VOID WINAPI CnpRegister(HPROTOCOL hCnpProtocol)
{
register DWORD i;
//=========================================================================
// Create the property database.
//=========================================================================
CreatePropertyDatabase(hCnpProtocol, nCnpProperties);
for(i = 0; i < nCnpProperties; ++i)
{
AddProperty(hCnpProtocol, &CnpDatabase[i]);
}
}
//=============================================================================
// FUNCTION: Deregister()
//
// Modification History
//
// Steve Hiskey 07/07/94 Created
//=============================================================================
VOID WINAPI CnpDeregister(HPROTOCOL hCnpProtocol)
{
DestroyPropertyDatabase(hCnpProtocol);
}
//=============================================================================
// FUNCTION: CnpRecognizeFrame()
//
// Modification History
//
// Steve Hiskey 07/07/94 Created
//=============================================================================
LPBYTE WINAPI CnpRecognizeFrame(HFRAME hFrame, //... frame handle.
LPBYTE MacFrame, //... Frame pointer.
LPBYTE MyFrame, //... Relative pointer.
DWORD MacType, //... MAC type.
DWORD BytesLeft, //... Bytes left.
HPROTOCOL hPreviousProtocol, //... Previous protocol or NULL if none.
DWORD nPreviousProtocolOffset, //... Offset of previous protocol.
LPDWORD ProtocolStatusCode, //... Pointer to return status code in.
LPHPROTOCOL hNextProtocol, //... Next protocol to call (optional).
LPDWORD InstData) //... Next protocol instance data.
{
CNP_HEADER UNALIGNED * cnpHeader = (CNP_HEADER UNALIGNED *) MyFrame;
CNP_SIGNATURE UNALIGNED * cnpSig = (CNP_SIGNATURE UNALIGNED *)(cnpHeader + 1);
LPBYTE lpNextByte;
if (cnpHeader->Version == CNP_VERSION_MULTICAST) {
lpNextByte = (LPBYTE)cnpSig + cnpSig->PayloadOffset;
} else {
lpNextByte = (LPBYTE)cnpSig;
}
if (cnpHeader->NextHeader == PROTOCOL_CDP) {
*hNextProtocol = hCdp;
*ProtocolStatusCode = PROTOCOL_STATUS_NEXT_PROTOCOL;
}
else if (cnpHeader->NextHeader == PROTOCOL_CCMP) {
*hNextProtocol = hCcmp;
*ProtocolStatusCode = PROTOCOL_STATUS_NEXT_PROTOCOL;
}
else {
*ProtocolStatusCode = PROTOCOL_STATUS_CLAIMED;
}
return lpNextByte;
}
//=============================================================================
// FUNCTION: CnpAttachProperties()
//
// Modification History
//
// Steve Hiskey 07/07/94 Created
//=============================================================================
LPBYTE WINAPI CnpAttachProperties(HFRAME hFrame,
LPBYTE Frame,
LPBYTE MyFrame,
DWORD MacType,
DWORD BytesLeft,
HPROTOCOL hPreviousProtocol,
DWORD nPreviousProtocolOffset,
DWORD InstData)
{
CNP_HEADER UNALIGNED * cnpHeader = (CNP_HEADER UNALIGNED *) MyFrame;
AttachPropertyInstance(hFrame,
CnpDatabase[CNP_SUMMARY].hProperty,
sizeof(CNP_HEADER),
cnpHeader,
0, 0, 0);
AttachPropertyInstance(hFrame,
CnpDatabase[CNP_VERSION].hProperty,
sizeof(BYTE),
&(cnpHeader->Version),
0, 1, 0);
AttachPropertyInstance(hFrame,
CnpDatabase[CNP_NEXT_HEADER].hProperty,
sizeof(BYTE),
&(cnpHeader->NextHeader),
0, 1, 0);
AttachPropertyInstance(hFrame,
CnpDatabase[CNP_PAYLOAD_LENGTH].hProperty,
sizeof(WORD),
&(cnpHeader->PayloadLength),
0, 1, 0);
AttachPropertyInstance(hFrame,
CnpDatabase[CNP_SOURCE_ADDRESS].hProperty,
sizeof(DWORD),
&(cnpHeader->SourceAddress),
0, 1, 0);
AttachPropertyInstance(hFrame,
CnpDatabase[CNP_DESTINATION_ADDRESS].hProperty,
sizeof(DWORD),
&(cnpHeader->DestinationAddress),
0, 1, 0);
if (cnpHeader->Version == CNP_VERSION_MULTICAST) {
CnpFormatSignature(hFrame,
(CNP_SIGNATURE UNALIGNED *)(cnpHeader + 1)
);
}
return NULL;
}
//==============================================================================
// FUNCTION: CnpFormatSummary()
//
// Modification History
//
// Steve Hiskey 07/07/94 Created
//==============================================================================
VOID WINAPIV CnpFormatSummary(LPPROPERTYINST lpPropertyInst)
{
LPSTR SummaryStr;
DWORD Length;
LPSTR NextHeaderStr;
CNP_HEADER UNALIGNED * cnpHeader =
(CNP_HEADER UNALIGNED *) lpPropertyInst->lpData;
if (cnpHeader->NextHeader == PROTOCOL_CDP) {
NextHeaderStr = CdpName;
}
else if (cnpHeader->NextHeader == PROTOCOL_CCMP) {
NextHeaderStr = CcmpName;
}
else {
NextHeaderStr = UnknownProtocolName;
}
Length = wsprintf( lpPropertyInst->szPropertyText,
"Src = %u; Dst = %u; Proto = %s; Payload Len = %u",
cnpHeader->SourceAddress,
cnpHeader->DestinationAddress,
NextHeaderStr,
cnpHeader->PayloadLength
);
}
//==============================================================================
// FUNCTION: CnpFormatProperties()
//
// Modification History
//
// Steve Hiskey 07/07/94 Created
//==============================================================================
DWORD WINAPI CnpFormatProperties(HFRAME hFrame,
LPBYTE MacFrame,
LPBYTE FrameData,
DWORD nPropertyInsts,
LPPROPERTYINST p)
{
//=========================================================================
// Format each property in the property instance table.
//
// The property-specific instance data was used to store the address of a
// property-specific formatting function so all we do here is call each
// function via the instance data pointer.
//=========================================================================
while (nPropertyInsts--)
{
((FORMAT) p->lpPropertyInfo->InstanceData)(p);
p++;
}
return NMERR_SUCCESS;
}
//==============================================================================
// FUNCTION: CnpFormatMcastSigData()
//
// Modification History
//
// David Dion 04/16/2001 Created
//==============================================================================
DWORD WINAPIV CnpFormatSigData(LPPROPERTYINST lpPropertyInst)
{
wsprintf( lpPropertyInst->szPropertyText,
"CNP Signature Data:"
);
return NMERR_SUCCESS;
}
//==============================================================================
// FUNCTION: CnpFormatSignature()
//
// Modification History
//
// David Dion 04/16/01 Created
//==============================================================================
DWORD WINAPIV CnpFormatSignature(HFRAME hFrame,
CNP_SIGNATURE UNALIGNED * CnpSig)
{
AttachPropertyInstance(hFrame,
CnpDatabase[CNP_SIG_SIGDATA].hProperty,
CnpSig->PayloadOffset,
CnpSig,
0, 1, 0);
AttachPropertyInstance(hFrame,
CnpDatabase[CNP_SIG_VERSION].hProperty,
sizeof(UCHAR),
&(CnpSig->Version),
0, 2, 0);
AttachPropertyInstance(hFrame,
CnpDatabase[CNP_SIG_PAYLOADOFFSET].hProperty,
sizeof(WORD),
&(CnpSig->PayloadOffset),
0, 2, 0);
AttachPropertyInstance(hFrame,
CnpDatabase[CNP_SIG_NETWORK_ID].hProperty,
sizeof(DWORD),
&(CnpSig->NetworkId),
0, 2, 0);
AttachPropertyInstance(hFrame,
CnpDatabase[CNP_SIG_NETWORK_BRAND].hProperty,
sizeof(DWORD),
&(CnpSig->ClusterNetworkBrand),
0, 2, 0);
AttachPropertyInstance(hFrame,
CnpDatabase[CNP_SIG_SIGBUFFERLEN].hProperty,
sizeof(WORD),
&(CnpSig->SigBufferLen),
0, 2, 0);
AttachPropertyInstance(hFrame,
CnpDatabase[CNP_SIG_SIGNATURE].hProperty,
CnpSig->SigBufferLen,
&(CnpSig->SigBuffer[0]),
0, 2, 0);
return NMERR_SUCCESS;
}
//==============================================================================
// FUNCTION: CnpIsMulticast()
//
// Modification History
//
// David Dion 04/16/2001 Created
//==============================================================================
BOOLEAN WINAPIV CnpIsMulticast(
HPROTOCOL hPreviousProtocol, //... Previous protocol or NULL if none.
LPBYTE MacFrame, //... Frame pointer.
DWORD nPreviousProtocolOffset //... Offset of previous protocol.
)
{
CNP_HEADER UNALIGNED * cnpHeader;
cnpHeader = (CNP_HEADER UNALIGNED *)(MacFrame + nPreviousProtocolOffset);
return (BOOLEAN)(hPreviousProtocol == hCnp &&
cnpHeader->DestinationAddress == ClusterAnyNodeId
);
}