547 lines
17 KiB
C
547 lines
17 KiB
C
/*
|
||
* HrNetworkEntry.c v0.10
|
||
* Generated in conjunction with Management Factory scripts:
|
||
* script version: SNMPv1, 0.16, Apr 25, 1996
|
||
* project: D:\TEMP\EXAMPLE\HOSTMIB
|
||
****************************************************************************
|
||
* *
|
||
* (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:
|
||
*
|
||
* Windows NT SNMP Extension Agent
|
||
*
|
||
* Abstract:
|
||
*
|
||
* This module contains the code for dealing with the get, set, and
|
||
* instance name routines for the HrNetworkEntry. Actual instrumentation code is
|
||
* supplied by the developer.
|
||
*
|
||
* Functions:
|
||
*
|
||
* A get and set routine for each attribute in the class.
|
||
*
|
||
* The routines for instances within the class.
|
||
*
|
||
* Author:
|
||
*
|
||
* D. D. Burns @ Webenable Inc
|
||
*
|
||
* Revision History:
|
||
*
|
||
* V1.00 - 04/28/97 D. D. Burns Genned: Thu Nov 07 16:42:33 1996
|
||
*
|
||
*/
|
||
|
||
|
||
#include <nt.h>
|
||
#include <windef.h>
|
||
#include <ntrtl.h>
|
||
#include <nturtl.h>
|
||
#include <windows.h>
|
||
#include <malloc.h>
|
||
|
||
#include <snmp.h>
|
||
|
||
#include "mib.h"
|
||
#include "smint.h"
|
||
#include "hostmsmi.h"
|
||
#include "user.h" /* Developer supplied include file */
|
||
#include "HMCACHE.H" /* Cache-related definitions */
|
||
#include "HRDEVENT.H" /* HrDevice Table-related definitions */
|
||
#include "iphlpapi.h" /* Access to MIB2 Utility function */
|
||
|
||
|
||
|
||
/*
|
||
* GetHrNetworkIfIndex
|
||
* The value of the ifIndex which corresponds to this network device.
|
||
*
|
||
* Gets the value for HrNetworkIfIndex.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* outvalue address to return variable value
|
||
* accesss Reserved for future security use
|
||
* instance address of instance name as ordered native
|
||
* data type(s)
|
||
*
|
||
* Return Codes:
|
||
*
|
||
* Standard PDU error codes.
|
||
*
|
||
* SNMP_ERRORSTATUS_NOERROR Successful get
|
||
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
|
||
* mibtget.c v0.10
|
||
*
|
||
| =============== From WebEnable Design Spec Rev 3 04/11/97==================
|
||
| hrNetworkIfIndex
|
||
|
|
||
| ACCESS SYNTAX
|
||
| read-only INTEGER
|
||
|
|
||
| "The value of ifIndex which corresponds to this network device."
|
||
|
|
||
| DISCUSSION:
|
||
|
|
||
| <POA-13> A mechanism by which I can map a network interface device (as found
|
||
| in the course of populating the hrDeviceTable) to the "ifIndex" value in
|
||
| MIB-II needs to be described to me.
|
||
|
|
||
| RESOLVED >>>>>>>>
|
||
| <POA-13> We expose this info via MIB2UTIL.DLL.
|
||
| RESOLVED >>>>>>>>
|
||
|
|
||
|============================================================================
|
||
| 1.3.6.1.2.1.25.3.4.1.1.<instance>
|
||
| | | | |
|
||
| | | | *-HrNetworkIfIndex
|
||
| | | *-HrNetworkEntry
|
||
| | *-HrNetworkTable
|
||
| *-hrDevice
|
||
*/
|
||
|
||
UINT
|
||
GetHrNetworkIfIndex(
|
||
OUT Integer *outvalue ,
|
||
IN Access_Credential *access ,
|
||
IN InstanceName *instance )
|
||
|
||
{
|
||
ULONG index; /* As fetched from instance structure */
|
||
CACHEROW *row; /* Row entry fetched from cache */
|
||
|
||
|
||
/*
|
||
| Grab the instance information
|
||
*/
|
||
index = GET_INSTANCE(0);
|
||
|
||
/*
|
||
| Use it to find the right entry in the cache
|
||
*/
|
||
if ((row = FindTableRow(index, &hrDevice_cache)) == NULL) {
|
||
return SNMP_ERRORSTATUS_GENERR;
|
||
}
|
||
|
||
|
||
/*
|
||
| By convention with "Gen_HrNetwork_Cache()", the "Hidden Context" attribute
|
||
| for the selected row is the value to be returned by hrNetworkIfIndex.
|
||
*/
|
||
*outvalue = row->attrib_list[HIDDEN_CTX].u.unumber_value;
|
||
|
||
return SNMP_ERRORSTATUS_NOERROR ;
|
||
|
||
} /* end of GetHrNetworkIfIndex() */
|
||
|
||
|
||
/*
|
||
* HrNetworkEntryFindInstance
|
||
*
|
||
* This routine is used to verify that the specified instance is
|
||
* valid.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* FullOid Address for the full oid - group, variable,
|
||
* and instance information
|
||
* instance Address for instance specification as an oid
|
||
*
|
||
* Return Codes:
|
||
*
|
||
* SNMP_ERRORSTATUS_NOERROR Instance found and valid
|
||
* SNMP_ERRORSTATUS_NOSUCHNAME Invalid instance
|
||
*
|
||
*/
|
||
|
||
UINT
|
||
HrNetworkEntryFindInstance( IN ObjectIdentifier *FullOid ,
|
||
IN OUT ObjectIdentifier *instance )
|
||
{
|
||
UINT tmp_instance; /* Instance arc value */
|
||
CACHEROW *row; /* Row entry fetched from cache */
|
||
|
||
//
|
||
// Developer instrumentation code to find appropriate instance goes here.
|
||
// For non-tables, it is not necessary to modify this routine. However, if
|
||
// there is any context that needs to be set, it can be done here.
|
||
//
|
||
|
||
if ( FullOid->idLength <= HRNETWORKENTRY_VAR_INDEX )
|
||
// No instance was specified
|
||
return SNMP_ERRORSTATUS_NOSUCHNAME ;
|
||
else if ( FullOid->idLength != HRNETWORKENTRY_VAR_INDEX + 1 )
|
||
// Instance length is more than 1
|
||
return SNMP_ERRORSTATUS_NOSUCHNAME ;
|
||
else
|
||
// The only valid instance for a non-table are instance 0. If this
|
||
// is a non-table, the following code validates the instances. If this
|
||
// is a table, developer modification is necessary below.
|
||
|
||
tmp_instance = FullOid->ids[ HRNETWORKENTRY_VAR_INDEX ] ;
|
||
|
||
/*
|
||
| For hrNetworkTable, the instance arc(s) is a single arc, and it must
|
||
| correctly select an entry in the hrDeviceTable cache.
|
||
|
|
||
| Check that here.
|
||
*/
|
||
if ( (row = FindTableRow(tmp_instance, &hrDevice_cache)) == NULL ) {
|
||
return SNMP_ERRORSTATUS_NOSUCHNAME ;
|
||
}
|
||
else
|
||
{
|
||
/*
|
||
| The instance arc selects an hrDeviceTable row entry, but is that
|
||
| entry actually for a device of type "Network"?
|
||
|
|
||
| (We examine the last arc of the OID that specifies the device
|
||
| type in the row entry selected by the instance arc).
|
||
*/
|
||
if (row->attrib_list[HRDV_TYPE].u.unumber_value !=
|
||
HRDV_TYPE_LASTARC_NETWORK) {
|
||
|
||
return SNMP_ERRORSTATUS_NOSUCHNAME;
|
||
}
|
||
|
||
// the instance is valid. Create the instance portion of the OID
|
||
// to be returned from this call.
|
||
|
||
instance->ids[ 0 ] = tmp_instance ;
|
||
instance->idLength = 1 ;
|
||
}
|
||
|
||
return SNMP_ERRORSTATUS_NOERROR ;
|
||
|
||
} /* end of HrNetworkEntryFindInstance() */
|
||
|
||
|
||
|
||
/*
|
||
* HrNetworkEntryFindNextInstance
|
||
*
|
||
* This routine is called to get the next instance. If no instance
|
||
* was passed than return the first instance (1).
|
||
*
|
||
* Arguments:
|
||
*
|
||
* FullOid Address for the full oid - group, variable,
|
||
* and instance information
|
||
* instance Address for instance specification as an oid
|
||
*
|
||
* Return Codes:
|
||
*
|
||
* SNMP_ERRORSTATUS_NOERROR Instance found and valid
|
||
* SNMP_ERRORSTATUS_NOSUCHNAME Invalid instance
|
||
*
|
||
*/
|
||
|
||
UINT
|
||
HrNetworkEntryFindNextInstance( IN ObjectIdentifier *FullOid ,
|
||
IN OUT ObjectIdentifier *instance )
|
||
{
|
||
//
|
||
// Developer supplied code to find the next instance of class goes here.
|
||
// If this is a class with cardinality 1, no modification of this routine
|
||
// is necessary unless additional context needs to be set.
|
||
// If the FullOid does not specify an instance, then the only instance
|
||
// of the class is returned. If this is a table, the first row of the
|
||
// table is returned.
|
||
//
|
||
// If an instance is specified and this is a non-table class, then NOSUCHNAME
|
||
// is returned so that correct MIB rollover processing occurs. If this is
|
||
// a table, then the next instance is the one following the current instance.
|
||
// If there are no more instances in the table, return NOSUCHNAME.
|
||
//
|
||
|
||
CACHEROW *row;
|
||
ULONG tmp_instance;
|
||
|
||
|
||
if ( FullOid->idLength <= HRNETWORKENTRY_VAR_INDEX )
|
||
{
|
||
/*
|
||
| Too short: must return the instance arc that selects the first
|
||
| entry in the table if there is one.
|
||
*/
|
||
tmp_instance = 0;
|
||
}
|
||
else {
|
||
/*
|
||
| There is at least one instance arc. Even if it is the only arc
|
||
| we use it as the "index" in a request for the "NEXT" one.
|
||
*/
|
||
tmp_instance = FullOid->ids[ HRNETWORKENTRY_VAR_INDEX ] ;
|
||
}
|
||
|
||
/* Now go off and try to find the next instance in the table */
|
||
if ((row = FindNextTableRow(tmp_instance, &hrDevice_cache)) == NULL) {
|
||
return SNMP_ERRORSTATUS_NOSUCHNAME ;
|
||
}
|
||
|
||
/*
|
||
| The instance arc selects an hrDeviceTable row entry, but is that
|
||
| entry actually for a device of type "Network"?
|
||
|
|
||
| (We examine the last arc of the OID that specifies the device
|
||
| type in the row entry selected by the instance arc).
|
||
*/
|
||
do {
|
||
if (row->attrib_list[HRDV_TYPE].u.unumber_value ==
|
||
HRDV_TYPE_LASTARC_NETWORK) {
|
||
|
||
/* Found an hrDeviceTable entry for the right device type */
|
||
break;
|
||
}
|
||
|
||
/* Step to the next row in the table */
|
||
row = GetNextTableRow( row );
|
||
}
|
||
while ( row != NULL );
|
||
|
||
/* If we found a proper device-type row . . . */
|
||
if ( row != NULL) {
|
||
instance->ids[ 0 ] = row->index ;
|
||
instance->idLength = 1 ;
|
||
}
|
||
else {
|
||
|
||
/*
|
||
| Fell off the end of the hrDeviceTable without finding a row
|
||
| entry that had the right device type.
|
||
*/
|
||
return SNMP_ERRORSTATUS_NOSUCHNAME ;
|
||
}
|
||
|
||
return SNMP_ERRORSTATUS_NOERROR ;
|
||
|
||
} /* end of HrNetworkEntryFindNextInstance() */
|
||
|
||
|
||
|
||
/*
|
||
* HrNetworkEntryConvertInstance
|
||
*
|
||
* This routine is used to convert the object id specification of an
|
||
* instance into an ordered native representation. The object id format
|
||
* is that object identifier that is returned from the Find Instance
|
||
* or Find Next Instance routines. It is NOT the full object identifier
|
||
* that contains the group and variable object ids as well. The native
|
||
* representation is an argc/argv-like structure that contains the
|
||
* ordered variables that define the instance. This is specified by
|
||
* the MIB's INDEX clause. See RFC 1212 for information about the INDEX
|
||
* clause.
|
||
*
|
||
*
|
||
* Arguments:
|
||
*
|
||
* oid_spec Address of the object id instance specification
|
||
* native_spec Address to return the ordered native instance
|
||
* specification
|
||
*
|
||
* Return Codes:
|
||
*
|
||
* SUCCESS Conversion complete successfully
|
||
* FAILURE Unable to convert object id into native format
|
||
*
|
||
*/
|
||
|
||
UINT
|
||
HrNetworkEntryConvertInstance( IN ObjectIdentifier *oid_spec ,
|
||
IN OUT InstanceName *native_spec )
|
||
{
|
||
static char *array; /* The address of this (char *) is passed back */
|
||
/* as though it were an array of length 1 of these */
|
||
/* types. */
|
||
|
||
static ULONG inst; /* The address of this ULONG is passed back */
|
||
/* (Obviously, no "free()" action is needed) */
|
||
|
||
/* We only expect the one arc in "oid_spec" */
|
||
inst = oid_spec->ids[0];
|
||
array = (char *) &inst;
|
||
|
||
native_spec->count = 1;
|
||
native_spec->array = &array;
|
||
return SUCCESS ;
|
||
|
||
} /* end of HrNetworkEntryConvertInstance() */
|
||
|
||
|
||
|
||
|
||
/*
|
||
* HrNetworkEntryFreeInstance
|
||
*
|
||
* This routine is used to free an ordered native representation of an
|
||
* instance name.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* instance Address to return the ordered native instance
|
||
* specification
|
||
*
|
||
* Return Codes:
|
||
*
|
||
*
|
||
*/
|
||
|
||
void
|
||
HrNetworkEntryFreeInstance( IN OUT InstanceName *instance )
|
||
{
|
||
|
||
/* No action needed for hrNetwork Table */
|
||
} /* end of HrNetworkEntryFreeInstance() */
|
||
|
||
/*
|
||
| End of Generated Code
|
||
*/
|
||
|
||
/* Gen_HrNetwork_Cache - Gen. a initial cache for HrDevice PROCESSOR Table */
|
||
/* Gen_HrNetwork_Cache - Gen. a initial cache for HrDevice PROCESSOR Table */
|
||
/* Gen_HrNetwork_Cache - Gen. a initial cache for HrDevice PROCESSOR Table */
|
||
|
||
BOOL
|
||
Gen_HrNetwork_Cache(
|
||
ULONG type_arc
|
||
)
|
||
|
||
/*
|
||
| EXPLICIT INPUTS:
|
||
|
|
||
| "type_arc" is the number "n" to be used as the last arc in the
|
||
| device-type OID:
|
||
|
|
||
| 1.3.6.1.2.1.25.3.1.n
|
||
| | | |
|
||
| | | * Identifying arc for type
|
||
| | *-hrDeviceTypes (OIDs specifying device types)
|
||
| *-hrDevice
|
||
|
|
||
| for devices created by this cache-population routine.
|
||
|
|
||
| IMPLICIT INPUTS:
|
||
|
|
||
| None.
|
||
|
|
||
| OUTPUTS:
|
||
|
|
||
| On Success:
|
||
| Function returns TRUE indicating that the HrDevice cache has been fully
|
||
| populated with all rows required for Network devices.
|
||
|
|
||
| On any Failure:
|
||
| Function returns FALSE (indicating "not enough storage" or other
|
||
| internal logic error).
|
||
|
|
||
| THE BIG PICTURE:
|
||
|
|
||
| At subagent startup time, the cache for each table in the MIB is
|
||
| populated with rows for each row in the table. This function is
|
||
| invoked by the start-up code in "Gen_HrDevice_Cache()" to
|
||
| populate the cache for the HrDevice table with Network-device
|
||
| specific entries.
|
||
|
|
||
| OTHER THINGS TO KNOW:
|
||
|
|
||
| Since all the attributes in the HrNetwork "sub" table are computed
|
||
| upon request (based on cached information in a selected row in the
|
||
| HrDevice table) there is no need to build a cache specifically for
|
||
| this sub-table. (This routine is only loading the HrDevice cache.
|
||
| --------
|
||
|
|
||
| This function holds a convention with the GET routines earlier in
|
||
| this module that the "HIDDEN_CTX" attribute for Network-devices
|
||
| contains a string that is the value of "hrNetworkIfIndex".
|
||
|============================================================================
|
||
| 1.3.6.1.2.1.25.3.4.1...
|
||
| | | |
|
||
| | | *-HrNetworkEntry
|
||
| | *-HrNetworkTable
|
||
| *-hrDevice
|
||
*/
|
||
{
|
||
DWORD dwBytesRequired;
|
||
MIB_IFTABLE *iftable; /* --> Heap storage containing table */
|
||
UINT i; /* iftable index */
|
||
|
||
|
||
/*
|
||
| We fetch the IfTable from the Mib2 subsection of the agent and for each
|
||
| network interface (ie for every entry in the table) we create a row in
|
||
| the hrDeviceTable.
|
||
|
|
||
| The HIDDEN_CTX attribute value in the row will simply be the "dwIndex"
|
||
| entry in the from the iftable entry from which the row was generated.
|
||
| This becomes the value of "hrNetworkIfIndex".
|
||
*/
|
||
|
||
/* Initialize */
|
||
dwBytesRequired = 0;
|
||
iftable = NULL;
|
||
|
||
/* Ask for the size of the table from "iphlpapi" */
|
||
if (GetIfTable(iftable, &dwBytesRequired, TRUE) != ERROR_INSUFFICIENT_BUFFER) {
|
||
return ( FALSE );
|
||
}
|
||
|
||
/* Allocate necessary memory */
|
||
if ((iftable = (MIB_IFTABLE *)malloc(dwBytesRequired)) == NULL) {
|
||
return ( FALSE );
|
||
}
|
||
|
||
/* Ask for the table information from "iphlpapi" */
|
||
if (GetIfTable(iftable, &dwBytesRequired, TRUE) != NO_ERROR ) {
|
||
|
||
/* Release */
|
||
free(iftable);
|
||
|
||
/* Something blew */
|
||
return ( FALSE );
|
||
}
|
||
|
||
/* Sweep thru any table creating hrDevice rows */
|
||
for (i = 0; i < iftable->dwNumEntries; i += 1) {
|
||
|
||
/*
|
||
| "Hidden Context" is the ifTable index passed in from the GetIfTable()
|
||
|
|
||
| It will be returned as the value of "hrNetworkIfIndex" by the Get
|
||
| function.
|
||
*/
|
||
|
||
if (AddHrDeviceRow(type_arc, // DeviceType OID Last-Arc
|
||
(unsigned char *) &iftable->table[i].bDescr, // Device Description
|
||
&iftable->table[i].dwIndex, // Hidden Ctx "index"
|
||
CA_NUMBER // Hidden Ctx "type"
|
||
) == NULL ) {
|
||
|
||
/* Release */
|
||
free(iftable);
|
||
|
||
/* Something blew */
|
||
return ( FALSE );
|
||
}
|
||
}
|
||
|
||
/* Release */
|
||
free(iftable);
|
||
|
||
return ( TRUE );
|
||
}
|