392 lines
13 KiB
C
392 lines
13 KiB
C
/*
|
||
* 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 <snmp.h>
|
||
#include <stdlib.h>
|
||
#include <malloc.h>
|
||
#include <memory.h>
|
||
#include <string.h>
|
||
|
||
|
||
// 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 */
|
||
|
||
|