531 lines
15 KiB
C
531 lines
15 KiB
C
//============================================================================
|
|
// 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_
|