|
|
//depot/private/homenet/net/published/inc/routprot.w#2 - integrate change 4116 (text) /*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
routprot.h
Abstract: Include file for Routing Protocol inteface to Router Managers
--*/
#ifndef _ROUTPROT_H_ #define _ROUTPROT_H_
#if _MSC_VER > 1000 #pragma once #endif
#include "stm.h"
#if _MSC_VER >= 1200 #pragma warning(push) #endif #pragma warning(disable:4201) #pragma warning(disable:4200)
#ifdef __cplusplus extern "C" { #endif
////////////////////////////////////////////////////////////////////////////// // // // Supported functionality flags // // // // ROUTING Imports Routing Table Manager APIs // // SERVICES Exports Service Table Manager APIs // // DEMAND_UPDATE_ROUTES IP and IPX RIP support for Autostatic // // DEMAND_UPDATE_SERVICES IPX SAP, NLSP support for Autostatic // // ADD_ALL_INTERFACES Adds all interfaces, even if no info is present // // MULTICAST Supports multicast // // POWER Power Manageable // // // //////////////////////////////////////////////////////////////////////////////
#define RF_ROUTING 0x00000001 #define RF_DEMAND_UPDATE_ROUTES 0x00000004 #define RF_ADD_ALL_INTERFACES 0x00000010 #define RF_MULTICAST 0x00000020 #define RF_POWER 0x00000040
#if MPR50 #define MS_ROUTER_VERSION 0x00000500 #else #error Router version not defined #endif
typedef enum _ROUTING_PROTOCOL_EVENTS { ROUTER_STOPPED, // Result is empty SAVE_GLOBAL_CONFIG_INFO, // Result is empty SAVE_INTERFACE_CONFIG_INFO, // Result is interface index // for which config info is to be saved. UPDATE_COMPLETE, // Result is UPDATE_COMPLETE_MESSAGE structure }ROUTING_PROTOCOL_EVENTS;
typedef enum _NET_INTERFACE_TYPE { PERMANENT, DEMAND_DIAL, LOCAL_WORKSTATION_DIAL, REMOTE_WORKSTATION_DIAL } NET_INTERFACE_TYPE;
// // Interface Receive Types //
#define IR_PROMISCUOUS 0 #define IR_PROMISCUOUS_MULTICAST 1
typedef struct _SUPPORT_FUNCTIONS { union { ULONGLONG _Align8;
struct { DWORD dwVersion; DWORD dwReserved; }; };
// // Function called by routing protocol to initiate demand dial connection //
OUT DWORD (WINAPI *DemandDialRequest)( IN DWORD ProtocolId, IN DWORD InterfaceIndex ) ;
// // Can be called to set the interface's receive capability // See IR_Xxx values above //
OUT DWORD (WINAPI *SetInterfaceReceiveType)( IN DWORD ProtocolId, IN DWORD InterfaceIndex, IN DWORD InterfaceReceiveType, IN BOOL bActivate );
// // Must be called by every protocol to set the route preference // and perform other validation //
OUT DWORD (WINAPI *ValidateRoute)( IN DWORD ProtocolId, IN PVOID RouteInfo, IN PVOID DestAddress OPTIONAL );
// // The following entrypoints are provided as a way for getting // information that spans components //
OUT DWORD (WINAPI *MIBEntryCreate)( IN DWORD dwRoutingPid, IN DWORD dwEntrySize, IN LPVOID lpEntry );
OUT DWORD (WINAPI *MIBEntryDelete)( IN DWORD dwRoutingPid, IN DWORD dwEntrySize, IN LPVOID lpEntry );
OUT DWORD (WINAPI *MIBEntrySet)( IN DWORD dwRoutingPid, IN DWORD dwEntrySize, IN LPVOID lpEntry );
OUT DWORD (WINAPI *MIBEntryGet)( IN DWORD dwRoutingPid, IN DWORD dwInEntrySize, IN LPVOID lpInEntry, IN OUT LPDWORD lpOutEntrySize, OUT LPVOID lpOutEntry );
OUT DWORD (WINAPI *MIBEntryGetFirst)( IN DWORD dwRoutingPid, IN DWORD dwInEntrySize, IN LPVOID lpInEntry, IN OUT LPDWORD lpOutEntrySize, OUT LPVOID lpOutEntry );
OUT DWORD (WINAPI *MIBEntryGetNext)( IN DWORD dwRoutingPid, IN DWORD dwInEntrySize, IN LPVOID lpInEntry, IN OUT LPDWORD lpOutEntrySize, OUT LPVOID lpOutEntry );
// // Can be called to get the router ID value //
OUT DWORD (WINAPI *GetRouterId)(VOID);
OUT BOOL (WINAPI *HasMulticastBoundary)( IN DWORD dwIfIndex, IN DWORD dwGroupAddress );
} SUPPORT_FUNCTIONS, *PSUPPORT_FUNCTIONS ;
////////////////////////////////////////////////////////////////////////////// // // // All IP Protocols must use the protocol ids defined in the range below. // // Protocols not identified below can use any unassigned number BELOW // // 0xffff0000 // // // // NOTE: These numbers have been chosen to coincide with MIB-II protocol // // numbers. Allocation should not be arbitrary. // // // //////////////////////////////////////////////////////////////////////////////
#define PROTO_IP_OTHER 1 #define PROTO_IP_LOCAL 2 #define PROTO_IP_NETMGMT 3 #define PROTO_IP_ICMP 4 #define PROTO_IP_EGP 5 #define PROTO_IP_GGP 6 #define PROTO_IP_HELLO 7 #define PROTO_IP_RIP 8 #define PROTO_IP_IS_IS 9 #define PROTO_IP_ES_IS 10 #define PROTO_IP_CISCO 11 #define PROTO_IP_BBN 12 #define PROTO_IP_OSPF 13 #define PROTO_IP_BGP 14
// // The multicast protocol IDs //
#define PROTO_IP_MSDP 9 #define PROTO_IP_IGMP 10 #define PROTO_IP_BGMP 11
// // The IPRTRMGR_PID is 10000 // 0x00002710 //
#define PROTO_IP_VRRP 112 #define PROTO_IP_BOOTP 9999 // 0x0000270F #define PROTO_IP_NT_AUTOSTATIC 10002 // 0x00002712 #define PROTO_IP_DNS_PROXY 10003 // 0x00002713 #define PROTO_IP_DHCP_ALLOCATOR 10004 // 0x00002714 #define PROTO_IP_NAT 10005 // 0x00002715 #define PROTO_IP_NT_STATIC 10006 // 0x00002716 #define PROTO_IP_NT_STATIC_NON_DOD 10007 // 0x00002717 #define PROTO_IP_DIFFSERV 10008 // 0x00002718 #define PROTO_IP_MGM 10009 // 0x00002719
#define PROTO_IP_H323 10011 // 0x0000271B #define PROTO_IP_FTP 10012 // 0x0000271C #define PROTO_IP_ALG 10013 // 0x0000271D
// // For all future development, the following macro must be used to generate // Ids //
// // Type - 2 bits // Vendor - 14 bits // ProtocolId - 16 bits //
#define PROTOCOL_ID(Type, VendorId, ProtocolId) \ (((Type & 0x03)<<30)|((VendorId & 0x3FFF)<<16)|(ProtocolId & 0xFFFF))
// // |----|----|----|----|----|----|----|----| // Ty*** Vendor Id *** StandardProtocolId //
#define TYPE_FROM_PROTO_ID(X) (((X) >> 30) & 0x03) #define VENDOR_FROM_PROTO_ID(X) (((X) >> 16) & 0x3FFF) #define PROTO_FROM_PROTO_ID(X) ((X) & 0xFFFF)
// // Types MS0 and MS1 are Microsoft Reserved // A protocol that supports both unicast and multicast should use type // MCAST //
#define PROTO_TYPE_UCAST 0 #define PROTO_TYPE_MCAST 1 #define PROTO_TYPE_MS0 2 #define PROTO_TYPE_MS1 3
#define PROTO_VENDOR_MS0 0x0000 #define PROTO_VENDOR_MS1 0x137 // 311 #define PROTO_VENDOR_MS2 0x3FFF
#define MS_IP_BOOTP \ PROTOCOL_ID(PROTO_TYPE_UCAST, PROTO_VENDOR_MS0, PROTO_IP_BOOTP)
#define MS_IP_RIP \ PROTOCOL_ID(PROTO_TYPE_UCAST, PROTO_VENDOR_MS0, PROTO_IP_RIP)
#define MS_IP_OSPF \ PROTOCOL_ID(PROTO_TYPE_UCAST, PROTO_VENDOR_MS0, PROTO_IP_OSPF)
#define MS_IP_BGP \ PROTOCOL_ID(PROTO_TYPE_UCAST, PROTO_VENDOR_MS1, PROTO_IP_BGP)
#define MS_IP_IGMP \ PROTOCOL_ID(PROTO_TYPE_MCAST, PROTO_VENDOR_MS1, PROTO_IP_IGMP)
#define MS_IP_BGMP \ PROTOCOL_ID(PROTO_TYPE_MCAST, PROTO_VENDOR_MS1, PROTO_IP_BGMP)
#define MS_IP_MSDP \ PROTOCOL_ID(PROTO_TYPE_MCAST, PROTO_VENDOR_MS1, PROTO_IP_MSDP)
#define MS_IP_DNS_PROXY \ PROTOCOL_ID(PROTO_TYPE_MS0, PROTO_VENDOR_MS1, PROTO_IP_DNS_PROXY)
#define MS_IP_DHCP_ALLOCATOR \ PROTOCOL_ID(PROTO_TYPE_MS0, PROTO_VENDOR_MS1, PROTO_IP_DHCP_ALLOCATOR)
#define MS_IP_NAT \ PROTOCOL_ID(PROTO_TYPE_MS0, PROTO_VENDOR_MS1, PROTO_IP_NAT)
#define MS_IP_DIFFSERV \ PROTOCOL_ID(PROTO_TYPE_MS0, PROTO_VENDOR_MS1, PROTO_IP_DIFFSERV)
#define MS_IP_MGM \ PROTOCOL_ID(PROTO_TYPE_MS0, PROTO_VENDOR_MS1, PROTO_IP_MGM)
#define MS_IP_VRRP \ PROTOCOL_ID(PROTO_TYPE_MS0, PROTO_VENDOR_MS1, PROTO_IP_VRRP)
#define MS_IP_H323 \ PROTOCOL_ID(PROTO_TYPE_MS0, PROTO_VENDOR_MS1, PROTO_IP_H323)
#define MS_IP_FTP \ PROTOCOL_ID(PROTO_TYPE_MS0, PROTO_VENDOR_MS1, PROTO_IP_FTP)
#define MS_IP_ALG \ PROTOCOL_ID(PROTO_TYPE_MS0, PROTO_VENDOR_MS1, PROTO_IP_ALG)
// // All IPX Protocols must use the protocol ids defined in the range below. // Protocols not identified below can use any unassigned number greater than // IPX_PROTOCOL_BASE. //
#define IPX_PROTOCOL_BASE 0x0001ffff #define IPX_PROTOCOL_RIP IPX_PROTOCOL_BASE + 1 #define IPX_PROTOCOL_SAP IPX_PROTOCOL_BASE + 2 #define IPX_PROTOCOL_NLSP IPX_PROTOCOL_BASE + 3
typedef struct _UPDATE_COMPLETE_MESSAGE { ULONG InterfaceIndex; ULONG UpdateType; // DEMAND_UPDATE_ROUTES, DEMAND_UPDATE_SERVICES ULONG UpdateStatus; // NO_ERROR if successfull
} UPDATE_COMPLETE_MESSAGE, *PUPDATE_COMPLETE_MESSAGE;
// // Message returned in Result parameter to GET_EVENT_MESSAGE api call. // UpdateCompleteMessage returned for UPDATE_COMPLETE message // InterfaceIndex returned for SAVE_INTERFACE_CONFIG_INFO message //
typedef union _MESSAGE { UPDATE_COMPLETE_MESSAGE UpdateCompleteMessage; DWORD InterfaceIndex;
} MESSAGE, *PMESSAGE;
// // Routing Interface Status types //
#define RIS_INTERFACE_ADDRESS_CHANGE 0 #define RIS_INTERFACE_ENABLED 1 #define RIS_INTERFACE_DISABLED 2 #define RIS_INTERFACE_MEDIA_PRESENT 3 #define RIS_INTERFACE_MEDIA_ABSENT 4
// // IPX Adapter Binding Info //
typedef struct IPX_ADAPTER_BINDING_INFO { ULONG AdapterIndex; UCHAR Network[4]; UCHAR LocalNode[6]; UCHAR RemoteNode[6]; ULONG MaxPacketSize; ULONG LinkSpeed;
}IPX_ADAPTER_BINDING_INFO, *PIPX_ADAPTER_BINDING_INFO;
// // IP Adapter Binding Info // This is the information associated with an ADDRESS_ARRIVAL event // An address arrival may have AddressCount == 0, this implies a unnumbered // interface //
typedef struct IP_LOCAL_BINDING { DWORD Address; DWORD Mask; }IP_LOCAL_BINDING, *PIP_LOCAL_BINDING;
typedef struct IP_ADAPTER_BINDING_INFO { ULONG AddressCount; DWORD RemoteAddress; ULONG Mtu; ULONGLONG Speed; IP_LOCAL_BINDING Address[0]; }IP_ADAPTER_BINDING_INFO, *PIP_ADAPTER_BINDING_INFO;
#define SIZEOF_IP_BINDING(X) \ (FIELD_OFFSET(IP_ADAPTER_BINDING_INFO,Address[0]) + \ ((X) * sizeof(IP_LOCAL_BINDING)))
typedef DWORD (WINAPI * PSTART_PROTOCOL) ( IN HANDLE NotificationEvent, IN PSUPPORT_FUNCTIONS SupportFunctions, IN LPVOID GlobalInfo, IN ULONG StructureVersion, IN ULONG StructureSize, IN ULONG StructureCount );
typedef DWORD (WINAPI * PSTART_COMPLETE) ( VOID );
typedef DWORD (WINAPI * PSTOP_PROTOCOL) ( VOID );
typedef DWORD (WINAPI * PADD_INTERFACE) ( IN LPWSTR InterfaceName, IN ULONG InterfaceIndex, IN NET_INTERFACE_TYPE InterfaceType, IN DWORD MediaType, IN WORD AccessType, IN WORD ConnectionType, IN PVOID InterfaceInfo, IN ULONG StructureVersion, IN ULONG StructureSize, IN ULONG StructureCount );
typedef DWORD (WINAPI * PDELETE_INTERFACE) ( IN ULONG InterfaceIndex );
typedef DWORD (WINAPI * PGET_EVENT_MESSAGE) ( OUT ROUTING_PROTOCOL_EVENTS *Event, OUT MESSAGE *Result );
typedef DWORD (WINAPI * PGET_INTERFACE_INFO) ( IN ULONG InterfaceIndex, IN PVOID InterfaceInfo, IN OUT PULONG BufferSize, OUT PULONG StructureVersion, IN PULONG StructureSize, OUT PULONG StructureCount );
typedef DWORD (WINAPI * PSET_INTERFACE_INFO) ( IN ULONG InterfaceIndex, IN PVOID InterfaceInfo, IN ULONG StructureVersion, IN ULONG StructureSize, IN ULONG StructureCount );
typedef DWORD (WINAPI * PINTERFACE_STATUS) ( IN ULONG InterfaceIndex, IN BOOL InterfaceActive, IN DWORD StatusType, IN PVOID StatusInfo );
typedef DWORD (WINAPI * PQUERY_POWER) ( IN DWORD PowerType );
typedef DWORD (WINAPI * PSET_POWER) ( IN DWORD PowerType );
typedef DWORD (WINAPI * PGET_GLOBAL_INFO) ( IN PVOID GlobalInfo, IN OUT PULONG BufferSize, OUT PULONG StructureVersion, OUT PULONG StructureSize, OUT PULONG StructureCount );
typedef DWORD (WINAPI * PSET_GLOBAL_INFO) ( IN PVOID GlobalInfo, IN ULONG StructureVersion, IN ULONG StructureSize, IN ULONG StructureCount );
typedef DWORD (WINAPI * PDO_UPDATE_ROUTES) ( IN ULONG InterfaceIndex );
typedef DWORD (WINAPI * PMIB_CREATE) ( IN ULONG InputDataSize, IN PVOID InputData );
typedef DWORD (WINAPI * PMIB_DELETE) ( IN ULONG InputDataSize, IN PVOID InputData );
typedef DWORD (WINAPI * PMIB_GET) ( IN ULONG InputDataSize, IN PVOID InputData, OUT PULONG OutputDataSize, OUT PVOID OutputData );
typedef DWORD (WINAPI * PMIB_SET) ( IN ULONG InputDataSize, IN PVOID InputData );
typedef DWORD (WINAPI * PMIB_GET_FIRST) ( IN ULONG InputDataSize, IN PVOID InputData, OUT PULONG OutputDataSize, OUT PVOID OutputData );
typedef DWORD (WINAPI * PMIB_GET_NEXT) ( IN ULONG InputDataSize, IN PVOID InputData, OUT PULONG OutputDataSize, OUT PVOID OutputData );
typedef DWORD (WINAPI * PMIB_SET_TRAP_INFO) ( IN HANDLE Event, IN ULONG InputDataSize, IN PVOID InputData, OUT PULONG OutputDataSize, OUT PVOID OutputData );
typedef DWORD (WINAPI * PMIB_GET_TRAP_INFO) ( IN ULONG InputDataSize, IN PVOID InputData, OUT PULONG OutputDataSize, OUT PVOID OutputData );
typedef DWORD (WINAPI *PCONNECT_CLIENT) ( IN ULONG InterfaceIndex, IN PVOID ClientAddress );
typedef DWORD (WINAPI *PDISCONNECT_CLIENT) ( IN ULONG InterfaceIndex, IN PVOID ClientAddress );
// // InterfaceFlags used with the GetNeighbors() call below //
#define MRINFO_TUNNEL_FLAG 0x01 #define MRINFO_PIM_FLAG 0x04 #define MRINFO_DOWN_FLAG 0x10 #define MRINFO_DISABLED_FLAG 0x20 #define MRINFO_QUERIER_FLAG 0x40 #define MRINFO_LEAF_FLAG 0x80
typedef DWORD (WINAPI *PGET_NEIGHBORS) ( IN DWORD InterfaceIndex, IN PDWORD NeighborList, IN OUT PDWORD NeighborListSize, OUT PBYTE InterfaceFlags );
// // StatusCode values used with the GetMfeStatus() call below. // The protocol should return the highest-valued one that applies. //
#define MFE_NO_ERROR 0 // none of the below events #define MFE_REACHED_CORE 1 // this router is an RP/core for the group
// // StatusCode values set by oif owner only //
#define MFE_OIF_PRUNED 5 // no downstream receivers exist on oif
// // StatusCode values set by iif owner only //
#define MFE_PRUNED_UPSTREAM 4 // a prune was send upstream #define MFE_OLD_ROUTER 11 // upstream nbr doesn't support mtrace
// // StatusCode values which are used only by the Router Manager itself: //
#define MFE_NOT_FORWARDING 2 // not fwding for an unspecified reason #define MFE_WRONG_IF 3 // mtrace received on iif #define MFE_BOUNDARY_REACHED 6 // iif or oif is admin scope boundary #define MFE_NO_MULTICAST 7 // oif is not multicast-enabled #define MFE_IIF 8 // mtrace arrived on iif #define MFE_NO_ROUTE 9 // router has no route that matches #define MFE_NOT_LAST_HOP 10 // router is not the proper last-hop router #define MFE_PROHIBITED 12 // mtrace is administratively prohibited #define MFE_NO_SPACE 13 // not enough room in packet
typedef DWORD (WINAPI *PGET_MFE_STATUS) ( IN DWORD InterfaceIndex, IN DWORD GroupAddress, IN DWORD SourceAddress, OUT PBYTE StatusCode );
////////////////////////////////////////////////////////////////////////////// // // // This is the structure passed between the router manager and a protocol // // upon registration. // // // // IN OUT DWORD dwVersion // // This is filled by the router manager to indicate the version it supports.// // The DLL MUST set this to the version that the protocol will support. // // // // IN DWORD dwProtocolId // // This the protocol the router manager is expecting the DLL to register. // // If the DLL does not support this protocol, it MUST return // // ERROR_NOT_SUPPORTED // // A DLL will be called once for every protocol it supports // // // // IN OUT DWORD fSupportedFunctionality // // These are the flags denoting the functionality the router manager // // supports. The DLL MUST reset this to the functionality that it supports. // // // //////////////////////////////////////////////////////////////////////////////
typedef struct _MPR50_ROUTING_CHARACTERISTICS { DWORD dwVersion; DWORD dwProtocolId; DWORD fSupportedFunctionality;
PSTART_PROTOCOL pfnStartProtocol; PSTART_COMPLETE pfnStartComplete; PSTOP_PROTOCOL pfnStopProtocol; PGET_GLOBAL_INFO pfnGetGlobalInfo; PSET_GLOBAL_INFO pfnSetGlobalInfo; PQUERY_POWER pfnQueryPower; PSET_POWER pfnSetPower;
PADD_INTERFACE pfnAddInterface; PDELETE_INTERFACE pfnDeleteInterface; PINTERFACE_STATUS pfnInterfaceStatus; PGET_INTERFACE_INFO pfnGetInterfaceInfo; PSET_INTERFACE_INFO pfnSetInterfaceInfo;
PGET_EVENT_MESSAGE pfnGetEventMessage;
PDO_UPDATE_ROUTES pfnUpdateRoutes;
PCONNECT_CLIENT pfnConnectClient; PDISCONNECT_CLIENT pfnDisconnectClient;
PGET_NEIGHBORS pfnGetNeighbors; PGET_MFE_STATUS pfnGetMfeStatus;
PMIB_CREATE pfnMibCreateEntry; PMIB_DELETE pfnMibDeleteEntry; PMIB_GET pfnMibGetEntry; PMIB_SET pfnMibSetEntry; PMIB_GET_FIRST pfnMibGetFirstEntry; PMIB_GET_NEXT pfnMibGetNextEntry; PMIB_SET_TRAP_INFO pfnMibSetTrapInfo; PMIB_GET_TRAP_INFO pfnMibGetTrapInfo;
}MPR50_ROUTING_CHARACTERISTICS;
#if MPR50 typedef MPR50_ROUTING_CHARACTERISTICS MPR_ROUTING_CHARACTERISTICS; #endif
typedef MPR_ROUTING_CHARACTERISTICS *PMPR_ROUTING_CHARACTERISTICS;
// // All routing protocols must export the following entry point. // The router manager calls this function to allow the routing // protocol to register //
#define REGISTER_PROTOCOL_ENTRY_POINT RegisterProtocol #define REGISTER_PROTOCOL_ENTRY_POINT_STRING "RegisterProtocol"
typedef DWORD (WINAPI * PREGISTER_PROTOCOL) ( IN OUT PMPR_ROUTING_CHARACTERISTICS pRoutingChar, IN OUT PMPR_SERVICE_CHARACTERISTICS pServiceChar );
#ifdef __cplusplus } #endif
#if _MSC_VER >= 1200 #pragma warning(pop) #else #pragma warning(default:4200) #pragma warning(default:4201) #endif
#endif // _ROUTPROT_H_
|