Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

530 lines
15 KiB

//============================================================================
// 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_