//============================================================================ // Copyright (c) 1995, Microsoft Corporation // // File: group.h // // History: // V Raman July-11-1997 Created. // // Data structures for and declarations for routines that manipulate // group and sources entries //============================================================================ #ifndef _GROUP_H_ #define _GROUP_H_ //---------------------------------------------------------------------------- // OUT_IF_ENTRY // // Each OUT_IF_ENTRY stores information about an outgoing interface in an // MFE. The fields in the structure are : // // leIfList - link to next entry in the outgoing interface // list. // dwIfIndex - Index of interface // // dwNextHopIfAddr - For interfaces with same index the next hop // address is used to distinguish them // // dwProtocolId - Protocol id of the routing protocol component // that owns dwIfIndex // // dwComponentId - Component id of the routing protocol component // that owns dwIfIndex // // wCreatedForFlag - Indicates if the interface entry was created // explicitly by a protocol or implicitly by // MGM (as a consequence of the interface being // being present in the Outgoing Interface list // of the corresponding (*, G) or (*, *) entry. // // dwAddedByFlag - if the interface entry is created by a // routing protocol then it could have been // created by both IGMP or by a full fledged // routing protocol (or both). This flag is // used to distinguish both. // // wNumAddsByIGMP - Count of number of times this interface has // been added to the OIL by IGMP. Can be at most // 2, once for a (*, G) addition and once for an // (S, G) addition. // // wNumAddsByRP - Count of number of times this interface has // been added to the OIL by the RP on this // interface. Can be at most // 3, once for a (*, *) addition, once for a // (*, G) addition and once for an (S, G) // addition. // // misIfStats - Statistics for this outgoing interface. // //---------------------------------------------------------------------------- typedef struct _OUT_IF_ENTRY { LIST_ENTRY leIfList; DWORD dwIfIndex; DWORD dwIfNextHopAddr; DWORD dwProtocolId; DWORD dwComponentId; WORD wForward; WORD wAddedByFlag; WORD wNumAddsByIGMP; WORD wNumAddsByRP; IPMCAST_OIF_STATS imosIfStats; } OUT_IF_ENTRY, *POUT_IF_ENTRY; // // Macros to manipulate bit flags in OUT_IF_ENTRY // #define ADDED_BY_IGMP (DWORD) 0x8000 #define ADDED_BY_ROUTING_PROTOCOL (DWORD) 0x4000 #define SET_ADDED_BY_IGMP( p ) \ (p)-> wAddedByFlag |= ADDED_BY_IGMP #define CLEAR_ADDED_BY_IGMP( p ) \ (p)-> wAddedByFlag &= ~ADDED_BY_IGMP #define IS_ADDED_BY_IGMP( p ) \ ( (p)-> wAddedByFlag & ADDED_BY_IGMP ) #define SET_ADDED_BY_PROTOCOL( p ) \ (p)-> wAddedByFlag |= ADDED_BY_ROUTING_PROTOCOL #define CLEAR_ADDED_BY_PROTOCOL( p ) \ (p)-> wAddedByFlag &= ~ADDED_BY_ROUTING_PROTOCOL #define IS_ADDED_BY_PROTOCOL( p ) \ ( (p)-> wAddedByFlag & ADDED_BY_ROUTING_PROTOCOL ) //---------------------------------------------------------------------------- // SOURCE_ENTRY // // Each SOURCE_ENTRY represents information about a specific source for a // specific group. The source can also be the wildcard source created by a // (*, G) join for a group. A source entry is either explicitly created by // a source specific (S, G) join or implicitly by MGM when creating an MFE // in response to packet arrival. // // leSrcList - Links along the lexicographically ordered // source list // // leSrcHashList - Links along the source hash table. // // leScopedIfList - List of interfaces that have been joined // but administratively scoped out. // // leOutIfList - Outgoing interface list. Entries in this // list are created as a result of explicit // (S, G) joins by a protocol // // leMfeIfList - Outgoing interface list created when an MFE // for this source, for this group is created // by MGM. This list is created by MGM // when a new packet for this (source, group) // and respresents the merge of the outgoing // interface lists of the (*, *) entry, (*, G) // entry and the (S,G) entry. // // dwOutIfCount - Count of number of entries in leOutIfList. // Used to determine callback order. // // dwOutIfCompCount - Count of number of protocol components that // have added interfaces to the outgoing list. // Used to determine the order of callbacks to // routing protocols // // dwSourceAddr - IP Address of source. // // dwSourceMask - IP mask corresponding to dwSourceAddr // // dwInIfIndex - Interface index of the incmoing interface. // A source entry is considered to be an MFE // if it has a valid incoming interface. // // dwInIfNextHopAddr - next hop address for dwInIfIndex // // dwInProtocolId - Protocol Id of the protocol owning dwInIfIndex // // dwInComponentId - Component Id of the protocol component owning // dwIfInIndex // // bInForwarder - Flag indicating if the MFE is present in the // kernel mode forwarder. // // liExpiryTime - Expiration time of the source entry. // // mgmGrpStatistics - Statistics associated with this (S, G) entry // //---------------------------------------------------------------------------- typedef struct _SOURCE_ENTRY { LIST_ENTRY leSrcList; LIST_ENTRY leSrcHashList; DWORD dwInUse; DWORD dwOutIfCount; DWORD dwOutCompCount; LIST_ENTRY leOutIfList; LIST_ENTRY leScopedIfList; DWORD dwMfeIfCount; LIST_ENTRY leMfeIfList; DWORD dwSourceAddr; DWORD dwSourceMask; DWORD dwInIfIndex; DWORD dwInIfNextHopAddr; DWORD dwUpstreamNeighbor; DWORD dwRouteProtocol; DWORD dwRouteNetwork; DWORD dwRouteMask; DWORD dwInProtocolId; DWORD dwInComponentId; BOOL bInForwarder; HANDLE hTimer; DWORD dwTimeOut; LARGE_INTEGER liCreationTime; IPMCAST_MFE_STATS imsStatistics; } SOURCE_ENTRY, *PSOURCE_ENTRY; #define MGM_SOURCE_ENUM_SIGNATURE 'sMGM' //---------------------------------------------------------------------------- // GROUP_ENTRY // // Each group entry contains information for a specific group that has been // explicitly added by a protocol (or implicitly by MGM). The group can // a wildcard group created by a (*, *) join. // // leGrpList - Links along the lexicographically ordered // group list. // // leGrpHashList - Links along the group hash bucket. // // dwGroupAddr - Group address of entry. // // dwGroupMask - Mask corresponding to the group address // // leSourceList - Head of lexicographically ordered source list // // pleSrcHashTable - hash table of source entries for this group // //---------------------------------------------------------------------------- typedef struct _GROUP_ENTRY { LIST_ENTRY leGrpList; LIST_ENTRY leGrpHashList; DWORD dwGroupAddr; DWORD dwGroupMask; PMGM_READ_WRITE_LOCK pmrwlLock; DWORD dwSourceCount; DWORD dwNumTempEntries; LIST_ENTRY leTempSrcList; LIST_ENTRY leSourceList; LIST_ENTRY pleSrcHashTable[1]; } GROUP_ENTRY, *PGROUP_ENTRY; #define MGM_GROUP_ENUM_SIGNATURE 'gMGM' DWORD CreateGroupEntry( PLIST_ENTRY pleHashList, DWORD dwGroupAddr, DWORD dwGroupMask, PGROUP_ENTRY * ppge ); PGROUP_ENTRY GetGroupEntry( PLIST_ENTRY pleGroupList, DWORD dwGroupAddr, DWORD dwGroupMask ); VOID DeleteGroupEntry( PGROUP_ENTRY pge ); BOOL FindGroupEntry( PLIST_ENTRY pleGroupList, DWORD dwGroupAddr, DWORD dwGroupMask, PGROUP_ENTRY * ppge, BOOL bHashList ); DWORD CreateSourceEntry( PGROUP_ENTRY pge, PLIST_ENTRY pleSrcList, DWORD dwSourceAddr, DWORD dwSourceMask, PSOURCE_ENTRY * ppse ); PSOURCE_ENTRY GetSourceEntry( PLIST_ENTRY pleSrcList, DWORD dwSourceAddr, DWORD dwSourceMask ); VOID DeleteSourceEntry( PSOURCE_ENTRY pse ); BOOL FindSourceEntry( PLIST_ENTRY pleSrcList, DWORD dwSourceAddr, DWORD dwSourceMask, PSOURCE_ENTRY * ppse, BOOL bHashList ); DWORD CreateOutInterfaceEntry( PLIST_ENTRY pleOutIfList, DWORD dwIfIndex, DWORD dwIfNextHopAddr, DWORD dwProtocolId, DWORD dwComponentId, BOOL bIGMP, POUT_IF_ENTRY * ppoie ); POUT_IF_ENTRY GetOutInterfaceEntry( PLIST_ENTRY pleOutIfList, DWORD dwIfIndex, DWORD dwIfNextHopAddr, DWORD dwProtocolId, DWORD dwComponentId ); VOID DeleteOutInterfaceEntry( POUT_IF_ENTRY poie ); BOOL FindOutInterfaceEntry( PLIST_ENTRY pleOutIfList, DWORD dwIfIndex, DWORD dwIfNextHopAddr, DWORD dwProtocolId, DWORD dwComponentId, PBOOL pbNewComponent, POUT_IF_ENTRY * ppoie ); DWORD AddInterfaceToSourceEntry( PPROTOCOL_ENTRY ppe, DWORD dwGroupAddr, DWORD dwGroupMask, DWORD dwSourceAddr, DWORD dwSourceMask, DWORD dwIfIndex, DWORD dwIfNextHopAddr, BOOL bIGMP, PBOOL pbUpdateMfe, PLIST_ENTRY pleSourceList ); VOID AddInterfaceToAllMfeInGroupBucket( DWORD dwIfIndex, DWORD dwIfNextHopAddr, DWORD dwProtocolId, DWORD dwComponentId, DWORD dwInd, BOOL bIGMP, BOOL bAdd, PLIST_ENTRY pleSourceList ); VOID AddInterfaceToGroupMfe( PGROUP_ENTRY pge, DWORD dwIfIndex, DWORD dwIfNextHopAddr, DWORD dwProtocolId, DWORD dwComponentId, BOOL bIGMP, BOOL bAdd, PLIST_ENTRY pleSourceList ); VOID AddInterfaceToSourceMfe( PGROUP_ENTRY pge, PSOURCE_ENTRY pse, DWORD dwIfIndex, DWORD dwIfNextHopAddr, DWORD dwProtocolId, DWORD dwComponentId, BOOL bIGMP, POUT_IF_ENTRY * ppoie ); VOID DeleteInterfaceFromSourceEntry( PPROTOCOL_ENTRY ppe, DWORD dwGroupAddr, DWORD dwGroupMask, DWORD dwSourceAddr, DWORD dwSourceMask, DWORD dwIfIndex, DWORD dwIfNextHopAddr, BOOL bIGMP ); VOID DeleteInterfaceFromAllMfe( DWORD dwIfIndex, DWORD dwIfNextHopAddr, DWORD dwProtocolId, DWORD dwComponentId, BOOL bIGMP ); VOID DeleteInterfaceFromGroupMfe( PGROUP_ENTRY pge, DWORD dwIfIndex, DWORD dwIfNextHopAddr, DWORD dwProtocolId, DWORD dwComponentId, BOOL bIGMP ); VOID DeleteInterfaceFromSourceMfe( PGROUP_ENTRY pge, PSOURCE_ENTRY pse, DWORD dwIfIndex, DWORD dwIfNextHopAddr, DWORD dwProtocolId, DWORD dwComponentId, BOOL bIGMP, BOOL bDel ); VOID LookupAndDeleteYourMfe( DWORD dwSourceAddr, DWORD dwSourceMask, DWORD dwGroupAddr, DWORD dwGroupMask, BOOL bDeleteTimer, PDWORD pdwInIfIndex OPTIONAL, PDWORD pdwInIfNextHopAddr OPTIONAL ); VOID DeleteMfe( PGROUP_ENTRY pge, PSOURCE_ENTRY pse ); VOID MergeTempAndMasterGroupLists( PLIST_ENTRY pleTempList ); VOID MergeTempAndMasterSourceLists( PGROUP_ENTRY pge ); #endif // _GROUP_H_