/*++ Copyright (c) 1995 Microsoft Corporation Module Name: ripint.h Abstract: This module contains the definitions of the internal control structures used by the rip protocol module Author: Stefan Solomon 06/22/1995 Revision History: --*/ #ifndef _RIPINT_ #define _RIPINT_ // //*** RIP Internal Structures *** // // internal filter control block typedef struct _RIP_ROUTE_FILTER_INFO_I { ULONG Network; ULONG Mask; } RIP_ROUTE_FILTER_INFO_I, *PRIP_ROUTE_FILTER_INFO_I; typedef struct _RIP_IF_FILTERS_I { BOOL SupplyFilterAction; // TRUE - Pass, FALSE - Don't Pass ULONG SupplyFilterCount; BOOL ListenFilterAction; // TRUE - Pass, FALSE - Don't Pass ULONG ListenFilterCount; RIP_ROUTE_FILTER_INFO_I RouteFilterI[1]; } RIP_IF_FILTERS_I, *PRIP_IF_FILTERS_I; // Interface Control Block typedef struct _ICB { ULONG InterfaceIndex; LIST_ENTRY IfListLinkage; // linkage in if list ordered by Index LIST_ENTRY IfHtLinkage; // linkage in if hash table LIST_ENTRY AdapterHtLinkage; // linkage in adapter hash table RIP_IF_INFO IfConfigInfo; // config info RIP_IF_STATS IfStats; // statistics ULONG RefCount; // reference counter IPX_ADAPTER_BINDING_INFO AdapterBindingInfo; CRITICAL_SECTION InterfaceLock; BOOL Discarded; // if the if CB is queued on discarded list LIST_ENTRY ChangesBcastQueue; // queue of bcast work items (packets) to be sent LIST_ENTRY AuxLinkage; // auxiliary linkage in temp queues USHORT LinkTickCount; // tick count equiv. of link speed ULONG IpxIfAdminState; // admin state of the IPX interface NET_INTERFACE_TYPE InterfaceType; UCHAR RemoteWkstaInternalNet[4]; // internal net of the remote client PRIP_IF_FILTERS_I RipIfFiltersIp; // pointer to the if filters block WCHAR InterfaceName[1]; } ICB, *PICB; // Work Item typedef enum _WORK_ITEM_TYPE { PERIODIC_BCAST_PACKET_TYPE, GEN_RESPONSE_PACKET_TYPE, CHANGE_BCAST_PACKET_TYPE, UPDATE_STATUS_CHECK_TYPE, PERIODIC_GEN_REQUEST_TYPE, // if you change the order/number of work items above this line you // must change also the WorkItemHandler table RECEIVE_PACKET_TYPE, SEND_PACKET_TYPE, START_CHANGES_BCAST_TYPE, SHUTDOWN_INTERFACES_TYPE, DEBUG_TYPE } WORK_ITEM_TYPE; typedef struct _ENUM_ROUTES_SPECIFIC { HANDLE RtmEnumerationHandle; } ENUM_ROUTES_SPECIFIC, *PENUM_ROUTES_SPECIFIC; typedef struct _UPDATE_SPECIFIC { ULONG UpdatedRoutesCount; ULONG UpdateRetriesCount; ULONG OldRipListen; // saved Listen state when updating routes ULONG OldRipInterval; // saved update interval when updating routes } UPDATE_SPECIFIC, *PUPDATE_SPECIFIC; typedef struct _SHUTDOWN_INTERFACES_SPECIFIC { ULONG ShutdownState; } SHUTDOWN_INTERFACES_SPECIFIC, *PSHUTDOWN_INTERFACES_SPECIFIC; typedef struct _DEBUG_SPECIFIC { ULONG DebugData; } DEBUG_SPECIFIC, *PDEBUG_SPECIFIC; // shutdown states definitions #define SHUTDOWN_START 0 #define SHUTDOWN_STATUS_CHECK 1 typedef union _WORK_ITEM_SPECIFIC { ENUM_ROUTES_SPECIFIC WIS_EnumRoutes; UPDATE_SPECIFIC WIS_Update; SHUTDOWN_INTERFACES_SPECIFIC WIS_ShutdownInterfaces; DEBUG_SPECIFIC WIS_Debug; } WORK_ITEM_SPECIFIC, *PWORK_ITEM_SPECIFIC; typedef struct _WORK_ITEM { LIST_ENTRY Linkage; // linkage in the worker's work queue WORK_ITEM_TYPE Type; // work item type DWORD TimeStamp; // used by the send complete to stamp for interpacket gap calc. DWORD DueTime; // use for timer queue PICB icbp; // ptr to the referenced if CB ULONG AdapterIndex; DWORD IoCompletionStatus; WORK_ITEM_SPECIFIC WorkItemSpecific; OVERLAPPED Overlapped; ADDRESS_RESERVED AddressReserved; UCHAR Packet[1]; } WORK_ITEM, *PWORK_ITEM; // event and message queued for the router manager typedef struct _RIP_MESSAGE { LIST_ENTRY Linkage; ROUTING_PROTOCOL_EVENTS Event; MESSAGE Result; } RIP_MESSAGE, *PRIP_MESSAGE; // //*** Constants *** // // Worker Thread Wait Objects Indices #define TIMER_EVENT 0 #define REPOST_RCV_PACKETS_EVENT 1 //#define WORKERS_QUEUE_EVENT 2 #define RTM_EVENT 2 #define RIP_CHANGES_EVENT 3 #define TERMINATE_WORKER_EVENT 4 #define MAX_WORKER_THREAD_OBJECTS 5 // invalid (unbound) adapter #define INVALID_ADAPTER_INDEX 0xFFFFFFFF // size of interfaces and adapter hash tables #define IF_INDEX_HASH_TABLE_SIZE 32 #define ADAPTER_INDEX_HASH_TABLE_SIZE 32 // RIP packet length values #define FULL_PACKET RIP_PACKET_LEN #define EMPTY_PACKET RIP_INFO // Time interval to check and broadcast changes (in milisec) #define CHANGES_BCAST_TIME 1000 // //*** Macros *** #define ACQUIRE_DATABASE_LOCK EnterCriticalSection(&DbaseCritSec) #define RELEASE_DATABASE_LOCK LeaveCriticalSection(&DbaseCritSec) #define ACQUIRE_QUEUES_LOCK EnterCriticalSection(&QueuesCritSec) #define RELEASE_QUEUES_LOCK LeaveCriticalSection(&QueuesCritSec) #define ACQUIRE_RIP_CHANGED_LIST_LOCK EnterCriticalSection(&RipChangedListCritSec) #define RELEASE_RIP_CHANGED_LIST_LOCK LeaveCriticalSection(&RipChangedListCritSec) #define ACQUIRE_IF_LOCK(icbp) EnterCriticalSection(&(icbp)->InterfaceLock) #define RELEASE_IF_LOCK(icbp) LeaveCriticalSection(&(icbp)->InterfaceLock) // macro to assess if time1 is later then time2 when both are ulong with wrap around #define IsLater(time1, time2) (((time1) - (time2)) < MAXULONG/2) // enqueue a work item in timer queue and increment the interface ref count #define IfRefStartWiTimer(wip, delay) (wip)->icbp->RefCount++;\ StartWiTimer((wip), (delay)); // Update Time and Route Time To Live definitions #define PERIODIC_UPDATE_INTERVAL_SECS(icbp) (icbp)->IfConfigInfo.PeriodicUpdateInterval // in seconds #define PERIODIC_UPDATE_INTERVAL_MILISECS(icbp) (PERIODIC_UPDATE_INTERVAL_SECS(icbp)) * 1000 #define AGE_INTERVAL_MULTIPLIER(icbp) (icbp)->IfConfigInfo.AgeIntervalMultiplier #define ROUTE_TIME_TO_LIVE_SECS(icbp) (AGE_INTERVAL_MULTIPLIER(icbp)) * (PERIODIC_UPDATE_INTERVAL_SECS(icbp)) #define CHECK_UPDATE_TIME_MILISECS (CheckUpdateTime*1000) // //*** Global Variables *** // extern CRITICAL_SECTION DbaseCritSec; extern CRITICAL_SECTION QueuesCritSec; extern CRITICAL_SECTION RipChangedListCritSec; extern ULONG RipOperState; extern LIST_ENTRY IndexIfList; extern LIST_ENTRY IfIndexHt[IF_INDEX_HASH_TABLE_SIZE]; extern LIST_ENTRY AdapterIndexHt[ADAPTER_INDEX_HASH_TABLE_SIZE]; extern LIST_ENTRY DiscardedIfList; extern CRITICAL_SECTION QueuesCritSec; extern ULONG RcvPostedCount; extern LIST_ENTRY RepostRcvPacketsQueue; extern LIST_ENTRY RipMessageQueue; extern HANDLE WorkerThreadObjects[MAX_WORKER_THREAD_OBJECTS]; //extern LIST_ENTRY WorkersQueue; extern LIST_ENTRY TimerQueue; extern BOOL DestroyStartChangesBcastWi; extern ULONG WorkItemsCount; extern ULONG TimerTimeout; extern ULONG RipOperState; extern UCHAR bcastnet[4]; extern UCHAR bcastnode[6]; extern ULONG RcvPostedCount; extern ULONG SendPostedCount; extern UCHAR nullnet[4]; extern HANDLE RipSocketHandle; extern HANDLE IoCompletionPortHandle; extern ULONG RipFiltersCount; extern ULONG SendGenReqOnWkstaDialLinks; extern ULONG CheckUpdateTime; #endif