Mgm.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:14k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //============================================================================
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //
  4. // File: Mgm.h
  5. //
  6. // History:
  7. //      V Raman    June-25-1997  Created.
  8. //
  9. // Data structures and entry points into MGM.
  10. //============================================================================
  11. #ifndef _MGM_H_
  12. #define _MGM_H_
  13. #if _MSC_VER > 1000
  14. #pragma once
  15. #endif
  16. //----------------------------------------------------------------------------
  17. //
  18. // typedefs for callback interface
  19. //
  20. //----------------------------------------------------------------------------
  21. //
  22. // MGM_IF_ENTRY
  23. //
  24. // structure used in MGM_CREATION_ALERT_CALLBACK.  In the process of
  25. // creating an MFE the routing protocol needs to enable/disable
  26. // multicast forwarding on each interface
  27. //
  28. typedef struct _MGM_IF_ENTRY {
  29.     DWORD               dwIfIndex;
  30.     DWORD               dwIfNextHopAddr;
  31.     BOOL                bIGMP;
  32.     BOOL                bIsEnabled;
  33.         
  34. } MGM_IF_ENTRY, *PMGM_IF_ENTRY;
  35. //----------------------------------------------------------------------------
  36. //
  37. // Callbacks into routing protocols
  38. //
  39. //----------------------------------------------------------------------------
  40. //
  41. // call into a routing protocol to perform RPF check.
  42. //
  43. // Invoked in the context of MgmNewPacketReceived into protocol component
  44. // owning the incoming interface.
  45. //
  46. typedef DWORD
  47. (*PMGM_RPF_CALLBACK)(
  48.     IN              DWORD           dwSourceAddr,
  49.     IN              DWORD           dwSourceMask,
  50.     IN              DWORD           dwGroupAddr,
  51.     IN              DWORD           dwGroupMask,
  52.     IN  OUT         PDWORD          pdwInIfIndex,
  53.     IN  OUT         PDWORD          pdwInIfNextHopAddr,
  54.     IN  OUT         PDWORD          pdwUpStreamNbr,
  55.     IN              DWORD           dwHdrSize,
  56.     IN              PBYTE           pbPacketHdr,
  57.     IN  OUT         PBYTE           pbRoute
  58. );
  59. //
  60. // call into a routing protocol to determine the subset of interfaces
  61. // (owned by the routing protocol) on which a multicast packet from a
  62. // "new" source should be forwarded.
  63. //
  64. // Invoked in the context of MgmNewPacketReceived into all
  65. // routing protocols that have outgoing interfaces for this source.
  66. //
  67. typedef
  68. DWORD (*PMGM_CREATION_ALERT_CALLBACK)(
  69.     IN              DWORD           dwSourceAddr,
  70.     IN              DWORD           dwSourceMask,
  71.     IN              DWORD           dwGroupAddr,
  72.     IN              DWORD           dwGroupMask,
  73.     IN              DWORD           dwInIfIndex,
  74.     IN              DWORD           dwInIfNextHopAddr,
  75.     IN              DWORD           dwIfCount,
  76.     IN  OUT         PMGM_IF_ENTRY   pmieOutIfList
  77. );
  78. //
  79. // call into routing protocol to notify protocol that an interface has
  80. // been deleted from the outgoing interface list of a group entry / MFE
  81. //
  82. // invoked in the context of MgmDeleteMembershipEntry()
  83. //
  84. typedef
  85. DWORD (*PMGM_PRUNE_ALERT_CALLBACK)(
  86.     IN              DWORD           dwSourceAddr,
  87.     IN              DWORD           dwSourceMask,
  88.     IN              DWORD           dwGroupAddr,
  89.     IN              DWORD           dwGroupMask,
  90.     IN              DWORD           dwIfIndex,
  91.     IN              DWORD           dwIfNextHopAddr,
  92.     IN              BOOL            bMemberDelete,
  93.     IN  OUT         PDWORD          pdwTimeout
  94. );
  95. //
  96. // call into routing protocol to notify protocol that an interface has
  97. // been added to the outgoing interface list of a group entry / MFE
  98. //
  99. // invoked in the context of MgmAddMembershipEntry()
  100. //
  101. typedef
  102. DWORD (*PMGM_JOIN_ALERT_CALLBACK)(
  103.     IN              DWORD           dwSourceAddr,
  104.     IN              DWORD           dwSourceMask,
  105.     IN              DWORD           dwGroupAddr,
  106.     IN              DWORD           dwGroupMask,
  107.     IN              BOOL            bMemberUpdate
  108. );
  109. //
  110. // call into routing protocol to notify protocol that a packet
  111. // has been received from a (source, group) on a wrong interface
  112. //
  113. typedef
  114. DWORD (*PMGM_WRONG_IF_CALLBACK)(
  115.     IN              DWORD           dwSourceAddr,
  116.     IN              DWORD           dwGroupAddr,
  117.     IN              DWORD           dwIfIndex,
  118.     IN              DWORD           dwIfNextHopAddr,
  119.     IN              DWORD           dwHdrSize,
  120.     IN              PBYTE           pbPacketHdr
  121. );
  122. //
  123. // call into routing protocol to notify protocol that IGMP needs to add
  124. // an interface to the outgoing interface list of a group entry / MFE
  125. //
  126. // invoked in the context of MgmLocalGroupJoin()
  127. //
  128. typedef DWORD
  129. (*PMGM_LOCAL_JOIN_CALLBACK) (
  130.     IN              DWORD           dwSourceAddr,
  131.     IN              DWORD           dwSourceMask,
  132.     IN              DWORD           dwGroupAddr,
  133.     IN              DWORD           dwGroupMask,
  134.     IN              DWORD           dwIfIndex,
  135.     IN              DWORD           dwIfNextHopAddr
  136. );
  137. //
  138. // call into routing protocol to notify protocol that IGMP needs to
  139. // delete an interface to the outgoing interface list of a group
  140. // entry / MFE
  141. //
  142. // invoked in the context of MgmLocalGroupJoin()
  143. //
  144. typedef DWORD
  145. (*PMGM_LOCAL_LEAVE_CALLBACK) (
  146.     IN              DWORD           dwSourceAddr,
  147.     IN              DWORD           dwSourceMask,
  148.     IN              DWORD           dwGroupAddr,
  149.     IN              DWORD           dwGroupMask,
  150.     IN              DWORD           dwIfIndex,
  151.     IN              DWORD           dwIfNextHopAddr
  152. );
  153. //
  154. // call into IGMP to notify it that a protocol is taking or
  155. // releasing ownership of an interface that has IGMP enabled on it.
  156. //
  157. // When this callback is invoked IGMP should stop adding/deleting
  158. // group memberships on the specified interface.
  159. //
  160. typedef DWORD
  161. (*PMGM_DISABLE_IGMP_CALLBACK) (
  162.     IN              DWORD           dwIfIndex,
  163.     IN              DWORD           dwIfNextHopAddr
  164. );
  165. //
  166. // call into IGMP to notify it that a protocol has finished taking
  167. // or releasing ownership of an interface.
  168. //
  169. // When this callback is invoked IGMP should add all its group memberships
  170. // on the interface.
  171. //
  172. typedef DWORD
  173. (*PMGM_ENABLE_IGMP_CALLBACK) (
  174.     IN              DWORD           dwIfIndex,
  175.     IN              DWORD           dwIfNextHopAddr
  176. );
  177. //----------------------------------------------------------------------------
  178. //
  179. // typedefs for MGM API interface
  180. //
  181. //----------------------------------------------------------------------------
  182. //
  183. // ROUTING_PROTOCOL_CONFIG
  184. //
  185. // routing protocol configuration that is passed to MGM at registration.
  186. //
  187. //
  188. // Callbacks into routing protocols
  189. //
  190. typedef struct _ROUTING_PROTOCOL_CONFIG {
  191.     DWORD                           dwCallbackFlags;
  192.     PMGM_RPF_CALLBACK               pfnRpfCallback;
  193.     PMGM_CREATION_ALERT_CALLBACK    pfnCreationAlertCallback;
  194.     PMGM_PRUNE_ALERT_CALLBACK       pfnPruneAlertCallback;
  195.     PMGM_JOIN_ALERT_CALLBACK        pfnJoinAlertCallback;
  196.     PMGM_WRONG_IF_CALLBACK          pfnWrongIfCallback;
  197.     //
  198.     // callbacks into Routing protocols
  199.     //
  200.     PMGM_LOCAL_JOIN_CALLBACK         pfnLocalJoinCallback;
  201.     PMGM_LOCAL_LEAVE_CALLBACK        pfnLocalLeaveCallback;
  202.     //
  203.     // callbacks into IGMP
  204.     //
  205.     PMGM_DISABLE_IGMP_CALLBACK      pfnDisableIgmpCallback;
  206.     PMGM_ENABLE_IGMP_CALLBACK       pfnEnableIgmpCallback;
  207. } ROUTING_PROTOCOL_CONFIG, *PROUTING_PROTOCOL_CONFIG;
  208. //
  209. // MGM_ENUM_TYPES
  210. //
  211. // Enumeration types to be specified when the
  212. //
  213. typedef enum _MGM_ENUM_TYPES
  214. {
  215.     ANY_SOURCE = 0,                 // enumerate group entries with
  216.                                     // atleast one source
  217.     ALL_SOURCES                     // enumerate all source entries
  218.                                     // for a group entry
  219. } MGM_ENUM_TYPES;
  220. //
  221. // SOURCE_GROUP_ENTRY
  222. //
  223. // (S, G) entry that is returned by the group entry enumeration API.
  224. //
  225. typedef struct _SOURCE_GROUP_ENTRY {
  226.     DWORD                           dwSourceAddr;
  227.     DWORD                           dwSourceMask;
  228.     DWORD                           dwGroupAddr;
  229.     DWORD                           dwGroupMask;
  230. } SOURCE_GROUP_ENTRY, *PSOURCE_GROUP_ENTRY;
  231. //----------------------------------------------------------------------------
  232. //
  233. // Entry points into MGM.
  234. //
  235. //----------------------------------------------------------------------------
  236. //============================================================================
  237. // Routing protocol registration / de-registration API
  238. //============================================================================
  239. DWORD
  240. MgmRegisterMProtocol(
  241.     IN          PROUTING_PROTOCOL_CONFIG    prpiInfo,
  242.     IN          DWORD                       dwProtocolId,
  243.     IN          DWORD                       dwComponentId,
  244.     OUT         HANDLE  *                   phProtocol
  245. );
  246. DWORD
  247. MgmDeRegisterMProtocol(
  248.     IN          HANDLE                      hProtocol
  249. );
  250. //============================================================================
  251. // Interface ownership API
  252. //============================================================================
  253. DWORD
  254. MgmTakeInterfaceOwnership(
  255.     IN          HANDLE                      hProtocol,
  256.     IN          DWORD                       dwIfIndex,
  257.     IN          DWORD                       dwIfNextHopAddr
  258. );
  259. DWORD
  260. MgmReleaseInterfaceOwnership(
  261.     IN          HANDLE                      hProtocol,
  262.     IN          DWORD                       dwIfIndex,
  263.     IN          DWORD                       dwIfNextHopAddr
  264. );
  265. DWORD
  266. MgmGetProtocolOnInterface(
  267.     IN          DWORD                       dwIfIndex,
  268.     IN          DWORD                       dwIfNextHopAddr,
  269.     IN  OUT     PDWORD                      pdwIfProtocolId,
  270.     IN  OUT     PDWORD                      pdwIfComponentId
  271. );
  272. //============================================================================
  273. // Group membership manipulation API. (addition / deletion )
  274. //============================================================================
  275. #define         MGM_JOIN_STATE_FLAG         0x00000001
  276. #define         MGM_FORWARD_STATE_FLAG      0x00000002
  277. DWORD
  278. MgmAddGroupMembershipEntry(
  279.     IN              HANDLE                  hProtocol,
  280.     IN              DWORD                   dwSourceAddr,
  281.     IN              DWORD                   dwSourceMask,
  282.     IN              DWORD                   dwGroupAddr,
  283.     IN              DWORD                   dwGroupMask,
  284.     IN              DWORD                   dwIfIndex,
  285.     IN              DWORD                   dwIfNextHopIPAddr,
  286.     IN              DWORD                   dwFlags
  287. );
  288. DWORD
  289. MgmDeleteGroupMembershipEntry(
  290.     IN              HANDLE                  hProtocol,
  291.     IN              DWORD                   dwSourceAddr,
  292.     IN              DWORD                   dwSourceMask,
  293.     IN              DWORD                   dwGroupAddr,
  294.     IN              DWORD                   dwGroupMask,
  295.     IN              DWORD                   dwIfIndex,
  296.     IN              DWORD                   dwIfNextHopIPAddr,
  297.     IN              DWORD                   dwFlags
  298. );
  299. //============================================================================
  300. //
  301. // Enumeration API
  302. //
  303. //============================================================================
  304. //----------------------------------------------------------------------------
  305. // MFE enumeration API
  306. //----------------------------------------------------------------------------
  307. DWORD
  308. MgmGetMfe(
  309.     IN              PMIB_IPMCAST_MFE        pimm,
  310.     IN  OUT         PDWORD                  pdwBufferSize,
  311.     IN  OUT         PBYTE                   pbBuffer
  312. );
  313. DWORD
  314. MgmGetFirstMfe(
  315.     IN  OUT         PDWORD                  pdwBufferSize,
  316.     IN  OUT         PBYTE                   pbBuffer,
  317.     IN  OUT         PDWORD                  pdwNumEntries
  318. );
  319. DWORD
  320. MgmGetNextMfe(
  321.     IN              PMIB_IPMCAST_MFE        pimmStart,
  322.     IN  OUT         PDWORD                  pdwBufferSize,
  323.     IN  OUT         PBYTE                   pbBuffer,
  324.     IN  OUT         PDWORD                  pdwNumEntries
  325. );
  326. //
  327. // Include statistics corresponding to MIB_IPMCAST_MFE_STATS
  328. //
  329. #define         MGM_MFE_STATS_0             0x00000001
  330. //
  331. // Include statistics corresponding to MIB_IPMCAST_MFE_STATS_EX
  332. //
  333. #define         MGM_MFE_STATS_1             0x00000002
  334. DWORD
  335. MgmGetMfeStats(
  336.     IN              PMIB_IPMCAST_MFE        pimm,
  337.     IN  OUT         PDWORD                  pdwBufferSize,
  338.     IN  OUT         PBYTE                   pbBuffer,
  339.     IN              DWORD                   dwFlags
  340. );
  341. DWORD
  342. MgmGetFirstMfeStats(
  343.     IN  OUT         PDWORD                  pdwBufferSize,
  344.     IN  OUT         PBYTE                   pbBuffer,
  345.     IN  OUT         PDWORD                  pdwNumEntries,
  346.     IN              DWORD                   dwFlags
  347. );
  348. DWORD
  349. MgmGetNextMfeStats(
  350.     IN              PMIB_IPMCAST_MFE        pimmStart,
  351.     IN  OUT         PDWORD                  pdwBufferSize,
  352.     IN  OUT         PBYTE                   pbBuffer,
  353.     IN  OUT         PDWORD                  pdwNumEntries,
  354.     IN              DWORD                   dwFlags
  355. );
  356. //----------------------------------------------------------------------------
  357. // Group menbership entry enumeration API
  358. //----------------------------------------------------------------------------
  359. DWORD
  360. MgmGroupEnumerationStart(
  361.     IN              HANDLE                  hProtocol,
  362.     IN              MGM_ENUM_TYPES          metEnumType,
  363.     OUT             HANDLE *                phEnumHandle
  364. );
  365. DWORD
  366. MgmGroupEnumerationGetNext(
  367.     IN              HANDLE                  hEnum,
  368.     IN  OUT         PDWORD                  pdwBufferSize,
  369.     IN  OUT         PBYTE                   pbBuffer,
  370.     IN  OUT         PDWORD                  pdwNumEntries
  371. );
  372. DWORD
  373. MgmGroupEnumerationEnd(
  374.     IN              HANDLE                  hEnum
  375. );
  376. //-----------------------------------------------------------------
  377. // Mgm MFE Update API.
  378. //
  379. //-----------------------------------------------------------------
  380. DWORD
  381. MgmSetMfe(
  382.     IN              HANDLE                  hProtocol,
  383.     IN              PMIB_IPMCAST_MFE        pmimm
  384. );
  385. #endif //_MGM_H_