mirror of https://github.com/lianthony/NT4.0
453 lines
12 KiB
453 lines
12 KiB
/*++
|
|
|
|
Copyright (c) 1992-1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
pdutest.c
|
|
|
|
Abstract:
|
|
|
|
Provides code to test the functionality and integrity of the PDUAPI's.
|
|
|
|
Environment:
|
|
|
|
User Mode - Win32
|
|
|
|
Revision History:
|
|
|
|
10-May-1996 DonRyan
|
|
Removed banner from Technology Dynamics, Inc.
|
|
|
|
--*/
|
|
|
|
//--------------------------- WINDOWS DEPENDENCIES --------------------------
|
|
|
|
//--------------------------- STANDARD DEPENDENCIES -- #include<xxxxx.h> ----
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
//--------------------------- MODULE DEPENDENCIES -- #include"xxxxx.h" ------
|
|
|
|
#include <snmp.h>
|
|
#include <snmputil.h>
|
|
|
|
#include "pduapi.h"
|
|
|
|
//--------------------------- SELF-DEPENDENCY -- ONE #include"module.h" -----
|
|
|
|
//--------------------------- PUBLIC VARIABLES --(same as in module.h file)--
|
|
|
|
//--------------------------- PRIVATE CONSTANTS -----------------------------
|
|
|
|
//--------------------------- PRIVATE STRUCTS -------------------------------
|
|
|
|
//--------------------------- PRIVATE VARIABLES -----------------------------
|
|
|
|
//--------------------------- PRIVATE PROTOTYPES ----------------------------
|
|
|
|
//--------------------------- PRIVATE PROCEDURES ----------------------------
|
|
|
|
//--------------------------- PUBLIC PROCEDURES -----------------------------
|
|
|
|
//
|
|
// Global Var - To keep stack size down
|
|
//
|
|
BYTE pBuffer[2000];
|
|
|
|
int pdutest()
|
|
|
|
{
|
|
UINT nLength;
|
|
BYTE *pTemp;
|
|
RFC1157Pdus anyPdu;
|
|
BYTE *pEncodeBuf;
|
|
UINT nEncodeLen;
|
|
int status;
|
|
RFC1157VarBindList SrcVarBinds;
|
|
RFC1157VarBindList DstVarBinds;
|
|
|
|
|
|
printf( "\n\nPDU api testing\n" );
|
|
printf( "---------------\n\n\n" );
|
|
|
|
// Copy the var bind
|
|
printf( " Var bind copy test --\n\n" );
|
|
|
|
// Test var bind copy
|
|
SrcVarBinds.list = SnmpUtilMemAlloc( 3 * sizeof(RFC1157VarBind) );
|
|
SrcVarBinds.len = 3;
|
|
|
|
SrcVarBinds.list[0].name.ids = SnmpUtilMemAlloc( 3*sizeof(UINT) );
|
|
SrcVarBinds.list[0].name.idLength = 3;
|
|
|
|
SrcVarBinds.list[0].name.ids[0] = 0;
|
|
SrcVarBinds.list[0].name.ids[1] = 0;
|
|
SrcVarBinds.list[0].name.ids[2] = 0;
|
|
|
|
SrcVarBinds.list[0].value.asnType = ASN_OBJECTIDENTIFIER;
|
|
SrcVarBinds.list[0].value.asnValue.object.ids = SnmpUtilMemAlloc( 3*sizeof(UINT) );
|
|
SrcVarBinds.list[0].value.asnValue.object.idLength = 3;
|
|
|
|
SrcVarBinds.list[0].value.asnValue.object.ids[0] = 0;
|
|
SrcVarBinds.list[0].value.asnValue.object.ids[1] = 0;
|
|
SrcVarBinds.list[0].value.asnValue.object.ids[2] = 0;
|
|
|
|
SrcVarBinds.list[1].name.ids = SnmpUtilMemAlloc( 3*sizeof(UINT) );
|
|
SrcVarBinds.list[1].name.idLength = 3;
|
|
|
|
SrcVarBinds.list[1].name.ids[0] = 1;
|
|
SrcVarBinds.list[1].name.ids[1] = 1;
|
|
SrcVarBinds.list[1].name.ids[2] = 1;
|
|
|
|
SrcVarBinds.list[1].value.asnType = ASN_OBJECTIDENTIFIER;
|
|
SrcVarBinds.list[1].value.asnValue.object.ids = SnmpUtilMemAlloc( 3*sizeof(UINT) );
|
|
SrcVarBinds.list[1].value.asnValue.object.idLength = 3;
|
|
|
|
SrcVarBinds.list[1].value.asnValue.object.ids[0] = 1;
|
|
SrcVarBinds.list[1].value.asnValue.object.ids[1] = 1;
|
|
SrcVarBinds.list[1].value.asnValue.object.ids[2] = 1;
|
|
|
|
SrcVarBinds.list[2].name.ids = SnmpUtilMemAlloc( 3*sizeof(UINT) );
|
|
SrcVarBinds.list[2].name.idLength = 3;
|
|
|
|
SrcVarBinds.list[2].name.ids[0] = 2;
|
|
SrcVarBinds.list[2].name.ids[1] = 2;
|
|
SrcVarBinds.list[2].name.ids[2] = 2;
|
|
|
|
SrcVarBinds.list[2].value.asnType = ASN_OBJECTIDENTIFIER;
|
|
SrcVarBinds.list[2].value.asnValue.object.ids = SnmpUtilMemAlloc( 3*sizeof(UINT) );
|
|
SrcVarBinds.list[2].value.asnValue.object.idLength = 3;
|
|
|
|
SrcVarBinds.list[2].value.asnValue.object.ids[0] = 2;
|
|
SrcVarBinds.list[2].value.asnValue.object.ids[1] = 2;
|
|
SrcVarBinds.list[2].value.asnValue.object.ids[2] = 2;
|
|
|
|
if ( SNMPAPI_ERROR == SnmpUtilVarBindListCpy(&DstVarBinds, &SrcVarBinds) )
|
|
{
|
|
printf( " Var bind copy failed: %d\n", GetLastError() );
|
|
}
|
|
else
|
|
{
|
|
printf( " Var bind copy succeeded\n" );
|
|
}
|
|
|
|
// Free memory
|
|
SnmpUtilVarBindListFree( &SrcVarBinds );
|
|
SnmpUtilVarBindListFree( &DstVarBinds );
|
|
|
|
// Setup GetRequest pdu
|
|
pBuffer[0] = 0x01; // fake
|
|
pBuffer[1] = 0x1c;
|
|
|
|
// Setup request-id
|
|
pBuffer[2] = ASN_INTEGER;
|
|
pBuffer[3] = 0x04;
|
|
pBuffer[4] = 0x05;
|
|
pBuffer[5] = 0xae;
|
|
pBuffer[6] = 0x56;
|
|
pBuffer[7] = 0x02;
|
|
|
|
// Setup error-status
|
|
pBuffer[8] = ASN_INTEGER;
|
|
pBuffer[9] = 0x01;
|
|
pBuffer[10] = 0x08; // invalid
|
|
|
|
// Setup error-index
|
|
pBuffer[11] = ASN_INTEGER;
|
|
pBuffer[12] = 0x01;
|
|
pBuffer[13] = 0x00;
|
|
|
|
// Setup variable bindings
|
|
pBuffer[14] = ASN_SEQUENCEOF;
|
|
pBuffer[15] = 0x0e;
|
|
|
|
// Setup first sequence
|
|
pBuffer[16] = ASN_SEQUENCE;
|
|
pBuffer[17] = 0x0c;
|
|
|
|
// Setup variable name
|
|
pBuffer[18] = ASN_OBJECTIDENTIFIER;
|
|
pBuffer[19] = 0x08;
|
|
pBuffer[20] = 0x2b;
|
|
pBuffer[21] = 0x06;
|
|
pBuffer[22] = 0x01;
|
|
pBuffer[23] = 0x02;
|
|
pBuffer[24] = 0x01;
|
|
pBuffer[25] = 0x01;
|
|
pBuffer[26] = 0x01;
|
|
pBuffer[27] = 0x00;
|
|
|
|
// Setup variable value
|
|
pBuffer[28] = ASN_NULL;
|
|
pBuffer[29] = 0x00;
|
|
|
|
// Setup for pdu processing
|
|
nLength = 30;
|
|
pTemp = pBuffer;
|
|
|
|
//
|
|
// Decode PDU successfully
|
|
//
|
|
|
|
printf( "\n PDU Decoding tests --\n\n" );
|
|
|
|
// Test for invalid PDU
|
|
status = SnmpPduDecodeAnyPdu( &anyPdu, &pTemp, &nLength );
|
|
if ( status == SNMPAPI_ERROR )
|
|
{
|
|
printf( " Invalid PDU, recognized: %d\n", GetLastError() );
|
|
}
|
|
else
|
|
{
|
|
printf( " Successful PDU decoding, shouldn't be\n" );
|
|
}
|
|
|
|
// Fix and try again - test for invalid error status
|
|
pBuffer[0] = ASN_RFC1157_GETREQUEST;
|
|
pTemp = pBuffer;
|
|
nLength = 30;
|
|
status = SnmpPduDecodeAnyPdu( &anyPdu, &pTemp, &nLength );
|
|
if ( status == SNMPAPI_ERROR )
|
|
{
|
|
printf( " Invalid Error status, recognized: %d\n", GetLastError() );
|
|
}
|
|
else
|
|
{
|
|
printf( " Successful PDU decoding, shouldn't be\n" );
|
|
}
|
|
|
|
// Fix and try again
|
|
pBuffer[10] = 0x00;
|
|
pTemp = pBuffer;
|
|
nLength = 30;
|
|
status = SnmpPduDecodeAnyPdu( &anyPdu, &pTemp, &nLength );
|
|
if ( status == SNMPAPI_ERROR )
|
|
{
|
|
printf( " Error decoding PDU, shouldn't be: %d\n", GetLastError() );
|
|
}
|
|
else
|
|
{
|
|
printf( " Successful PDU decoding\n" );
|
|
}
|
|
|
|
//
|
|
// Encode PDU successfully
|
|
//
|
|
|
|
printf( "\n PDU Encoding tests --\n\n" );
|
|
|
|
// Test for invalid PDU
|
|
pEncodeBuf = NULL;
|
|
nEncodeLen = 0;
|
|
anyPdu.pduType = 0x00;
|
|
status = SnmpPduEncodeAnyPdu( &anyPdu, &pEncodeBuf, &nEncodeLen );
|
|
if ( status == SNMPAPI_ERROR )
|
|
{
|
|
printf( " Invalid PDU, recognized: %d\n", GetLastError() );
|
|
}
|
|
else
|
|
{
|
|
printf( " Successful PDU encoding, shouldn't be\n" );
|
|
}
|
|
|
|
// Test for invalid error status
|
|
pEncodeBuf = NULL;
|
|
nEncodeLen = 0;
|
|
anyPdu.pduType = ASN_RFC1157_GETREQUEST;
|
|
anyPdu.pduValue.pdu.errorStatus = 0x08;
|
|
status = SnmpPduEncodeAnyPdu( &anyPdu, &pEncodeBuf, &nEncodeLen );
|
|
if ( status == SNMPAPI_ERROR )
|
|
{
|
|
printf( " Invalid error status, recognized: %d\n", GetLastError() );
|
|
}
|
|
else
|
|
{
|
|
printf( " Successful PDU encoding, shouldn't be\n" );
|
|
}
|
|
|
|
// Fix and try again
|
|
SnmpUtilMemFree( pEncodeBuf );
|
|
pEncodeBuf = NULL;
|
|
nEncodeLen = 0;
|
|
anyPdu.pduValue.pdu.errorStatus = 0x00;
|
|
status = SnmpPduEncodeAnyPdu( &anyPdu, &pEncodeBuf, &nEncodeLen );
|
|
if ( status == SNMPAPI_ERROR )
|
|
{
|
|
printf( " Error encoding PDU, shouldn't be: %d\n", GetLastError() );
|
|
}
|
|
else
|
|
{
|
|
printf( " Successful PDU encoding\n" );
|
|
}
|
|
|
|
// Reverse PDU buffer
|
|
SnmpSvcBufRevInPlace( pEncodeBuf, nEncodeLen );
|
|
|
|
// Compare PDU buffers
|
|
if ( strncmp(pBuffer, pEncodeBuf, nEncodeLen) )
|
|
{
|
|
printf( "\nPDU Buffers DON'T match!!\n\n" );
|
|
}
|
|
else
|
|
{
|
|
printf( "\nPDU Buffers match!!\n\n" );
|
|
}
|
|
|
|
// Free memory for testing traps
|
|
SnmpUtilVarBindListFree( &anyPdu.pduValue.pdu.varBinds );
|
|
SnmpUtilMemFree( pEncodeBuf );
|
|
|
|
//
|
|
// Trap testing
|
|
//
|
|
|
|
// Setup TRAP
|
|
pBuffer[0] = ASN_RFC1157_TRAP;
|
|
pBuffer[1] = 37;
|
|
|
|
// Setup enterprise
|
|
pBuffer[2] = ASN_OBJECTIDENTIFIER;
|
|
pBuffer[3] = 0x04;
|
|
pBuffer[4] = 82;
|
|
pBuffer[5] = 0x02;
|
|
pBuffer[6] = 0x02;
|
|
pBuffer[7] = 0x02;
|
|
|
|
// Setup agent-addr
|
|
pBuffer[8] = ASN_RFC1155_IPADDRESS;
|
|
pBuffer[9] = 0x04;
|
|
pBuffer[10] = 'T';
|
|
pBuffer[11] = 'o';
|
|
pBuffer[12] = 'd';
|
|
pBuffer[13] = 'd';
|
|
|
|
// Setup generic-trap
|
|
pBuffer[14] = ASN_INTEGER;
|
|
pBuffer[15] = 0x01;
|
|
pBuffer[16] = 0x07; // invalid
|
|
|
|
// Setup specific-trap
|
|
pBuffer[17] = ASN_INTEGER;
|
|
pBuffer[18] = 0x01;
|
|
pBuffer[19] = 0x01;
|
|
|
|
// Setup time-stamp
|
|
pBuffer[20] = ASN_RFC1155_TIMETICKS;
|
|
pBuffer[21] = 0x01;
|
|
pBuffer[22] = 0x02;
|
|
|
|
// Setup var-binds
|
|
pBuffer[23] = ASN_SEQUENCEOF;
|
|
pBuffer[24] = 0x0e;
|
|
|
|
// Setup first sequence
|
|
pBuffer[25] = ASN_SEQUENCE;
|
|
pBuffer[26] = 0x0c;
|
|
|
|
// Setup variable name
|
|
pBuffer[27] = ASN_OBJECTIDENTIFIER;
|
|
pBuffer[28] = 0x08;
|
|
pBuffer[29] = 0x2b;
|
|
pBuffer[30] = 0x06;
|
|
pBuffer[31] = 0x01;
|
|
pBuffer[32] = 0x02;
|
|
pBuffer[33] = 0x01;
|
|
pBuffer[34] = 0x01;
|
|
pBuffer[35] = 0x01;
|
|
pBuffer[36] = 0x00;
|
|
|
|
// Setup variable value
|
|
pBuffer[37] = ASN_NULL;
|
|
pBuffer[38] = 0x00;
|
|
|
|
// Setup for trap processing
|
|
nLength = 39;
|
|
pTemp = pBuffer;
|
|
|
|
//
|
|
// Decode trap successfully
|
|
//
|
|
|
|
printf( "\nTrap Decoding Tests\n\n" );
|
|
|
|
status = SnmpPduDecodeAnyPdu( &anyPdu, &pTemp, &nLength );
|
|
if ( status == SNMPAPI_ERROR )
|
|
{
|
|
printf( " Invalid generic trap, recognized: %d\n", GetLastError() );
|
|
}
|
|
else
|
|
{
|
|
printf( " Successful TRAP decoding, shouldn't be\n" );
|
|
}
|
|
|
|
// Fix and try again
|
|
pBuffer[16] = 0x06;
|
|
nLength = 39;
|
|
pTemp = pBuffer;
|
|
status = SnmpPduDecodeAnyPdu( &anyPdu, &pTemp, &nLength );
|
|
if ( status == SNMPAPI_ERROR )
|
|
{
|
|
printf( " Error decoding TRAP, shouldn't be: %d\n", GetLastError() );
|
|
}
|
|
else
|
|
{
|
|
printf( " Successful TRAP decoding\n" );
|
|
}
|
|
|
|
//
|
|
// Encode TRAP successfully
|
|
//
|
|
|
|
printf( "\nTrap Encoding Tests\n\n" );
|
|
|
|
pEncodeBuf = NULL;
|
|
nEncodeLen = 0;
|
|
anyPdu.pduValue.trap.genericTrap = 0x07;
|
|
status = SnmpPduEncodeAnyPdu( &anyPdu, &pEncodeBuf, &nEncodeLen );
|
|
if ( status == SNMPAPI_ERROR )
|
|
{
|
|
printf( " Invalid generic trap, recognized: %d\n", GetLastError() );
|
|
}
|
|
else
|
|
{
|
|
printf( " Successful TRAP encoding, shouldn't be\n" );
|
|
}
|
|
|
|
pEncodeBuf = NULL;
|
|
nEncodeLen = 0;
|
|
anyPdu.pduValue.trap.genericTrap = 0x06;
|
|
status = SnmpPduEncodeAnyPdu( &anyPdu, &pEncodeBuf, &nEncodeLen );
|
|
if ( status == SNMPAPI_ERROR )
|
|
{
|
|
printf( " Error encoding TRAP, shouldn't be: %d\n", GetLastError() );
|
|
}
|
|
else
|
|
{
|
|
printf( " Successful TRAP encoding\n" );
|
|
}
|
|
|
|
// Reverse the PDU
|
|
SnmpSvcBufRevInPlace( pEncodeBuf, nEncodeLen );
|
|
|
|
// Compare two buffers
|
|
if ( strncmp(pBuffer, pEncodeBuf, nEncodeLen) )
|
|
{
|
|
printf( "\nTrap Buffers DON'T match!!\n\n" );
|
|
}
|
|
else
|
|
{
|
|
printf( "\nTrap Buffers match!!\n\n" );
|
|
}
|
|
|
|
// Free memory
|
|
SnmpUtilVarBindListFree( &anyPdu.pduValue.trap.varBinds );
|
|
SnmpUtilMemFree( pEncodeBuf );
|
|
|
|
return 0;
|
|
}
|
|
|
|
//-------------------------------- END --------------------------------------
|
|
|