499 lines
14 KiB
C
499 lines
14 KiB
C
//============================================================================
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// File: Mgm.h
|
|
//
|
|
// History:
|
|
// V Raman June-25-1997 Created.
|
|
//
|
|
// Data structures and entry points into MGM.
|
|
//============================================================================
|
|
|
|
|
|
#ifndef _MGM_H_
|
|
#define _MGM_H_
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// typedefs for callback interface
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
|
//
|
|
// MGM_IF_ENTRY
|
|
//
|
|
// structure used in MGM_CREATION_ALERT_CALLBACK. In the process of
|
|
// creating an MFE the routing protocol needs to enable/disable
|
|
// multicast forwarding on each interface
|
|
//
|
|
|
|
typedef struct _MGM_IF_ENTRY {
|
|
|
|
DWORD dwIfIndex;
|
|
DWORD dwIfNextHopAddr;
|
|
BOOL bIGMP;
|
|
BOOL bIsEnabled;
|
|
|
|
} MGM_IF_ENTRY, *PMGM_IF_ENTRY;
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Callbacks into routing protocols
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
//
|
|
// call into a routing protocol to perform RPF check.
|
|
//
|
|
// Invoked in the context of MgmNewPacketReceived into protocol component
|
|
// owning the incoming interface.
|
|
//
|
|
|
|
typedef DWORD
|
|
(*PMGM_RPF_CALLBACK)(
|
|
IN DWORD dwSourceAddr,
|
|
IN DWORD dwSourceMask,
|
|
IN DWORD dwGroupAddr,
|
|
IN DWORD dwGroupMask,
|
|
IN OUT PDWORD pdwInIfIndex,
|
|
IN OUT PDWORD pdwInIfNextHopAddr,
|
|
IN OUT PDWORD pdwUpStreamNbr,
|
|
IN DWORD dwHdrSize,
|
|
IN PBYTE pbPacketHdr,
|
|
IN OUT PBYTE pbRoute
|
|
);
|
|
|
|
|
|
//
|
|
// call into a routing protocol to determine the subset of interfaces
|
|
// (owned by the routing protocol) on which a multicast packet from a
|
|
// "new" source should be forwarded.
|
|
//
|
|
// Invoked in the context of MgmNewPacketReceived into all
|
|
// routing protocols that have outgoing interfaces for this source.
|
|
//
|
|
|
|
typedef
|
|
DWORD (*PMGM_CREATION_ALERT_CALLBACK)(
|
|
IN DWORD dwSourceAddr,
|
|
IN DWORD dwSourceMask,
|
|
IN DWORD dwGroupAddr,
|
|
IN DWORD dwGroupMask,
|
|
IN DWORD dwInIfIndex,
|
|
IN DWORD dwInIfNextHopAddr,
|
|
IN DWORD dwIfCount,
|
|
IN OUT PMGM_IF_ENTRY pmieOutIfList
|
|
);
|
|
|
|
|
|
//
|
|
// call into routing protocol to notify protocol that an interface has
|
|
// been deleted from the outgoing interface list of a group entry / MFE
|
|
//
|
|
// invoked in the context of MgmDeleteMembershipEntry()
|
|
//
|
|
|
|
typedef
|
|
DWORD (*PMGM_PRUNE_ALERT_CALLBACK)(
|
|
IN DWORD dwSourceAddr,
|
|
IN DWORD dwSourceMask,
|
|
IN DWORD dwGroupAddr,
|
|
IN DWORD dwGroupMask,
|
|
IN DWORD dwIfIndex,
|
|
IN DWORD dwIfNextHopAddr,
|
|
IN BOOL bMemberDelete,
|
|
IN OUT PDWORD pdwTimeout
|
|
);
|
|
|
|
|
|
//
|
|
// call into routing protocol to notify protocol that an interface has
|
|
// been added to the outgoing interface list of a group entry / MFE
|
|
//
|
|
// invoked in the context of MgmAddMembershipEntry()
|
|
//
|
|
|
|
typedef
|
|
DWORD (*PMGM_JOIN_ALERT_CALLBACK)(
|
|
IN DWORD dwSourceAddr,
|
|
IN DWORD dwSourceMask,
|
|
IN DWORD dwGroupAddr,
|
|
IN DWORD dwGroupMask,
|
|
IN BOOL bMemberUpdate
|
|
);
|
|
|
|
|
|
//
|
|
// call into routing protocol to notify protocol that a packet
|
|
// has been received from a (source, group) on a wrong interface
|
|
//
|
|
|
|
typedef
|
|
DWORD (*PMGM_WRONG_IF_CALLBACK)(
|
|
IN DWORD dwSourceAddr,
|
|
IN DWORD dwGroupAddr,
|
|
IN DWORD dwIfIndex,
|
|
IN DWORD dwIfNextHopAddr,
|
|
IN DWORD dwHdrSize,
|
|
IN PBYTE pbPacketHdr
|
|
);
|
|
|
|
|
|
//
|
|
// call into routing protocol to notify protocol that IGMP needs to add
|
|
// an interface to the outgoing interface list of a group entry / MFE
|
|
//
|
|
// invoked in the context of MgmLocalGroupJoin()
|
|
//
|
|
|
|
typedef DWORD
|
|
(*PMGM_LOCAL_JOIN_CALLBACK) (
|
|
IN DWORD dwSourceAddr,
|
|
IN DWORD dwSourceMask,
|
|
IN DWORD dwGroupAddr,
|
|
IN DWORD dwGroupMask,
|
|
IN DWORD dwIfIndex,
|
|
IN DWORD dwIfNextHopAddr
|
|
);
|
|
|
|
|
|
//
|
|
// call into routing protocol to notify protocol that IGMP needs to
|
|
// delete an interface to the outgoing interface list of a group
|
|
// entry / MFE
|
|
//
|
|
// invoked in the context of MgmLocalGroupJoin()
|
|
//
|
|
|
|
typedef DWORD
|
|
(*PMGM_LOCAL_LEAVE_CALLBACK) (
|
|
IN DWORD dwSourceAddr,
|
|
IN DWORD dwSourceMask,
|
|
IN DWORD dwGroupAddr,
|
|
IN DWORD dwGroupMask,
|
|
IN DWORD dwIfIndex,
|
|
IN DWORD dwIfNextHopAddr
|
|
);
|
|
|
|
|
|
//
|
|
// call into IGMP to notify it that a protocol is taking or
|
|
// releasing ownership of an interface that has IGMP enabled on it.
|
|
//
|
|
// When this callback is invoked IGMP should stop adding/deleting
|
|
// group memberships on the specified interface.
|
|
//
|
|
|
|
typedef DWORD
|
|
(*PMGM_DISABLE_IGMP_CALLBACK) (
|
|
IN DWORD dwIfIndex,
|
|
IN DWORD dwIfNextHopAddr
|
|
);
|
|
|
|
|
|
//
|
|
// call into IGMP to notify it that a protocol has finished taking
|
|
// or releasing ownership of an interface.
|
|
//
|
|
// When this callback is invoked IGMP should add all its group memberships
|
|
// on the interface.
|
|
//
|
|
|
|
typedef DWORD
|
|
(*PMGM_ENABLE_IGMP_CALLBACK) (
|
|
IN DWORD dwIfIndex,
|
|
IN DWORD dwIfNextHopAddr
|
|
);
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// typedefs for MGM API interface
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
|
//
|
|
// ROUTING_PROTOCOL_CONFIG
|
|
//
|
|
// routing protocol configuration that is passed to MGM at registration.
|
|
//
|
|
//
|
|
// Callbacks into routing protocols
|
|
//
|
|
|
|
typedef struct _ROUTING_PROTOCOL_CONFIG {
|
|
|
|
DWORD dwCallbackFlags;
|
|
|
|
PMGM_RPF_CALLBACK pfnRpfCallback;
|
|
|
|
PMGM_CREATION_ALERT_CALLBACK pfnCreationAlertCallback;
|
|
|
|
PMGM_PRUNE_ALERT_CALLBACK pfnPruneAlertCallback;
|
|
|
|
PMGM_JOIN_ALERT_CALLBACK pfnJoinAlertCallback;
|
|
|
|
PMGM_WRONG_IF_CALLBACK pfnWrongIfCallback;
|
|
|
|
|
|
//
|
|
// callbacks into Routing protocols
|
|
//
|
|
|
|
PMGM_LOCAL_JOIN_CALLBACK pfnLocalJoinCallback;
|
|
|
|
PMGM_LOCAL_LEAVE_CALLBACK pfnLocalLeaveCallback;
|
|
|
|
|
|
//
|
|
// callbacks into IGMP
|
|
//
|
|
|
|
PMGM_DISABLE_IGMP_CALLBACK pfnDisableIgmpCallback;
|
|
|
|
PMGM_ENABLE_IGMP_CALLBACK pfnEnableIgmpCallback;
|
|
|
|
} ROUTING_PROTOCOL_CONFIG, *PROUTING_PROTOCOL_CONFIG;
|
|
|
|
|
|
//
|
|
// MGM_ENUM_TYPES
|
|
//
|
|
// Enumeration types to be specified when the
|
|
//
|
|
|
|
typedef enum _MGM_ENUM_TYPES
|
|
{
|
|
ANY_SOURCE = 0, // enumerate group entries with
|
|
// atleast one source
|
|
|
|
ALL_SOURCES // enumerate all source entries
|
|
// for a group entry
|
|
} MGM_ENUM_TYPES;
|
|
|
|
|
|
//
|
|
// SOURCE_GROUP_ENTRY
|
|
//
|
|
// (S, G) entry that is returned by the group entry enumeration API.
|
|
//
|
|
|
|
typedef struct _SOURCE_GROUP_ENTRY {
|
|
|
|
DWORD dwSourceAddr;
|
|
|
|
DWORD dwSourceMask;
|
|
|
|
DWORD dwGroupAddr;
|
|
|
|
DWORD dwGroupMask;
|
|
|
|
} SOURCE_GROUP_ENTRY, *PSOURCE_GROUP_ENTRY;
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Entry points into MGM.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
//============================================================================
|
|
// Routing protocol registration / de-registration API
|
|
//============================================================================
|
|
|
|
DWORD
|
|
MgmRegisterMProtocol(
|
|
IN PROUTING_PROTOCOL_CONFIG prpiInfo,
|
|
IN DWORD dwProtocolId,
|
|
IN DWORD dwComponentId,
|
|
OUT HANDLE * phProtocol
|
|
);
|
|
|
|
DWORD
|
|
MgmDeRegisterMProtocol(
|
|
IN HANDLE hProtocol
|
|
);
|
|
|
|
|
|
//============================================================================
|
|
// Interface ownership API
|
|
//============================================================================
|
|
|
|
DWORD
|
|
MgmTakeInterfaceOwnership(
|
|
IN HANDLE hProtocol,
|
|
IN DWORD dwIfIndex,
|
|
IN DWORD dwIfNextHopAddr
|
|
);
|
|
|
|
|
|
DWORD
|
|
MgmReleaseInterfaceOwnership(
|
|
IN HANDLE hProtocol,
|
|
IN DWORD dwIfIndex,
|
|
IN DWORD dwIfNextHopAddr
|
|
);
|
|
|
|
DWORD
|
|
MgmGetProtocolOnInterface(
|
|
IN DWORD dwIfIndex,
|
|
IN DWORD dwIfNextHopAddr,
|
|
IN OUT PDWORD pdwIfProtocolId,
|
|
IN OUT PDWORD pdwIfComponentId
|
|
);
|
|
|
|
|
|
//============================================================================
|
|
// Group membership manipulation API. (addition / deletion )
|
|
//============================================================================
|
|
|
|
#define MGM_JOIN_STATE_FLAG 0x00000001
|
|
#define MGM_FORWARD_STATE_FLAG 0x00000002
|
|
|
|
DWORD
|
|
MgmAddGroupMembershipEntry(
|
|
IN HANDLE hProtocol,
|
|
IN DWORD dwSourceAddr,
|
|
IN DWORD dwSourceMask,
|
|
IN DWORD dwGroupAddr,
|
|
IN DWORD dwGroupMask,
|
|
IN DWORD dwIfIndex,
|
|
IN DWORD dwIfNextHopIPAddr,
|
|
IN DWORD dwFlags
|
|
);
|
|
|
|
DWORD
|
|
MgmDeleteGroupMembershipEntry(
|
|
IN HANDLE hProtocol,
|
|
IN DWORD dwSourceAddr,
|
|
IN DWORD dwSourceMask,
|
|
IN DWORD dwGroupAddr,
|
|
IN DWORD dwGroupMask,
|
|
IN DWORD dwIfIndex,
|
|
IN DWORD dwIfNextHopIPAddr,
|
|
IN DWORD dwFlags
|
|
);
|
|
|
|
//============================================================================
|
|
//
|
|
// Enumeration API
|
|
//
|
|
//============================================================================
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
// MFE enumeration API
|
|
//----------------------------------------------------------------------------
|
|
|
|
DWORD
|
|
MgmGetMfe(
|
|
IN PMIB_IPMCAST_MFE pimm,
|
|
IN OUT PDWORD pdwBufferSize,
|
|
IN OUT PBYTE pbBuffer
|
|
);
|
|
|
|
DWORD
|
|
MgmGetFirstMfe(
|
|
IN OUT PDWORD pdwBufferSize,
|
|
IN OUT PBYTE pbBuffer,
|
|
IN OUT PDWORD pdwNumEntries
|
|
);
|
|
|
|
|
|
DWORD
|
|
MgmGetNextMfe(
|
|
IN PMIB_IPMCAST_MFE pimmStart,
|
|
IN OUT PDWORD pdwBufferSize,
|
|
IN OUT PBYTE pbBuffer,
|
|
IN OUT PDWORD pdwNumEntries
|
|
);
|
|
|
|
|
|
//
|
|
// Include statistics corresponding to MIB_IPMCAST_MFE_STATS
|
|
//
|
|
|
|
#define MGM_MFE_STATS_0 0x00000001
|
|
|
|
//
|
|
// Include statistics corresponding to MIB_IPMCAST_MFE_STATS_EX
|
|
//
|
|
|
|
#define MGM_MFE_STATS_1 0x00000002
|
|
|
|
|
|
DWORD
|
|
MgmGetMfeStats(
|
|
IN PMIB_IPMCAST_MFE pimm,
|
|
IN OUT PDWORD pdwBufferSize,
|
|
IN OUT PBYTE pbBuffer,
|
|
IN DWORD dwFlags
|
|
);
|
|
|
|
DWORD
|
|
MgmGetFirstMfeStats(
|
|
IN OUT PDWORD pdwBufferSize,
|
|
IN OUT PBYTE pbBuffer,
|
|
IN OUT PDWORD pdwNumEntries,
|
|
IN DWORD dwFlags
|
|
);
|
|
|
|
|
|
DWORD
|
|
MgmGetNextMfeStats(
|
|
IN PMIB_IPMCAST_MFE pimmStart,
|
|
IN OUT PDWORD pdwBufferSize,
|
|
IN OUT PBYTE pbBuffer,
|
|
IN OUT PDWORD pdwNumEntries,
|
|
IN DWORD dwFlags
|
|
);
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Group menbership entry enumeration API
|
|
//----------------------------------------------------------------------------
|
|
|
|
DWORD
|
|
MgmGroupEnumerationStart(
|
|
IN HANDLE hProtocol,
|
|
IN MGM_ENUM_TYPES metEnumType,
|
|
OUT HANDLE * phEnumHandle
|
|
);
|
|
|
|
DWORD
|
|
MgmGroupEnumerationGetNext(
|
|
IN HANDLE hEnum,
|
|
IN OUT PDWORD pdwBufferSize,
|
|
IN OUT PBYTE pbBuffer,
|
|
IN OUT PDWORD pdwNumEntries
|
|
);
|
|
|
|
DWORD
|
|
MgmGroupEnumerationEnd(
|
|
IN HANDLE hEnum
|
|
);
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
// Mgm MFE Update API.
|
|
//
|
|
//-----------------------------------------------------------------
|
|
|
|
DWORD
|
|
MgmSetMfe(
|
|
IN HANDLE hProtocol,
|
|
IN PMIB_IPMCAST_MFE pmimm
|
|
);
|
|
|
|
|
|
#endif //_MGM_H_
|