/*++ Copyright (c) 1997-1998 Microsoft Corporation Module Name: rtmregn.h Abstract: Private defns relating to the registration and de-registration of entities with RTMv2 Author: Chaitanya Kodeboyina (chaitk) 17-Aug-1998 Revision History: --*/ #ifndef __ROUTING_RTMREGN_H__ #define __ROUTING_RTMREGN_H__ // // Forward declarations for various Info Blocks // typedef struct _ADDRFAM_INFO ADDRFAM_INFO; // // Info related to an RTM instance // typedef struct _INSTANCE_INFO { OBJECT_HEADER ObjectHeader; // Signature, Type and Reference Count USHORT RtmInstanceId; // Unique ID for this RTM instance LIST_ENTRY InstTableLE; // Linkage on global table of instances UINT NumAddrFamilies; // Address Family Specific Info Blocks LIST_ENTRY AddrFamilyTable; // on this instance (like IPv4 n IPv6) } INSTANCE_INFO, *PINSTANCE_INFO; // // Info related to an address family in an RTM instance // #define ENTITY_TABLE_SIZE 16 typedef struct _ADDRFAM_INFO { OBJECT_HEADER ObjectHeader; // Signature, Type and Reference Count USHORT AddressFamily; // Address Family for this info block UINT AddressSize; // Address size in this address family PINSTANCE_INFO Instance; // Back pointer to the owning instance LIST_ENTRY AFTableLE; // Linkage on table of AFs on instance RTM_VIEW_SET ViewsSupported; // Views supported by this addr family UINT NumberOfViews; // Num. of views supported by this AF RTM_VIEW_ID ViewIdFromIndex[RTM_MAX_VIEWS]; // View Id -> Its Index in Dest mapping RTM_VIEW_ID ViewIndexFromId[RTM_MAX_VIEWS]; // View Index in Dest -> Its Id mapping UINT MaxHandlesInEnum; // Max. number of handles returned in // any RTMv2 call that returns handles UINT MaxNextHopsInRoute;// Max. number of equal cost next-hops UINT MaxOpaquePtrs; // UINT NumOpaquePtrs; // Directory of opaque info ptr offsets PVOID *OpaquePtrsDir; // UINT NumEntities; // Table of all the registered entities LIST_ENTRY EntityTable[ENTITY_TABLE_SIZE]; LIST_ENTRY DeregdEntities; // Table of all de-registered entities READ_WRITE_LOCK RouteTableLock; // Protects the route table of routes BOOL RoutesLockInited; // Was the above lock initialized ? PVOID RouteTable; // Table of dests and routes on this AF LONG NumDests; // Number of dests in the route table LONG NumRoutes; // Number of routes in the route table // [Use interlocked ops as no locking] HANDLE RouteTimerQueue; // List of route timers being used HANDLE NotifTimerQueue; // List of notification timers used READ_WRITE_LOCK ChangeNotifsLock; // Protects change notification info BOOL NotifsLockInited; // Was the above lock initialized ? UINT MaxChangeNotifs; // UINT NumChangeNotifs; // Directory of change notifications PVOID *ChangeNotifsDir; // DWORD ChangeNotifRegns; // Mask of regd change notifications DWORD CNsForMarkedDests;// Mask of CNs requesing changes on // only destinations marked by them DWORD CNsForView[RTM_MAX_VIEWS]; // CNs interested in a certain view DWORD CNsForChangeType[RTM_NUM_CHANGE_TYPES]; // CNs interested in a change type CRITICAL_SECTION NotifsTimerLock; // Lock the protects ops on CN timer BOOL TimerLockInited; // Was the above lock initialized ? HANDLE ChangeNotifTimer; // Timer used to process changes list LONG NumChangedDests; // Num of destinations on change list // [Use interlocked ops as no locking] struct { LONG ChangesListInUse; // Is this change list in use ? CRITICAL_SECTION ChangesListLock; // Protects list of changed dests BOOL ChangesLockInited; // Was above lock initialized ? SINGLE_LIST_ENTRY ChangedDestsHead; // Head of list of changed dests PSINGLE_LIST_ENTRY ChangedDestsTail; // Pointer to tail of above list } ChangeLists[NUM_CHANGED_DEST_LISTS]; // Multiple chng lists for concurrency } ADDRFAM_INFO, *PADDRFAM_INFO; // // Entity Registration Info Block // typedef struct _ENTITY_INFO { OBJECT_HEADER ObjectHeader; // Signature, Type and Reference Count RTM_ENTITY_ID EntityId; // Entity Proto ID and Instance // that make a unique Entity Id PADDRFAM_INFO OwningAddrFamily; // Back pointer to the owning AF LIST_ENTRY EntityTableLE; // Linkage on AF's table of entities HANDLE BlockingEvent; // Event used to block ops on entity ULONG State; // See ENTITY_STATE_* values below INT OpaquePtrOffset; // Offset of reserved opaque ptr or -1 READ_WRITE_LOCK RouteListsLock; // Protects all route lists of entity BOOL ListsLockInited; // Was the above lock initialized ? CRITICAL_SECTION OpenHandlesLock; // Protects list of enums and notifs BOOL HandlesLockInited;// Was the above lock initialized ? LIST_ENTRY OpenHandles; // List of all enums & change notifs READ_WRITE_LOCK NextHopTableLock; // Protects the next hop table. BOOL NextHopsLockInited;// Was the above lock initialized ? PVOID NextHopTable; // Table of next-hops that all // routes of this entity share ULONG NumNextHops; // Number of next-hops in this table READ_WRITE_LOCK EntityMethodsLock;// Used to block all methods // on owned dests and routes BOOL MethodsLockInited;// Was above lock initialized ? RTM_EVENT_CALLBACK EventCallback; // Entity Register/De-register // event inform callback RTM_ENTITY_EXPORT_METHODS EntityMethods; // Method set exported to get // entity specific information } ENTITY_INFO, *PENTITY_INFO; #define ENTITY_STATE_REGISTERED 0x00000000 #define ENTITY_STATE_DEREGISTERED 0x00000001 // // Common Header for all open blocks // ( pointed to by active handles ) // typedef struct _OPEN_HEADER { OBJECT_HEADER ObjectHeader; // Signature, Type and Reference Count UCHAR HandleType; // Type of handle for this open block #if DBG_HDL LIST_ENTRY HandlesLE; // On list of handles opened by entity #endif } OPEN_HEADER, *POPEN_HEADER; // // Macros for acquiring various locks defined in this file // #define ACQUIRE_ROUTE_TABLE_READ_LOCK(AF) \ ACQUIRE_READ_LOCK(&AF->RouteTableLock) #define RELEASE_ROUTE_TABLE_READ_LOCK(AF) \ RELEASE_READ_LOCK(&AF->RouteTableLock) #define ACQUIRE_ROUTE_TABLE_WRITE_LOCK(AF) \ ACQUIRE_WRITE_LOCK(&AF->RouteTableLock) #define RELEASE_ROUTE_TABLE_WRITE_LOCK(AF) \ RELEASE_WRITE_LOCK(&AF->RouteTableLock) #define ACQUIRE_NOTIFICATIONS_READ_LOCK(AF) \ ACQUIRE_READ_LOCK(&AF->ChangeNotifsLock); #define RELEASE_NOTIFICATIONS_READ_LOCK(AF) \ RELEASE_READ_LOCK(&AF->ChangeNotifsLock); #define ACQUIRE_NOTIFICATIONS_WRITE_LOCK(AF) \ ACQUIRE_WRITE_LOCK(&AF->ChangeNotifsLock); #define RELEASE_NOTIFICATIONS_WRITE_LOCK(AF) \ RELEASE_WRITE_LOCK(&AF->ChangeNotifsLock); #define ACQUIRE_NOTIF_TIMER_LOCK(AF) \ ACQUIRE_LOCK(&AF->NotifsTimerLock) #define RELEASE_NOTIF_TIMER_LOCK(AF) \ RELEASE_LOCK(&AF->NotifsTimerLock) #define ACQUIRE_CHANGED_DESTS_LIST_LOCK(AF, ListN) \ ACQUIRE_LOCK(&AF->ChangeLists[ListN].ChangesListLock) #define RELEASE_CHANGED_DESTS_LIST_LOCK(AF, ListN) \ RELEASE_LOCK(&AF->ChangeLists[ListN].ChangesListLock) #define ACQUIRE_ROUTE_LISTS_READ_LOCK(Entity) \ ACQUIRE_READ_LOCK(&Entity->RouteListsLock) #define RELEASE_ROUTE_LISTS_READ_LOCK(Entity) \ RELEASE_READ_LOCK(&Entity->RouteListsLock) #define ACQUIRE_ROUTE_LISTS_WRITE_LOCK(Entity) \ ACQUIRE_WRITE_LOCK(&Entity->RouteListsLock) #define RELEASE_ROUTE_LISTS_WRITE_LOCK(Entity) \ RELEASE_WRITE_LOCK(&Entity->RouteListsLock) #define ACQUIRE_OPEN_HANDLES_LOCK(Entity) \ ACQUIRE_LOCK(&Entity->OpenHandlesLock) #define RELEASE_OPEN_HANDLES_LOCK(Entity) \ RELEASE_LOCK(&Entity->OpenHandlesLock) #define ACQUIRE_NHOP_TABLE_READ_LOCK(Entity) \ ACQUIRE_READ_LOCK(&Entity->NextHopTableLock) #define RELEASE_NHOP_TABLE_READ_LOCK(Entity) \ RELEASE_READ_LOCK(&Entity->NextHopTableLock) #define ACQUIRE_NHOP_TABLE_WRITE_LOCK(Entity) \ ACQUIRE_WRITE_LOCK(&Entity->NextHopTableLock) #define RELEASE_NHOP_TABLE_WRITE_LOCK(Entity) \ RELEASE_WRITE_LOCK(&Entity->NextHopTableLock) #define ACQUIRE_ENTITY_METHODS_READ_LOCK(Entity) \ ACQUIRE_READ_LOCK(&Entity->NextHopTableLock) #define RELEASE_ENTITY_METHODS_READ_LOCK(Entity) \ RELEASE_READ_LOCK(&Entity->NextHopTableLock) #define ACQUIRE_ENTITY_METHODS_WRITE_LOCK(Entity) \ ACQUIRE_WRITE_LOCK(&Entity->NextHopTableLock) #define RELEASE_ENTITY_METHODS_WRITE_LOCK(Entity) \ RELEASE_WRITE_LOCK(&Entity->NextHopTableLock) // // Registration Helper Functions // DWORD CreateInstance ( IN USHORT InstanceId, OUT PINSTANCE_INFO *NewInstance ); DWORD GetInstance ( IN USHORT RtmInstanceId, IN BOOL ImplicitCreate, OUT PINSTANCE_INFO *RtmInstance ); DWORD DestroyInstance ( IN PINSTANCE_INFO Instance ); DWORD CreateAddressFamily ( IN PINSTANCE_INFO Instance, IN USHORT AddressFamily, OUT PADDRFAM_INFO *NewAddrFamilyInfo ); DWORD GetAddressFamily ( IN PINSTANCE_INFO Instance, IN USHORT AddressFamily, IN BOOL ImplicitCreate, OUT PADDRFAM_INFO *AddrFamilyInfo ); DWORD DestroyAddressFamily ( IN PADDRFAM_INFO AddrFamilyInfo ); DWORD CreateEntity ( IN PADDRFAM_INFO AddressFamily, IN PRTM_ENTITY_INFO EntityInfo, IN BOOL ReserveOpaquePtr, IN PRTM_ENTITY_EXPORT_METHODS ExportMethods, IN RTM_EVENT_CALLBACK EventCallback, OUT PENTITY_INFO *NewEntity ); DWORD GetEntity ( IN PADDRFAM_INFO AddrFamilyInfo, IN ULONGLONG EntityId, IN BOOL ImplicitCreate, IN PRTM_ENTITY_INFO RtmEntityInfo OPTIONAL, IN BOOL ReserveOpaquePtr OPTIONAL, IN PRTM_ENTITY_EXPORT_METHODS ExportMethods OPTIONAL, IN RTM_EVENT_CALLBACK EventCallback OPTIONAL, OUT PENTITY_INFO *EntityInfo ); DWORD DestroyEntity ( IN PENTITY_INFO Entity ); VOID InformEntitiesOfEvent ( IN PLIST_ENTRY EntityTable, IN RTM_EVENT_TYPE EventType, IN PENTITY_INFO EntityThis ); VOID CleanupAfterDeregister ( IN PENTITY_INFO Entity ); #endif //__ROUTING_RTMREGN_H__