/* * gennt.h v0.15 March 21, 1996 * **************************************************************************** * * * (C) Copyright 1995 DIGITAL EQUIPMENT CORPORATION * * * * This software is an unpublished work protected under the * * the copyright laws of the United States of America, all * * rights reserved. * * * * In the event this software is licensed for use by the United * * States Government, all use, duplication or disclosure by the * * United States Government is subject to restrictions as set * * forth in either subparagraph (c)(1)(ii) of the Rights in * * Technical Data And Computer Software Clause at DFARS * * 252.227-7013, or the Commercial Computer Software Restricted * * Rights Clause at FAR 52.221-19, whichever is applicable. * * * **************************************************************************** * * Facility: * * SNMP Extension Agent * * Abstract: * * Agent. * * This module contains the definitions for the table driven SNMP dlls. * * Author: * Miriam Amos Nihart, Kathy Faust * * Date: * 2/17/95 * * Revision History: * v0.11 11/15/95 ags added mib-2 definitions. * v0.12 Feb 14, 1996 ags changed SMIGet/SetBoolean to SMIGet/SetNSMBoolean * v0.13 Mar 12, 1996 kkf revised trap_control_block so that VarBindList * is built prior to queuing to the trap_queue * v0.14 Mar 19, 1996 kkf fixed numerous trap related bugs * v0.15 Mar 22, 1996 kkf fixed mib-2 code definition (should be 1 not 2) * */ #ifndef gennt_h #define gennt_h // Necessary includes. #include #include #include #include #include // MIB function actions. #define MIB_ACTION_GET ASN_RFC1157_GETREQUEST #define MIB_ACTION_SET ASN_RFC1157_SETREQUEST #define MIB_ACTION_GETNEXT ASN_RFC1157_GETNEXTREQUEST typedef enum { NSM_READ_ONLY, NSM_WRITE_ONLY, NSM_READ_WRITE, NSM_NO_ACCESS } access_mode_t ; typedef enum { NON_TABLE = 0 , TABLE = 1 } table_type_t ; typedef int (* PF)() ; typedef void (* PFV)() ; // // The variable structure is used to construct the variable table. // Each variable is represented by an entry in the table. The table // driven design indexes into the table to access information specific // to the variable, such as its oid, access, get and set routines. // "Holes" in the sequence of variables are represented by NULL entries. // typedef struct variable { AsnObjectIdentifier *oid ; BYTE type ; access_mode_t access_mode ; PF VarGet ; PF VarSet ; PF SMIGet ; PF SMISet ; } variable_t ; // // The class structure is used to construct the class_info table. It // is this table that represents the groups composing the mib view of // this dll. The table driven design uses this table in conjuction // with the variable tables to process the SNMP requests. // typedef struct class { table_type_t table ; AsnObjectIdentifier *oid ; unsigned long int var_index ; unsigned long int min_index ; unsigned long int max_index ; PF FindInstance ; PF FindNextInstance ; PF ConvertInstance ; PFV FreeInstance ; variable_t *variable ; } class_t ; // // The trap structure is used to construct the trap_info table. It // is this table that represents the trap for this mib view. The // table driven design uses this table to process the trap. A event // is sent to tell the Extendible Agent to call this dll's SnmpExtensionTrap // routine to "collect" a trap. This routine dequeues a trap from the // trap queue and then indexes into the trap_info table to fill in the // trap information for the trap pdu. // typedef struct trap_variable { AsnObjectIdentifier *oid ; PF SMIBuild ; } tvt_t ; typedef struct trap { AsnObjectIdentifier *oid ; /* enterprise OID */ AsnInteger type ; /* SNMP_GENERICTRAP_ENTERSPECIFIC */ AsnInteger specific ; /* trap value */ UINT number_of_variables ; tvt_t *variables ; } trap_t ; typedef struct q_hdr { char *lifo_a ; char *fifo_a ; } q_hdr_t ; typedef struct trap_control_block { q_hdr_t chain_q ; AsnObjectIdentifier enterprise ; AsnInteger genericTrap ; AsnInteger specificTrap ; AsnTimeticks timeStamp ; RFC1157VarBindList varBindList ; } tcb_t ; // // Definitions of the oid sequence : 1.3.6.1.4.1.36.2 also described as: // iso.memberbody.dod.internet.mib.private.dec.ema // #define ISO_CODE 1 #define ISO 1 #define ISO_SEQ ISO_CODE #define ISO_LENGTH 1 #define ORG_CODE 3 #define ORG 3 #define ORG_SEQ ISO_SEQ, ORG_CODE #define ORG_LENGTH ( ISO_LENGTH + 1 ) #define DOD_CODE 6 #define DOD 6 #define DOD_SEQ ORG_SEQ, DOD_CODE #define DOD_LENGTH ( ORG_LENGTH + 1 ) #define INTERNET_CODE 1 #define INTERNET 1 #define INTERNET_SEQ DOD_SEQ, INTERNET_CODE #define INTERNET_LENGTH ( DOD_LENGTH + 1 ) #define DIRECTORY_CODE 1 #define DIRECTORY 1 #define DIRECTORY_SEQ INTERNET_SEQ, DIRECTORY_CODE #define DIRECTORY_LENGTH ( INTERNET_LENGTH + 1 ) #define MGMT_CODE 2 #define MGMT 2 #define MGMT_SEQ INTERNET_SEQ, MGMT_CODE #define MGMT_LENGTH ( INTERNET_LENGTH + 1 ) #define EXPERIMENTAL_CODE 3 #define EXPERIMENTAL 3 #define EXPERIMENTAL_SEQ INTERNET_SEQ, EXPERIMENTAL_CODE #define EXPERIMENTAL_LENGTH ( INTERNET_LENGTH + 1 ) #define PRIVATE_CODE 4 #define PRIVATE 4 #define PRIVATE_SEQ INTERNET_SEQ, PRIVATE_CODE #define PRIVATE_LENGTH ( INTERNET_LENGTH + 1 ) #define ENTERPRISES_CODE 1 #define ENTERPRISES 1 #define ENTERPRISES_SEQ PRIVATE_SEQ, ENTERPRISES_CODE #define ENTERPRISES_LENGTH ( PRIVATE_LENGTH + 1 ) #define DEC_CODE 36 #define DEC 36 #define DEC_SEQ ENTERPRISES_SEQ, DEC_CODE #define DEC_LENGTH ( ENTERPRISES_LENGTH + 1 ) #define EMA_CODE 2 #define EMA 2 #define EMA_SEQ DEC_SEQ, EMA_CODE #define EMA_LENGTH ( DEC_LENGTH + 1 ) #define MIB_2_CODE 1 #define MIB_2 2 #define MIB_2_SEQ MGMT_SEQ, MIB_2_CODE #define MIB_2_LENGTH ( MGMT_LENGTH + 1 ) // // Macros // #define SUCCESS 1 #define FAILURE 0 #define CHECK_VARIABLE( VarBind, cindex, vindex, status ) \ { \ if ( VarBind->name.idLength > class_info[ cindex ].var_index ) \ { \ vindex = VarBind->name.ids[ class_info[ cindex ].var_index - 1 ] ; \ if ( ( vindex >= class_info[ cindex ].min_index ) && \ ( vindex <= class_info[ cindex ].max_index ) ) \ status = SUCCESS ; \ else \ status = FAILURE ; \ } \ else \ status = FAILURE ; \ } #define CHECK_ACCESS( cindex, vindex, PduAction, status ) \ { \ access_mode_t tmp ; \ \ tmp = class_info[ cindex ].variable[ vindex ].access_mode ; \ if ( PduAction == MIB_ACTION_SET ) \ { \ if ( ( tmp == NSM_WRITE_ONLY ) || ( tmp == NSM_READ_WRITE ) ) \ status = SUCCESS ; \ else \ status = FAILURE ; \ } \ else \ { \ if ( ( tmp == NSM_READ_ONLY ) || ( tmp == NSM_READ_WRITE ) ) \ status = SUCCESS ; \ else \ status = FAILURE ; \ } \ } // // These macros are used by the trap logic. There is only one queue // used by the generic code - a trap queue. These macros can be used // elsewhere. The macros assume that the queue structure is the first // element in the queue entry structure. // #define QUEUE_ENTER( queue_head, entry ) \ { \ q_hdr_t *old_chain ; \ \ old_chain = (q_hdr_t *)(queue_head.lifo_a) ; \ entry->chain_q.lifo_a = queue_head.lifo_a ; \ queue_head.lifo_a = (char *)entry ; \ entry->chain_q.fifo_a = NULL ; \ if ( old_chain == NULL ) \ queue_head.fifo_a = (char *)entry ; \ else \ old_chain->fifo_a = (char *)entry ; \ } #define QUEUE_REMOVE( queue_head, entry ) \ { \ q_hdr_t *dequeue_chain ; \ q_hdr_t *prev_chain ; \ \ dequeue_chain = (q_hdr_t *)(queue_head.fifo_a) ; \ entry = (tcb_t *)dequeue_chain ; \ if ( dequeue_chain != NULL ) \ { \ prev_chain = (q_hdr_t *)(dequeue_chain->fifo_a) ; \ queue_head.fifo_a = (char *)prev_chain ; \ if ( prev_chain != NULL ) \ prev_chain->lifo_a = NULL ; \ else \ queue_head.lifo_a = NULL ; \ } \ } // // Function Prototypes // UINT UserMibInit( IN OUT HANDLE *hPollForTrapEvent ) ; void TrapInit( IN OUT HANDLE *hPollForTrapEvent ) ; UINT ResolveVarBind( IN OUT RFC1157VarBind *VarBind , // Variable Binding to resolve IN UINT PduAction ) ; // Action specified in PDU UINT FindClass( IN RFC1157VarBind *VarBind, // Variable Binding IN OUT UINT *cindex ) ; // Index into class_info table UINT ResolveGetNext( IN OUT RFC1157VarBind *VarBind, // Variable Binding IN OUT UINT *cindex, // Class Info table index IN OUT UINT *vindex , // Variable table index OUT AsnObjectIdentifier *instance ) ; void SetupTrap( IN OUT tcb_t **entryBlock , IN int trapIndex ) ; UINT AddTrapVar( IN tcb_t *entry , IN int trapIndex , IN int varIndex , IN AsnObjectIdentifier *instance , IN char *value ) ; void PostTrap( IN tcb_t *entry , IN int trapIndex ) ; // // Externals // extern UINT SMIGetInteger() ; extern UINT SMIGetNSMBoolean() ; extern UINT SMIGetBIDTEnum() ; extern UINT SMIGetOctetString() ; extern UINT SMIGetObjectId() ; extern UINT SMIGetCounter() ; extern UINT SMIGetGauge() ; extern UINT SMIGetTimeTicks() ; extern UINT SMIGetIpAddress() ; extern UINT SMIGetDispString() ; extern UINT SMISetInteger() ; extern UINT SMISetBIDTEnum() ; extern UINT SMISetOctetString() ; extern UINT SMISetObjectId() ; extern UINT SMISetCounter() ; extern UINT SMISetGauge() ; extern UINT SMISetTimeTicks() ; extern UINT SMISetIpAddress() ; extern UINT SMISetDispString() ; extern UINT SMIBuildInteger() ; extern UINT SMISetNSMBoolean() ; extern UINT SMIBuildBIDTEnum() ; extern UINT SMIBuildOctetString() ; extern UINT SMIBuildObjectId() ; extern UINT SMIBuildCounter() ; extern UINT SMIBuildGauge() ; extern UINT SMIBuildTimeTicks() ; extern UINT SMIBuildIpAddress() ; extern UINT SMIBuildDispString() ; extern void SMIFree() ; extern q_hdr_t trap_q ; extern HANDLE hEnabledTraps ; extern HANDLE hTrapQMutex ; // Microsoft MIB Specifics. #define MAX_STRING_LEN 255 #endif /* gennt_h */