Leaked source code of windows server 2003
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

/*
* 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 */