home *** CD-ROM | disk | FTP | other *** search
/ PC Format (South-Africa) 2001 June / PCFJune.iso / Xenon / C++ / FreeCommandLineTools.exe / Include / mgm.h < prev    next >
Encoding:
C/C++ Source or Header  |  2000-01-31  |  13.8 KB  |  481 lines

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