/*++ Copyright (c) 1992-1996 Microsoft Corporation Module Name: resolve.c Abstract: High level routines to process the variable binding list. Environment: User Mode - Win32 Revision History: 10-May-1996 DonRyan Removed banner from Technology Dynamics, Inc. --*/ //--------------------------- WINDOWS DEPENDENCIES -------------------------- //--------------------------- STANDARD DEPENDENCIES -- #include ---- #include //--------------------------- MODULE DEPENDENCIES -- #include"xxxxx.h" ------ #include #include #include "mib.h" #include "mibfuncs.h" //--------------------------- SELF-DEPENDENCY -- ONE #include"module.h" ----- //--------------------------- PUBLIC VARIABLES --(same as in module.h file)-- //--------------------------- PRIVATE CONSTANTS ----------------------------- //--------------------------- PRIVATE STRUCTS ------------------------------- //--------------------------- PRIVATE VARIABLES ----------------------------- //--------------------------- PRIVATE PROTOTYPES ---------------------------- AsnInteger ResolveVarBind( IN RFC1157VarBind *VarBind, // Variable Binding to resolve IN UINT PduAction // Action specified in PDU ); SNMPAPI SnmpExtensionQuery( IN BYTE ReqType, // 1157 Request type IN OUT RFC1157VarBindList *VarBinds, // Var Binds to resolve OUT AsnInteger *ErrorStatus, // Error status returned OUT AsnInteger *ErrorIndex // Var Bind containing error ); //--------------------------- PRIVATE PROCEDURES ---------------------------- // // ResolveVarBind // Resolve a variable binding. // // Notes: // // Return Codes: // None. // // Error Codes: // None. // AsnInteger ResolveVarBind( IN RFC1157VarBind *VarBind, // Variable Binding to resolve IN UINT PduAction // Action specified in PDU ) { MIB_ENTRY *MibPtr; AsnObjectIdentifier TempOid; AsnInteger nResult; // Lookup OID in MIB MibPtr = MIB_get_entry( &VarBind->name ); // Check to see if OID is between LM variables if ( MibPtr == NULL && PduAction == MIB_ACTION_GETNEXT ) { UINT I; // // OPENISSUE - Should change to binary search // // Search through MIB to see if OID is within the LM MIB's scope I = 0; while ( MibPtr == NULL && I < MIB_num_variables ) { // Construct OID with complete prefix for comparison purposes if (SnmpUtilOidCpy( &TempOid, &MIB_OidPrefix ) == SNMPAPI_ERROR) { nResult = SNMP_ERRORSTATUS_RESOURCEUNAVAILABLE; goto Exit; } if (SnmpUtilOidAppend( &TempOid, &Mib[I].Oid ) == SNMPAPI_ERROR) { SnmpUtilOidFree( &TempOid ); nResult = SNMP_ERRORSTATUS_RESOURCEUNAVAILABLE; goto Exit; } // Check for OID in MIB if ( 0 > SnmpUtilOidCmp(&VarBind->name, &TempOid) ) { MibPtr = &Mib[I]; PduAction = MIB_ACTION_GETFIRST; } // Free OID memory before copying another SnmpUtilOidFree( &TempOid ); I++; } // while } // if // If OID not within scope of LM MIB, then no such name if ( MibPtr == NULL ) { nResult = SNMP_ERRORSTATUS_NOSUCHNAME; goto Exit; } // Call MIB function to apply requested operation if ( MibPtr->MibFunc == NULL ) { // If not GET-NEXT, then error if ( PduAction != MIB_ACTION_GETNEXT && PduAction != MIB_ACTION_GETFIRST ) { nResult = SNMP_ERRORSTATUS_NOSUCHNAME; goto Exit; } // Since this is AGGREGATE, use GET-FIRST on next variable, then return nResult = (*MibPtr->MibNext->MibFunc)( MIB_ACTION_GETFIRST, MibPtr->MibNext, VarBind ); } else { // Make complete OID of MIB name if (SnmpUtilOidCpy( &TempOid, &MIB_OidPrefix ) == SNMPAPI_ERROR) { nResult = SNMP_ERRORSTATUS_RESOURCEUNAVAILABLE; goto Exit; } if (SnmpUtilOidAppend( &TempOid, &MibPtr->Oid ) == SNMPAPI_ERROR) { SnmpUtilOidFree( &TempOid ); nResult = SNMP_ERRORSTATUS_RESOURCEUNAVAILABLE; goto Exit; } if ( MibPtr->Type == MIB_TABLE && !SnmpUtilOidCmp(&TempOid, &VarBind->name) ) { if ( PduAction == MIB_ACTION_GETNEXT ) { // Supports GET-NEXT on a MIB table's root node PduAction = MIB_ACTION_GETFIRST; } else { nResult = SNMP_ERRORSTATUS_NOSUCHNAME; SnmpUtilOidFree( &TempOid ); goto Exit; } } nResult = (*MibPtr->MibFunc)( PduAction, MibPtr, VarBind ); // Free temp memory SnmpUtilOidFree( &TempOid ); } Exit: return nResult; } // ResolveVarBind //--------------------------- PUBLIC PROCEDURES ----------------------------- // // SnmpExtensionQuery // Loop through var bind list resolving each var bind name to an entry // in the LAN Manager MIB. // // Notes: // Table sets are handled on a case by case basis, because in some cases // more than one entry in the Var Bind list will be needed to perform a // single SET on the LM MIB. This is due to the LM API calls. // // Return Codes: // SNMPAPI_NOERROR // SNMPAPI_ERROR // // Error Codes: // None. // SNMPAPI SnmpExtensionQuery( IN BYTE ReqType, // 1157 Request type IN OUT RFC1157VarBindList *VarBinds, // Var Binds to resolve OUT AsnInteger *ErrorStatus, // Error status returned OUT AsnInteger *ErrorIndex // Var Bind containing error ) { UINT I; SNMPAPI nResult; // // // OPENISSUE - Support is not available for TABLE SETS. // // nResult = SNMPAPI_NOERROR; *ErrorIndex = 0; // Loop through Var Bind list resolving var binds for ( I=0;I < VarBinds->len;I++ ) { *ErrorStatus = ResolveVarBind( &VarBinds->list[I], ReqType ); // Check for GET-NEXT past end of MIB if ( *ErrorStatus == SNMP_ERRORSTATUS_NOSUCHNAME && ReqType == MIB_ACTION_GETNEXT ) { *ErrorStatus = SNMP_ERRORSTATUS_NOERROR; // Set Var Bind pointing to next enterprise past LM MIB SnmpUtilOidFree( &VarBinds->list[I].name ); SnmpUtilOidCpy( &VarBinds->list[I].name, &MIB_OidPrefix ); VarBinds->list[I].name.ids[MIB_PREFIX_LEN-1] ++; } if ( *ErrorStatus != SNMP_ERRORSTATUS_NOERROR ) { *ErrorIndex = I+1; goto Exit; } } Exit: return nResult; } // SnmpExtensionQuery //-------------------------------- END --------------------------------------