//============================================================================ // Copyright (c) 1995, Microsoft Corporation // // File: if.h // // History: // V Raman July-11-1997 Created. // // Declarations for routines that manipulate interface entries //============================================================================ #ifndef _IF_H_ #define _IF_H_ #include //---------------------------------------------------------------------------- // IF_ENTRY // // For each interface owned by a routing protocol an interface entry // is created in the interface table. // // dwIfIndex - Interface index // // dwNextHopAddr - Next hop IP address, used to distinguish // dial-in interfaces that are all connected // on the same RAS Server Interface. // // dwOwningProtocol - Protocol id of routing protocol that // owns this interface. // // dwOwningComponent - Component of protocol. // // wAddedByFlag - Flag indicating if the interface entry was // added by the routing protocol / IGMP / both. // // leOutIfList - list of (source, group) entries that reference // this interface in their outgoing interface list // // leInIfList - list of (source, group) entries that reference // this interface as their incoming interface //---------------------------------------------------------------------------- typedef struct _IF_ENTRY { LIST_ENTRY leIfHashList; DWORD dwIfIndex; DWORD dwIfNextHopAddr; DWORD dwOwningProtocol; DWORD dwOwningComponent; WORD wAddedByFlag; LIST_ENTRY leOutIfList; LIST_ENTRY leInIfList; } IF_ENTRY, *PIF_ENTRY; //---------------------------------------------------------------------------- // IF_REFERENCE_ENTRY // // Each interface maintains a list of (source, group) entries that refer // to this interface. Each entry in this reference list stores the // source, group info and a flag to determine what protocol caused this // reference. Protocol could be IGMP/some routing protocol or both. // // Fields descriptions are left as an exercise to the reader. // //---------------------------------------------------------------------------- typedef struct _IF_REFERENCE_ENTRY { LIST_ENTRY leRefList; DWORD dwGroupAddr; DWORD dwGroupMask; DWORD dwSourceAddr; DWORD dwSourceMask; WORD wAddedByFlag; } IF_REFERENCE_ENTRY, *PIF_REFERENCE_ENTRY; DWORD CreateIfEntry( PLIST_ENTRY pleIfList, DWORD dwIfIndex, DWORD dwIfNextHopAddr, DWORD dwProtocolId, DWORD dwComponentId ); VOID DeleteIfEntry( PIF_ENTRY pieEntry ); PIF_ENTRY GetIfEntry( PLIST_ENTRY pleIfList, DWORD dwIfIndex, DWORD dwIfNextHopAddr ); BOOL FindIfEntry( PLIST_ENTRY pleIfList, DWORD dwIfIndex, DWORD dwIfNextHopAddr, PIF_ENTRY * ppie ); DWORD AddSourceToOutList( PLIST_ENTRY pleIfList, DWORD dwSourceAddr, DWORD dwSourceMask, DWORD dwGroupAddr, DWORD dwGroupMask, BOOL bIGMP ); VOID AddSourceToRefList( PLIST_ENTRY pleRefList, DWORD dwSourceAddr, DWORD dwSourceMask, DWORD dwGroupAddr, DWORD dwGroupMask, BOOL bIGMP ); VOID DeleteSourceFromRefList( PLIST_ENTRY pleIfRefList, DWORD dwSourceAddr, DWORD dwSourceMask, DWORD dwGroupAddr, DWORD dwGroupMask, BOOL bIGMP ); BOOL FindRefEntry( PLIST_ENTRY pleRefList, DWORD dwSourceAddr, DWORD dwSourceMask, DWORD dwGroupAddr, DWORD dwGroupMask, PIF_REFERENCE_ENTRY * ppire ); VOID DeleteOutInterfaceRefs( PPROTOCOL_ENTRY ppe, PIF_ENTRY pie, BOOL bIGMP ); VOID DeleteInInterfaceRefs( PLIST_ENTRY pleRefList ); DWORD TransferInterfaceOwnershipToIGMP( PPROTOCOL_ENTRY ppe, PIF_ENTRY pie ); DWORD TransferInterfaceOwnershipToProtocol( PPROTOCOL_ENTRY ppe, PIF_ENTRY pie ); #endif // _IF_H_