Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

1646 lines
44 KiB

//*****************************************************************************
//
// Name: snmputil.c
//
// Description: Provides functions to read tables of data from snmp.
//
// Used by: netstat.exe, arp.exe, route.exe
//
// History:
// 01/12/94 JayPh Created.
// 18-Feb-97 MohsinA Fixing.
// Copied from net\tcpip\commands\common2\snmpinfo.c
//*****************************************************************************
//*****************************************************************************
//
// Copyright (c) 1994 by Microsoft Corp. All rights reserved.
//
//*****************************************************************************
// #define DEBUG
//
// Include Files
//
#include "precomp.h"
#include <time.h>
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <snmp.h>
#include "snmputil.h"
//
//
ulong verbose = 0;
//
// Definitions
//
#define MAX_ID_LENGTH 50
#define MAX_RETRY_COUNT 10
// Interface ID values
#define ID_IF_INDEX 1
#define ID_IF_DESC 2
#define ID_IF_TYPE 3
#define ID_IF_MTU 4
#define ID_IF_SPEED 5
#define ID_IF_PHYSADDR 6
#define ID_IF_ADMINSTATUS 7
#define ID_IF_OPERSTATUS 8
#define ID_IF_LASTCHANGE 9
#define ID_IF_INOCTETS 10
#define ID_IF_INUCASTPKTS 11
#define ID_IF_INNUCASTPKTS 12
#define ID_IF_INDISCARDS 13
#define ID_IF_INERRORS 14
#define ID_IF_INUKNOWNPROTOS 15
#define ID_IF_OUTOCTETS 16
#define ID_IF_OUTUCASTPKTS 17
#define ID_IF_OUTNUCASTPKTS 18
#define ID_IF_OUTDISCARDS 19
#define ID_IF_OUTERRORS 20
#define ID_IF_OUTQLEN 21
// IP ID Values
#define ID_IP_FORWARDING 1
#define ID_IP_DEFAULTTTL 2
#define ID_IP_INRECEIVES 3
#define ID_IP_INHDRERRORS 4
#define ID_IP_INADDRERRORS 5
#define ID_IP_FORWDATAGRAMS 6
#define ID_IP_INUNKNOWNPROTOS 7
#define ID_IP_INDISCARDS 8
#define ID_IP_INDELIVERS 9
#define ID_IP_OUTREQUESTS 10
#define ID_IP_OUTDISCARDS 11
#define ID_IP_OUTNOROUTES 12
#define ID_IP_REASMTIMEOUTS 13
#define ID_IP_REASMREQDS 14
#define ID_IP_REASMOKS 15
#define ID_IP_REASMFAILS 16
#define ID_IP_FRAGOKS 17
#define ID_IP_FRAGFAILS 18
#define ID_IP_FRAGCREATES 19
#define ID_IP_ADDRTABLE 20
#define ID_IP_ROUTETABLE 21
#define ID_IP_ARPTABLE 22
#define ID_IP_ROUTINGDISCARDS 23
// IPAddr ID Values
#define ID_IPADDR_ADDR 1
#define ID_IPADDR_INDEX 2
#define ID_IPADDR_MASK 3
#define ID_IPADDR_BCASTADDR 4
#define ID_IPADDR_REASMSIZE 5
// Route ID values
#define ID_ROUTE_DEST 1
#define ID_ROUTE_IFINDEX 2
#define ID_ROUTE_METRIC1 3
#define ID_ROUTE_METRIC2 4
#define ID_ROUTE_METRIC3 5
#define ID_ROUTE_METRIC4 6
#define ID_ROUTE_NEXTHOP 7
#define ID_ROUTE_TYPE 8
#define ID_ROUTE_PROTO 9
#define ID_ROUTE_AGE 10
#define ID_ROUTE_MASK 11
#define ID_ROUTE_METRIC5 12
// ARP ID Values
#define ID_ARP_IFINDEX 1
#define ID_ARP_PHYSADDR 2
#define ID_ARP_NETADDR 3
#define ID_ARP_TYPE 4
// ICMP ID Values
#define ID_ICMP_INMSGS 1
#define ID_ICMP_INERRORS 2
#define ID_ICMP_INDESTUNREACHES 3
#define ID_ICMP_INTIMEEXCDS 4
#define ID_ICMP_INPARMPROBS 5
#define ID_ICMP_INSRCQUENCHS 6
#define ID_ICMP_INREDIRECTS 7
#define ID_ICMP_INECHOS 8
#define ID_ICMP_INECHOREPS 9
#define ID_ICMP_INTIMESTAMPS 10
#define ID_ICMP_INTIMESTAMPREPS 11
#define ID_ICMP_INADDRMASKS 12
#define ID_ICMP_INADDRMASKREPS 13
#define ID_ICMP_OUTMSGS 14
#define ID_ICMP_OUTERRORS 15
#define ID_ICMP_OUTDESTUNREACHES 16
#define ID_ICMP_OUTTIMEEXCDS 17
#define ID_ICMP_OUTPARMPROBS 18
#define ID_ICMP_OUTSRCQUENCHS 19
#define ID_ICMP_OUTREDIRECTS 20
#define ID_ICMP_OUTECHOS 21
#define ID_ICMP_OUTECHOREPS 22
#define ID_ICMP_OUTTIMESTAMPS 23
#define ID_ICMP_OUTTIMESTAMPREPS 24
#define ID_ICMP_OUTADDRMASKS 25
#define ID_ICMP_OUTADDRMASKREPS 26
// TCP ID Values
#define ID_TCP_RTOALGORITHM 1
#define ID_TCP_RTOMIN 2
#define ID_TCP_RTOMAX 3
#define ID_TCP_MAXCONN 4
#define ID_TCP_ACTIVEOPENS 5
#define ID_TCP_PASSIVEOPENS 6
#define ID_TCP_ATTEMPTFAILS 7
#define ID_TCP_ESTABRESETS 8
#define ID_TCP_CURRESTABS 9
#define ID_TCP_INSEGS 10
#define ID_TCP_OUTSEGS 11
#define ID_TCP_RETRANSSEGS 12
#define ID_TCP_CONNTABLE 13
#define ID_TCP_INERRS 14
#define ID_TCP_OUTRSTS 15
// TCP CONN ID Values
#define ID_TCPCONN_STATE 1
#define ID_TCPCONN_LOCALADDR 2
#define ID_TCPCONN_LOCALPORT 3
#define ID_TCPCONN_REMOTEADDR 4
#define ID_TCPCONN_REMOTEPORT 5
// UDP ID Values
#define ID_UDP_INDATAGRAMS 1
#define ID_UDP_NOPORTS 2
#define ID_UDP_INERRORS 3
#define ID_UDP_OUTDATAGRAMS 4
#define ID_UDP_CONNTABLE 5
// UDP CONN ID Values
#define ID_UDPCONN_LOCALADDR 1
#define ID_UDPCONN_LOCALPORT 2
//
// Structure Definitions
//
typedef struct _OIDdef {
ulong Length;
ulong Val[MAX_ID_LENGTH];
ulong EntElemOffset;
ulong BackOffset;
} OIDdef;
//
// Local Function Prototypes
//
ulong ReadTable( GenericTable *pList, ulong Type, ulong Size );
void SaveData_IF( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid );
void SaveData_IP( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid );
void SaveData_IPAddr( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid );
void SaveData_ROUTE( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid );
void SaveData_ARP( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid );
void SaveData_ICMP( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid );
void SaveData_TCP( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid );
void SaveData_TCPCONN( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid );
void SaveData_UDP( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid );
void SaveData_UDPCONN( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid );
//
// Global Variables
//
// These are used to create object id's
OIDdef PreambleDef = { 6, { 1, 3, 6, 1, 2, 1 }, 0, 0 };
OIDdef IfInfoDef = { 4, { 2, 2, 1, 1 }, 9, 2 };
OIDdef IPInfoDef = { 2, { 4, 1 }, 7, 1 };
OIDdef IPAddrInfoDef = { 4, { 4, 20, 1, 1 }, 9, 2 };
OIDdef RouteInfoDef = { 4, { 4, 21, 1, 1 }, 9, 2 };
OIDdef ARPInfoDef = { 4, { 4, 22, 1, 1 }, 9, 2 };
OIDdef ICMPInfoDef = { 2, { 5, 1, }, 7, 1 };
OIDdef TCPInfoDef = { 2, { 6, 1 }, 7, 1 };
OIDdef TCPConnDef = { 4, { 6, 13, 1, 1 }, 9, 2 };
OIDdef UDPInfoDef = { 2, { 7, 1 }, 7, 1 };
OIDdef UDPConnDef = { 4, { 7, 5, 1, 1 }, 9, 2 };
// These are used to hold the addresses of the functions we use in inetmib1.dll
FARPROC gQueryAddr;
FARPROC gInitAddr;
//
// From //ORVILLE/RAZZLE/src/net/snmp/agent/mgmtapi/mgmtapi.c
// See //ORVILLE/RAZZLE/src/public/sdk/inc/snmp.h
// SNMP_FUNC_TYPE is WINAPI.
//
// These pointer to functions are imported from mgmtapi.dll (available
// on nt server only with snmp service, but can be copied).
// - MohsinA, 11-Mar-97.
//
BOOL (SNMP_FUNC_TYPE * pSnmpMgrOidToStr )( IN AsnObjectIdentifier *oid,
OUT LPSTR *string );
//
// Exported Functions
//
//*****************************************************************************
//
// Name: InitSnmp
//
// Description: Set up to use inetmib1.dll. Load the DLL, and get addresses
// for the interesting procedures.
// NOTE: This function must be called before calling GetTable().
//
// Parameters: void.
//
// Returns: ulong: NO_ERROR if successful, error code otherwise.
//
// History:
// 12/20/93 JayPh Created.
//
//*****************************************************************************
ulong InitSnmp( void )
{
HANDLE hExtension;
ulong TimeZeroReference;
HANDLE hPollForTrapEvent;
AsnObjectIdentifier SupportedView;
HANDLE mgmtapi_dll;
TimeZeroReference = (ulong)time( (time_t *)0 );
// Load the management apis, only on servers, but useful for
// figuring out snmp jargon.
if( verbose ){
mgmtapi_dll = LoadLibraryA( "mgmtapi.dll" );
if( mgmtapi_dll ){
pSnmpMgrOidToStr
= (LPVOID) GetProcAddress( mgmtapi_dll, "SnmpMgrOidToStr" );
}
if( !mgmtapi_dll || !pSnmpMgrOidToStr ){
DEBUG_PRINT((
"InitSnmp: mgmtapi.dll:pSnmpMgrOidToStr() not found.\n"
));
}
}
// Load inetmib1.dll and get proc address for SnmpExtensionQuery
hExtension = LoadLibraryA( "inetmib1.dll" );
if ( hExtension == NULL )
{
DEBUG_PRINT(("InitSnmp: cannot load inetmib1.dll\n"));
return ( ERROR_FILE_NOT_FOUND );
}
gInitAddr = GetProcAddress( hExtension, "SnmpExtensionInit" );
if ( gInitAddr == NULL )
{
DEBUG_PRINT(("InitSnmp: inetmib1.dll:SnmpExtensionInit missing.\n"));
return ( ERROR_FILE_NOT_FOUND );
}
gQueryAddr = GetProcAddress( hExtension, "SnmpExtensionQuery" );
if ( gQueryAddr == NULL )
{
DEBUG_PRINT(("InitSnmp: inetmib1.dll:SnmpExtensionQuery missing.\n"));
return ( ERROR_FILE_NOT_FOUND );
}
// Initialize the extension DLL
(*gInitAddr)( TimeZeroReference, &hPollForTrapEvent, &SupportedView );
return ( NO_ERROR );
}
//*****************************************************************************
//
// Name: GetTable
//
// Description: Gets a consistent table from snmp. Consistency is achieved by
// reading the table, reading the table a second time and
// comparing the two. If they match, we are done. If they don't
// match, we read the table again and compare again. Repeating
// until we have a match, or our retry count exceeds a threshold.
//
// Parameters: ulong Type: type of table to get.
// ulong *pResult: pointer to location to receive the result code.
//
// Returns: void *: NULL if some error, otherwise pointer to table.
//
// History:
// 01/12/94 JayPh Created.
// 18-Feb-97 MohsinA Removed while loop and pList1.
//*****************************************************************************
void *GetTable( ulong Type, ulong *pResult )
{
GenericTable *pList2;
ulong Result;
ulong RetryCount = 0;
ulong Size;
if( verbose ){
fprintf(stderr, "GetTable: type = %d\n", Type );
}
if ( Type > TYPE_UDPCONN )
{
*pResult = ERROR_INVALID_PARAMETER;
return ( NULL );
}
// Allocate memory for the list heads
switch ( Type )
{
case TYPE_IF:
Size = sizeof( IfEntry ) + MAX_IFDESCR_LEN;
break;
case TYPE_IP:
Size = sizeof( IpEntry );
break;
case TYPE_IPADDR:
Size = sizeof( IpAddrEntry );
break;
case TYPE_ROUTE:
Size = sizeof( RouteEntry );
break;
case TYPE_ARP:
Size = sizeof( ArpEntry );
break;
case TYPE_ICMP:
Size = sizeof( IcmpEntry );
break;
case TYPE_TCP:
Size = sizeof( TcpEntry );
break;
case TYPE_TCPCONN:
Size = sizeof( TcpConnEntry );
break;
case TYPE_UDP:
Size = sizeof( UdpEntry );
break;
case TYPE_UDPCONN:
Size = sizeof( UdpConnEntry );
break;
}
// Don't need pList1 - MohsinA, 18-Feb-97.
pList2 = (GenericTable *)SNMP_malloc( Size );
if ( pList2 == NULL )
{
*pResult = ERROR_NOT_ENOUGH_MEMORY;
return ( NULL );
}
InitializeListHead( &pList2->ListEntry );
// Read the table into List2
Result = ReadTable( pList2, Type, Size );
if ( Result != NO_ERROR )
{
FreeTable( pList2 );
*pResult = Result;
return ( NULL );
}
// Useless while loop removed. - MohsinA, 18-Feb-97.
*pResult = NO_ERROR;
return ( pList2 );
}
//*****************************************************************************
//
// Name: FreeTable
//
// Description: Free all entries in the list, including the list head.
//
// Parameters: GenericTable *pList: pointer to head of list.
//
// Returns: void.
//
// History:
// 01/12/94 JayPh Created.
//
//*****************************************************************************
void FreeTable( GenericTable *pList )
{
GenericTable *pTmp;
LIST_ENTRY *pTmpList;
while ( !IsListEmpty( &pList->ListEntry ) )
{
pTmpList = RemoveHeadList( &pList->ListEntry );
pTmp = CONTAINING_RECORD( pTmpList,
GenericTable,
ListEntry );
SNMP_free( pTmp );
}
SNMP_free( pList );
}
//
// Internal Functions
//
//*****************************************************************************
//
// Name: ReadTable
//
// Description: Queries the MIB and builds a table representing the data we are
// interested in.
//
// Parameters: GenericTable *pList: address of unitialized head of the entry
// list.
// ulong Type: type of table we want.
// ulong Size: size of a table entry.
//
// Returns: ulong: NO_ERROR if no error, and table is built.
//
// History:
// 01/12/94 JayPh Created.
//
//*****************************************************************************
ulong ReadTable( GenericTable *pList, ulong Type, ulong Size )
{
AsnInteger GetNextReq = ASN_RFC1157_GETNEXTREQUEST;
RFC1157VarBind item;
RFC1157VarBindList VarBinds = { &item, 1 };
AsnObjectIdentifier oidBackup;
AsnInteger ErrorStatus = 0;
AsnInteger ErrorIndex = 0;
ulong *pId;
GenericTable *pTable;
ulong LastField = 0;
uchar *pTmp;
ulong i;
OIDdef *pOid;
ulong BreakLoop = FALSE;
if( verbose ){
fprintf(stderr,"ReadTable: type = %d\n", Type);
}
// Walk SNMP database, building local table.
pId = (ulong *)SNMP_malloc( (sizeof( ulong ) * MAX_ID_LENGTH) );
if ( pId == NULL )
{
return ( ERROR_NOT_ENOUGH_MEMORY );
}
item.name.ids = pId;
// Build OID from preamble and table-specific suffix
// Copy preamble
for ( i = 0; i < PreambleDef.Length; i++ )
{
*pId++ = PreambleDef.Val[i];
}
// Get pointer to table-specific info
switch ( Type )
{
case TYPE_IF:
pOid = &IfInfoDef;
break;
case TYPE_IP:
pOid = &IPInfoDef;
break;
case TYPE_IPADDR:
pOid = &IPAddrInfoDef;
break;
case TYPE_ROUTE:
pOid = &RouteInfoDef;
break;
case TYPE_ARP:
pOid = &ARPInfoDef;
break;
case TYPE_ICMP:
pOid = &ICMPInfoDef;
break;
case TYPE_TCP:
pOid = &TCPInfoDef;
break;
case TYPE_TCPCONN:
pOid = &TCPConnDef;
break;
case TYPE_UDP:
pOid = &UDPInfoDef;
break;
case TYPE_UDPCONN:
pOid = &UDPConnDef;
break;
}
// Copy table-specific info
for ( i = 0; i < pOid->Length; i++ )
{
*pId++ = pOid->Val[i];
}
item.name.idLength = PreambleDef.Length + pOid->Length;
item.value.asnType = ASN_NULL;
pTable = pList;
// Walk the mib until the table-specific termination condition is met.
while( 1 )
{
// Get next
(*gQueryAddr)( GetNextReq, &VarBinds, &ErrorStatus, &ErrorIndex );
if( verbose )
{
int q;
fprintf(stderr,"value=%8d oid= ", item.value.asnValue.number );
//
// Print the object name, use mgmtapi.dll.
//
if( pSnmpMgrOidToStr ){
LPSTR String = NULL;
int err;
err = (* pSnmpMgrOidToStr )( &item.name, &String );
if( SNMPAPI_ERROR != err ){
fprintf(stderr," %s ", String );
}
SnmpUtilMemFree( String );
}
if( !pSnmpMgrOidToStr || (verbose > 1) ){
//
// Print the oid, in ``1.3.6.1.2.1'' style.
//
for ( q = 0; q < (int) item.name.idLength; q++ ){
// Must align the output to read huge tables.
if( q < 6 ){
fprintf( stderr,"%d.", item.name.ids[q]);
}else if( q < 9 ){
fprintf( stderr,"%2d.", item.name.ids[q]);
}else{
fprintf( stderr,"%3d.", item.name.ids[q]);
}
}
}
fprintf(stderr,"\n");
}
if ( ErrorStatus != 0 )
{
SnmpUtilVarBindFree( &item );
return ( ErrorStatus );
}
// We want to break out of this while loop if the defining part of the
// OID changes
if ( item.name.idLength < ( PreambleDef.Length + pOid->Length ) )
{
break;
}
for ( i = PreambleDef.Length;
i < PreambleDef.Length + pOid->Length - pOid->BackOffset;
i++ )
{
if ( item.name.ids[i] != pOid->Val[i - PreambleDef.Length] )
{
BreakLoop = TRUE;
break;
}
}
if ( BreakLoop )
{
break;
}
// We want to ignore certain entries. EG: the TCP statistics will also
// return the TCP connection table, which we don't want (there is a
// separate Type code for that).
switch ( Type )
{
case TYPE_IP:
if ( ( item.name.ids[pOid->EntElemOffset] == ID_IP_ADDRTABLE ) ||
( item.name.ids[pOid->EntElemOffset] == ID_IP_ROUTETABLE ) ||
( item.name.ids[pOid->EntElemOffset] == ID_IP_ARPTABLE ) )
{
continue;
}
break;
case TYPE_TCP:
if ( item.name.ids[pOid->EntElemOffset] == ID_TCP_CONNTABLE )
{
continue;
}
break;
case TYPE_UDP:
if ( item.name.ids[pOid->EntElemOffset] == ID_UDP_CONNTABLE )
{
continue;
}
break;
}
// Entry handling:
//
// There are 3 cases to consider:
// 1. If the list is empty, OR at the end of the list AND the
// CurrField == LastField.
// Then add a new entry to the list.
// 2. CurrField != LastField.
// Then reset pointer to start of the list.
// 3. Otherwise
// Then go to next entry in the list.
if ( ( pTable == pList ) ||
( ( pTable->ListEntry.Flink == &pList->ListEntry ) &&
( item.name.ids[pOid->EntElemOffset] == LastField ) ) )
{
// Add new entry to table
pTable = (GenericTable *)SNMP_malloc( Size );
if ( pTable == NULL )
{
SnmpUtilVarBindFree( &item );
return ( ERROR_NOT_ENOUGH_MEMORY );
}
InsertTailList( &pList->ListEntry, &pTable->ListEntry );
}
else if ( item.name.ids[pOid->EntElemOffset] != LastField )
{
// Reset pointer to start of list
pTable = CONTAINING_RECORD( pList->ListEntry.Flink,
GenericTable,
ListEntry );
}
else
{
// Move pointer to next entry in list
pTable = CONTAINING_RECORD( pTable->ListEntry.Flink,
GenericTable,
ListEntry );
}
LastField = item.name.ids[pOid->EntElemOffset];
// Save info in our list. pTable points to desired entry.
switch ( Type )
{
case TYPE_IF:
SaveData_IF( pTable, item, pOid );
break;
case TYPE_IP:
SaveData_IP( pTable, item, pOid );
break;
case TYPE_IPADDR:
SaveData_IPAddr( pTable, item, pOid );
break;
case TYPE_ROUTE:
SaveData_ROUTE( pTable, item, pOid );
break;
case TYPE_ARP:
SaveData_ARP( pTable, item, pOid );
break;
case TYPE_ICMP:
SaveData_ICMP( pTable, item, pOid );
break;
case TYPE_TCP:
SaveData_TCP( pTable, item, pOid );
break;
case TYPE_TCPCONN:
SaveData_TCPCONN( pTable, item, pOid );
break;
case TYPE_UDP:
SaveData_UDP( pTable, item, pOid );
break;
case TYPE_UDPCONN:
SaveData_UDPCONN( pTable, item, pOid );
break;
}
SnmpUtilOidCpy( &oidBackup, &(item.name));
SnmpUtilVarBindFree( &item );
item.name.idLength = oidBackup.idLength;
item.name.ids = oidBackup.ids;
}
SnmpUtilVarBindFree( &item );
return ( NO_ERROR );
}
//*****************************************************************************
//
// Name: SaveData_IF
//
// Description: Saves an element of the data in the interface table.
//
// Parameters: GenericTable *pEntry; pointer to table entry.
// RFC1157VarBind item: contains value returned from mib.
// OIDdef *pOid: contains table-specific data.
//
// Returns: void.
//
// History:
// 01/12/94 JayPh Created.
//
//*****************************************************************************
void SaveData_IF( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid )
{
IfEntry *pIf = ( IfEntry *)pEntry;
uchar *pTmp;
ulong i;
switch ( item.name.ids[pOid->EntElemOffset] )
{
case ID_IF_INDEX:
pIf->Info.if_index = item.value.asnValue.number;
break;
case ID_IF_DESC:
pIf->Info.if_descrlen = item.value.asnValue.string.length;
for ( i = 0; i < pIf->Info.if_descrlen; i++ )
{
pIf->Info.if_descr[i] = item.value.asnValue.string.stream[i];
}
break;
case ID_IF_TYPE:
pIf->Info.if_type = item.value.asnValue.number;
break;
case ID_IF_MTU:
pIf->Info.if_mtu = item.value.asnValue.number;
break;
case ID_IF_SPEED:
pIf->Info.if_speed = item.value.asnValue.number;
break;
case ID_IF_PHYSADDR:
pIf->Info.if_physaddrlen = item.value.asnValue.string.length;
for ( i = 0; i < pIf->Info.if_physaddrlen; i++ )
{
pIf->Info.if_physaddr[i] = item.value.asnValue.string.stream[i];
}
break;
case ID_IF_ADMINSTATUS:
pIf->Info.if_adminstatus = item.value.asnValue.number;
break;
case ID_IF_OPERSTATUS:
pIf->Info.if_operstatus = item.value.asnValue.number;
break;
case ID_IF_LASTCHANGE:
pIf->Info.if_lastchange = item.value.asnValue.number;
break;
case ID_IF_INOCTETS:
pIf->Info.if_inoctets = item.value.asnValue.number;
break;
case ID_IF_INUCASTPKTS:
pIf->Info.if_inucastpkts = item.value.asnValue.number;
break;
case ID_IF_INNUCASTPKTS:
pIf->Info.if_innucastpkts = item.value.asnValue.number;
break;
case ID_IF_INDISCARDS:
pIf->Info.if_indiscards = item.value.asnValue.number;
break;
case ID_IF_INERRORS:
pIf->Info.if_inerrors = item.value.asnValue.number;
break;
case ID_IF_INUKNOWNPROTOS:
pIf->Info.if_inunknownprotos = item.value.asnValue.number;
break;
case ID_IF_OUTOCTETS:
pIf->Info.if_outoctets = item.value.asnValue.number;
break;
case ID_IF_OUTUCASTPKTS:
pIf->Info.if_outucastpkts = item.value.asnValue.number;
break;
case ID_IF_OUTNUCASTPKTS:
pIf->Info.if_outnucastpkts = item.value.asnValue.number;
break;
case ID_IF_OUTDISCARDS:
pIf->Info.if_outdiscards = item.value.asnValue.number;
break;
case ID_IF_OUTERRORS:
pIf->Info.if_outerrors = item.value.asnValue.number;
break;
case ID_IF_OUTQLEN:
pIf->Info.if_outqlen = item.value.asnValue.number;
break;
}
}
//*****************************************************************************
//
// Name: SaveData_IP
//
// Description: Saves an element of the data in the IP table.
//
// Parameters: GenericTable *pEntry; pointer to table entry.
// RFC1157VarBind item: contains value returned from mib.
// OIDdef *pOid: contains table-specific data.
//
// Returns: void.
//
// History:
// 01/12/94 JayPh Created.
//
//*****************************************************************************
void SaveData_IP( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid )
{
IpEntry *pIp = (IpEntry *)pEntry;
uchar *pTmp;
switch ( item.name.ids[pOid->EntElemOffset] )
{
case ID_IP_FORWARDING:
pIp->Info.ipsi_forwarding = item.value.asnValue.number;
break;
case ID_IP_DEFAULTTTL:
pIp->Info.ipsi_defaultttl = item.value.asnValue.number;
break;
case ID_IP_INRECEIVES:
pIp->Info.ipsi_inreceives = item.value.asnValue.number;
break;
case ID_IP_INHDRERRORS:
pIp->Info.ipsi_inhdrerrors = item.value.asnValue.number;
break;
case ID_IP_INADDRERRORS:
pIp->Info.ipsi_inaddrerrors = item.value.asnValue.number;
break;
case ID_IP_FORWDATAGRAMS:
pIp->Info.ipsi_forwdatagrams = item.value.asnValue.number;
break;
case ID_IP_INUNKNOWNPROTOS:
pIp->Info.ipsi_inunknownprotos = item.value.asnValue.number;
break;
case ID_IP_INDISCARDS:
pIp->Info.ipsi_indiscards = item.value.asnValue.number;
break;
case ID_IP_INDELIVERS:
pIp->Info.ipsi_indelivers = item.value.asnValue.number;
break;
case ID_IP_OUTREQUESTS:
pIp->Info.ipsi_outrequests = item.value.asnValue.number;
break;
case ID_IP_OUTDISCARDS:
pIp->Info.ipsi_outdiscards = item.value.asnValue.number;
break;
case ID_IP_OUTNOROUTES:
pIp->Info.ipsi_outnoroutes = item.value.asnValue.number;
break;
case ID_IP_REASMTIMEOUTS:
pIp->Info.ipsi_reasmtimeout = item.value.asnValue.number;
break;
case ID_IP_REASMREQDS:
pIp->Info.ipsi_reasmreqds = item.value.asnValue.number;
break;
case ID_IP_REASMOKS:
pIp->Info.ipsi_reasmoks = item.value.asnValue.number;
break;
case ID_IP_REASMFAILS:
pIp->Info.ipsi_reasmfails = item.value.asnValue.number;
break;
case ID_IP_FRAGOKS:
pIp->Info.ipsi_fragoks = item.value.asnValue.number;
break;
case ID_IP_FRAGFAILS:
pIp->Info.ipsi_fragfails = item.value.asnValue.number;
break;
case ID_IP_FRAGCREATES:
pIp->Info.ipsi_fragcreates = item.value.asnValue.number;
break;
}
}
//*****************************************************************************
//
// Name: SaveData_IPAddr
//
// Description: Saves an element of the data in the IP table.
//
// Parameters: GenericTable *pEntry; pointer to table entry.
// RFC1157VarBind item: contains value returned from mib.
// OIDdef *pOid: contains table-specific data.
//
// Returns: void.
//
// History:
// 01/12/94 JayPh Created.
//
//*****************************************************************************
void SaveData_IPAddr( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid )
{
IpAddrEntry *pIpAddr = (IpAddrEntry *)pEntry;
uchar *pTmp;
switch ( item.name.ids[pOid->EntElemOffset] )
{
case ID_IPADDR_ADDR:
pTmp = (uchar *)&(pIpAddr->Info.iae_addr);
pTmp[0] = item.value.asnValue.string.stream[0];
pTmp[1] = item.value.asnValue.string.stream[1];
pTmp[2] = item.value.asnValue.string.stream[2];
pTmp[3] = item.value.asnValue.string.stream[3];
break;
case ID_IPADDR_INDEX:
pIpAddr->Info.iae_index = item.value.asnValue.number;
break;
case ID_IPADDR_MASK:
pTmp = (uchar *)&(pIpAddr->Info.iae_mask);
pTmp[0] = item.value.asnValue.string.stream[0];
pTmp[1] = item.value.asnValue.string.stream[1];
pTmp[2] = item.value.asnValue.string.stream[2];
pTmp[3] = item.value.asnValue.string.stream[3];
break;
case ID_IPADDR_BCASTADDR:
pIpAddr->Info.iae_bcastaddr = item.value.asnValue.number;
break;
case ID_IPADDR_REASMSIZE:
pIpAddr->Info.iae_reasmsize = item.value.asnValue.number;
break;
}
}
//*****************************************************************************
//
// Name: SaveData_ROUTE
//
// Description: Saves an element of the data in the ROUTE table.
//
// Parameters: GenericTable *pEntry; pointer to table entry.
// RFC1157VarBind item: contains value returned from mib.
// OIDdef *pOid: contains table-specific data.
//
// Returns: void.
//
// History:
// 01/12/94 JayPh Created.
//
//*****************************************************************************
void SaveData_ROUTE( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid )
{
RouteEntry *pRoute = (RouteEntry *)pEntry;
uchar *pTmp;
switch ( item.name.ids[pOid->EntElemOffset] )
{
case ID_ROUTE_DEST:
pTmp = (uchar *)&(pRoute->Info.ire_dest);
pTmp[0] = item.value.asnValue.string.stream[0];
pTmp[1] = item.value.asnValue.string.stream[1];
pTmp[2] = item.value.asnValue.string.stream[2];
pTmp[3] = item.value.asnValue.string.stream[3];
break;
case ID_ROUTE_IFINDEX:
pRoute->Info.ire_index = item.value.asnValue.number;
break;
case ID_ROUTE_METRIC1:
pRoute->Info.ire_metric1 = item.value.asnValue.number;
break;
case ID_ROUTE_METRIC2:
pRoute->Info.ire_metric2 = item.value.asnValue.number;
break;
case ID_ROUTE_METRIC3:
pRoute->Info.ire_metric3 = item.value.asnValue.number;
break;
case ID_ROUTE_METRIC4:
pRoute->Info.ire_metric4 = item.value.asnValue.number;
break;
case ID_ROUTE_NEXTHOP:
pTmp = (uchar *)&(pRoute->Info.ire_nexthop);
pTmp[0] = item.value.asnValue.string.stream[0];
pTmp[1] = item.value.asnValue.string.stream[1];
pTmp[2] = item.value.asnValue.string.stream[2];
pTmp[3] = item.value.asnValue.string.stream[3];
break;
case ID_ROUTE_TYPE:
pRoute->Info.ire_type = item.value.asnValue.number;
break;
case ID_ROUTE_PROTO:
pRoute->Info.ire_proto = item.value.asnValue.number;
break;
case ID_ROUTE_AGE:
pRoute->Info.ire_age = item.value.asnValue.number;
break;
case ID_ROUTE_MASK:
pTmp = (uchar *)&(pRoute->Info.ire_mask);
pTmp[0] = item.value.asnValue.string.stream[0];
pTmp[1] = item.value.asnValue.string.stream[1];
pTmp[2] = item.value.asnValue.string.stream[2];
pTmp[3] = item.value.asnValue.string.stream[3];
break;
case ID_ROUTE_METRIC5:
pRoute->Info.ire_metric5 = item.value.asnValue.number;
break;
}
}
//*****************************************************************************
//
// Name: SaveData_ARP
//
// Description: Saves an element of the data in the ARP table.
//
// Parameters: GenericTable *pEntry; pointer to table entry.
// RFC1157VarBind item: contains value returned from mib.
// OIDdef *pOid: contains table-specific data.
//
// Returns: void.
//
// History:
// 01/12/94 JayPh Created.
//
//*****************************************************************************
void SaveData_ARP( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid )
{
ArpEntry *pArp = (ArpEntry *)pEntry;
uchar *pTmp;
ulong i;
switch ( item.name.ids[pOid->EntElemOffset] )
{
case ID_ARP_IFINDEX:
pArp->Info.inme_index = item.value.asnValue.number;
break;
case ID_ARP_PHYSADDR:
pArp->Info.inme_physaddrlen = item.value.asnValue.string.length;
for ( i = 0; i < pArp->Info.inme_physaddrlen; i++ )
{
pArp->Info.inme_physaddr[i] = item.value.asnValue.string.stream[i];
}
break;
case ID_ARP_NETADDR:
pTmp = (uchar *)&(pArp->Info.inme_addr);
pTmp[0] = item.value.asnValue.string.stream[0];
pTmp[1] = item.value.asnValue.string.stream[1];
pTmp[2] = item.value.asnValue.string.stream[2];
pTmp[3] = item.value.asnValue.string.stream[3];
break;
case ID_ARP_TYPE:
pArp->Info.inme_type = item.value.asnValue.number;
break;
}
}
//*****************************************************************************
//
// Name: SaveData_ICMP
//
// Description: Saves an element of the data in the ICMP table.
//
// Parameters: GenericTable *pEntry; pointer to table entry.
// RFC1157VarBind item: contains value returned from mib.
// OIDdef *pOid: contains table-specific data.
//
// Returns: void.
//
// History:
// 01/12/94 JayPh Created.
//
//*****************************************************************************
void SaveData_ICMP( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid )
{
IcmpEntry *pIcmp = (IcmpEntry *)pEntry;
uchar *pTmp;
switch ( item.name.ids[pOid->EntElemOffset] )
{
case ID_ICMP_INMSGS:
pIcmp->InInfo.icmps_msgs = item.value.asnValue.number;
break;
case ID_ICMP_INERRORS:
pIcmp->InInfo.icmps_errors = item.value.asnValue.number;
break;
case ID_ICMP_INDESTUNREACHES:
pIcmp->InInfo.icmps_destunreachs = item.value.asnValue.number;
break;
case ID_ICMP_INTIMEEXCDS:
pIcmp->InInfo.icmps_timeexcds = item.value.asnValue.number;
break;
case ID_ICMP_INPARMPROBS:
pIcmp->InInfo.icmps_parmprobs = item.value.asnValue.number;
break;
case ID_ICMP_INSRCQUENCHS:
pIcmp->InInfo.icmps_srcquenchs = item.value.asnValue.number;
break;
case ID_ICMP_INREDIRECTS:
pIcmp->InInfo.icmps_redirects = item.value.asnValue.number;
break;
case ID_ICMP_INECHOS:
pIcmp->InInfo.icmps_echos = item.value.asnValue.number;
break;
case ID_ICMP_INECHOREPS:
pIcmp->InInfo.icmps_echoreps = item.value.asnValue.number;
break;
case ID_ICMP_INTIMESTAMPS:
pIcmp->InInfo.icmps_timestamps = item.value.asnValue.number;
break;
case ID_ICMP_INTIMESTAMPREPS:
pIcmp->InInfo.icmps_timestampreps = item.value.asnValue.number;
break;
case ID_ICMP_INADDRMASKS:
pIcmp->InInfo.icmps_addrmasks = item.value.asnValue.number;
break;
case ID_ICMP_INADDRMASKREPS:
pIcmp->InInfo.icmps_addrmaskreps = item.value.asnValue.number;
break;
case ID_ICMP_OUTMSGS:
pIcmp->OutInfo.icmps_msgs = item.value.asnValue.number;
break;
case ID_ICMP_OUTERRORS:
pIcmp->OutInfo.icmps_errors = item.value.asnValue.number;
break;
case ID_ICMP_OUTDESTUNREACHES:
pIcmp->OutInfo.icmps_destunreachs = item.value.asnValue.number;
break;
case ID_ICMP_OUTTIMEEXCDS:
pIcmp->OutInfo.icmps_timeexcds = item.value.asnValue.number;
break;
case ID_ICMP_OUTPARMPROBS:
pIcmp->OutInfo.icmps_parmprobs = item.value.asnValue.number;
break;
case ID_ICMP_OUTSRCQUENCHS:
pIcmp->OutInfo.icmps_srcquenchs = item.value.asnValue.number;
break;
case ID_ICMP_OUTREDIRECTS:
pIcmp->OutInfo.icmps_redirects = item.value.asnValue.number;
break;
case ID_ICMP_OUTECHOS:
pIcmp->OutInfo.icmps_echos = item.value.asnValue.number;
break;
case ID_ICMP_OUTECHOREPS:
pIcmp->OutInfo.icmps_echoreps = item.value.asnValue.number;
break;
case ID_ICMP_OUTTIMESTAMPS:
pIcmp->OutInfo.icmps_timestamps = item.value.asnValue.number;
break;
case ID_ICMP_OUTTIMESTAMPREPS:
pIcmp->OutInfo.icmps_timestampreps = item.value.asnValue.number;
break;
case ID_ICMP_OUTADDRMASKS:
pIcmp->OutInfo.icmps_addrmasks = item.value.asnValue.number;
break;
case ID_ICMP_OUTADDRMASKREPS:
pIcmp->OutInfo.icmps_addrmaskreps = item.value.asnValue.number;
break;
}
}
//*****************************************************************************
//
// Name: SaveData_TCP
//
// Description: Saves an element of the data in the TCP table.
//
// Parameters: GenericTable *pEntry; pointer to table entry.
// RFC1157VarBind item: contains value returned from mib.
// OIDdef *pOid: contains table-specific data.
//
// Returns: void.
//
// History:
// 01/12/94 JayPh Created.
//
//*****************************************************************************
void SaveData_TCP( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid )
{
TcpEntry *pTcp = (TcpEntry *)pEntry;
uchar *pTmp;
switch ( item.name.ids[pOid->EntElemOffset] )
{
case ID_TCP_RTOALGORITHM:
pTcp->Info.ts_rtoalgorithm = item.value.asnValue.number;
break;
case ID_TCP_RTOMIN:
pTcp->Info.ts_rtomin = item.value.asnValue.number;
break;
case ID_TCP_RTOMAX:
pTcp->Info.ts_rtomax = item.value.asnValue.number;
break;
case ID_TCP_MAXCONN:
pTcp->Info.ts_maxconn = item.value.asnValue.number;
break;
case ID_TCP_ACTIVEOPENS:
pTcp->Info.ts_activeopens = item.value.asnValue.number;
break;
case ID_TCP_PASSIVEOPENS:
pTcp->Info.ts_passiveopens = item.value.asnValue.number;
break;
case ID_TCP_ATTEMPTFAILS:
pTcp->Info.ts_attemptfails = item.value.asnValue.number;
break;
case ID_TCP_ESTABRESETS:
pTcp->Info.ts_estabresets = item.value.asnValue.number;
break;
case ID_TCP_CURRESTABS:
pTcp->Info.ts_currestab = item.value.asnValue.number;
break;
case ID_TCP_INSEGS:
pTcp->Info.ts_insegs = item.value.asnValue.number;
break;
case ID_TCP_OUTSEGS:
pTcp->Info.ts_outsegs = item.value.asnValue.number;
break;
case ID_TCP_RETRANSSEGS:
pTcp->Info.ts_retranssegs = item.value.asnValue.number;
break;
case ID_TCP_INERRS:
pTcp->Info.ts_inerrs = item.value.asnValue.number;
break;
case ID_TCP_OUTRSTS:
pTcp->Info.ts_outrsts = item.value.asnValue.number;
break;
}
}
//*****************************************************************************
//
// Name: SaveData_TCPCONN
//
// Description: Saves an element of the data in the TCP connection table.
//
// Parameters: GenericTable *pEntry; pointer to table entry.
// RFC1157VarBind item: contains value returned from mib.
// OIDdef *pOid: contains table-specific data.
//
// Returns: void.
//
// History:
// 01/12/94 JayPh Created.
//
//*****************************************************************************
void SaveData_TCPCONN( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid )
{
TcpConnEntry *pTcp = (TcpConnEntry *)pEntry;
uchar *pTmp;
switch ( item.name.ids[pOid->EntElemOffset] )
{
case ID_TCPCONN_STATE:
pTcp->Info.tct_state = item.value.asnValue.number;
break;
case ID_TCPCONN_LOCALADDR:
pTmp = (uchar *)&(pTcp->Info.tct_localaddr);
pTmp[0] = item.value.asnValue.string.stream[0];
pTmp[1] = item.value.asnValue.string.stream[1];
pTmp[2] = item.value.asnValue.string.stream[2];
pTmp[3] = item.value.asnValue.string.stream[3];
break;
case ID_TCPCONN_LOCALPORT:
pTcp->Info.tct_localport = item.value.asnValue.number;
break;
case ID_TCPCONN_REMOTEADDR:
pTmp = (uchar *)&(pTcp->Info.tct_remoteaddr);
pTmp[0] = item.value.asnValue.string.stream[0];
pTmp[1] = item.value.asnValue.string.stream[1];
pTmp[2] = item.value.asnValue.string.stream[2];
pTmp[3] = item.value.asnValue.string.stream[3];
break;
case ID_TCPCONN_REMOTEPORT:
pTcp->Info.tct_remoteport = item.value.asnValue.number;
break;
}
}
//*****************************************************************************
//
// Name: SaveData_UDP
//
// Description: Saves an element of the data in the UDP table.
//
// Parameters: GenericTable *pEntry; pointer to table entry.
// RFC1157VarBind item: contains value returned from mib.
// OIDdef *pOid: contains table-specific data.
//
// Returns: void.
//
// History:
// 01/12/94 JayPh Created.
//
//*****************************************************************************
void SaveData_UDP( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid )
{
UdpEntry *pUdp = (UdpEntry *)pEntry;
uchar *pTmp;
switch ( item.name.ids[pOid->EntElemOffset] )
{
case ID_UDP_INDATAGRAMS:
pUdp->Info.us_indatagrams = item.value.asnValue.number;
break;
case ID_UDP_NOPORTS:
pUdp->Info.us_noports = item.value.asnValue.number;
break;
case ID_UDP_INERRORS:
pUdp->Info.us_inerrors = item.value.asnValue.number;
break;
case ID_UDP_OUTDATAGRAMS:
pUdp->Info.us_outdatagrams = item.value.asnValue.number;
break;
}
}
//*****************************************************************************
//
// Name: SaveData_UDPCONN
//
// Description: Saves an element of the data in the UDP connection table.
//
// Parameters: GenericTable *pEntry; pointer to table entry.
// RFC1157VarBind item: contains value returned from mib.
// OIDdef *pOid: contains table-specific data.
//
// Returns: void.
//
// History:
// 01/12/94 JayPh Created.
//
//*****************************************************************************
void SaveData_UDPCONN( GenericTable *pEntry,
RFC1157VarBind item,
OIDdef *pOid )
{
UdpConnEntry *pUdp = (UdpConnEntry *)pEntry;
uchar *pTmp;
switch ( item.name.ids[pOid->EntElemOffset] )
{
case ID_UDPCONN_LOCALADDR:
pTmp = (uchar *)&(pUdp->Info.ue_localaddr);
pTmp[0] = item.value.asnValue.string.stream[0];
pTmp[1] = item.value.asnValue.string.stream[1];
pTmp[2] = item.value.asnValue.string.stream[2];
pTmp[3] = item.value.asnValue.string.stream[3];
break;
case ID_UDPCONN_LOCALPORT:
pUdp->Info.ue_localport = item.value.asnValue.number;
break;
}
}