/*++ Copyright (c) 1996 Microsoft Corporation Module Name: mibfuncs.c Abstract: Sample subagent instrumentation callbacks. --*/ #include "precomp.h" #pragma hdrstop DWORD ConnectToRouter(); DWORD GetGlobalConfigInfo( OUT PIPRIP_MIB_GET_OUTPUT_DATA * ppimgod, OUT PDWORD pdwSize ); DWORD SetGlobalInfo( IN AsnAny * objectArray ); DWORD UpdatePeerFilterTable( IN AsnAny * objectArray, IN DWORD dwOp ); DWORD AddPeerFilterEntry( IN DWORD dwPeerAddr, IN PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData ); DWORD DeletePeerFilterEntry( IN DWORD dwIndex, IN PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData ); DWORD GetInterfaceInfo( IN UINT actionId, IN PIPRIP_MIB_GET_INPUT_DATA pimgidInData, OUT PIPRIP_MIB_GET_OUTPUT_DATA* ppimgod, OUT PDWORD pdwOutSize ); DWORD ValidateInterfaceConfig( IN AsnAny * objectArray ); DWORD SetInterfaceConfig( IN AsnAny * objectArray ); DWORD UpdateUnicastPeerEntry( IN AsnAny * objectArray, IN DWORD dwOp ); DWORD AddUnicastPeerEntry( IN DWORD dwPeer, IN PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData ); DWORD DeleteUnicastPeerEntry( IN DWORD dwIndex, IN PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData ); DWORD UpdateFilterTable( IN DWORD dwOp, IN DWORD dwIfIndex, IN DWORD dwFiltType, IN PIPRIP_ROUTE_FILTER pirfFilt ); DWORD AddFilterEntry( IN DWORD dwFiltType, IN PIPRIP_ROUTE_FILTER pirfFilt, IN PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData ); DWORD DeleteFilterEntry( IN DWORD dwFiltType, IN DWORD dwIndex, IN PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData ); /////////////////////////////////////////////////////////////////////////////// // // // global group (1.3.6.1.4.1.311.1.11.1) // // // /////////////////////////////////////////////////////////////////////////////// UINT get_global( UINT actionId, AsnAny * objectArray, UINT * errorIndex ) { DWORD dwRes = (DWORD) -1, dwStatSize = 0, dwConfigSize = 0; buf_global* pbgBuffer = NULL; PIPRIP_GLOBAL_STATS pigsGlbStats = NULL; PIPRIP_GLOBAL_CONFIG pigcGlbConfig = NULL; PIPRIP_MIB_GET_OUTPUT_DATA pimgodStatData = NULL; PIPRIP_MIB_GET_OUTPUT_DATA pimgodConfigData = NULL; IPRIP_MIB_GET_INPUT_DATA imgidInData; TraceEnter( "get_global" ); switch ( actionId ) { case MIB_ACTION_GET: case MIB_ACTION_GETFIRST: // // Retrieve global information in 2 parts. // // // First get global stats // imgidInData.IMGID_TypeID = IPRIP_GLOBAL_STATS_ID; RIP_MIB_GET( &imgidInData, sizeof( IPRIP_MIB_GET_INPUT_DATA ), &pimgodStatData, &dwStatSize, dwRes ); if ( dwRes != NO_ERROR ) { break; } // // Next get global config // imgidInData.IMGID_TypeID = IPRIP_GLOBAL_CONFIG_ID; RIP_MIB_GET( &imgidInData, sizeof( IPRIP_MIB_GET_INPUT_DATA ), &pimgodConfigData, &dwConfigSize, dwRes ); break; case MIB_ACTION_GETNEXT: default: TRACE1( "Wrong Action", actionId ); return MIB_S_INVALID_PARAMETER; } // // if error print error message and free allocations // if ( dwRes != NO_ERROR ) { TraceError( dwRes ); if ( pimgodStatData ) { MprAdminMIBBufferFree ( pimgodStatData ); } if ( pimgodConfigData ) { MprAdminMIBBufferFree ( pimgodConfigData ); } return dwRes; } // // Set the return data. // // // Global Stats Data // pbgBuffer = (buf_global*) objectArray; pigsGlbStats = (PIPRIP_GLOBAL_STATS) pimgodStatData-> IMGOD_Buffer; SetAsnCounter( &(pbgBuffer-> globalSystemRouteChanges), pigsGlbStats-> GS_SystemRouteChanges ); SetAsnCounter( &(pbgBuffer-> globalTotalResponseSends), pigsGlbStats-> GS_TotalResponsesSent ); // // Global config Data // pigcGlbConfig = (PIPRIP_GLOBAL_CONFIG) pimgodConfigData-> IMGOD_Buffer; SetAsnInteger( &( pbgBuffer-> globalMaxRecQueueSize ), pigcGlbConfig-> GC_MaxRecvQueueSize ); SetAsnInteger( &( pbgBuffer-> globalMaxSendQueueSize ), pigcGlbConfig-> GC_MaxSendQueueSize ); SetAsnTimeTicks( &( pbgBuffer-> globalMinTriggeredUpdateInterval ), pigcGlbConfig-> GC_MinTriggeredUpdateInterval ); SetAsnInteger( &( pbgBuffer-> globalPeerFilterCount ), pigcGlbConfig-> GC_PeerFilterCount ); // // +1 added to adjust value to enumeration values in asn. // Enumeration in asn cannot have a value of 0. Causes a warning // to be generated by the asn compiler. // SetAsnInteger( &(pbgBuffer-> globalLoggingLevel), pigcGlbConfig-> GC_LoggingLevel + 1 ); SetAsnInteger( &( pbgBuffer-> globalPeerFilterMode ), pigcGlbConfig-> GC_PeerFilterMode + 1 ); if ( pimgodStatData ) { MprAdminMIBBufferFree ( pimgodStatData ); } if ( pimgodConfigData ) { MprAdminMIBBufferFree ( pimgodConfigData ); } TraceLeave( "get_global" ); return MIB_S_SUCCESS; } UINT set_global( UINT actionId, AsnAny * objectArray, UINT * errorIndex ) { DWORD dwRes = MIB_S_SUCCESS, dwLogLevel = 0, dwFiltMode = 0; sav_global* psgBuffer = (sav_global*) objectArray; switch ( actionId ) { case MIB_ACTION_VALIDATE : TraceEnter( " set_global - validate " ); // // Verify logging level // dwLogLevel = GetAsnInteger( &( psgBuffer-> globalLoggingLevel ), 0 ); if ( dwLogLevel < d_globalLoggingLevel_none || dwLogLevel > d_globalLoggingLevel_information ) { dwRes = MIB_S_INVALID_PARAMETER; TRACE1( "Invalid Logging level : %d\n", dwLogLevel ); } // // Verify Peer Filter Mode // dwFiltMode = GetAsnInteger( &( psgBuffer-> globalPeerFilterMode ), 0, ); if ( dwFiltMode < d_globalPeerFilterMode_disable || dwFiltMode > d_globalPeerFilterMode_exclude ) { dwRes = MIB_S_INVALID_PARAMETER; TRACE1( "Invalid Peer Filter Mode level : %d\n", dwFiltMode ); } TraceLeave( " set_global - validate " ); break; case MIB_ACTION_SET : TraceEnter( " set_global - set " ); dwRes = SetGlobalInfo( objectArray ); TraceLeave( " set_global - set " ); break; case MIB_ACTION_CLEANUP : TraceEnter( " set_global - cleanup " ); TraceLeave( " set_global - cleanup " ); break; default : TraceEnter( " set_global - Wrong action " ); TraceLeave( " set_global - Wrong Action " ); dwRes = MIB_S_INVALID_PARAMETER; break; } return dwRes; } /////////////////////////////////////////////////////////////////////////////// // // // globalPeerFilterEntry table (1.3.6.1.4.1.311.1.11.1.9.1) // // // /////////////////////////////////////////////////////////////////////////////// UINT get_globalPeerFilterEntry( UINT actionId, AsnAny * objectArray, UINT * errorIndex ) { DWORD dwRes = (DWORD) -1, dwCurrentAddr = INADDR_NONE, dwInd = 0, dwGetSize = 0, dwSetSize = 0; PDWORD pdwAddrTable= NULL; buf_globalPeerFilterEntry* pbgpfe = NULL; PIPRIP_GLOBAL_CONFIG pigc = NULL; PIPRIP_MIB_SET_INPUT_DATA pimsidInData= NULL; PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData = NULL; IPRIP_MIB_GET_INPUT_DATA imgidInData; TraceEnter( "get_globalPeerFilterEntry" ); pbgpfe = (buf_globalPeerFilterEntry*) objectArray; // // retrive the peer filter table // imgidInData.IMGID_TypeID = IPRIP_GLOBAL_CONFIG_ID; RIP_MIB_GET( &imgidInData, sizeof( IPRIP_MIB_GET_INPUT_DATA ), &pimgodOutData, &dwGetSize, dwRes ); if ( dwRes != NO_ERROR ) { TraceError( dwRes ); return dwRes; } pigc = (PIPRIP_GLOBAL_CONFIG) pimgodOutData-> IMGOD_Buffer; if ( !pigc-> GC_PeerFilterCount ) { TRACE0( "No Peer Entries" ); MprAdminMIBBufferFree( pimgodOutData ); return MIB_S_NO_MORE_ENTRIES; } pdwAddrTable = IPRIP_GLOBAL_PEER_FILTER_TABLE( pigc ); // // Locate current entry in Peer filter table // dwCurrentAddr = GetAsnIPAddress( &( pbgpfe-> globalPFAddr ), 0 ); FIND_PEER_ENTRY( dwCurrentAddr, pigc-> GC_PeerFilterCount, pdwAddrTable, dwInd ); // // get requested entry // dwRes = MIB_S_SUCCESS; switch ( actionId ) { case MIB_ACTION_GET : // // This is an idempotent case, since retieving a peer address // requires the peer address as index. // It is only useful to verify the presence of a particular peer. // if ( dwInd >= pigc-> GC_PeerFilterCount ) { dwRes = MIB_S_ENTRY_NOT_FOUND; TRACE0( "Peer Entry not found" ); } break; case MIB_ACTION_GETFIRST : // // get entry at index 0 (if available ) // dwInd = 0; if ( !pigc-> GC_PeerFilterCount ) { dwRes = MIB_S_ENTRY_NOT_FOUND; TRACE0( "Peer filter entry not found" ); } break; case MIB_ACTION_GETNEXT : // // check if entry was found // if ( dwInd >= pigc-> GC_PeerFilterCount ) { dwRes = MIB_S_ENTRY_NOT_FOUND; TRACE0( "Peer Entry not found " ); break; } // // try and get next // dwInd++; if ( dwInd >= pigc-> GC_PeerFilterCount ) { dwRes = MIB_S_NO_MORE_ENTRIES; TRACE0( "No more Peer Entries" ); break; } break; default : TRACE0( " get_globalPeerFilterEntry - Wrong Action " ); dwRes = MIB_S_INVALID_PARAMETER; break; } // // set index for next retrieval // if ( dwRes == MIB_S_SUCCESS ) { ForceSetAsnIPAddress( &( pbgpfe-> globalPFAddr ), &( pbgpfe-> dwPeerFilterAddr ), pdwAddrTable[ dwInd ] ); } if ( pimgodOutData ) { MprAdminMIBBufferFree( pimgodOutData ); } TraceLeave( "get_globalPeerFilterEntry" ); return dwRes; } UINT set_globalPeerFilterEntry( UINT actionId, AsnAny * objectArray, UINT * errorIndex ) { DWORD dwRes = MIB_S_SUCCESS, dwAddr = INADDR_NONE, dwOp = 0; sav_globalPeerFilterEntry* psgpfe = NULL; TraceEnter( " set_globalPeerFilterEntry " ); psgpfe = (sav_globalPeerFilterEntry*) objectArray; switch ( actionId ) { case MIB_ACTION_VALIDATE : // // Verify if the specified IP address is valid. // dwAddr = GetAsnIPAddress( &( psgpfe-> globalPFAddr ), INADDR_NONE ); if ( !dwAddr || dwAddr == INADDR_NONE ) { dwRes = MIB_S_INVALID_PARAMETER; TRACE0( " Invalid Peer address specified" ); } // // Verify operation tag // dwRes = GetAsnInteger( &( psgpfe-> globalPFTag ), 0 ); if ( dwRes != d_Tag_create && dwRes != d_Tag_delete ) { dwRes = MIB_S_INVALID_PARAMETER; TRACE0( " Invalid Operation specified" ); } break; case MIB_ACTION_SET : dwOp = GetAsnInteger( &( psgpfe-> globalPFTag ), 0 ); dwRes = UpdatePeerFilterTable( objectArray, dwOp ); break; case MIB_ACTION_CLEANUP : dwRes = MIB_S_SUCCESS; break; default : dwRes = MIB_S_INVALID_PARAMETER; TRACE0 ( " set_globalPeerFilterEntry - Wrong Action " ); break; } TraceLeave( " set_globalPeerFilterEntry " ); return dwRes; } /////////////////////////////////////////////////////////////////////////////// // // // interface group (1.3.6.1.4.1.311.1.11.2) // // // /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // // // ifStatsEntry table (1.3.6.1.4.1.311.1.11.2.1.1) // // // /////////////////////////////////////////////////////////////////////////////// UINT get_ifStatsEntry( UINT actionId, AsnAny * objectArray, UINT * errorIndex ) { DWORD dwRes = (DWORD) -1, dwGetSize = 0, dwSetSize = 0; buf_ifStatsEntry * pbifse = NULL; PIPRIP_IF_STATS piis = NULL; PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData = NULL; IPRIP_MIB_GET_INPUT_DATA imgidInData; TraceEnter( "get_ifStatsEntry" ); // // Retrieve Specified interface info. // pbifse = (buf_ifStatsEntry*) objectArray; imgidInData.IMGID_TypeID = IPRIP_IF_STATS_ID; imgidInData.IMGID_IfIndex = GetAsnInteger( &( pbifse-> ifSEIndex ), 0 ); // // When walking the mib using a sequence of getnext operations // the first getnext operation is translated into a getfirst // operation. // if ( actionId == MIB_ACTION_GETNEXT && !imgidInData.IMGID_IfIndex ) { actionId = MIB_ACTION_GETFIRST; } dwRes = GetInterfaceInfo( actionId, &imgidInData, &pimgodOutData, &dwGetSize ); if ( dwRes != NO_ERROR ) { TraceError( dwRes ); return dwRes; } // // Set interface stats in return buffer // piis = (PIPRIP_IF_STATS) (pimgodOutData-> IMGOD_Buffer); SetAsnInteger( &( pbifse-> ifSEState ), piis-> IS_State ); SetAsnCounter( &( pbifse-> ifSESendFailures ), piis-> IS_SendFailures ); SetAsnCounter( &( pbifse-> ifSEReceiveFailures ), piis-> IS_ReceiveFailures ); SetAsnCounter( &( pbifse-> ifSERequestSends ), piis-> IS_RequestsSent ); SetAsnCounter( &( pbifse-> ifSEResponseSends ), piis-> IS_ResponsesSent ); SetAsnCounter( &( pbifse-> ifSEResponseReceiveds ), piis-> IS_ResponsesReceived ); SetAsnCounter( &( pbifse-> ifSEBadResponsePacketReceiveds ), piis-> IS_BadResponsePacketsReceived ); SetAsnCounter( &( pbifse-> ifSEBadResponseEntriesReceiveds ), piis-> IS_BadResponseEntriesReceived ); SetAsnCounter( &( pbifse-> ifSETriggeredUpdateSends ), piis-> IS_TriggeredUpdatesSent ); // // set index for following getnext operation, (if any) // ForceSetAsnInteger( &( pbifse-> ifSEIndex ), pimgodOutData-> IMGOD_IfIndex ); if ( pimgodOutData ) { MprAdminMIBBufferFree( pimgodOutData ); } TraceLeave( "get_ifStatsEntry" ); return MIB_S_SUCCESS ; } /////////////////////////////////////////////////////////////////////////////// // // // ifConfigEntry table (1.3.6.1.4.1.311.1.11.2.2.1) // // // /////////////////////////////////////////////////////////////////////////////// UINT get_ifConfigEntry( UINT actionId, AsnAny * objectArray, UINT * errorIndex ) { DWORD dwRes = (DWORD) -1, dwGetSize = 0; buf_ifConfigEntry* pbifce = NULL; PIPRIP_IF_CONFIG piic = NULL; PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData = NULL; IPRIP_MIB_GET_INPUT_DATA imgidInData; BYTE pbAuthKey[ IPRIP_MAX_AUTHKEY_SIZE ]; TraceEnter( " get_ifConfigEntry " ); // // retrieve interface config. // pbifce = (buf_ifConfigEntry*) objectArray; imgidInData.IMGID_TypeID = IPRIP_IF_CONFIG_ID; imgidInData.IMGID_IfIndex = GetAsnInteger( &( pbifce-> ifCEIndex ), 0 ); // // When walking the mib using a sequence of getnext operations // the first getnext operation is translated into a getfirst // operation. // if ( actionId == MIB_ACTION_GETNEXT && !imgidInData.IMGID_IfIndex ) { actionId = MIB_ACTION_GETFIRST; } dwRes = GetInterfaceInfo( actionId, &imgidInData, &pimgodOutData, &dwGetSize ); if ( dwRes != NO_ERROR ) { TraceError( dwRes ); return dwRes; } // // set requiste fields // piic = (PIPRIP_IF_CONFIG) (pimgodOutData-> IMGOD_Buffer); SetAsnInteger( &( pbifce-> ifCEState ), piic-> IC_State ); SetAsnInteger( &( pbifce-> ifCEMetric ), piic-> IC_Metric ); SetAsnInteger( &( pbifce-> ifCEUpdateMode ), piic-> IC_UpdateMode + 1 ); SetAsnInteger( &( pbifce-> ifCEAcceptMode ), piic-> IC_AcceptMode + 1 ); SetAsnInteger( &( pbifce-> ifCEAnnounceMode ), piic-> IC_AnnounceMode + 1 ); SetAsnInteger( &( pbifce-> ifCEProtocolFlags ), piic-> IC_ProtocolFlags ); SetAsnTimeTicks( &( pbifce-> ifCERouteExpirationInterval ), piic-> IC_RouteExpirationInterval ); SetAsnTimeTicks( &( pbifce-> ifCERouteRemovalInterval ), piic-> IC_RouteRemovalInterval ); SetAsnTimeTicks( &( pbifce-> ifCEFullUpdateInterval ), piic-> IC_FullUpdateInterval ); SetAsnInteger( &( pbifce-> ifCEAuthenticationType ), piic-> IC_AuthenticationType ); SetAsnInteger( &( pbifce-> ifCERouteTag ), piic-> IC_RouteTag ); SetAsnInteger( &( pbifce-> ifCEUnicastPeerMode ), piic-> IC_UnicastPeerMode + 1 ); SetAsnInteger( &( pbifce-> ifCEAcceptFilterMode ), piic-> IC_AcceptFilterMode + 1 ); SetAsnInteger( &( pbifce-> ifCEAnnounceFilterMode ), piic-> IC_AnnounceFilterMode + 1 ); SetAsnInteger( &( pbifce-> ifCEUnicastPeerCount ), piic-> IC_UnicastPeerCount + 1 ); SetAsnInteger( &( pbifce-> ifCEAcceptFilterCount ), piic-> IC_AcceptFilterCount ); SetAsnInteger( &( pbifce-> ifCEAnnounceFilterCount ), piic-> IC_AnnounceFilterCount ); // // As per RFC 1724, this field is a write only field. // Authentication may not be bypassed by reading the key. // The default value to be returned is a null string. // ZeroMemory( pbAuthKey, IPRIP_MAX_AUTHKEY_SIZE ); SetAsnOctetString( &( pbifce-> ifCEAuthenticationKey ), pbifce-> pbAuthKey, pbAuthKey, IPRIP_MAX_AUTHKEY_SIZE ); // // set index for following getnext operation, (if any) // ForceSetAsnInteger( &( pbifce-> ifCEIndex ), pimgodOutData-> IMGOD_IfIndex ); if ( pimgodOutData ) { MprAdminMIBBufferFree( pimgodOutData ); } TraceLeave( " get_ifConfigEntry " ); return MIB_S_SUCCESS; } UINT set_ifConfigEntry( UINT actionId, AsnAny * objectArray, UINT * errorIndex ) { DWORD dwRes = (DWORD) -1; TraceEnter( " set_ifConfigEntry " ); switch ( actionId ) { case MIB_ACTION_VALIDATE : dwRes = ValidateInterfaceConfig( objectArray ); break; case MIB_ACTION_SET : dwRes = SetInterfaceConfig( objectArray ); break; case MIB_ACTION_CLEANUP : dwRes = MIB_S_SUCCESS; break; default : TRACE0( " set_ifConfigEntry - wrong action " ); dwRes = MIB_S_INVALID_PARAMETER; break; } TraceLeave( "set_ifConfigEntry" ); return dwRes ; } /////////////////////////////////////////////////////////////////////////////// // // // ifUnicastPeersEntry table (1.3.6.1.4.1.311.1.11.2.3.1) // // // /////////////////////////////////////////////////////////////////////////////// UINT get_ifUnicastPeersEntry( UINT actionId, AsnAny * objectArray, UINT * errorIndex ) { DWORD dwRes = (DWORD) -1, dwGetSize = 0, dwPeer = INADDR_NONE, dwInd = (DWORD) -1; PDWORD pdwAddrTable= NULL; buf_ifUnicastPeersEntry* pbifupe = NULL; PIPRIP_IF_CONFIG piic = NULL; PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData = NULL; IPRIP_MIB_GET_INPUT_DATA imgidInData; TraceEnter( " get_ifUnicastPeerEntry " ); // // retrieve interface config. // pbifupe = (buf_ifUnicastPeersEntry*) objectArray; imgidInData.IMGID_TypeID = IPRIP_IF_CONFIG_ID; imgidInData.IMGID_IfIndex = GetAsnInteger( &( pbifupe-> ifUPIfIndex ), 0 ); if ( actionId == MIB_ACTION_GETNEXT && !imgidInData.IMGID_IfIndex ) { actionId = MIB_ACTION_GETFIRST; } dwRes = GetInterfaceInfo( actionId, &imgidInData, &pimgodOutData, &dwGetSize ); if ( dwRes != NO_ERROR ) { TraceError( dwRes ); return dwRes; } // // Locate peer entry // dwPeer = GetAsnIPAddress( &( pbifupe-> ifUPAddress ), 0 ); piic = (PIPRIP_IF_CONFIG) ( pimgodOutData-> IMGOD_Buffer ); pdwAddrTable = IPRIP_IF_UNICAST_PEER_TABLE( piic ); FIND_PEER_ENTRY( dwPeer, piic-> IC_UnicastPeerCount, pdwAddrTable, dwInd ); // // return requested peer entry // dwRes = MIB_S_SUCCESS; switch ( actionId ) { case MIB_ACTION_GET : // // idempotent case. Only possible use is to verify // specific peer present. // if ( dwInd >= piic-> IC_UnicastPeerCount ) { dwRes = MIB_S_ENTRY_NOT_FOUND; TRACE0( "Unicast Peer entry not found" ); } break; case MIB_ACTION_GETFIRST : // // get entry at index 0 if available // dwInd = 0; if ( !piic-> IC_UnicastPeerCount ) { dwRes = MIB_S_NO_MORE_ENTRIES; TRACE1( "No more Peer Entries for interface : %d", imgidInData.IMGID_IfIndex ); } break; case MIB_ACTION_GETNEXT : // // check if entry was found // if ( dwInd >= piic-> IC_UnicastPeerCount ) { dwRes = MIB_S_ENTRY_NOT_FOUND; TRACE0( "Unicast Peer Entry not found " ); break; } // // try and get next // dwInd++; if ( dwInd >= piic-> IC_UnicastPeerCount ) { dwRes = MIB_S_NO_MORE_ENTRIES; TRACE1( "No more Peer Entries for interface : %d", imgidInData.IMGID_IfIndex ); break; } break; default : TRACE0( " get_globalPeerFilterEntry - Wrong Action " ); dwRes = MIB_S_INVALID_PARAMETER; break; } // // set index value for next retrieval. // if ( dwRes == MIB_S_SUCCESS ) { ForceSetAsnInteger( &( pbifupe-> ifUPIfIndex ), pimgodOutData-> IMGOD_IfIndex ); ForceSetAsnIPAddress( &( pbifupe-> ifUPAddress ), &( pbifupe-> dwUnicastPeerAddr ), pdwAddrTable[ dwInd ] ); } if ( pimgodOutData ) { MprAdminMIBBufferFree( pimgodOutData ); } TraceLeave( "get_ifUnicastPeersEntry " ); return dwRes; } UINT set_ifUnicastPeersEntry( UINT actionId, AsnAny * objectArray, UINT * errorIndex ) { DWORD dwRes = (DWORD) -1, dwOp = 0, dwAddr = INADDR_NONE; sav_ifUnicastPeersEntry* psifupe = NULL; TraceEnter( " set_ifUnicastPeersEntry " ); psifupe = (sav_ifUnicastPeersEntry*) objectArray; switch ( actionId ) { case MIB_ACTION_VALIDATE : // // Verify if the specified IP address is valid. // dwAddr = GetAsnIPAddress( &( psifupe-> ifUPAddress ), INADDR_NONE ); if ( !dwAddr || dwAddr == INADDR_NONE ) { dwRes = MIB_S_INVALID_PARAMETER; TRACE0( " Invalid Peer address specified" ); break; } // // Verify operation tag // dwRes = GetAsnInteger( &( psifupe-> ifUPTag ), 0 ); if ( dwRes != d_Tag_create && dwRes != d_Tag_delete ) { dwRes = MIB_S_INVALID_PARAMETER; TRACE0( " Invalid Operation specified" ); break; } dwRes = MIB_S_SUCCESS; break; case MIB_ACTION_SET : dwOp = GetAsnInteger( &( psifupe-> ifUPTag ), 0 ); dwRes = UpdateUnicastPeerEntry( objectArray, dwOp ); break; case MIB_ACTION_CLEANUP : dwRes = MIB_S_SUCCESS; break; default : dwRes = MIB_S_INVALID_PARAMETER; TRACE0 ( " set_ifUnicastPeersEntry - Wrong Action " ); break; } TraceLeave( " set_ifUnicastPeersEntry " ); return dwRes; } /////////////////////////////////////////////////////////////////////////////// // // // ifAcceptRouteFilterEntry table (1.3.6.1.4.1.311.1.11.2.4.1) // // // /////////////////////////////////////////////////////////////////////////////// UINT get_ifAcceptRouteFilterEntry( UINT actionId, AsnAny * objectArray, UINT * errorIndex ) { DWORD dwRes = (DWORD) -1, dwIndex = 0, dwGetSize = 0; PIPRIP_IF_CONFIG piic = NULL; PIPRIP_ROUTE_FILTER pFiltTable = NULL; PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData = NULL; buf_ifAcceptRouteFilterEntry * pgifRF = NULL; IPRIP_ROUTE_FILTER irf; IPRIP_MIB_GET_INPUT_DATA imgidInData; TraceEnter( "get_ifAcceptRouteFilterEntry" ); // // retrieve interface Info // pgifRF = (buf_ifAcceptRouteFilterEntry*) objectArray; imgidInData.IMGID_TypeID = IPRIP_IF_CONFIG_ID; imgidInData.IMGID_IfIndex = GetAsnInteger( &( pgifRF-> ifAcceptRFIfIndex ), 0 ); if ( actionId == MIB_ACTION_GETNEXT && !imgidInData.IMGID_IfIndex ) { actionId = MIB_ACTION_GETFIRST; } dwRes = GetInterfaceInfo( actionId, &imgidInData, &pimgodOutData, &dwGetSize ); if ( dwRes != NO_ERROR ) { TraceError( dwRes ); return dwRes; } // // Find accept filter // irf.RF_LoAddress = GetAsnIPAddress( &( pgifRF-> ifAcceptRFLoAddress ), INADDR_NONE ); irf.RF_HiAddress = GetAsnIPAddress( &( pgifRF-> ifAcceptRFHiAddress ), INADDR_NONE ); piic = (PIPRIP_IF_CONFIG) pimgodOutData-> IMGOD_Buffer; pFiltTable = IPRIP_IF_ACCEPT_FILTER_TABLE( piic ); FIND_FILTER( &irf, piic-> IC_AcceptFilterCount, pFiltTable, dwIndex ); // // retrieve requested entry // dwRes = MIB_S_SUCCESS; switch ( actionId ) { case MIB_ACTION_GET : // // Idempotent case // if ( dwIndex >= piic-> IC_AcceptFilterCount ) { dwRes = MIB_S_ENTRY_NOT_FOUND; TRACE0( "Accept filter not found" ); } break; case MIB_ACTION_GETFIRST : dwIndex = 0; if ( !piic-> IC_AcceptFilterCount ) { dwRes = MIB_S_ENTRY_NOT_FOUND; TRACE0( "No Accept filters present " ); } break; case MIB_ACTION_GETNEXT : if ( dwIndex >= piic-> IC_AcceptFilterCount ) { dwRes = MIB_S_ENTRY_NOT_FOUND; TRACE0( "No Accept filters present " ); } dwIndex++; if ( dwIndex >= piic-> IC_AcceptFilterCount ) { dwRes = MIB_S_NO_MORE_ENTRIES; TRACE0( "No More Accept filters present " ); } break; default : dwRes = MIB_S_INVALID_PARAMETER; TRACE0 ( "get_ifAcceptRouteFilterEntry - Wrong Action " ); break; } // // set index for next retrieveal // if ( dwRes == MIB_S_SUCCESS ) { ForceSetAsnInteger( &( pgifRF-> ifAcceptRFIfIndex ), pimgodOutData-> IMGOD_IfIndex ); ForceSetAsnIPAddress( &( pgifRF-> ifAcceptRFLoAddress ), &( pgifRF-> dwFilterLoAddr ), pFiltTable[ dwIndex ].RF_LoAddress ); ForceSetAsnIPAddress( &( pgifRF-> ifAcceptRFHiAddress ), &( pgifRF-> dwFilterHiAddr ), pFiltTable[ dwIndex ].RF_HiAddress ); } if ( pimgodOutData ) { MprAdminMIBBufferFree( pimgodOutData ); } TraceLeave( "get_ifAcceptRouteFilterEntry" ); return dwRes; } UINT set_ifAcceptRouteFilterEntry( UINT actionId, AsnAny * objectArray, UINT * errorIndex ) { DWORD dwRes = (DWORD) -1, dwIndex = 0, dwTag = 0; sav_ifAcceptRouteFilterEntry* psifRF = NULL; IPRIP_ROUTE_FILTER irf; TraceEnter( "set_ifAcceptRouteFilterEntry" ); psifRF = (sav_ifAcceptRouteFilterEntry*) objectArray; dwIndex = GetAsnInteger( &( psifRF-> ifAcceptRFIfIndex ), 0 ); irf.RF_LoAddress = GetAsnIPAddress( &( psifRF-> ifAcceptRFLoAddress ), INADDR_NONE ); irf.RF_HiAddress = GetAsnIPAddress( &( psifRF-> ifAcceptRFHiAddress ), INADDR_NONE ); dwTag = GetAsnInteger( &( psifRF-> ifAcceptRFTag ), 0 ); switch ( actionId ) { case MIB_ACTION_VALIDATE : // // Check filter ranges are valid address // if ( !irf.RF_LoAddress || irf.RF_LoAddress == INADDR_NONE || !irf.RF_HiAddress || irf.RF_HiAddress == INADDR_NONE || ( dwTag != d_Tag_create && dwTag != d_Tag_delete ) ) { dwRes = MIB_S_INVALID_PARAMETER; TRACE0( "Invalid parameter value " ); } break; case MIB_ACTION_SET : dwRes = UpdateFilterTable( dwTag, dwIndex, RIP_MIB_ACCEPT_FILTER, &irf ); break; case MIB_ACTION_CLEANUP : dwRes = MIB_S_SUCCESS; break; default : dwRes = MIB_S_INVALID_PARAMETER; TRACE0 ( " set_ifAcceptRouteFilterEntry - Wrong Action " ); break; } TraceLeave( "set_ifAcceptRouteFilterEntry" ); return dwRes; } /////////////////////////////////////////////////////////////////////////////// // // // ifAnnounceRouteFilterEntry table (1.3.6.1.4.1.311.1.11.2.5.1) // // // /////////////////////////////////////////////////////////////////////////////// UINT get_ifAnnounceRouteFilterEntry( UINT actionId, AsnAny * objectArray, UINT * errorIndex ) { DWORD dwRes = (DWORD) -1, dwIndex = 0, dwGetSize = 0; IPRIP_ROUTE_FILTER irf; IPRIP_MIB_GET_INPUT_DATA imgidInData; PIPRIP_IF_CONFIG piic = NULL; PIPRIP_ROUTE_FILTER pFiltTable = NULL; PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData = NULL; buf_ifAnnounceRouteFilterEntry * pgifRF = NULL; TraceEnter( "get_ifAnnounceRouteFilterEntry" ); // // retrieve interface Info // pgifRF = (buf_ifAnnounceRouteFilterEntry*) objectArray; imgidInData.IMGID_TypeID = IPRIP_IF_CONFIG_ID; imgidInData.IMGID_IfIndex = GetAsnInteger( &( pgifRF-> ifAnnounceRFIfIndex ), 0 ); if ( actionId == MIB_ACTION_GETNEXT && !imgidInData.IMGID_IfIndex ) { actionId = MIB_ACTION_GETFIRST; } dwRes = GetInterfaceInfo( actionId, &imgidInData, &pimgodOutData, &dwGetSize ); if ( dwRes != NO_ERROR ) { TraceError( dwRes ); return dwRes; } // // find specfied filter // irf.RF_LoAddress = GetAsnIPAddress( &( pgifRF-> ifAnnounceRFLoAddress ), INADDR_NONE ); irf.RF_HiAddress = GetAsnIPAddress( &( pgifRF-> ifAnnounceRFHiAddress ), INADDR_NONE ); piic = (PIPRIP_IF_CONFIG) pimgodOutData-> IMGOD_Buffer; pFiltTable = IPRIP_IF_ACCEPT_FILTER_TABLE( piic ); FIND_FILTER( &irf, piic-> IC_AnnounceFilterCount, pFiltTable, dwIndex ); // // get filter info. // dwRes = MIB_S_SUCCESS; switch ( actionId ) { case MIB_ACTION_GET : // // Idempotent case // if ( dwIndex >= piic-> IC_AnnounceFilterCount ) { dwRes = MIB_S_ENTRY_NOT_FOUND; TRACE0( "Announce filter not found" ); } break; case MIB_ACTION_GETFIRST : dwIndex = 0; if ( !piic-> IC_AnnounceFilterCount ) { dwRes = MIB_S_ENTRY_NOT_FOUND; TRACE0( "No Announce filters present " ); } break; case MIB_ACTION_GETNEXT : if ( dwIndex >= piic-> IC_AnnounceFilterCount ) { dwRes = MIB_S_ENTRY_NOT_FOUND; TRACE0( "No Announce filters present " ); } dwIndex++; if ( dwIndex >= piic-> IC_AnnounceFilterCount ) { dwRes = ERROR_NO_MORE_ITEMS; TRACE0( "No More Announce filters present " ); } dwRes = MIB_S_SUCCESS; break; default : dwRes = MIB_S_INVALID_PARAMETER; TRACE0 ( "get_ifAnnounceRouteFilterEntry - Wrong Action " ); break; } // // set up the indices for next retrieval // if ( dwRes == MIB_S_SUCCESS ) { ForceSetAsnInteger( &( pgifRF-> ifAnnounceRFIfIndex ), pimgodOutData-> IMGOD_IfIndex ); ForceSetAsnIPAddress( &( pgifRF-> ifAnnounceRFLoAddress ), &( pgifRF-> dwFilterLoAddr ), pFiltTable[ dwIndex ].RF_LoAddress ); ForceSetAsnIPAddress( &( pgifRF-> ifAnnounceRFHiAddress ), &( pgifRF-> dwFilterHiAddr ), pFiltTable[ dwIndex ].RF_HiAddress ); } if ( pimgodOutData ) { MprAdminMIBBufferFree( pimgodOutData ); } TraceLeave( "get_ifAnnounceRouteFilterEntry" ); return dwRes; } UINT set_ifAnnounceRouteFilterEntry( UINT actionId, AsnAny * objectArray, UINT * errorIndex ) { DWORD dwRes = (DWORD) -1, dwIndex = 0, dwTag = 0; sav_ifAnnounceRouteFilterEntry* psifRF = NULL; IPRIP_ROUTE_FILTER irf; TraceEnter( "set_ifAnnounceRouteFilterEntry" ); psifRF = (sav_ifAnnounceRouteFilterEntry*) objectArray; dwIndex = GetAsnInteger( &( psifRF-> ifAnnounceRFLoAddress ), 0 ); irf.RF_LoAddress = GetAsnIPAddress( &( psifRF-> ifAnnounceRFLoAddress ), INADDR_NONE ); irf.RF_HiAddress = GetAsnIPAddress( &( psifRF-> ifAnnounceRFHiAddress ), INADDR_NONE ); dwTag = GetAsnInteger( &( psifRF-> ifAnnounceRFTag ), 0 ); switch ( actionId ) { case MIB_ACTION_VALIDATE : // // Check filter ranges are valid address // if ( !irf.RF_LoAddress || irf.RF_LoAddress == INADDR_NONE || !irf.RF_HiAddress || irf.RF_HiAddress == INADDR_NONE || ( dwTag != d_Tag_create && dwTag != d_Tag_delete ) ) { dwRes = MIB_S_INVALID_PARAMETER; TRACE0( "Invalid parameter value " ); } break; case MIB_ACTION_SET : dwRes = UpdateFilterTable( dwTag, dwIndex, RIP_MIB_ANNOUNCE_FILTER, &irf ); break; case MIB_ACTION_CLEANUP : dwRes = MIB_S_SUCCESS; break; default : dwRes = MIB_S_INVALID_PARAMETER; TRACE0 ( " set_ifAnnounceRouteFilterEntry - Wrong Action " ); break; } TraceLeave( "set_ifAnnounceRouteFilterEntry" ); return dwRes; } /////////////////////////////////////////////////////////////////////////////// // // // ifBindingEntry table (1.3.6.1.4.1.311.1.11.2.6.1) // // // /////////////////////////////////////////////////////////////////////////////// UINT get_ifBindingEntry( UINT actionId, AsnAny * objectArray, UINT * errorIndex ) { DWORD dwRes = (DWORD) -1, dwGetSize = 0; buf_ifBindingEntry* pbifb = NULL; PIPRIP_IF_BINDING piib = NULL; PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData = NULL; IPRIP_MIB_GET_INPUT_DATA imgidInData; TraceEnter( " get_ifBindingEntry " ); // // retrieve interface binding info. // pbifb = (buf_ifBindingEntry*) objectArray; imgidInData.IMGID_TypeID = IPRIP_IF_BINDING_ID; imgidInData.IMGID_IfIndex = GetAsnInteger( &( pbifb-> ifBindingIndex ), 0 ); if ( actionId == MIB_ACTION_GETNEXT && !imgidInData.IMGID_IfIndex ) { actionId = MIB_ACTION_GETFIRST; } dwRes = GetInterfaceInfo( actionId, &imgidInData, &pimgodOutData, &dwGetSize ); if ( dwRes != NO_ERROR ) { TraceError( dwRes ); return dwRes; } // // set requiste fields // piib = (PIPRIP_IF_BINDING) (pimgodOutData-> IMGOD_Buffer); SetAsnInteger( &( pbifb-> ifBindingState ), piib-> IB_State + 1 ); SetAsnCounter( &( pbifb-> ifBindingCounts ), piib-> IB_AddrCount ); ForceSetAsnInteger( &( pbifb-> ifBindingIndex ), pimgodOutData-> IMGOD_IfIndex ); if ( pimgodOutData ) { MprAdminMIBBufferFree( pimgodOutData ); } TraceLeave( " get_ifBindingEntry " ); return MIB_S_SUCCESS ; } /////////////////////////////////////////////////////////////////////////////// // // // ifAddressEntry table (1.3.6.1.4.1.311.1.11.2.7.1) // // // /////////////////////////////////////////////////////////////////////////////// UINT get_ifAddressEntry( UINT actionId, AsnAny * objectArray, UINT * errorIndex ) { DWORD dwRes = (DWORD) -1, dwIndex = (DWORD) -1, dwGetSize = 0; buf_ifAddressEntry * pbifae = NULL; PIPRIP_IF_BINDING piib = NULL; PIPRIP_IP_ADDRESS pia = NULL; PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData = NULL; IPRIP_IP_ADDRESS ipa; IPRIP_MIB_GET_INPUT_DATA imgidInData; TraceEnter( " get_ifAddressEntry " ); // // retrieve interface binding info. // pbifae = (buf_ifAddressEntry*) objectArray; imgidInData.IMGID_TypeID = IPRIP_IF_BINDING_ID; imgidInData.IMGID_IfIndex = GetAsnInteger( &( pbifae-> ifAEIfIndex ), 0 ); if ( actionId == MIB_ACTION_GETNEXT && !imgidInData.IMGID_IfIndex ) { actionId = MIB_ACTION_GETFIRST; } dwRes = GetInterfaceInfo( actionId, &imgidInData, &pimgodOutData, &dwGetSize ); if ( dwRes != NO_ERROR ) { TraceError( dwRes ); return dwRes; } // // retrieve IPAddress from IP Address table // ipa.IA_Address = GetAsnIPAddress( &( pbifae-> ifAEAddress), INADDR_NONE ); ipa.IA_Netmask = GetAsnIPAddress( &( pbifae-> ifAEMask), INADDR_NONE ); piib = (PIPRIP_IF_BINDING) pimgodOutData-> IMGOD_Buffer; pia = (PIPRIP_IP_ADDRESS) IPRIP_IF_ADDRESS_TABLE( piib ); FIND_IP_ADDRESS( ipa, piib-> IB_AddrCount, pia, dwIndex ); // // set appr fields // dwRes = MIB_S_SUCCESS; switch ( actionId ) { case MIB_ACTION_GET : // // idempotent case. Only possible use is to verify // specific peer present. // if ( dwIndex >= piib-> IB_AddrCount ) { dwRes = MIB_S_ENTRY_NOT_FOUND; TRACE0( "IP address entry not found" ); } break; case MIB_ACTION_GETFIRST : // // get entry at index 0 if available // dwIndex = 0; if ( !piib-> IB_AddrCount ) { dwRes = MIB_S_NO_MORE_ENTRIES; TRACE1( "No more IP address Entries for interface : %d", imgidInData.IMGID_IfIndex ); } break; case MIB_ACTION_GETNEXT : // // check if entry was found // if ( dwIndex >= piib-> IB_AddrCount ) { dwRes = MIB_S_ENTRY_NOT_FOUND; TRACE0( "IP address Entry not found " ); break; } // // try and get next // dwIndex++; if ( dwIndex >= piib-> IB_AddrCount ) { dwRes = MIB_S_NO_MORE_ENTRIES; TRACE1( "No more IP address Entries for interface : %d", imgidInData.IMGID_IfIndex ); break; } dwRes = MIB_S_SUCCESS; break; default : TRACE0( " get_globalPeerFilterEntry - Wrong Action " ); dwRes = MIB_S_INVALID_PARAMETER; break; } // // set index for next retieval // if ( dwRes == MIB_S_SUCCESS ) { ForceSetAsnInteger( &( pbifae-> ifAEIfIndex ), pimgodOutData-> IMGOD_IfIndex ); ForceSetAsnIPAddress( &( pbifae-> ifAEAddress ), &( pbifae-> dwAddress ), pia[ dwIndex ].IA_Address ); ForceSetAsnIPAddress( &( pbifae-> ifAEMask ), &( pbifae-> dwMask ), pia[ dwIndex ].IA_Netmask ); } if ( pimgodOutData ) { MprAdminMIBBufferFree( pimgodOutData ); } TraceLeave( " get_ifAddressEntry " ); return dwRes; } /////////////////////////////////////////////////////////////////////////////// // // // peer group (1.3.6.1.4.1.311.1.11.3) // // // /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // // // ifPeerStatsEntry table (1.3.6.1.4.1.311.1.11.3.1.1) // // // /////////////////////////////////////////////////////////////////////////////// UINT get_ifPeerStatsEntry( UINT actionId, AsnAny * objectArray, UINT * errorIndex ) { DWORD dwRes = (DWORD) -1, dwGetSize = 0; buf_ifPeerStatsEntry* pbifpse = NULL; PIPRIP_PEER_STATS pips = NULL; PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData = NULL; IPRIP_MIB_GET_INPUT_DATA imgidInData; TraceEnter( "get_ifPeerStatsEntry" ); // // retrieve interface config. // pbifpse = (buf_ifPeerStatsEntry*) objectArray; imgidInData.IMGID_TypeID = IPRIP_PEER_STATS_ID; imgidInData.IMGID_PeerAddress = (DWORD) GetAsnIPAddress( &( pbifpse-> ifPSAddress ), 0 ); if ( actionId == MIB_ACTION_GETNEXT && !imgidInData.IMGID_PeerAddress ) { actionId = MIB_ACTION_GETFIRST; } dwRes = GetPeerStatsInfo( actionId, &imgidInData, &pimgodOutData, &dwGetSize ); if ( dwRes != NO_ERROR ) { TraceError( dwRes ); return dwRes; } // // set requiste fields // pips = (PIPRIP_PEER_STATS) (pimgodOutData-> IMGOD_Buffer); SetAsnInteger( &( pbifpse-> ifPSLastPeerRouteTag ), pips-> PS_LastPeerUpdateTickCount ); SetAsnTimeTicks( &( pbifpse-> ifPSLastPeerUpdateTickCount ), pips-> PS_LastPeerUpdateTickCount ); SetAsnInteger( &( pbifpse-> ifPSLastPeerUpdateVersion ), pips-> PS_LastPeerUpdateVersion ); SetAsnCounter( &( pbifpse-> ifPSPeerBadResponsePackets ), pips-> PS_BadResponsePacketsFromPeer ); SetAsnCounter( &( pbifpse-> ifPSPeerBadResponseEntries ), pips-> PS_BadResponseEntriesFromPeer ); // // Set index for next retrieval // ForceSetAsnIPAddress( &( pbifpse-> ifPSAddress ), &( pbifpse-> dwPeerAddr ), pimgodOutData-> IMGOD_PeerAddress ); if ( pimgodOutData ) { MprAdminMIBBufferFree( pimgodOutData ); } TraceLeave( " get_ifPeerStatsEntry " ); return MIB_S_SUCCESS ; } DWORD GetGlobalConfigInfo( OUT PIPRIP_MIB_GET_OUTPUT_DATA * ppimgod, OUT PDWORD pdwSize ) { DWORD dwRes = (DWORD) -1; PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData = NULL; IPRIP_MIB_GET_INPUT_DATA imgidInData; do { // // retrieve global config // imgidInData.IMGID_TypeID = IPRIP_GLOBAL_CONFIG_ID; RIP_MIB_GET( &imgidInData, sizeof( IPRIP_MIB_GET_INPUT_DATA ), &pimgodOutData, pdwSize, dwRes ); if ( dwRes != NO_ERROR ) { TraceError( dwRes ); break; } *ppimgod = pimgodOutData; } while ( FALSE ); return dwRes; } // // SetGlobalInfo // // // Sets the global RIP info. // DWORD SetGlobalInfo( IN AsnAny * objectArray ) { DWORD dwRes = (DWORD) -1, dwGetSize = 0, dwSetSize = 0; sav_global* psg = NULL; PIPRIP_GLOBAL_CONFIG pigc = NULL; PIPRIP_MIB_SET_INPUT_DATA pimsidInData= NULL; PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData = NULL; do { // // Retrieve the global config Data first // dwRes = GetGlobalConfigInfo( &pimgodOutData, &dwGetSize ); if ( dwRes != NO_ERROR ) { break; } pigc = (PIPRIP_GLOBAL_CONFIG) pimgodOutData-> IMGOD_Buffer; psg = (sav_global*) objectArray; // // Allocate set info buffer // dwSetSize = sizeof( IPRIP_MIB_SET_INPUT_DATA ) - 1 + IPRIP_GLOBAL_CONFIG_SIZE( pigc ); pimsidInData = (PIPRIP_MIB_SET_INPUT_DATA) RIP_MIB_ALLOC( dwSetSize ); if ( pimsidInData == NULL ) { dwRes = ERROR_NOT_ENOUGH_MEMORY; TRACE0( "SetGlobalData - Mem. alloc failed" ); break; } // // Set config info fields. // if the variable is not specified, we // set the field to its previous value i.e. an empty assignment. // pimsidInData-> IMSID_TypeID = IPRIP_GLOBAL_CONFIG_ID; pimsidInData-> IMSID_IfIndex = (DWORD) -1; pimsidInData-> IMSID_BufferSize = IPRIP_GLOBAL_CONFIG_SIZE( pigc ); pigc-> GC_MaxRecvQueueSize = GetAsnInteger( &( psg-> globalMaxRecQueueSize ), pigc-> GC_MaxRecvQueueSize ); pigc-> GC_MaxSendQueueSize = GetAsnInteger( &( psg-> globalMaxSendQueueSize ), pigc-> GC_MaxSendQueueSize ); pigc-> GC_MinTriggeredUpdateInterval = GetAsnTimeTicks( &( psg-> globalMinTriggeredUpdateInterval ), pigc-> GC_MinTriggeredUpdateInterval ); // // -1 is subtracted from the enumerated fields to adjust // the ASN enumeration values to the actual values. // This is required since the enumeration cannot have // a zero value as per the ASN compiler, but one of the // actual values for the field in the config is a zero. // // as a caveat, if the enumerated field is not specified in // this set operation, to preserve the value of the field // in the config, we first increment it. This way on the // -1 operation the value is restored. // pigc-> GC_LoggingLevel++; pigc-> GC_LoggingLevel = GetAsnInteger( &( psg-> globalLoggingLevel ), pigc-> GC_LoggingLevel ) - 1; pigc-> GC_PeerFilterMode++; pigc-> GC_PeerFilterMode = GetAsnInteger( &( psg-> globalPeerFilterMode ), pigc-> GC_PeerFilterMode ) - 1; CopyMemory( (PVOID) pimsidInData-> IMSID_Buffer, (PVOID*) pigc, IPRIP_GLOBAL_CONFIG_SIZE( pigc ) ); // // Save the info. in the MIB // RIP_MIB_SET( pimsidInData, dwSetSize, dwRes ); if ( dwRes != NO_ERROR ) { TraceError( dwRes ); break; } dwRes = MIB_S_SUCCESS; } while ( FALSE ); // // Free allocations // if ( pimgodOutData ) { MprAdminMIBBufferFree( pimgodOutData ); } if ( pimsidInData ) { RIP_MIB_FREE( pimsidInData ); } return dwRes; } DWORD UpdatePeerFilterTable( IN AsnAny * objectArray, IN DWORD dwOp ) { DWORD dwRes = (DWORD) -1, dwInd = 0, dwPeerAddr = INADDR_NONE, dwGetSize = 0, dwSetSize = 0; PDWORD pdwAddrTable= 0; sav_globalPeerFilterEntry* psgpfe = NULL; PIPRIP_GLOBAL_CONFIG pigc = NULL; PIPRIP_MIB_SET_INPUT_DATA pimsid = NULL; PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData = NULL; do { // // Get global info // dwRes = GetGlobalConfigInfo( &pimgodOutData, &dwGetSize ); if ( dwRes != NO_ERROR ) { break; } // // Find filter entry // psgpfe = (sav_globalPeerFilterEntry*) objectArray; dwPeerAddr = GetAsnIPAddress( &( psgpfe-> globalPFAddr ), 0 ); pigc = (PIPRIP_GLOBAL_CONFIG) pimgodOutData-> IMGOD_Buffer; pdwAddrTable= IPRIP_GLOBAL_PEER_FILTER_TABLE( pigc ); FIND_PEER_ENTRY( dwPeerAddr, pigc-> GC_PeerFilterCount, pdwAddrTable, dwInd ); // // if operation is filter add // if ( dwOp == d_Tag_create ) { // // if peer already present, quit // if ( pigc-> GC_PeerFilterCount && dwInd < pigc-> GC_PeerFilterCount ) { dwRes = MIB_S_SUCCESS; break; } else { dwRes = AddPeerFilterEntry( dwPeerAddr, pimgodOutData ); } break; } // // operation is filter delete // // // if peer is not present quit. // if ( !pigc-> GC_PeerFilterCount || dwInd >= pigc-> GC_PeerFilterCount ) { dwRes = MIB_S_SUCCESS; break; } dwRes = DeletePeerFilterEntry( dwInd, pimgodOutData ); } while ( FALSE ); if ( pimgodOutData ) { MprAdminMIBBufferFree( pimgodOutData ); } return dwRes; } DWORD AddPeerFilterEntry( IN DWORD dwPeerAddr, IN PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData ) { DWORD dwRes = (DWORD) -1, dwSetSize = 0; PDWORD pdwAddrTable= NULL; PIPRIP_GLOBAL_CONFIG pigc = NULL; PIPRIP_MIB_SET_INPUT_DATA pimsid = NULL; do { // // Peer needs to be added. // // // compute buffer size required // pigc = (PIPRIP_GLOBAL_CONFIG) pimgodOutData-> IMGOD_Buffer; dwSetSize = sizeof( IPRIP_MIB_SET_INPUT_DATA ) - 1 + IPRIP_GLOBAL_CONFIG_SIZE( pigc ) + sizeof( DWORD ); pimsid = (PIPRIP_MIB_SET_INPUT_DATA) RIP_MIB_ALLOC( dwSetSize ); if ( !pimsid ) { dwRes = ERROR_NOT_ENOUGH_MEMORY; TRACE0( "AddPeerFilterEntry - out of memory" ); break; } // // Add filter // pimsid-> IMSID_TypeID = IPRIP_GLOBAL_CONFIG_ID; pimsid-> IMSID_IfIndex = (DWORD) -1; pimsid-> IMSID_BufferSize = IPRIP_GLOBAL_CONFIG_SIZE( pigc ) + sizeof( DWORD ); CopyMemory( (PVOID) &( pimsid-> IMSID_Buffer ), (VOID *) pigc, IPRIP_GLOBAL_CONFIG_SIZE( pigc ) ); pigc = (PIPRIP_GLOBAL_CONFIG) pimsid-> IMSID_Buffer; pdwAddrTable = IPRIP_GLOBAL_PEER_FILTER_TABLE( pigc ); pdwAddrTable[ pigc-> GC_PeerFilterCount ] = dwPeerAddr; pigc-> GC_PeerFilterCount++; // // Update MIB // RIP_MIB_SET( pimsid, dwSetSize, dwRes ); } while ( FALSE ); if ( pimsid ) { RIP_MIB_FREE( pimsid ); } return dwRes; } DWORD DeletePeerFilterEntry( IN DWORD dwIndex, IN PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData ) { DWORD dwRes = (DWORD) -1, dwSetSize = 0, dwSrc = 0, dwDst = 0; PDWORD pdwSrcTable = NULL, pdwDstTable = NULL; PIPRIP_GLOBAL_CONFIG pigc = NULL; PIPRIP_MIB_SET_INPUT_DATA pimsid = NULL; do { // // Peer needs to be added. // // // compute buffer size required // pigc = (PIPRIP_GLOBAL_CONFIG) pimgodOutData-> IMGOD_Buffer; dwSetSize = sizeof( IPRIP_MIB_SET_INPUT_DATA ) - 1 + IPRIP_GLOBAL_CONFIG_SIZE( pigc ) - sizeof( DWORD ); pimsid = (PIPRIP_MIB_SET_INPUT_DATA) RIP_MIB_ALLOC( dwSetSize ); if ( !pimsid ) { dwRes = ERROR_NOT_ENOUGH_MEMORY; TRACE0( "AddPeerFilterEntry - out of memory" ); break; } // // Delete filter // // // Copy base global config structure // pimsid-> IMSID_TypeID = IPRIP_GLOBAL_CONFIG_ID; pimsid-> IMSID_IfIndex = (DWORD) -1; pimsid-> IMSID_BufferSize = IPRIP_GLOBAL_CONFIG_SIZE( pigc ) - sizeof( DWORD ); CopyMemory( (PVOID) &( pimsid-> IMSID_Buffer ), (VOID *) pigc, sizeof( IPRIP_GLOBAL_CONFIG ) ); // // Copy peer table. Skip entry to be deleted // pdwSrcTable = IPRIP_GLOBAL_PEER_FILTER_TABLE( pigc ); pigc = ( PIPRIP_GLOBAL_CONFIG ) pimsid-> IMSID_Buffer; pdwDstTable = IPRIP_GLOBAL_PEER_FILTER_TABLE( pigc ); DELETE_PEER_ENTRY( dwIndex, pigc-> GC_PeerFilterCount, pdwSrcTable, pdwDstTable ); pigc-> GC_PeerFilterCount--; // // Update MIB // RIP_MIB_SET( pimsid, dwSetSize, dwRes ); } while ( FALSE ); if ( pimsid ) { RIP_MIB_FREE( pimsid ); } return dwRes; } DWORD GetInterfaceInfo( IN UINT actionId, IN PIPRIP_MIB_GET_INPUT_DATA pimgidInData, OUT PIPRIP_MIB_GET_OUTPUT_DATA* ppimgod, OUT PDWORD pdwOutSize ) { DWORD dwRes = (DWORD) -1; PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData = NULL; *ppimgod = NULL; switch ( actionId ) { case MIB_ACTION_GET : RIP_MIB_GET( pimgidInData, sizeof( IPRIP_MIB_GET_INPUT_DATA ), &pimgodOutData, pdwOutSize, dwRes ); // // ERROR_INVALID_PARAMETER is returned when there is // no interface for the specified index. // if (( dwRes == ERROR_INVALID_PARAMETER ) || ( dwRes == ERROR_NOT_FOUND )) { dwRes = MIB_S_ENTRY_NOT_FOUND; } break; case MIB_ACTION_GETFIRST : RIP_MIB_GETFIRST( pimgidInData, sizeof( IPRIP_MIB_GET_INPUT_DATA ), &pimgodOutData, pdwOutSize, dwRes ); // // ERROR_INVALID_PARAMETER is returned when there is // no interface for the specified index. // if ( dwRes == ERROR_INVALID_PARAMETER ) { dwRes = MIB_S_NO_MORE_ENTRIES; } break; case MIB_ACTION_GETNEXT : RIP_MIB_GETNEXT( pimgidInData, sizeof( IPRIP_MIB_GET_INPUT_DATA ), &pimgodOutData, pdwOutSize, dwRes ); // // ERROR_INVALID_PARAMETER is returned when there is // no interface for the specified index. // if ( dwRes == ERROR_INVALID_PARAMETER || pimgodOutData==NULL) { dwRes = MIB_S_NO_MORE_ENTRIES; break; } // // Get Next wraps to the next table at the end of the // entries in the current table. To flag the end of a table, // check the end of the table. // if ( pimgidInData-> IMGID_TypeID != pimgodOutData-> IMGOD_TypeID ) { MprAdminMIBBufferFree( pimgodOutData ); dwRes = MIB_S_NO_MORE_ENTRIES; } break; default : dwRes = MIB_S_INVALID_PARAMETER; break; } if ( dwRes == NO_ERROR ) { *ppimgod = pimgodOutData; } return dwRes; } DWORD ValidateInterfaceConfig( IN AsnAny * objectArray ) { DWORD dwRes = MIB_S_INVALID_PARAMETER, dwMetric = (DWORD) -1, dwMode = (DWORD) -1; sav_ifConfigEntry* psifce = (sav_ifConfigEntry*) objectArray; do { // // verify metric is in [0..16] // dwMetric = GetAsnInteger( &( psifce-> ifCEMetric ), (DWORD) -1 ); if ( dwMetric > 16 ) { TRACE1( " Invalid metric (%d) specified ", dwMetric ); break; } // // verify update, annouce, accept modes // dwMode = GetAsnInteger( &( psifce-> ifCEUpdateMode ), (DWORD) -1 ); if ( dwMode != d_ifCEUpdateMode_periodic && dwMode != d_ifCEUpdateMode_demand ) { TRACE1( " Invalid update mode (%d) specified ", dwMode ); break; } dwMode = GetAsnInteger( &( psifce-> ifCEAcceptMode ), (DWORD) -1 ); if ( dwMode < d_ifCEAcceptMode_disable || dwMode > d_ifCEAcceptMode_rip2 ) { TRACE1( " Invalid Accept mode (%d) specified ", dwMode ); break; } dwMode = GetAsnInteger( &( psifce-> ifCEAnnounceMode ), (DWORD) -1 ); if ( dwMode < d_ifCEAnnounceMode_disable || dwMode > d_ifCEAnnounceMode_rip2 ) { TRACE1( " Invalid Announce mode (%d) specified ", dwMode ); break; } // // Verify protcol flags, authentication type // dwMode = GetAsnInteger( &( psifce-> ifCEProtocolFlags ), (DWORD) -1 ); if ( dwMode > MAX_PROTOCOL_FLAG_VALUE ) { TRACE1( " Invalid protocol flags (%d) specified ", dwMode ); break; } dwMode = GetAsnInteger( &( psifce-> ifCEAuthenticationType ), (DWORD) -1 ); if ( dwMode < d_ifCEAuthenticationType_noAuthentication || dwMode > d_ifCEAuthenticationType_md5 ) { TRACE1( " Invalid authentication type (%d) specified ", dwMode ); break; } // // Verify Unicast peer, Announce/Accept filter modes // dwMode = GetAsnInteger( &( psifce-> ifCEUnicastPeerMode ), (DWORD) -1 ); if ( dwMode < d_ifCEUnicastPeerMode_disable || dwMode > d_ifCEUnicastPeerMode_peerOnly ) { TRACE1( " Invalid Unicast Peer mode (%d) specified ", dwMode ); break; } dwMode = GetAsnInteger( &( psifce-> ifCEAcceptFilterMode ), (DWORD) -1 ); if ( dwMode < d_ifCEAcceptFilterMode_disable || dwMode > d_ifCEAcceptFilterMode_exclude ) { TRACE1( " Invalid Accept Filter mode (%d) specified ", dwMode ); break; } dwMode = GetAsnInteger( &( psifce-> ifCEAnnounceFilterMode ), (DWORD) -1 ); if ( dwMode < d_ifCEAnnounceFilterMode_disable || dwMode > d_ifCEAnnounceFilterMode_exclude ) { TRACE1( " Invalid Announce Filter mode (%d) specified ", dwMode ); break; } dwRes = MIB_S_SUCCESS; } while ( FALSE ); return dwRes; } DWORD SetInterfaceConfig( IN AsnAny * objectArray ) { DWORD dwRes = (DWORD) -1, dwGetSize = 0, dwSetSize = 0; sav_ifConfigEntry* psifce = NULL; PIPRIP_IF_CONFIG piic = NULL; PIPRIP_MIB_SET_INPUT_DATA pimsidInData= NULL; PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData = NULL; IPRIP_MIB_GET_INPUT_DATA imgidInData; do { // // Retrieve existing interface config // psifce = (sav_ifConfigEntry*) objectArray; imgidInData.IMGID_TypeID = IPRIP_IF_CONFIG_ID; imgidInData.IMGID_IfIndex = GetAsnInteger( &( psifce-> ifCEIndex ), (DWORD) -1 ); dwRes = GetInterfaceInfo( MIB_ACTION_GET, &imgidInData, &pimgodOutData, &dwGetSize ); if ( dwRes != NO_ERROR ) { TraceError( dwRes ); break; } // // Update fields // piic = (PIPRIP_IF_CONFIG) (pimgodOutData-> IMGOD_Buffer); piic-> IC_Metric = GetAsnInteger( &( psifce-> ifCEMetric ), piic-> IC_Metric ); piic-> IC_UpdateMode = GetAsnInteger( &( psifce-> ifCEUpdateMode ), piic-> IC_UpdateMode ); piic-> IC_AcceptMode = GetAsnInteger( &( psifce-> ifCEAcceptMode ), piic-> IC_AcceptMode ); piic-> IC_AnnounceMode = GetAsnInteger( &( psifce-> ifCEAnnounceMode ), piic-> IC_AnnounceMode ); piic-> IC_ProtocolFlags = GetAsnInteger( &( psifce-> ifCEProtocolFlags ), piic-> IC_ProtocolFlags ); piic-> IC_RouteExpirationInterval = GetAsnTimeTicks( &( psifce-> ifCERouteExpirationInterval ), piic-> IC_RouteExpirationInterval ); piic-> IC_RouteRemovalInterval = GetAsnTimeTicks( &( psifce-> ifCERouteRemovalInterval ), piic-> IC_RouteRemovalInterval ); piic-> IC_FullUpdateInterval = GetAsnTimeTicks( &( psifce-> ifCEFullUpdateInterval ), piic-> IC_FullUpdateInterval ); piic-> IC_AuthenticationType = GetAsnInteger( &( psifce-> ifCEAuthenticationType ), piic-> IC_AuthenticationType ); GetAsnOctetString( piic-> IC_AuthenticationKey, &( psifce-> ifCEAuthenticationKey ) ); piic-> IC_RouteTag = (USHORT) GetAsnInteger( &( psifce-> ifCERouteTag ), piic-> IC_RouteTag ); piic-> IC_UnicastPeerMode = GetAsnInteger( &( psifce-> ifCEUnicastPeerMode ), piic-> IC_UnicastPeerMode ); piic-> IC_AcceptFilterMode = GetAsnInteger( &( psifce-> ifCEAcceptFilterMode ), piic-> IC_AcceptFilterMode ); piic-> IC_AnnounceFilterMode = GetAsnInteger( &( psifce-> ifCEAnnounceFilterMode ), piic-> IC_AnnounceFilterMode ); // // Save inteface config // dwSetSize = sizeof( IPRIP_MIB_SET_INPUT_DATA) - 1 + IPRIP_IF_CONFIG_SIZE( piic ); pimsidInData = (PIPRIP_MIB_SET_INPUT_DATA) RIP_MIB_ALLOC( dwSetSize ); if ( !pimsidInData ) { dwRes = ERROR_NOT_ENOUGH_MEMORY; TRACE0( " Not enough memory " ); break; } pimsidInData-> IMSID_TypeID = IPRIP_IF_CONFIG_ID; pimsidInData-> IMSID_IfIndex = imgidInData.IMGID_IfIndex; pimsidInData-> IMSID_BufferSize = IPRIP_IF_CONFIG_SIZE( piic ); CopyMemory( pimsidInData-> IMSID_Buffer, piic, pimsidInData-> IMSID_BufferSize ); RIP_MIB_SET( pimsidInData, dwSetSize, dwRes ); if ( dwRes != NO_ERROR ) { TraceError( dwRes ); break; } dwRes = MIB_S_SUCCESS; } while ( FALSE ); if ( pimgodOutData ) { MprAdminMIBBufferFree( pimgodOutData ); } if ( pimsidInData ) { RIP_MIB_FREE( pimsidInData ); } return dwRes; } DWORD UpdateUnicastPeerEntry( IN AsnAny * objectArray, IN DWORD dwOp ) { DWORD dwRes = (DWORD) -1, dwInd = 0, dwPeerAddr = INADDR_NONE, dwGetSize = 0, dwSetSize = 0; PDWORD pdwAddrTable= 0; sav_ifUnicastPeersEntry * psifupe = NULL; PIPRIP_IF_CONFIG piic = NULL; PIPRIP_MIB_SET_INPUT_DATA pimsid = NULL; PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData = NULL; IPRIP_MIB_GET_INPUT_DATA imgidInData; do { // // Get interface config info // psifupe = (sav_ifUnicastPeersEntry*) objectArray; imgidInData.IMGID_TypeID = IPRIP_IF_CONFIG_ID; imgidInData.IMGID_IfIndex = GetAsnInteger( &( psifupe-> ifUPIfIndex ), 0 ); dwRes = GetInterfaceInfo( MIB_ACTION_GET, &imgidInData, &pimgodOutData, &dwGetSize ); if ( dwRes != NO_ERROR ) { TraceError( dwRes ); break; } // // Find Peer entry // dwPeerAddr = GetAsnIPAddress( &( psifupe-> ifUPAddress ), 0 ); piic = (PIPRIP_IF_CONFIG) pimgodOutData-> IMGOD_Buffer; pdwAddrTable= IPRIP_IF_UNICAST_PEER_TABLE( piic ); FIND_PEER_ENTRY( dwPeerAddr, piic-> IC_UnicastPeerCount, pdwAddrTable, dwInd ); // // if operation is filter add // if ( dwOp == d_Tag_create ) { // // if peer already present, quit // if ( piic-> IC_UnicastPeerCount && dwInd < piic-> IC_UnicastPeerCount ) { dwRes = MIB_S_SUCCESS; break; } else { dwRes = AddUnicastPeerEntry( dwPeerAddr, pimgodOutData ); } break; } // // operation is filter delete // // // if peer is not present quit. // if ( !piic-> IC_UnicastPeerCount || dwInd >= piic-> IC_UnicastPeerCount ) { dwRes = MIB_S_SUCCESS; break; } dwRes = DeleteUnicastPeerEntry( dwInd, pimgodOutData ); } while ( FALSE ); if ( pimgodOutData ) { MprAdminMIBBufferFree( pimgodOutData ); } return dwRes; } DWORD AddUnicastPeerEntry( IN DWORD dwPeer, IN PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData ) { DWORD dwRes = (DWORD) -1, dwSetSize = 0; PDWORD pdwAddrTable = NULL; PIPRIP_IF_CONFIG piicOld = NULL, piicNew = NULL; PIPRIP_MIB_SET_INPUT_DATA pimsid = NULL; do { // // Allocate new info block // piicOld = (PIPRIP_IF_CONFIG) pimgodOutData-> IMGOD_Buffer; dwSetSize = sizeof( IPRIP_MIB_SET_INPUT_DATA ) - 1 + IPRIP_IF_CONFIG_SIZE( piicOld ) + sizeof( DWORD ); pimsid = (PIPRIP_MIB_SET_INPUT_DATA) RIP_MIB_ALLOC( dwSetSize ); if ( pimsid == NULL ) { dwRes = ERROR_NOT_ENOUGH_MEMORY; TRACE0 ( "Memory allocation failed" ); break; } // // Add unicast peer // pimsid-> IMSID_TypeID = IPRIP_IF_CONFIG_ID; pimsid-> IMSID_IfIndex = pimgodOutData-> IMGOD_IfIndex; pimsid-> IMSID_BufferSize = IPRIP_IF_CONFIG_SIZE( piicOld ) + sizeof( DWORD ); piicNew = (PIPRIP_IF_CONFIG) pimsid-> IMSID_Buffer; CopyMemory( (PVOID) piicNew, (VOID *) piicOld, sizeof( IPRIP_IF_CONFIG ) + piicOld-> IC_UnicastPeerCount * sizeof( DWORD ) ); pdwAddrTable = IPRIP_IF_UNICAST_PEER_TABLE( piicNew ); pdwAddrTable[ piicNew-> IC_UnicastPeerCount ] = dwPeer; piicNew-> IC_UnicastPeerCount++; // // Copy Filters // CopyMemory( (PVOID) IPRIP_IF_ACCEPT_FILTER_TABLE( piicNew ), (VOID *) IPRIP_IF_ACCEPT_FILTER_TABLE( piicOld ), piicOld-> IC_AcceptFilterCount * sizeof ( IPRIP_ROUTE_FILTER ) ); CopyMemory( (PVOID) IPRIP_IF_ANNOUNCE_FILTER_TABLE( piicNew ), (VOID *) IPRIP_IF_ANNOUNCE_FILTER_TABLE( piicOld ), piicOld-> IC_AnnounceFilterCount * sizeof ( IPRIP_ROUTE_FILTER ) ); // // Set info. in MIB // RIP_MIB_SET( pimsid, dwSetSize, dwRes ); } while ( FALSE ); if ( pimsid ) { RIP_MIB_FREE( pimsid ); } return dwRes; } DWORD DeleteUnicastPeerEntry( IN DWORD dwIndex, IN PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData ) { DWORD dwRes = (DWORD) -1, dwSetSize = 0; PDWORD pdwSrc = NULL, pdwDst = NULL; PIPRIP_IF_CONFIG piicOld = NULL, piicNew = NULL; PIPRIP_MIB_SET_INPUT_DATA pimsid = NULL; do { // // Compute size of new interface config // piicOld = (PIPRIP_IF_CONFIG) pimgodOutData-> IMGOD_Buffer; dwSetSize = sizeof( IPRIP_MIB_SET_INPUT_DATA ) - 1 + IPRIP_IF_CONFIG_SIZE( piicOld ) - sizeof ( DWORD ); pimsid = (PIPRIP_MIB_SET_INPUT_DATA) RIP_MIB_ALLOC( dwSetSize ); if ( pimsid == NULL ) { dwRes = ERROR_NOT_ENOUGH_MEMORY; TRACE0( "Memory Allocation Failed" ); break; } pimsid-> IMSID_TypeID = IPRIP_GLOBAL_CONFIG_ID; pimsid-> IMSID_IfIndex = pimgodOutData-> IMGOD_IfIndex; pimsid-> IMSID_BufferSize = IPRIP_IF_CONFIG_SIZE( piicOld ) - sizeof( DWORD ); piicNew = (PIPRIP_IF_CONFIG) pimsid-> IMSID_Buffer; // // Copy base config info. // CopyMemory( (PVOID) piicNew, (VOID *) piicOld, sizeof( IPRIP_IF_CONFIG ) ); // // Delete specified peer // pdwSrc = IPRIP_IF_UNICAST_PEER_TABLE( piicOld ); pdwDst = IPRIP_IF_UNICAST_PEER_TABLE( piicNew ); DELETE_PEER_ENTRY( dwIndex, piicOld-> IC_UnicastPeerCount, pdwSrc, pdwDst ); piicNew-> IC_UnicastPeerCount--; // // Copy filters // CopyMemory( (PVOID) IPRIP_IF_ACCEPT_FILTER_TABLE( piicNew ), (VOID *) IPRIP_IF_ACCEPT_FILTER_TABLE( piicOld ), piicOld-> IC_AcceptFilterCount * sizeof ( IPRIP_ROUTE_FILTER ) ); CopyMemory( (PVOID) IPRIP_IF_ANNOUNCE_FILTER_TABLE( piicNew ), (VOID *) IPRIP_IF_ANNOUNCE_FILTER_TABLE( piicOld ), piicOld-> IC_AnnounceFilterCount * sizeof ( IPRIP_ROUTE_FILTER ) ); // // Set info. in MIB // RIP_MIB_SET( pimsid, dwSetSize, dwRes ); } while ( FALSE ); if ( pimsid ) { RIP_MIB_FREE( pimsid ); } return dwRes; } DWORD UpdateFilterTable( IN DWORD dwOp, IN DWORD dwIfIndex, IN DWORD dwFiltType, IN PIPRIP_ROUTE_FILTER pirfFilt ) { DWORD dwRes = (DWORD) -1, dwGetSize = 0, dwIndex = (DWORD) -1, dwCount = 0; PIPRIP_IF_CONFIG piic = NULL; PIPRIP_ROUTE_FILTER pirfLst = NULL; PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData = NULL; IPRIP_MIB_GET_INPUT_DATA imgidInData; do { imgidInData.IMGID_TypeID = IPRIP_GLOBAL_CONFIG_ID; imgidInData.IMGID_IfIndex = dwIfIndex; dwRes = GetInterfaceInfo( MIB_ACTION_GET, &imgidInData, &pimgodOutData, &dwGetSize ); if ( dwRes != NO_ERROR ) { TraceError( dwRes ); break; } // // find filter // piic = (PIPRIP_IF_CONFIG) pimgodOutData-> IMGOD_Buffer; if ( dwFiltType == RIP_MIB_ACCEPT_FILTER ) { dwCount = piic-> IC_AcceptFilterCount; pirfLst = IPRIP_IF_ACCEPT_FILTER_TABLE( piic ); } else { dwCount = piic-> IC_AnnounceFilterCount; pirfLst = IPRIP_IF_ANNOUNCE_FILTER_TABLE( piic ); } FIND_FILTER( pirfFilt, dwCount, pirfLst, dwIndex ); if ( dwOp == d_Tag_create ) { // // check if filter is already present // if ( dwCount && dwIndex < dwCount ) { dwRes = MIB_S_SUCCESS; break; } dwRes = AddFilterEntry( dwFiltType, pirfFilt, pimgodOutData ); break; } // // Must be a delete operation // if ( !dwCount || dwIndex >= dwCount ) { dwRes = MIB_S_SUCCESS; break; } dwRes = DeleteFilterEntry( dwFiltType, dwIndex, pimgodOutData ); } while ( FALSE ); if ( pimgodOutData ) { MprAdminMIBBufferFree( pimgodOutData ); } return dwRes; } DWORD AddFilterEntry( IN DWORD dwFiltType, IN PIPRIP_ROUTE_FILTER pirfFilt, IN PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData ) { DWORD dwRes = (DWORD) -1, dwSetSize = 0, dwIndex = (DWORD) -1, dwCount = 0; PIPRIP_IF_CONFIG piicOld = NULL, piicNew = NULL; PIPRIP_ROUTE_FILTER pirfLst = NULL; PIPRIP_MIB_SET_INPUT_DATA pimsid = NULL; do { // // Compute size of new config and allocate block for it. // piicOld = (PIPRIP_IF_CONFIG) pimgodOutData-> IMGOD_Buffer; dwSetSize = sizeof( IPRIP_MIB_SET_INPUT_DATA ) - 1 + IPRIP_IF_CONFIG_SIZE( piicOld) + sizeof( IPRIP_ROUTE_FILTER ); pimsid = (PIPRIP_MIB_SET_INPUT_DATA) RIP_MIB_ALLOC( dwSetSize ); if ( pimsid == NULL ) { dwRes = ERROR_NOT_ENOUGH_MEMORY; TRACE0( "Memory Allocation Failed" ); break; } // // set up the new config block. // pimsid-> IMSID_TypeID = IPRIP_IF_CONFIG_ID; pimsid-> IMSID_IfIndex = pimgodOutData-> IMGOD_IfIndex; pimsid-> IMSID_BufferSize = IPRIP_IF_CONFIG_SIZE( piicOld ) + sizeof( DWORD ); piicNew = (PIPRIP_IF_CONFIG) pimsid-> IMSID_Buffer; CopyMemory( (PVOID) piicNew, (VOID *) piicOld, sizeof( IPRIP_IF_CONFIG ) + piicOld-> IC_UnicastPeerCount * sizeof( DWORD ) + piicOld-> IC_AcceptFilterCount * sizeof ( IPRIP_ROUTE_FILTER ) ); // // if accept filter is being added, added to end of // accept fitler table, and copy the annouce filters // if ( dwFiltType == RIP_MIB_ACCEPT_FILTER ) { pirfLst = IPRIP_IF_ACCEPT_FILTER_TABLE( piicNew ); pirfLst[ piicNew-> IC_AcceptFilterCount++ ] = *pirfFilt; CopyMemory( (PVOID) IPRIP_IF_ANNOUNCE_FILTER_TABLE( piicNew ), (VOID *) IPRIP_IF_ANNOUNCE_FILTER_TABLE( piicOld ), piicNew-> IC_AnnounceFilterCount * sizeof( IPRIP_ROUTE_FILTER ) ); } else { CopyMemory( (PVOID) IPRIP_IF_ANNOUNCE_FILTER_TABLE( piicNew ), (VOID *) IPRIP_IF_ANNOUNCE_FILTER_TABLE( piicOld ), piicNew-> IC_AnnounceFilterCount * sizeof( IPRIP_ROUTE_FILTER ) ); pirfLst = IPRIP_IF_ANNOUNCE_FILTER_TABLE( piicNew ); pirfLst[ piicNew-> IC_AnnounceFilterCount++ ] = *pirfFilt; } // // Update the MIB with the new config // RIP_MIB_SET( pimsid, dwSetSize, dwRes ); if ( dwRes != NO_ERROR ) { TraceError( dwRes ); } } while ( FALSE ); if ( pimsid ) { RIP_MIB_FREE( pimsid ); } return dwRes; } DWORD DeleteFilterEntry( IN DWORD dwFiltType, IN DWORD dwIndex, IN PIPRIP_MIB_GET_OUTPUT_DATA pimgodOutData ) { DWORD dwRes = (DWORD) -1, dwSetSize = 0, dwCount = 0; PIPRIP_IF_CONFIG piicOld = NULL, piicNew = NULL; PIPRIP_ROUTE_FILTER pirfSrc = NULL, pirfDst = NULL; PIPRIP_MIB_SET_INPUT_DATA pimsid = NULL; do { // // Compute size of new config and allocate block for it. // piicOld = (PIPRIP_IF_CONFIG) pimgodOutData-> IMGOD_Buffer; dwSetSize = sizeof( IPRIP_MIB_SET_INPUT_DATA ) - 1 + IPRIP_IF_CONFIG_SIZE( piicOld ) - sizeof( IPRIP_ROUTE_FILTER ); pimsid = (PIPRIP_MIB_SET_INPUT_DATA) RIP_MIB_ALLOC( dwSetSize ); if ( pimsid == NULL ) { dwRes = ERROR_NOT_ENOUGH_MEMORY; TRACE0( "Memory Allocation Failed" ); break; } // // set up the new config block. // pimsid-> IMSID_TypeID = IPRIP_IF_CONFIG_ID; pimsid-> IMSID_IfIndex = pimgodOutData-> IMGOD_IfIndex; pimsid-> IMSID_BufferSize = IPRIP_IF_CONFIG_SIZE( piicOld ) + sizeof( DWORD ); piicNew = (PIPRIP_IF_CONFIG) pimsid-> IMSID_Buffer; CopyMemory( (PVOID) piicNew, (VOID *) piicOld, sizeof( IPRIP_IF_CONFIG ) + piicOld-> IC_UnicastPeerCount * sizeof( DWORD ) ); if ( dwFiltType == RIP_MIB_ACCEPT_FILTER ) { pirfSrc = IPRIP_IF_ACCEPT_FILTER_TABLE( piicOld ); pirfDst = IPRIP_IF_ACCEPT_FILTER_TABLE( piicNew ); DELETE_FILTER( dwIndex, piicOld-> IC_AcceptFilterCount, pirfSrc, pirfDst ); piicNew-> IC_AcceptFilterCount--; CopyMemory( (PVOID) IPRIP_IF_ANNOUNCE_FILTER_TABLE( piicNew ), (VOID *) IPRIP_IF_ANNOUNCE_FILTER_TABLE( piicOld ), piicNew-> IC_AnnounceFilterCount * sizeof( IPRIP_ROUTE_FILTER ) ); } else { CopyMemory( (PVOID) IPRIP_IF_ACCEPT_FILTER_TABLE( piicNew ), (VOID *) IPRIP_IF_ACCEPT_FILTER_TABLE( piicOld ), piicNew-> IC_AcceptFilterCount * sizeof( IPRIP_ROUTE_FILTER ) ); pirfSrc = IPRIP_IF_ACCEPT_FILTER_TABLE( piicOld ); pirfDst = IPRIP_IF_ACCEPT_FILTER_TABLE( piicNew ); DELETE_FILTER( dwIndex, piicOld-> IC_AnnounceFilterCount, pirfSrc, pirfDst ); piicNew-> IC_AnnounceFilterCount--; } RIP_MIB_SET( pimsid, dwSetSize, dwRes ); if ( dwRes != NO_ERROR ) { TraceError( dwRes ); } } while ( FALSE ); if ( pimsid ) { RIP_MIB_FREE( pimsid ); } return dwRes; } DWORD ConnectToRouter() { DWORD dwRes = (DWORD) -1; EnterCriticalSection( &g_CS ); do { MPR_SERVER_HANDLE hTmp; if ( g_hMIBServer ) { dwRes = NO_ERROR; break; } dwRes = MprAdminMIBServerConnect( NULL, &hTmp ); if ( dwRes == NO_ERROR ) { InterlockedExchangePointer(&g_hMIBServer, hTmp ); } else { TRACE1( "Error %d setting up DIM connection to MIB Server\n", dwRes ); } } while ( FALSE ); LeaveCriticalSection( &g_CS ); return dwRes; }