You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
391 lines
13 KiB
391 lines
13 KiB
/*
|
|
* 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 */
|
|
|
|
|