294 lines
6.5 KiB
C
294 lines
6.5 KiB
C
|
//============================================================================
|
||
|
// Copyright (c) 1995, Microsoft Corporation
|
||
|
//
|
||
|
// File: protocol.c
|
||
|
//
|
||
|
// History:
|
||
|
// V Raman June-25-1997 Created.
|
||
|
//
|
||
|
// Routines that manipulate protocol entries
|
||
|
//============================================================================
|
||
|
|
||
|
#include "pchmgm.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// CreateProtocolEntry
|
||
|
//
|
||
|
// This function creates, initializes and inserts a new protocol entry in the
|
||
|
// the list of protocols registered with MGM.
|
||
|
//
|
||
|
// Assumes that the protocol list is already locked.
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
DWORD
|
||
|
CreateProtocolEntry(
|
||
|
PLIST_ENTRY pleProtocolList,
|
||
|
DWORD dwProtocolId,
|
||
|
DWORD dwComponentId,
|
||
|
PROUTING_PROTOCOL_CONFIG prpcConfig,
|
||
|
PPROTOCOL_ENTRY * pppeEntry
|
||
|
)
|
||
|
{
|
||
|
|
||
|
DWORD dwErr = NO_ERROR;
|
||
|
|
||
|
PPROTOCOL_ENTRY ppe = NULL;
|
||
|
|
||
|
|
||
|
|
||
|
do
|
||
|
{
|
||
|
//
|
||
|
// Allocate new protocol entry.
|
||
|
//
|
||
|
|
||
|
ppe = MGM_ALLOC( sizeof( PROTOCOL_ENTRY ) );
|
||
|
|
||
|
if ( ppe == NULL )
|
||
|
{
|
||
|
dwErr = ERROR_NOT_ENOUGH_MEMORY;
|
||
|
|
||
|
TRACE1(
|
||
|
ANY,
|
||
|
"CreateProtocolEntry : Could not allocate protocol entry %x",
|
||
|
dwErr
|
||
|
);
|
||
|
|
||
|
LOGERR0( HEAP_ALLOC_FAILED, dwErr );
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Initialize protocol entry
|
||
|
//
|
||
|
|
||
|
InitializeListHead( &ppe-> leProtocolList );
|
||
|
|
||
|
|
||
|
ppe-> dwProtocolId = dwProtocolId;
|
||
|
ppe-> dwComponentId = dwComponentId;
|
||
|
ppe-> dwIfCount = 0;
|
||
|
|
||
|
CopyMemory(
|
||
|
&ppe-> rpcProtocolConfig, prpcConfig,
|
||
|
sizeof( ROUTING_PROTOCOL_CONFIG )
|
||
|
);
|
||
|
|
||
|
ppe-> dwSignature = MGM_PROTOCOL_SIGNATURE;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Insert into protocol list
|
||
|
//
|
||
|
|
||
|
InsertTailList( pleProtocolList, &ppe-> leProtocolList );
|
||
|
|
||
|
*pppeEntry = ppe;
|
||
|
|
||
|
dwErr = NO_ERROR;
|
||
|
|
||
|
} while ( FALSE );
|
||
|
|
||
|
|
||
|
return dwErr;
|
||
|
}
|
||
|
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// GetProtocolEntry
|
||
|
//
|
||
|
// This function retrieves an entry from the list of protocols registered
|
||
|
// with MGM.
|
||
|
//
|
||
|
// Assumes that the protocol list is already locked.
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
PPROTOCOL_ENTRY
|
||
|
GetProtocolEntry(
|
||
|
PLIST_ENTRY pleProtocolList,
|
||
|
DWORD dwProtocolId,
|
||
|
DWORD dwComponentId
|
||
|
)
|
||
|
{
|
||
|
|
||
|
BOOL bFound = FALSE;
|
||
|
PLIST_ENTRY ple = NULL;
|
||
|
PPROTOCOL_ENTRY ppe = NULL;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Scan protocol list and find entry
|
||
|
//
|
||
|
|
||
|
for ( ple = pleProtocolList-> Flink;
|
||
|
ple != pleProtocolList;
|
||
|
ple = ple-> Flink )
|
||
|
{
|
||
|
ppe = CONTAINING_RECORD( ple, PROTOCOL_ENTRY, leProtocolList );
|
||
|
|
||
|
if ( ppe-> dwProtocolId == dwProtocolId &&
|
||
|
ppe-> dwComponentId == dwComponentId )
|
||
|
{
|
||
|
bFound = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return bFound ? ppe : NULL;
|
||
|
}
|
||
|
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// DeleteProtocolEntry
|
||
|
//
|
||
|
// This function deletes a protocol entry from the list of registered
|
||
|
// protocols. All the interface owned by this protocol should have been
|
||
|
// released before this funtion is called.
|
||
|
//
|
||
|
// Assumes that the protocol list is already locked.
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
VOID
|
||
|
DeleteProtocolEntry(
|
||
|
PPROTOCOL_ENTRY ppeEntry
|
||
|
)
|
||
|
{
|
||
|
//
|
||
|
// remove protocol entry from list
|
||
|
//
|
||
|
|
||
|
RemoveEntryList( &ppeEntry-> leProtocolList );
|
||
|
|
||
|
MGM_FREE( ppeEntry );
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// DeleteProtocolList
|
||
|
//
|
||
|
// This function deletes a protocol entry from the list of registered
|
||
|
// protocols. All the interface owned by this protocol should have been
|
||
|
// released before this funtion is called.
|
||
|
//
|
||
|
// Assumes that the protocol list is already locked.
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
VOID
|
||
|
DeleteProtocolList(
|
||
|
PLIST_ENTRY pleProtocolList
|
||
|
)
|
||
|
{
|
||
|
|
||
|
PLIST_ENTRY ple = NULL;
|
||
|
|
||
|
PPROTOCOL_ENTRY ppe = NULL;
|
||
|
|
||
|
|
||
|
while ( !IsListEmpty( pleProtocolList ) )
|
||
|
{
|
||
|
ple = pleProtocolList-> Flink;
|
||
|
|
||
|
ppe = CONTAINING_RECORD( ple, PROTOCOL_ENTRY, leProtocolList );
|
||
|
|
||
|
DeleteProtocolEntry( ppe );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// VerifyProtocolHandle
|
||
|
//
|
||
|
// This function verifies that the specified pointer points to a valid
|
||
|
// protocol entry
|
||
|
//
|
||
|
// Assumes that the protocol list is already locked.
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
DWORD
|
||
|
VerifyProtocolHandle(
|
||
|
PPROTOCOL_ENTRY ppeEntry
|
||
|
)
|
||
|
{
|
||
|
|
||
|
DWORD dwErr = NO_ERROR;
|
||
|
|
||
|
try
|
||
|
{
|
||
|
if ( ppeEntry-> dwSignature != MGM_PROTOCOL_SIGNATURE )
|
||
|
{
|
||
|
dwErr = ERROR_INVALID_PARAMETER;
|
||
|
|
||
|
TRACE0( ANY, "Invalid protocol handle" );
|
||
|
|
||
|
LOGERR0( INVALID_PROTOCOL_HANDLE, dwErr );
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
except ( GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
|
||
|
EXCEPTION_EXECUTE_HANDLER :
|
||
|
EXCEPTION_CONTINUE_SEARCH )
|
||
|
{
|
||
|
dwErr = ERROR_INVALID_PARAMETER;
|
||
|
|
||
|
TRACE0( ANY, "Invalid protocol handle" );
|
||
|
|
||
|
LOGERR0( INVALID_PROTOCOL_HANDLE, dwErr );
|
||
|
|
||
|
}
|
||
|
|
||
|
return dwErr;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// FindIgmpProtocolEntry
|
||
|
//
|
||
|
// Find the protocol entry for IGMP
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
PPROTOCOL_ENTRY
|
||
|
GetIgmpProtocolEntry(
|
||
|
PLIST_ENTRY pleProtocolList
|
||
|
)
|
||
|
{
|
||
|
BOOL bFound = FALSE;
|
||
|
|
||
|
PLIST_ENTRY ple = NULL;
|
||
|
|
||
|
PPROTOCOL_ENTRY ppe = NULL;
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Scan protocol list and find entry
|
||
|
//
|
||
|
|
||
|
for ( ple = pleProtocolList-> Flink;
|
||
|
ple != pleProtocolList;
|
||
|
ple = ple-> Flink )
|
||
|
{
|
||
|
ppe = CONTAINING_RECORD( ple, PROTOCOL_ENTRY, leProtocolList );
|
||
|
|
||
|
if ( IS_PROTOCOL_IGMP( ppe ) )
|
||
|
{
|
||
|
bFound = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return bFound ? ppe : NULL;
|
||
|
}
|
||
|
|