//============================================================================ // 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; }