3876 lines
93 KiB
C
3876 lines
93 KiB
C
/*++
|
|
|
|
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;
|
|
}
|
|
|