Leaked source code of windows server 2003
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.

615 lines
21 KiB

  1. //============================================================================
  2. // Copyright (c) 1995, Microsoft Corporation
  3. //
  4. // File: ipriprm.h
  5. //
  6. // History:
  7. // Abolade Gbadegesin Aug-7-1995 Created.
  8. //
  9. // Contains type definitions and declarations for IP RIP,
  10. // used by the IP Router Manager.
  11. //============================================================================
  12. #ifndef _IPRIPRM_H_
  13. #define _IPRIPRM_H_
  14. //----------------------------------------------------------------------------
  15. // CONSTANT AND MACRO DECLARATIONS
  16. //----------------------------------------------------------------------------
  17. //----------------------------------------------------------------------------
  18. // constants identifying IPRIP's MIB tables
  19. //----------------------------------------------------------------------------
  20. #define IPRIP_GLOBAL_STATS_ID 0
  21. #define IPRIP_GLOBAL_CONFIG_ID 1
  22. #define IPRIP_IF_STATS_ID 2
  23. #define IPRIP_IF_CONFIG_ID 3
  24. #define IPRIP_IF_BINDING_ID 4
  25. #define IPRIP_PEER_STATS_ID 5
  26. //----------------------------------------------------------------------------
  27. // constants used for the field IPRIP_GLOBAL_CONFIG::GC_LoggingLevel
  28. //----------------------------------------------------------------------------
  29. #define IPRIP_LOGGING_NONE 0
  30. #define IPRIP_LOGGING_ERROR 1
  31. #define IPRIP_LOGGING_WARN 2
  32. #define IPRIP_LOGGING_INFO 3
  33. //----------------------------------------------------------------------------
  34. // constants used for the following fields:
  35. // IPRIP_GLOBAL_CONFIG::GC_PeerFilterMode,
  36. // IPRIP_IF_CONFIG::IC_AcceptFilterMode, and
  37. // IPRIP_IF_CONFIG::IC_AnnounceFilterMode
  38. //----------------------------------------------------------------------------
  39. #define IPRIP_FILTER_DISABLED 0
  40. #define IPRIP_FILTER_INCLUDE 1
  41. #define IPRIP_FILTER_EXCLUDE 2
  42. //----------------------------------------------------------------------------
  43. // constants used for the fields
  44. // IPRIP_IF_STATS::IS_State, IPRIP_IF_CONFIG::IC_State and
  45. // IPRIP_IF_BINDING::IB_State
  46. //----------------------------------------------------------------------------
  47. #define IPRIP_STATE_ENABLED 0x00000001
  48. #define IPRIP_STATE_BOUND 0x00000002
  49. //----------------------------------------------------------------------------
  50. // constant for the field IPRIP_IF_CONFIG::IC_AuthenticationKey;
  51. // defines maximum authentication key size
  52. //----------------------------------------------------------------------------
  53. #define IPRIP_MAX_AUTHKEY_SIZE 16
  54. //----------------------------------------------------------------------------
  55. // constants used to construct the field IPRIP_IF_CONFIG::IC_ProtocolFlags
  56. //----------------------------------------------------------------------------
  57. #define IPRIP_FLAG_ACCEPT_HOST_ROUTES 0x00000001
  58. #define IPRIP_FLAG_ANNOUNCE_HOST_ROUTES 0x00000002
  59. #define IPRIP_FLAG_ACCEPT_DEFAULT_ROUTES 0x00000004
  60. #define IPRIP_FLAG_ANNOUNCE_DEFAULT_ROUTES 0x00000008
  61. #define IPRIP_FLAG_SPLIT_HORIZON 0x00000010
  62. #define IPRIP_FLAG_POISON_REVERSE 0x00000020
  63. #define IPRIP_FLAG_GRACEFUL_SHUTDOWN 0x00000040
  64. #define IPRIP_FLAG_TRIGGERED_UPDATES 0x00000080
  65. #define IPRIP_FLAG_OVERWRITE_STATIC_ROUTES 0x00000100
  66. #define IPRIP_FLAG_NO_SUBNET_SUMMARY 0x00000200
  67. //----------------------------------------------------------------------------
  68. // constants for the field IPRIP_IF_CONFIG::IC_UpdateMode
  69. //----------------------------------------------------------------------------
  70. #define IPRIP_UPDATE_PERIODIC 0
  71. #define IPRIP_UPDATE_DEMAND 1
  72. //----------------------------------------------------------------------------
  73. // constants for the field IPRIP_IF_CONFIG::IC_AcceptMode
  74. //----------------------------------------------------------------------------
  75. #define IPRIP_ACCEPT_DISABLED 0
  76. #define IPRIP_ACCEPT_RIP1 1
  77. #define IPRIP_ACCEPT_RIP1_COMPAT 2
  78. #define IPRIP_ACCEPT_RIP2 3
  79. //----------------------------------------------------------------------------
  80. // constants for the field IPRIP_IF_CONFIG::IC_AnnounceMode
  81. //----------------------------------------------------------------------------
  82. #define IPRIP_ANNOUNCE_DISABLED 0
  83. #define IPRIP_ANNOUNCE_RIP1 1
  84. #define IPRIP_ANNOUNCE_RIP1_COMPAT 2
  85. #define IPRIP_ANNOUNCE_RIP2 3
  86. //----------------------------------------------------------------------------
  87. // constants for the field IPRIP_IF_CONFIG::IC_AuthenticationType
  88. //----------------------------------------------------------------------------
  89. #define IPRIP_AUTHTYPE_NONE 1
  90. #define IPRIP_AUTHTYPE_SIMPLE_PASSWORD 2
  91. #define IPRIP_AUTHTYPE_MD5 3
  92. //----------------------------------------------------------------------------
  93. // constants for the field IPRIP_IF_CONFIG::IC_UnicastPeerMode
  94. //----------------------------------------------------------------------------
  95. #define IPRIP_PEER_DISABLED 0
  96. #define IPRIP_PEER_ALSO 1
  97. #define IPRIP_PEER_ONLY 2
  98. //----------------------------------------------------------------------------
  99. // macros for manipulating the variable length IPRIP_GLOBAL_CONFIG structure
  100. //
  101. // IPRIP_GLOBAL_CONFIG_SIZE computes the size of a global config struct
  102. //
  103. // IPRIP_GLOBAL_PEER_FILTER_TABLE computes the starting address
  104. // of the series of peer IP addresses which comprise
  105. // the peer filter table in a global config struct
  106. //
  107. // e.g.
  108. // PIPRIP_GLOBAL_CONFIG pigcSource, pigcDest;
  109. //
  110. // pigcDest = malloc(IPRIP_GLOBAL_CONFIG_SIZE(pigcSource));
  111. // memcpy(pigcDest, pigcSource, IPRIP_GLOBAL_CONFIG_SIZE(pigcSource));
  112. //
  113. // e.g.
  114. // DWORD i, *pdwPeer;
  115. // PIPRIP_GLOBAL_CONFIG pigc;
  116. //
  117. // pdwPeer = IPRIP_GLOBAL_PEER_FILTER_TABLE(pigc);
  118. // for (i = 0; i < pigc->GC_PeerFilterCount; i++, pdwPeer++) {
  119. // printf("%s\n", inet_ntoa(*(struct in_addr *)pdwPeer));
  120. // }
  121. //----------------------------------------------------------------------------
  122. #define IPRIP_GLOBAL_CONFIG_SIZE(cfg) \
  123. (sizeof(IPRIP_GLOBAL_CONFIG) + \
  124. (cfg)->GC_PeerFilterCount * sizeof(DWORD))
  125. #define IPRIP_GLOBAL_PEER_FILTER_TABLE(cfg) ((PDWORD)((cfg) + 1))
  126. //----------------------------------------------------------------------------
  127. // macros used for manipulating the field IPRIP_IF_CONFIG::IC_ProtocolFlags;
  128. //
  129. // IPRIP_FLAG_ENABLE enables a flag in a config structure
  130. //
  131. // IPRIP_FLAG_DISABLE disables a flag in a config structure
  132. //
  133. // IPRIP_FLAG_IS_ENABLED evaluates to non-zero if a given flag is enabled
  134. // in a config structure
  135. //
  136. // IPRIP_FLAG_IS_DISABLED evaluates to non-zero if a given flag is disabled
  137. // in a config structure
  138. //
  139. // e.g.
  140. // IPRIP_IF_CONFIG iic;
  141. // IPRIP_FLAG_ENABLE(&iic, ACCEPT_HOST_ROUTES);
  142. //
  143. // e.g.
  144. // IPRIP_IF_CONFIG iic;
  145. // printf((IPRIP_FLAG_IS_ENABLED(&iic, SPLIT_HORIZON) ? "split" : ""));
  146. //----------------------------------------------------------------------------
  147. #define IPRIP_FLAG_ENABLE(iic, flag) \
  148. ((iic)->IC_ProtocolFlags |= IPRIP_FLAG_ ## flag)
  149. #define IPRIP_FLAG_DISABLE(iic, flag) \
  150. ((iic)->IC_ProtocolFlags &= ~ (IPRIP_FLAG_ ## flag))
  151. #define IPRIP_FLAG_IS_ENABLED(iic, flag) \
  152. ((iic)->IC_ProtocolFlags & IPRIP_FLAG_ ## flag)
  153. #define IPRIP_FLAG_IS_DISABLED(iic, flag) \
  154. !IPRIP_FLAG_IS_ENABLED(iic, flag)
  155. //----------------------------------------------------------------------------
  156. // macros for manipulating the variable-length IPRIP_IF_CONFIG structure
  157. //
  158. // IPRIP_IF_CONFIG_SIZE computes the size of a config structure.
  159. //
  160. // IPRIP_IF_UNICAST_PEER_TABLE computes the starting address
  161. // in a config struct of the series of IP addresses for peers
  162. // to whom routes are to be sent by unicast.
  163. //
  164. // IPRIP_IF_CONFIG_ACCEPT_FILTER_TABLE computes the starting address
  165. // of the series of route-acceptance filters in a config structure.
  166. //
  167. // IPRIP_IF_CONFIG_ANNOUNCE_FILTER_TABLE computes the starting address
  168. // of the series of route-announcement filters in a config structure.
  169. //
  170. // e.g.
  171. // PIPRIP_IF_CONFIG piicSource, piicDest;
  172. //
  173. // piicDest = malloc(IPRIP_IF_CONFIG_SIZE(piicSource));
  174. // memcpy(piicDest, piicSource, IPRIP_IF_CONFIG_SIZE(piicSource));
  175. //
  176. // e.g.
  177. // DWORD i, *pdwPeer;
  178. // PIPRIP_IF_CONFIG piic;
  179. //
  180. // pdwPeer = IPRIP_IF_UNICAST_PEER_TABLE(piic);
  181. // for (i = 0; i < piic->IC_UnicastPeerCount; i++) {
  182. // printf("%s\n", inet_ntoa(*(struct in_addr *)pdwPeer));
  183. // }
  184. //----------------------------------------------------------------------------
  185. #define IPRIP_IF_CONFIG_SIZE(cfg) \
  186. (sizeof(IPRIP_IF_CONFIG) + \
  187. (cfg)->IC_UnicastPeerCount * sizeof(DWORD) + \
  188. (cfg)->IC_AcceptFilterCount * sizeof(IPRIP_ROUTE_FILTER) + \
  189. (cfg)->IC_AnnounceFilterCount * sizeof(IPRIP_ROUTE_FILTER))
  190. #define IPRIP_IF_UNICAST_PEER_TABLE(cfg) ((PDWORD)((cfg) + 1))
  191. #define IPRIP_IF_ACCEPT_FILTER_TABLE(cfg) \
  192. ((PIPRIP_ROUTE_FILTER)( \
  193. IPRIP_IF_UNICAST_PEER_TABLE(cfg) + (cfg)->IC_UnicastPeerCount ))
  194. #define IPRIP_IF_ANNOUNCE_FILTER_TABLE(cfg) \
  195. ((PIPRIP_ROUTE_FILTER)( \
  196. IPRIP_IF_ACCEPT_FILTER_TABLE(cfg) + (cfg)->IC_AcceptFilterCount ))
  197. //----------------------------------------------------------------------------
  198. // macros for manipulating the variable-length IPRIP_IF_BINDING structure
  199. //
  200. // IPRIP_IF_BINDING_SIZE computes the size of a binding structure.
  201. //
  202. // IPRIP_IF_ADDRESS_TABLE computes the starting address in a binding struct
  203. // of the series of IPRIP_IP_ADDRESS structures which are the bindings
  204. // for the interface in question.
  205. //
  206. // e.g.
  207. // PIPRIP_IF_BINDING piibSource, piibDest;
  208. //
  209. // piibDest = malloc(IPRIP_IF_BINDING_SIZE(piicSource));
  210. // memcpy(piibDest, piicSource, IPRIP_IF_BINDING_SIZE(piicSource));
  211. //
  212. // e.g.
  213. // DWORD i;
  214. // PIPRIP_IF_BINDING piib;
  215. // PIPRIP_IP_ADDRESS *pdwAddr;
  216. //
  217. // pdwAddr = IPRIP_IF_ADDRESS_TABLE(piib);
  218. // for (i = 0; i < piib->IB_AddrCount; i++) {
  219. // printf("%s-", inet_ntoa(*(struct in_addr *)&pdwAddr->IA_Address));
  220. // printf("%s\n", inet_ntoa(*(struct in_addr *)&pdwAddr->IA_Netmask));
  221. // }
  222. //----------------------------------------------------------------------------
  223. #define IPRIP_IF_BINDING_SIZE(bind) \
  224. (sizeof(IPRIP_IF_BINDING) + \
  225. (bind)->IB_AddrCount * sizeof(IPRIP_IP_ADDRESS))
  226. #define IPRIP_IF_ADDRESS_TABLE(bind) ((PIPRIP_IP_ADDRESS)((bind) + 1))
  227. //----------------------------------------------------------------------------
  228. // STRUCTURE DEFINITIONS
  229. //----------------------------------------------------------------------------
  230. //----------------------------------------------------------------------------
  231. // struct: IPRIP_GLOBAL_STATS
  232. //
  233. // This MIB entry stores global statistics for IPRIP;
  234. // There is only one instance, so this entry has no index.
  235. //
  236. // This structure is read-only.
  237. //----------------------------------------------------------------------------
  238. typedef struct _IPRIP_GLOBAL_STATS {
  239. DWORD GS_SystemRouteChanges;
  240. DWORD GS_TotalResponsesSent;
  241. } IPRIP_GLOBAL_STATS, *PIPRIP_GLOBAL_STATS;
  242. //----------------------------------------------------------------------------
  243. // struct: IPRIP_GLOBAL_CONFIG
  244. //
  245. // This MIB entry stores global configuration for IPRIP
  246. // There is only one instance, so this entry has no index.
  247. //
  248. // THIS STRUCTURE IS VARIABLE LENGTH:
  249. //
  250. // after the base structure comes an array of GC_PeerFilterCount DWORDs,
  251. // each of which contains an IP address which is a peer which will be
  252. // accepted or rejected depending on the value of GC_PeerFilterMode.
  253. //
  254. // Thus, if GC_PeerFilterMode is IPRIP_FILTER_EXCLUDE, routes will be
  255. // rejected which come from the routers whose addresses are in the peer array,
  256. // and all other routers will be accepted.
  257. //
  258. // Likewise, if GC_PeerFilterMode is IPRIP_FILTER_INCLUDE, routes will
  259. // be only be accepted if they are from the routers in the peer array.
  260. //----------------------------------------------------------------------------
  261. typedef struct _IPRIP_GLOBAL_CONFIG {
  262. DWORD GC_LoggingLevel;
  263. DWORD GC_MaxRecvQueueSize;
  264. DWORD GC_MaxSendQueueSize;
  265. DWORD GC_MinTriggeredUpdateInterval;
  266. DWORD GC_PeerFilterMode;
  267. DWORD GC_PeerFilterCount;
  268. } IPRIP_GLOBAL_CONFIG, *PIPRIP_GLOBAL_CONFIG;
  269. //----------------------------------------------------------------------------
  270. // struct: IPRIP_IF_STATS
  271. //
  272. // This MIB entry stores per-interface statistics for IPRIP.
  273. //
  274. // This structure is read-only.
  275. //----------------------------------------------------------------------------
  276. typedef struct _IPRIP_IF_STATS {
  277. DWORD IS_State;
  278. DWORD IS_SendFailures;
  279. DWORD IS_ReceiveFailures;
  280. DWORD IS_RequestsSent;
  281. DWORD IS_RequestsReceived;
  282. DWORD IS_ResponsesSent;
  283. DWORD IS_ResponsesReceived;
  284. DWORD IS_BadResponsePacketsReceived;
  285. DWORD IS_BadResponseEntriesReceived;
  286. DWORD IS_TriggeredUpdatesSent;
  287. } IPRIP_IF_STATS, *PIPRIP_IF_STATS;
  288. //----------------------------------------------------------------------------
  289. // struct: IPRIP_IF_CONFIG
  290. //
  291. // This MIB entry describes per-interface configuration.
  292. // All IP address fields must be in network order.
  293. //
  294. // Note:
  295. // The field IC_State is read-only.
  296. // The field IC_AuthenticationKey is write-only.
  297. //
  298. // THIS STRUCTURE IS VARIABLE LENGTH:
  299. //
  300. // after the base structure comes
  301. //
  302. // 1. the table of unicast peers configured for this interface,
  303. // with each entry being a DWORD containing an IP address, where a
  304. // unicast peer is a router to which updates will be unicast;
  305. // if IC_UnicastPeerMode is IPRIP_PEER_ONLY, RIP packets will only
  306. // be sent to these peers; if IC_UnicastPeerMode is IPRIP_PEER_ALSO,
  307. // RIP packets will be sent to these peers as well as being sent
  308. // via broadcast/multicast.
  309. //
  310. // 2. the table of filters used to filter routes before accepting them,
  311. // with each entry being of type IPRIP_ROUTE_FILTER.
  312. // The use of these depends on the rule in IC_AcceptFilterMode. Thus
  313. // if IC_AcceptFilterMode is IPRIP_FILTER_INCLUDE, these filters specify
  314. // which routes to include, and all other routes are excluded.
  315. //
  316. // 3. the table of filters used to filter routes before announcing them,
  317. // with each entry being of type IPRIP_ROUTE_FILTER;
  318. // The use of these depend on the rule in IC_AnnounceFilterMode. Thus
  319. // if IC_AnnounceFilterMode is IPRIP_FILTER_INCLUDE, these filters
  320. // specify which routes to include, and all other routes are excluded.
  321. //
  322. // IC_UnicastPeerCount, IC_AcceptFilterCount, and IC_AnnounceFilterCount
  323. // give the counts of entries in each of the above tables.
  324. //
  325. // If the interface type is PERMANENT, then routing information will
  326. // be broadcast AND sent by unicast to the routers in the unicast peer table.
  327. // Otherwise, routing information will only be unicast to the routers in the
  328. // unicast peer table.
  329. //----------------------------------------------------------------------------
  330. typedef struct _IPRIP_IF_CONFIG {
  331. DWORD IC_State;
  332. DWORD IC_Metric;
  333. DWORD IC_UpdateMode;
  334. DWORD IC_AcceptMode;
  335. DWORD IC_AnnounceMode;
  336. DWORD IC_ProtocolFlags;
  337. DWORD IC_RouteExpirationInterval;
  338. DWORD IC_RouteRemovalInterval;
  339. DWORD IC_FullUpdateInterval;
  340. DWORD IC_AuthenticationType;
  341. BYTE IC_AuthenticationKey[IPRIP_MAX_AUTHKEY_SIZE];
  342. WORD IC_RouteTag;
  343. DWORD IC_UnicastPeerMode;
  344. DWORD IC_AcceptFilterMode;
  345. DWORD IC_AnnounceFilterMode;
  346. DWORD IC_UnicastPeerCount;
  347. DWORD IC_AcceptFilterCount;
  348. DWORD IC_AnnounceFilterCount;
  349. } IPRIP_IF_CONFIG, *PIPRIP_IF_CONFIG;
  350. //----------------------------------------------------------------------------
  351. // struct: IPRIP_ROUTE_FILTER
  352. //
  353. // This is used for per-interface filters in the structure IPRIP_IF_CONFIG
  354. //
  355. // Each filter describes an instance of the default filter action;
  356. // if the default accept filter action is IPRIP_FILTER_INCLUDE,
  357. // then each of the accept filters in the filter table will be treated
  358. // as an inclusion range. If an interface's default announce filter action is
  359. // IPRIP_FILTER_EXCLUDE, then each of that interface's announce filters
  360. // will be treated as an exclusion range.
  361. //
  362. // Both the low and high IP addresses must be in network order.
  363. //----------------------------------------------------------------------------
  364. typedef struct _IPRIP_ROUTE_FILTER {
  365. DWORD RF_LoAddress;
  366. DWORD RF_HiAddress;
  367. } IPRIP_ROUTE_FILTER, *PIPRIP_ROUTE_FILTER;
  368. //----------------------------------------------------------------------------
  369. // struct: IPRIP_IF_BINDING
  370. //
  371. // This MIB entry contains the table of IP addresses to which each interface
  372. // is bound.
  373. // All IP addresses are in network order.
  374. //
  375. // THIS STRUCTURE IS VARIABLE LENGTH:
  376. //
  377. // The base structure contains of the field IB_AddrCount, which gives
  378. // the number of IP addresses to which the indexed interface is bound.
  379. // The IP addresses themselves follow the base structure, and are given
  380. // as IPRIP_IP_ADDRESS structures.
  381. //
  382. // This MIB entry is read-only.
  383. //----------------------------------------------------------------------------
  384. typedef struct _IPRIP_IF_BINDING {
  385. DWORD IB_State;
  386. DWORD IB_AddrCount;
  387. } IPRIP_IF_BINDING, *PIPRIP_IF_BINDING;
  388. //----------------------------------------------------------------------------
  389. // struct: IPRIP_IP_ADDRESS
  390. //
  391. // This structure is used for storing interface bindings.
  392. // A series of structures of this type follows the IPRIP_IF_BINDING
  393. // structure (described above).
  394. //
  395. // Both fields are IP address fields in network-order.
  396. //----------------------------------------------------------------------------
  397. typedef struct _IPRIP_IP_ADDRESS {
  398. DWORD IA_Address;
  399. DWORD IA_Netmask;
  400. } IPRIP_IP_ADDRESS, *PIPRIP_IP_ADDRESS;
  401. //----------------------------------------------------------------------------
  402. // struct: IPRIP_PEER_STATS
  403. //
  404. // This MIB entry describes statistics kept about neighboring routers.
  405. // All IP addresses are in network order.
  406. //
  407. // This structure is read-only.
  408. //----------------------------------------------------------------------------
  409. typedef struct _IPRIP_PEER_STATS {
  410. DWORD PS_LastPeerRouteTag;
  411. DWORD PS_LastPeerUpdateTickCount;
  412. DWORD PS_LastPeerUpdateVersion;
  413. DWORD PS_BadResponsePacketsFromPeer;
  414. DWORD PS_BadResponseEntriesFromPeer;
  415. } IPRIP_PEER_STATS, *PIPRIP_PEER_STATS;
  416. //----------------------------------------------------------------------------
  417. // struct: IPRIP_MIB_SET_INPUT_DATA
  418. //
  419. // This is passed as input data for MibSet.
  420. // Note that only global config and interface config can be set.
  421. //----------------------------------------------------------------------------
  422. typedef struct _IPRIP_MIB_SET_INPUT_DATA {
  423. DWORD IMSID_TypeID;
  424. DWORD IMSID_IfIndex;
  425. DWORD IMSID_BufferSize;
  426. BYTE IMSID_Buffer[1];
  427. } IPRIP_MIB_SET_INPUT_DATA, *PIPRIP_MIB_SET_INPUT_DATA;
  428. //----------------------------------------------------------------------------
  429. // struct: IPRIP_MIB_GET_INPUT_DATA
  430. //
  431. // This is passed as input data for MibGet, MibGetFirst, MibGetNext.
  432. // All tables are readable.
  433. // These and all other IP addresses must be in network order.
  434. //----------------------------------------------------------------------------
  435. typedef struct _IPRIP_MIB_GET_INPUT_DATA {
  436. DWORD IMGID_TypeID;
  437. union {
  438. DWORD IMGID_IfIndex;
  439. DWORD IMGID_PeerAddress;
  440. };
  441. } IPRIP_MIB_GET_INPUT_DATA, *PIPRIP_MIB_GET_INPUT_DATA;
  442. //----------------------------------------------------------------------------
  443. // struct: IPRIP_MIB_GET_OUTPUT_DATA
  444. //
  445. // This is written into the output data by MibGet, MibGetFirst, MibGetNext.
  446. // Note that at the end of a table MibGetNext wraps to the next table,
  447. // and therefore the value IMGOD_TypeID should be examined to see the
  448. // type of the data returned in the output buffer.
  449. //----------------------------------------------------------------------------
  450. typedef struct _IPRIP_MIB_GET_OUTPUT_DATA {
  451. DWORD IMGOD_TypeID;
  452. union {
  453. DWORD IMGOD_IfIndex;
  454. DWORD IMGOD_PeerAddress;
  455. };
  456. BYTE IMGOD_Buffer[1];
  457. } IPRIP_MIB_GET_OUTPUT_DATA, *PIPRIP_MIB_GET_OUTPUT_DATA;
  458. #endif // _IPRIPRM_H_