//*************************************************************************** // // File: // // Module: MS SNMP Provider // // Purpose: // // Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved // //*************************************************************************** /*--------------------------------------------------------- Filename: encdec.cpp Written By: S.Menzies ----------------------------------------------------------*/ #include "precomp.h" #include #include "common.h" #include "sync.h" #include "encap.h" #include "value.h" #include "vblist.h" #include "vbl.h" #include "fs_reg.h" #include "error.h" #include "encdec.h" #include "sec.h" #include "pdu.h" #include "pseudo.h" #include "dummy.h" #include "flow.h" #include "frame.h" #include "timer.h" #include "message.h" #include "ssent.h" #include "idmap.h" #include "opreg.h" #include "session.h" #include "ophelp.h" #include "op.h" #include "tsess.h" const WinSnmpInteger winsnmp_pdu_type[] = {SNMP_PDU_GET, SNMP_PDU_GETNEXT, SNMP_PDU_SET}; const ULONG num_pdus = sizeof(winsnmp_pdu_type)/sizeof(WinSnmpInteger); CriticalSection SnmpEncodeDecode :: s_CriticalSection; void FreeDescriptor ( smiVALUE &a_Value ) { switch ( a_Value.syntax ) { case SNMP_SYNTAX_OCTETS : case SNMP_SYNTAX_BITS : case SNMP_SYNTAX_OPAQUE : case SNMP_SYNTAX_IPADDR : case SNMP_SYNTAX_NSAPADDR : { SnmpFreeDescriptor ( SNMP_SYNTAX_OCTETS , & a_Value.value.string ) ; } break ; case SNMP_SYNTAX_OID : { SnmpFreeDescriptor ( SNMP_SYNTAX_OID, (smiOCTETS *)(&a_Value.value.oid) ); } break ; default: { } break ; } } // returns an SnmpVarBind containing an SnmpObjectIdentifier and an // SnmpValue created using the instance(OID) and the value(VALUE) SnmpVarBind *GetVarBind ( IN smiOID &instance, IN smiVALUE &value ) { // create an SnmpObjectIdentifier using the instance value SnmpObjectIdentifier id(instance.ptr, instance.len); SnmpValue *snmp_value = NULL; // for each possible value for value.syntax, create the // corresponding SnmpValue switch(value.syntax) { case SNMP_SYNTAX_NULL: // null value { snmp_value = new SnmpNull(); } break; case SNMP_SYNTAX_INT: // integer *(has same value as SNMP_SYNTAX_INT32)* { snmp_value = new SnmpInteger(value.value.sNumber); } break; case SNMP_SYNTAX_UINT32: // integer *(has same value as SNMP_SYNTAX_GAUGE)* { snmp_value = new SnmpUInteger32(value.value.uNumber); } break; case SNMP_SYNTAX_CNTR32: // counter32 { snmp_value = new SnmpCounter (value.value.uNumber); } break; case SNMP_SYNTAX_GAUGE32: // gauge { snmp_value = new SnmpGauge(value.value.uNumber); } break; case SNMP_SYNTAX_TIMETICKS: // time ticks { snmp_value = new SnmpTimeTicks(value.value.uNumber); } break; case SNMP_SYNTAX_OCTETS: // octets { snmp_value = new SnmpOctetString(value.value.string.ptr, value.value.string.len); } break; case SNMP_SYNTAX_OPAQUE: // opaque value { snmp_value = new SnmpOpaque(value.value.string.ptr, value.value.string.len); } break; case SNMP_SYNTAX_OID: // object identifier { snmp_value = new SnmpObjectIdentifier(value.value.oid.ptr, value.value.oid.len); } break; case SNMP_SYNTAX_IPADDR: // ip address value { if ( value.value.string.ptr ) { snmp_value = new SnmpIpAddress(ntohl(*((ULONG *)value.value.string.ptr))); } else { snmp_value = new SnmpNull(); } } break; case SNMP_SYNTAX_CNTR64: // counter64 { snmp_value = new SnmpCounter64 (value.value.hNumber.lopart , value.value.hNumber.hipart ); } break; case SNMP_SYNTAX_NOSUCHOBJECT: { snmp_value = new SnmpNoSuchObject ; } break ; case SNMP_SYNTAX_NOSUCHINSTANCE: { snmp_value = new SnmpNoSuchInstance ; } break ; case SNMP_SYNTAX_ENDOFMIBVIEW: { snmp_value = new SnmpEndOfMibView ; } break ; default: { // it must be an unsupported type // return an SnmpNullValue by default snmp_value = new SnmpNull(); } break; }; SnmpVarBind *var_bind = NULL ; if ( snmp_value ) { CProvDeleteMe sc(snmp_value); var_bind = new SnmpVarBind(id, *snmp_value); } return var_bind; } void GetOID(OUT smiOID &oid, IN SnmpObjectIdentifier &instance) { // determine length oid.len = instance.GetValueLength(); // allocate space oid.ptr = new smiUINT32[oid.len]; // copy the identifier values ULONG *value = instance.GetValue(); for(UINT i=0; i < oid.len; i++) oid.ptr[i] = value[i]; } // returns a winsnmp VALUE in the value OUT parameter corresponding // to the specified snmp_value. makes use of run-time type information // for the purpose void GetValue(OUT smiVALUE &value, IN SnmpValue &snmp_value) { // for each SnmpValue type, check if it is a pointer // to the derived type. If so, fill in the smiValue // and return SnmpNull *null_value = dynamic_cast(&snmp_value); if ( null_value != NULL ) { value.syntax = SNMP_SYNTAX_NULL; return; } SnmpInteger *integer_value = dynamic_cast(&snmp_value); if ( integer_value != NULL ) { value.syntax = SNMP_SYNTAX_INT; value.value.sNumber = integer_value->GetValue(); return; } SnmpGauge *gauge_value = dynamic_cast(&snmp_value); if ( gauge_value != NULL ) { value.syntax = SNMP_SYNTAX_GAUGE32; value.value.uNumber = gauge_value->GetValue(); return; } SnmpCounter *counter_value = dynamic_cast(&snmp_value); if ( counter_value != NULL ) { value.syntax = SNMP_SYNTAX_CNTR32; value.value.uNumber = counter_value->GetValue(); return; } SnmpTimeTicks *timeTicks_value = dynamic_cast(&snmp_value); if ( timeTicks_value != NULL ) { value.syntax = SNMP_SYNTAX_TIMETICKS; value.value.uNumber = timeTicks_value->GetValue(); return; } SnmpOpaque *opaque_value = dynamic_cast(&snmp_value); if ( opaque_value != NULL ) { value.syntax = SNMP_SYNTAX_OPAQUE; value.value.string.len = opaque_value->GetValueLength(); value.value.string.ptr = new smiBYTE[value.value.string.len]; UCHAR *source = opaque_value->GetValue(); for(UINT i=0; i < value.value.string.len; i++) value.value.string.ptr[i] = source[i]; return; } SnmpOctetString *string_value = dynamic_cast(&snmp_value); if ( string_value != NULL ) { value.syntax = SNMP_SYNTAX_OCTETS; value.value.string.len = string_value->GetValueLength(); value.value.string.ptr = new smiBYTE[value.value.string.len]; UCHAR *source = string_value->GetValue(); for(UINT i=0; i < value.value.string.len; i++) value.value.string.ptr[i] = source[i]; return; } SnmpObjectIdentifier *oid_value = dynamic_cast(&snmp_value); if ( oid_value != NULL ) { value.syntax = SNMP_SYNTAX_OID; GetOID(value.value.oid, *oid_value); return; } SnmpIpAddress *ip_address_value = dynamic_cast(&snmp_value); if ( ip_address_value != NULL ) { value.syntax = SNMP_SYNTAX_IPADDR; value.value.string.len = IP_ADDR_LEN; value.value.string.ptr = new smiBYTE[IP_ADDR_LEN]; ULONG address = htonl ( ip_address_value->GetValue() ) ; UCHAR *t_Address = ( UCHAR * ) & address ; for(int i=IP_ADDR_LEN-1; i >= 0; i--) { value.value.string.ptr[i] = t_Address [ i ] ; } return; } SnmpUInteger32 *uinteger32_value = dynamic_cast(&snmp_value); if ( uinteger32_value != NULL ) { value.syntax = SNMP_SYNTAX_UINT32; value.value.uNumber = uinteger32_value->GetValue(); return; } SnmpCounter64 *counter64_value = dynamic_cast(&snmp_value); if ( counter64_value != NULL ) { value.syntax = SNMP_SYNTAX_CNTR64; value.value.hNumber.lopart = counter64_value->GetLowValue(); value.value.hNumber.hipart = counter64_value->GetHighValue(); return; } SnmpEndOfMibView *endofmibview_value = dynamic_cast(&snmp_value); if ( endofmibview_value != NULL ) { value.syntax = SNMP_SYNTAX_ENDOFMIBVIEW; return; } SnmpNoSuchObject *nosuchobject_value = dynamic_cast(&snmp_value); if ( nosuchobject_value != NULL ) { value.syntax = SNMP_SYNTAX_NOSUCHOBJECT; return; } SnmpNoSuchInstance *nosuchinstance_value = dynamic_cast(&snmp_value); if ( nosuchinstance_value != NULL ) { value.syntax = SNMP_SYNTAX_NOSUCHINSTANCE; return; } // we should not have come here // did we check all supported types? throw GeneralException(Snmp_Error, Snmp_Local_Error,__FILE__,__LINE__); } void LocalFreeVb(IN smiOID &oid, IN smiVALUE &value) { if ( oid.len > 0 ) delete[] oid.ptr; switch( value.syntax ) { case SNMP_SYNTAX_OCTETS: // octets case SNMP_SYNTAX_OPAQUE: // opaque value case SNMP_SYNTAX_IPADDR: // ip address value { delete[] value.value.string.ptr; break; } case SNMP_SYNTAX_OID: // object identifier { delete[] value.value.oid.ptr; break; } default: break; }; } void SetWinSnmpVbl(SnmpVarBindList &var_bind_list, HSNMP_VBL vbl) { // reset the list var_bind_list.Reset(); // for each var_bind, create a pair and // insert it into the vbl while( var_bind_list.Next() ) { const SnmpVarBind *var_bind = var_bind_list.Get(); smiOID instance; GetOID(instance, var_bind->GetInstance()); smiVALUE value; GetValue(value, var_bind->GetValue()); // insert a new var bind SnmpSetVb(vbl, 0, &instance, &value); LocalFreeVb(instance, value); } } BOOL DecodeVarBindList ( HSNMP_VBL a_Vbl , SnmpVarBindList &a_SnmpVarBindList ) { smiINT t_VblCount = SnmpCountVbl ( a_Vbl ) ; for ( smiINT t_Count = 1 ; t_Count <= t_VblCount ; t_Count ++ ) { smiOID t_Instance; smiVALUE t_Value; SNMPAPI_STATUS t_Status = SnmpGetVb ( a_Vbl, t_Count, & t_Instance, & t_Value ) ; if ( t_Status == SNMPAPI_FAILURE ) { return FALSE ; } SnmpVarBind *t_VarBind = GetVarBind ( t_Instance , t_Value ) ; if ( ! t_VarBind ) { SnmpFreeDescriptor ( SNMP_SYNTAX_OID, (smiOCTETS *) & t_Instance ) ; return FALSE ; } a_SnmpVarBindList.AddNoReallocate ( *t_VarBind ) ; SnmpFreeDescriptor ( SNMP_SYNTAX_OID, (smiOCTETS *) & t_Instance ) ; FreeDescriptor ( t_Value ) ; } return TRUE ; } BOOL SnmpEncodeDecode :: DestroyStaticComponents () { return TRUE ; } BOOL SnmpEncodeDecode :: InitializeStaticComponents () { return TRUE ; } SnmpEncodeDecode :: SnmpEncodeDecode () : m_IsValid ( FALSE ) , m_Session ( NULL ) , m_Window ( NULL ) { Window *t_Window = new Window ; m_Window = t_Window ; } SnmpEncodeDecode :: ~SnmpEncodeDecode () { if ( m_IsValid ) { HSNMP_SESSION t_Session = ( HSNMP_SESSION ) m_Session ; SnmpClose ( t_Session ) ; } Window *t_Window = ( Window * ) m_Window ; delete t_Window ; } BOOL SnmpEncodeDecode :: EncodeFrame ( OUT SnmpPdu &a_SnmpPdu , IN RequestId a_RequestId, IN PduType a_PduType, IN SnmpErrorReport &a_SnmpErrorReport , IN SnmpVarBindList &a_SnmpVarBindList, IN SnmpCommunityBasedSecurity *&a_SnmpCommunityBasedSecurity , IN SnmpTransportAddress *&a_SrcTransportAddress , IN SnmpTransportAddress *&a_DstTransportAddress ) { a_SnmpPdu.SetRequestId ( a_RequestId ) ; a_SnmpPdu.SetPduType ( a_PduType ) ; a_SnmpPdu.SetErrorReport ( a_SnmpErrorReport ) ; a_SnmpPdu.SetVarBindList ( a_SnmpVarBindList ) ; if ( a_SnmpCommunityBasedSecurity ) a_SnmpPdu.SetCommunityName ( *a_SnmpCommunityBasedSecurity ) ; if ( a_SrcTransportAddress ) a_SnmpPdu.SetSourceAddress ( *a_SrcTransportAddress ) ; if ( a_DstTransportAddress ) a_SnmpPdu.SetDestinationAddress ( *a_DstTransportAddress ) ; return TRUE ; } BOOL SnmpEncodeDecode :: DecodeFrame ( IN SnmpPdu &a_SnmpPdu , OUT RequestId a_RequestId, OUT PduType a_PduType , OUT SnmpErrorReport &a_SnmpErrorReport , OUT SnmpVarBindList *&a_SnmpVarBindList , OUT SnmpCommunityBasedSecurity *&a_SnmpCommunityBasedSecurity , OUT SnmpTransportAddress *&a_SrcTransportAddress , OUT SnmpTransportAddress *&a_DstTransportAddress ) { a_SrcTransportAddress = & a_SnmpPdu.GetSourceAddress (); a_DstTransportAddress = & a_SnmpPdu.GetDestinationAddress () ; a_PduType = a_SnmpPdu.GetPduType () ; a_RequestId = a_SnmpPdu.GetRequestId () ; a_SnmpVarBindList = & a_SnmpPdu.GetVarbindList () ; a_SnmpCommunityBasedSecurity = & a_SnmpPdu.GetCommunityName () ; a_SnmpErrorReport = a_SnmpPdu.GetErrorReport () ; return TRUE ; } BOOL SnmpEncodeDecode :: EncodeFrame ( IN SnmpPdu &a_SnmpPdu , OUT void *a_ImplementationEncoding ) { WinSnmpVariables *t_WinSnmpVariables = ( WinSnmpVariables * ) a_ImplementationEncoding ; RequestId t_SnmpRequestId = a_SnmpPdu.GetRequestId () ; PduType t_SnmpPduType = a_SnmpPdu.GetPduType () ; SnmpErrorReport &t_SnmpErrorReport = a_SnmpPdu.GetErrorReport () ; SnmpCommunityBasedSecurity &t_SnmpCommunityBasedSecurity = a_SnmpPdu.GetCommunityName () ; SnmpVarBindList &t_SnmpVarBindList = a_SnmpPdu.GetVarbindList () ; SnmpTransportAddress &t_SrcTransportAddress = a_SnmpPdu.GetSourceAddress () ; SnmpTransportAddress &t_DstTransportAddress = a_SnmpPdu.GetDestinationAddress () ; if ( ! m_IsValid ) { throw GeneralException ( Snmp_Error, Snmp_Local_Error, __FILE__, __LINE__, SnmpGetLastError (( HSNMP_SESSION)m_Session) ); } HSNMP_SESSION t_Session = ( HSNMP_SESSION ) m_Session ; HSNMP_VBL t_Vbl = SnmpCreateVbl ( t_Session , NULL , NULL ) ; if ( t_Vbl == SNMPAPI_FAILURE ) { throw GeneralException ( Snmp_Error, Snmp_Local_Error, __FILE__, __LINE__, SnmpGetLastError ( ( HSNMP_SESSION ) m_Session ) ) ; } SetWinSnmpVbl ( t_SnmpVarBindList , t_Vbl ) ; smiINT t_RequestId = t_SnmpRequestId ; smiINT t_PduType = winsnmp_pdu_type[t_SnmpPduType] ; smiINT t_ErrorStatus = t_SnmpErrorReport.GetStatus () ; smiINT t_ErrorIndex = t_SnmpErrorReport.GetIndex () ; HSNMP_PDU t_Pdu ; t_Pdu = SnmpCreatePdu ( t_Session, t_PduType, t_RequestId, t_ErrorStatus, t_ErrorIndex , t_Vbl ); if ( t_Pdu == SNMPAPI_FAILURE ) { SnmpFreeVbl ( t_Vbl ) ; throw GeneralException ( Snmp_Error, Snmp_Local_Error, __FILE__, __LINE__, SnmpGetLastError ( ( HSNMP_SESSION ) m_Session ) ) ; } CriticalSectionLock t_CriticalSectionLock ( s_CriticalSection ) ; SnmpOctetString t_OctetString ( NULL , 0 ) ; t_SnmpCommunityBasedSecurity.GetCommunityName ( t_OctetString ) ; smiOCTETS t_Name; t_Name.len = t_OctetString.GetValueLength () ; t_Name.ptr = t_OctetString.GetValue () ; HSNMP_CONTEXT t_Context ; t_CriticalSectionLock.GetLock ( INFINITE ) ; SetTranslateMode () ; t_Context = SnmpStrToContext ( t_Session, &t_Name ) ; t_CriticalSectionLock.UnLock () ; if ( t_Context == SNMPAPI_FAILURE ) { SnmpFreePdu ( t_Pdu ) ; SnmpFreeVbl ( t_Vbl ) ; throw GeneralException ( Snmp_Error, Snmp_Local_Error, __FILE__, __LINE__, SnmpGetLastError (t_Session) ); } t_WinSnmpVariables->m_RequestId = t_RequestId; t_WinSnmpVariables->m_Pdu = t_Pdu ; t_WinSnmpVariables->m_Vbl = t_Vbl ; t_WinSnmpVariables->m_SrcEntity = NULL ; t_WinSnmpVariables->m_DstEntity = NULL ; t_WinSnmpVariables->m_Context = t_Context ; return TRUE ; } BOOL SnmpEncodeDecode :: DecodeFrame ( IN void *a_ImplementationEncoding , OUT SnmpPdu &a_SnmpPdu ) { WinSnmpVariables *t_WinSnmpVariables = ( WinSnmpVariables * ) a_ImplementationEncoding ; RequestId t_SnmpRequestId ; PduType t_SnmpPduType ; SnmpErrorReport t_SnmpErrorReport ; SnmpCommunityBasedSecurity *t_SnmpCommunityBasedSecurity ; SnmpVarBindList *t_SnmpVarBindList ; SnmpTransportAddress *t_SrcTransportAddress ; SnmpTransportAddress *t_DstTransportAddress ; if ( ! m_IsValid ) { throw GeneralException ( Snmp_Error, Snmp_Local_Error, __FILE__, __LINE__, SnmpGetLastError (( HSNMP_SESSION)m_Session) ); } HSNMP_ENTITY t_SrcEntity = t_WinSnmpVariables->m_SrcEntity ; HSNMP_ENTITY t_DstEntity = t_WinSnmpVariables->m_DstEntity ; HSNMP_CONTEXT t_Context = t_WinSnmpVariables->m_Context ; HSNMP_PDU t_Pdu = t_WinSnmpVariables->m_Pdu ; smiOCTETS t_Community ; SNMPAPI_STATUS t_Status = SnmpContextToStr ( t_Context , &t_Community ); if (SNMPAPI_FAILURE == t_Status) { throw GeneralException ( Snmp_Error, Snmp_Local_Error, __FILE__, __LINE__, SnmpGetLastError (( HSNMP_SESSION)m_Session) ); } t_SnmpCommunityBasedSecurity = new SnmpCommunityBasedSecurity ; SnmpOctetString t_SnmpOctetString ( t_Community.ptr , t_Community.len ) ; SnmpFreeDescriptor ( SNMP_SYNTAX_OCTETS, &t_Community ); t_SnmpCommunityBasedSecurity->SetCommunityName ( t_SnmpOctetString ) ; if ( t_SrcEntity ) { char buff[MAX_ADDRESS_LEN]; t_Status = SnmpEntityToStr(t_SrcEntity, MAX_ADDRESS_LEN, (LPSTR)buff); if (SNMPAPI_FAILURE == t_Status) { throw GeneralException ( Snmp_Error, Snmp_Local_Error, __FILE__, __LINE__, SnmpGetLastError (( HSNMP_SESSION)m_Session) ); } SnmpTransportIpAddress *t_SrcIpAddress = new SnmpTransportIpAddress (buff, SNMP_ADDRESS_RESOLVE_VALUE); if (t_SrcIpAddress->IsValid()) { t_SrcTransportAddress = t_SrcIpAddress ; } else { delete t_SrcIpAddress ; SnmpTransportIpxAddress *t_SrcIpxAddress = new SnmpTransportIpxAddress (buff); if (t_SrcIpxAddress->IsValid()) { t_SrcTransportAddress = t_SrcIpxAddress ; } else { delete t_SrcIpxAddress ; throw GeneralException ( Snmp_Error, Snmp_Local_Error, __FILE__, __LINE__, SnmpGetLastError (( HSNMP_SESSION)m_Session) ); } } } if ( t_DstEntity ) { char buff[MAX_ADDRESS_LEN]; t_Status = SnmpEntityToStr(t_DstEntity, MAX_ADDRESS_LEN, (LPSTR)buff); if (SNMPAPI_FAILURE == t_Status) { throw GeneralException ( Snmp_Error, Snmp_Local_Error, __FILE__, __LINE__, SnmpGetLastError (( HSNMP_SESSION)m_Session) ); } SnmpTransportIpAddress *t_DstIpAddress = new SnmpTransportIpAddress (buff, SNMP_ADDRESS_RESOLVE_VALUE); if (t_DstIpAddress->IsValid()) { t_DstTransportAddress = t_DstIpAddress ; } else { delete t_DstIpAddress ; SnmpTransportIpxAddress *t_DstIpxAddress = new SnmpTransportIpxAddress (buff); if (t_DstIpxAddress->IsValid()) { t_DstTransportAddress = t_DstIpxAddress ; } else { delete t_DstIpxAddress ; throw GeneralException ( Snmp_Error, Snmp_Local_Error, __FILE__, __LINE__, SnmpGetLastError (( HSNMP_SESSION)m_Session) ); } } } HSNMP_VBL t_Vbl ; smiINT t_RequestId ; smiINT t_PduType ; smiINT t_ErrorStatus ; smiINT t_ErrorIndex ; t_Status = SnmpGetPduData ( t_Pdu, &t_PduType, &t_RequestId, &t_ErrorStatus, &t_ErrorIndex, &t_Vbl ); if ( t_Status == SNMPAPI_FAILURE ) { throw GeneralException ( Snmp_Error, Snmp_Local_Error, __FILE__, __LINE__, SnmpGetLastError (( HSNMP_SESSION)m_Session) ) ; } if ( t_PduType == SNMP_PDU_GET ) { t_SnmpPduType = GET ; } else if ( t_PduType == SNMP_PDU_SET ) { t_SnmpPduType = SET ; } else if ( t_PduType == SNMP_PDU_GETNEXT ) { t_SnmpPduType = GETNEXT ; } else if ( t_PduType == SNMP_PDU_RESPONSE ) { t_SnmpPduType = RESPONSE ; } else if (t_PduType == SNMP_PDU_GETBULK) { t_SnmpPduType = GETBULK; } else if (t_PduType == SNMP_PDU_TRAP) { t_SnmpPduType = TRAP; } else if (t_PduType == SNMP_PDU_V1TRAP) { t_SnmpPduType = V1TRAP; } else if (t_PduType == SNMP_PDU_INFORM) { t_SnmpPduType = INFORM ; } else { t_SnmpPduType = UNKNOWN; } a_SnmpPdu.SetPduType(t_SnmpPduType); t_SnmpRequestId = t_RequestId ; t_SnmpErrorReport.SetStatus ( ( SnmpStatus ) t_ErrorStatus ) ; t_SnmpErrorReport.SetIndex ( t_ErrorIndex ) ; t_SnmpErrorReport.SetError ( t_ErrorStatus == SNMP_ERROR_NOERROR ? Snmp_Success : Snmp_Error ) ; t_SnmpVarBindList = new SnmpVarBindList ; if ( ! DecodeVarBindList ( t_Vbl , *t_SnmpVarBindList ) ) { throw GeneralException ( Snmp_Error, Snmp_Local_Error, __FILE__, __LINE__, SnmpGetLastError (( HSNMP_SESSION)m_Session) ) ; } a_SnmpPdu.SetRequestId ( t_SnmpRequestId ) ; a_SnmpPdu.SetErrorReport ( t_SnmpErrorReport ) ; a_SnmpPdu.SetSourceAddress ( *t_SrcTransportAddress ) ; a_SnmpPdu.SetDestinationAddress ( *t_DstTransportAddress ) ; a_SnmpPdu.SetVarBindList ( *t_SnmpVarBindList ) ; a_SnmpPdu.SetCommunityName ( *t_SnmpCommunityBasedSecurity ) ; DebugMacro4( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpEncodeDecode :: DecodeFrame- received frame_id (%d) \r\n\r\n" , t_RequestId ) ; smiOCTETS t_Octets ; if ( SnmpEncodeMsg ( m_Session, t_SrcEntity, t_DstEntity, t_Context, t_Pdu , & t_Octets ) != SNMPAPI_FAILURE ) { ULONG t_Len = t_Octets.len ; UCHAR *t_Ptr = t_Octets.ptr ; ULONG t_RowLength = t_Len / 16 ; ULONG t_Remainder = t_Len % 16 ; ULONG t_Index = 0 ; for ( ULONG t_RowIndex = 0 ; t_RowIndex < t_RowLength ; t_RowIndex ++ ) { ULONG t_StoredIndex = t_Index ; for ( ULONG t_ColumnIndex = 0 ; t_ColumnIndex < 16 ; t_ColumnIndex ++ ) { SnmpDebugLog :: s_SnmpDebugLog->Write ( L"%2.2lx " , t_Ptr [ t_Index ++ ] ) ; } SnmpDebugLog :: s_SnmpDebugLog->Write ( L" " ) ; for ( t_ColumnIndex = 0 ; t_ColumnIndex < 16 ; t_ColumnIndex ++ ) { if ( ( t_Ptr [ t_StoredIndex ] >= 0x20 ) && ( t_Ptr [ t_StoredIndex ] <= 0x7f ) ) { SnmpDebugLog :: s_SnmpDebugLog->Write ( L"%c" , t_Ptr [ t_StoredIndex ] ) ; } else { SnmpDebugLog :: s_SnmpDebugLog->Write ( L"." ) ; } t_StoredIndex ++ ; } SnmpDebugLog :: s_SnmpDebugLog->Write ( L"\r\n" ) ; } ULONG t_StoredIndex = t_Index ; for ( ULONG t_ColumnIndex = 0 ; t_ColumnIndex < 16 ; t_ColumnIndex ++ ) { if ( t_ColumnIndex < t_Remainder ) { SnmpDebugLog :: s_SnmpDebugLog->Write ( L"%2.2lx " , t_Ptr [ t_Index ++ ] ) ; } else { SnmpDebugLog :: s_SnmpDebugLog->Write ( L" " ) ; } } SnmpDebugLog :: s_SnmpDebugLog->Write ( L" " ) ; for ( t_ColumnIndex = 0 ; t_ColumnIndex < 16 ; t_ColumnIndex ++ ) { if ( t_ColumnIndex < t_Remainder ) { if ( t_Ptr [ t_StoredIndex ] >= 0x20 && t_Ptr [ t_StoredIndex ] <= 0x7f ) { SnmpDebugLog :: s_SnmpDebugLog->Write ( L"%c" , t_Ptr [ t_StoredIndex ] ) ; } else { SnmpDebugLog :: s_SnmpDebugLog->Write ( L"." ) ; } t_StoredIndex ++ ; } } SnmpDebugLog :: s_SnmpDebugLog->Write ( L"\r\n\r\n" ) ; SnmpFreeDescriptor ( SNMP_SYNTAX_OCTETS , & t_Octets ) ; } else { DWORD t_LastError = SnmpGetLastError ((HSNMP_SESSION) m_Session) ; SnmpDebugLog :: s_SnmpDebugLog->Write ( L"Encode Failure\r\n\r\n" ) ; } ) SnmpFreeVbl ( t_Vbl ) ; return TRUE ; } BOOL SnmpEncodeDecode :: SetRequestId ( IN OUT SnmpPdu &a_SnmpPdu , IN RequestId a_RequestId ) { return a_SnmpPdu.SetRequestId ( a_RequestId ) ; } BOOL SnmpEncodeDecode :: SetVarBindList ( IN SnmpPdu &a_SnmpPdu , OUT SnmpVarBindList &a_SnmpVarBindList ) { return a_SnmpPdu.SetVarBindList ( a_SnmpVarBindList ) ; } BOOL SnmpEncodeDecode :: SetCommunityName ( IN SnmpPdu &a_SnmpPdu , IN SnmpCommunityBasedSecurity &a_SnmpCommunityBasedSecurity ) { return a_SnmpPdu.SetCommunityName ( a_SnmpCommunityBasedSecurity ) ; } BOOL SnmpEncodeDecode :: SetErrorReport ( IN SnmpPdu &a_SnmpPdu , OUT SnmpErrorReport &a_SnmpErrorReport ) { return a_SnmpPdu.SetErrorReport ( a_SnmpErrorReport ) ; } BOOL SnmpEncodeDecode :: SetPduType ( IN SnmpPdu &a_SnmpPdu , OUT PduType a_PduType ) { return a_SnmpPdu.SetPduType ( a_PduType ) ; } BOOL SnmpEncodeDecode :: SetSourceAddress ( IN OUT SnmpPdu &a_SnmpPdu , IN SnmpTransportAddress &a_TransportAddress ) { return a_SnmpPdu.SetSourceAddress ( a_TransportAddress ) ; } BOOL SnmpEncodeDecode :: SetDestinationAddress ( IN OUT SnmpPdu &a_SnmpPdu , IN SnmpTransportAddress &a_TransportAddress ) { return a_SnmpPdu.SetDestinationAddress ( a_TransportAddress ) ; } BOOL SnmpEncodeDecode :: GetSourceAddress ( IN SnmpPdu &a_SnmpPdu , SnmpTransportAddress *&a_TransportAddress ) { a_TransportAddress = a_SnmpPdu.GetSourceAddress ().Copy () ; return TRUE ; } BOOL SnmpEncodeDecode :: GetDestinationAddress ( IN SnmpPdu &a_SnmpPdu , SnmpTransportAddress *&a_TransportAddress ) { a_TransportAddress = a_SnmpPdu.GetDestinationAddress ().Copy () ; return TRUE ; } BOOL SnmpEncodeDecode :: GetPduType ( IN SnmpPdu &a_SnmpPdu , OUT PduType &a_PduType ) { a_PduType = a_SnmpPdu.GetPduType () ; return TRUE ; } BOOL SnmpEncodeDecode :: GetRequestId ( IN SnmpPdu &a_SnmpPdu , RequestId &a_RequestId ) { a_RequestId = a_SnmpPdu.GetRequestId () ; return TRUE ; } BOOL SnmpEncodeDecode :: GetErrorReport ( IN SnmpPdu &a_SnmpPdu , OUT SnmpErrorReport &a_SnmpErrorReport ) { a_SnmpErrorReport = a_SnmpPdu.GetErrorReport () ; return TRUE ; } BOOL SnmpEncodeDecode :: GetVarbindList ( IN SnmpPdu &a_SnmpPdu , OUT SnmpVarBindList &a_SnmpVarBindList ) { a_SnmpVarBindList = a_SnmpPdu.GetVarbindList () ; return TRUE ; } BOOL SnmpEncodeDecode :: GetCommunityName ( IN SnmpPdu &a_SnmpPdu , OUT SnmpCommunityBasedSecurity &a_SnmpCommunityBasedSecurity ) { a_SnmpCommunityBasedSecurity = a_SnmpPdu.GetCommunityName () ; return TRUE; } SnmpV1EncodeDecode::SnmpV1EncodeDecode () { try { InitializeVariables(); } catch ( Heap_Exception e_He ) { } catch(GeneralException exception) { } } SnmpV1EncodeDecode::~SnmpV1EncodeDecode(void) { } void SnmpV1EncodeDecode::InitializeVariables() { m_IsValid = FALSE; smiUINT32 t_MajorVersion = 1 ; smiUINT32 t_MinorVersion = 1 ; smiUINT32 t_Level = 2 ; smiUINT32 t_TranslateMode = SNMPAPI_UNTRANSLATED_V1 ; smiUINT32 t_RetransmitMode = SNMPAPI_OFF ; SNMPAPI_STATUS t_StartupStatus = SnmpStartup ( &t_MajorVersion, &t_MinorVersion, &t_Level, &t_TranslateMode, &t_RetransmitMode ); if ( t_StartupStatus == SNMPAPI_FAILURE ) { DWORD t_LastError = SnmpGetLastError ( 0 ) ; throw GeneralException ( Snmp_Error, Snmp_Local_Error, __FILE__, __LINE__ ); } HSNMP_SESSION t_Session ; t_Session = SnmpOpen ( ( ( Window * ) m_Window ) ->GetWindowHandle (), Window :: g_NullEventId ) ; if ( t_Session == SNMPAPI_FAILURE ) { DWORD t_LastError = SnmpGetLastError ( 0 ) ; throw GeneralException ( Snmp_Error, Snmp_Local_Error, __FILE__, __LINE__ ); } m_Session = ( void * ) t_Session ; m_IsValid = TRUE; } void SnmpV1EncodeDecode :: SetTranslateMode () { SnmpSetTranslateMode ( SNMPAPI_UNTRANSLATED_V1 ) ; } SnmpV2CEncodeDecode::SnmpV2CEncodeDecode () { InitializeVariables(); } SnmpV2CEncodeDecode::~SnmpV2CEncodeDecode(void) { } void SnmpV2CEncodeDecode::InitializeVariables() { m_IsValid = FALSE; smiUINT32 t_MajorVersion = 1 ; smiUINT32 t_MinorVersion = 1 ; smiUINT32 t_Level = 2 ; smiUINT32 t_TranslateMode = SNMPAPI_UNTRANSLATED_V2 ; smiUINT32 t_RetransmitMode = SNMPAPI_OFF ; SNMPAPI_STATUS t_StartupStatus = SnmpStartup ( &t_MajorVersion, &t_MinorVersion, &t_Level, &t_TranslateMode, &t_RetransmitMode ); if ( t_StartupStatus == SNMPAPI_FAILURE ) { throw GeneralException ( Snmp_Error, Snmp_Local_Error, __FILE__, __LINE__ ); } HSNMP_SESSION t_Session ; t_Session = SnmpOpen ( ( ( Window * ) m_Window ) ->GetWindowHandle (), Window :: g_NullEventId ) ; if ( t_Session == SNMPAPI_FAILURE ) { DWORD t_LastError = SnmpGetLastError ( 0 ) ; throw GeneralException ( Snmp_Error, Snmp_Local_Error, __FILE__, __LINE__ ); } m_Session = ( void * ) t_Session ; m_IsValid = TRUE; } void SnmpV2CEncodeDecode :: SetTranslateMode () { SnmpSetTranslateMode ( SNMPAPI_UNTRANSLATED_V2 ) ; }