www.pudn.com > snmp.rar > pdutest.c


/*++ 
 
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 ---- 
 
#include  
#include  
#include  
 
//--------------------------- MODULE DEPENDENCIES -- #include"xxxxx.h" ------ 
 
#include  
#include  
 
#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 --------------------------------------