/********************************************************************/ /** Copyright(c) 1995 Microsoft Corporation. **/ /********************************************************************/ //*** // // Filename: ddm.h // // Description: This module contains the definitions for Demand Dial Manager // component. // // History: May 11,1995 NarenG Created original version. // #ifndef _DDM_ #define _DDM_ #include #include // For ASSERT #include // needed for winbase.h #include // Win32 base API's #include #include #include // For HRASCONN #include // For HPORT #include // For PPP_INTERFACE_INFO #include #include #include #include #include #include #include #include #include #include #include // For PPP_PROJECTION_INFO #include #include #include // RASSECURITYPROC #include #include typedef DWORD (*ALLOCATEANDGETIFTABLEFROMSTACK)( OUT MIB_IFTABLE **ppIfTable, IN BOOL bOrder, IN HANDLE hHeap, IN DWORD dwFlags, IN BOOL bForceUpdate ); typedef DWORD (*ALLOCATEANDGETIPADDRTABLEFROMSTACK)( OUT MIB_IPADDRTABLE **ppIpAddrTable, IN BOOL bOrder, IN HANDLE hHeap, IN DWORD dwFlags ); // // Macros for DDM // #define DDMLogError( LogId, NumStrings, lpwsSubStringArray, dwRetCode ) \ if ( gblDDMConfigInfo.dwLoggingLevel > 0 ) { \ RouterLogError( gblDDMConfigInfo.hLogEvents, LogId, \ NumStrings, lpwsSubStringArray, dwRetCode ); } #define DDMLogWarning( LogId, NumStrings, lpwsSubStringArray ) \ if ( gblDDMConfigInfo.dwLoggingLevel > 1 ) { \ RouterLogWarning( gblDDMConfigInfo.hLogEvents, LogId, \ NumStrings, lpwsSubStringArray, 0 ); } #define DDMLogInformation( LogId, NumStrings, lpwsSubStringArray ) \ if ( gblDDMConfigInfo.dwLoggingLevel > 2 ) { \ RouterLogInformation( gblDDMConfigInfo.hLogEvents, \ LogId, NumStrings, lpwsSubStringArray, 0 ); } #define DDMLogErrorString(LogId,NumStrings,lpwsSubStringArray,dwRetCode, \ dwPos ) \ if ( gblDDMConfigInfo.dwLoggingLevel > 0 ) { \ RouterLogErrorString( gblDDMConfigInfo.hLogEvents, LogId, \ NumStrings, lpwsSubStringArray, dwRetCode, \ dwPos ); } #define DDMLogWarningString( LogId,NumStrings,lpwsSubStringArray,dwRetCode, \ dwPos ) \ if ( gblDDMConfigInfo.dwLoggingLevel > 1 ) { \ RouterLogWarningString( gblDDMConfigInfo.hLogEvents, LogId, \ NumStrings, lpwsSubStringArray, dwRetCode, \ dwPos ); } #define DDMLogInformationString( LogId, NumStrings, lpwsSubStringArray, \ dwRetCode, dwPos ) \ if ( gblDDMConfigInfo.dwLoggingLevel > 2 ) { \ RouterLogInformationString( gblDDMConfigInfo.hLogEvents, LogId, \ NumStrings, lpwsSubStringArray, \ dwRetCode,dwPos ); } #define DDM_PRINT TracePrintfExA #define DDMTRACE(a) \ TracePrintfExA(gblDDMConfigInfo.dwTraceId, TRACE_FSM, a ) #define DDMTRACE1(a,b) \ TracePrintfExA(gblDDMConfigInfo.dwTraceId, TRACE_FSM, a,b ) #define DDMTRACE2(a,b,c) \ TracePrintfExA(gblDDMConfigInfo.dwTraceId, TRACE_FSM, a,b,c ) #define DDMTRACE3(a,b,c,d) \ TracePrintfExA(gblDDMConfigInfo.dwTraceId, TRACE_FSM, a,b,c,d ) #define DDMTRACE4(a,b,c,d,e) \ TracePrintfExA(gblDDMConfigInfo.dwTraceId, TRACE_FSM, a,b,c,d,e) #define DDMTRACE5(a,b,c,d,e,f) \ TracePrintfExA(gblDDMConfigInfo.dwTraceId, TRACE_FSM, a,b,c,d,e,f ) // // Constant defines for DDM // #define MAX_PROTOCOLS 2 // IP, IPX #define HW_FAILURE_WAIT_TIME 10 // Waiting time (sec) before reposting // listen #define INIT_GATEWAY_TIMEOUT 10000 //Gateway initialization timeout(msec) #define MIN_DEVICE_TABLE_SIZE 5 // Smallest device hash table size #define MAX_DEVICE_TABLE_SIZE 17 // Largest device hash table size #define HW_FAILURE_CNT 6 //nr of consecutive times a hw failure //may occur before being reported #define DISC_TIMEOUT_CALLBACK 10 #define DISC_TIMEOUT_AUTHFAILURE 3 #define ANNOUNCE_PRESENCE_TIMEOUT 120L #define DDM_HEAP_INITIAL_SIZE 20000 // approx 20K #define DDM_HEAP_MAX_SIZE 0 // Not limited // // DDM Events Definitions // #define NUM_DDM_EVENTS 9 // All DDM events other than RASMAN enum { DDM_EVENT_SVC = 0, DDM_EVENT_SVC_TERMINATED, DDM_EVENT_SECURITY_DLL, DDM_EVENT_PPP, DDM_EVENT_TIMER, DDM_EVENT_CHANGE_NOTIFICATION, DDM_EVENT_CHANGE_NOTIFICATION1, DDM_EVENT_CHANGE_NOTIFICATION2 }; // // Device Object FSM states definitions // typedef enum _DEV_OBJ_STATE { DEV_OBJ_LISTENING, // waiting for a connection DEV_OBJ_LISTEN_COMPLETE, // Listen completed but not connected. DEV_OBJ_RECEIVING_FRAME, // waiting for a frame from the Rasman DEV_OBJ_HW_FAILURE, // waiting to repost a listen DEV_OBJ_AUTH_IS_ACTIVE, // auth started DEV_OBJ_ACTIVE, // connected and auth done DEV_OBJ_CALLBACK_DISCONNECTING, // wait for disconnect DEV_OBJ_CALLBACK_DISCONNECTED, // wait for callback TO before reconn. DEV_OBJ_CALLBACK_CONNECTING, // wait for reconnection DEV_OBJ_CLOSING, // wait for closing to complete DEV_OBJ_CLOSED // staying idle, waiting for service to // resume or to stop }DEV_OBJ_STATE; // // 3rd party security dialog state // typedef enum _SECURITY_STATE { DEV_OBJ_SECURITY_DIALOG_ACTIVE, DEV_OBJ_SECURITY_DIALOG_STOPPING, DEV_OBJ_SECURITY_DIALOG_INACTIVE } SECURITY_STATE; // // Connection object flags // #define CONN_OBJ_IS_PPP 0x00000001 #define CONN_OBJ_MESSENGER_PRESENT 0x00000004 #define CONN_OBJ_PROJECTIONS_NOTIFIED 0x00000008 #define CONN_OBJ_NOTIFY_OF_DISCONNECTION 0x00000010 #define CONN_OBJ_DISCONNECT_INITIATED 0x00000020 // // Device object flags // #define DEV_OBJ_IS_ADVANCED_SERVER 0x00000001 #define DEV_OBJ_IS_PPP 0x00000002 #define DEV_OBJ_OPENED_FOR_DIALOUT 0x00000004 #define DEV_OBJ_MARKED_AS_INUSE 0x00000008 #define DEV_OBJ_NOTIFY_OF_DISCONNECTION 0x00000020 #define DEV_OBJ_ALLOW_ROUTERS 0x00000040 #define DEV_OBJ_ALLOW_CLIENTS 0x00000080 #define DEV_OBJ_BAP_CALLBACK 0x00000200 #define DEV_OBJ_PNP_DELETE 0x00000400 #define DEV_OBJ_SECURITY_DLL_USED 0x00000800 #define DEV_OBJ_PPP_IS_ACTIVE 0x00001000 #define DEV_OBJ_RECEIVE_ACTIVE 0x00002000 #define DEV_OBJ_AUTH_ACTIVE 0x00004000 #define DEV_OBJ_IPSEC_ERROR_LOGGED 0x00008000 // // Global DDM config flags // #define DDM_USING_RADIUS_AUTHENTICATION 0x00000001 #define DDM_USING_RADIUS_ACCOUNTING 0x00000002 #define DDM_USING_NT_AUTHENTICATION 0x00000004 #define DDM_NO_CERTIFICATE_LOGGED 0x00000008 // // ******************** Data structure definitions for DDM ******************** // // // Table of Event Numbers and Event Handlers // typedef VOID (*EVENTHANDLER)( VOID ); typedef struct _EVENT_HANDLER { DWORD EventId; EVENTHANDLER EventHandler; } EVENT_HANDLER, *PEVENT_HANDLER; typedef struct _NOTIFICATION_EVENT { LIST_ENTRY ListEntry; HANDLE hEventClient; HANDLE hEventRouter; } NOTIFICATION_EVENT, *PNOTIFICATION_EVENT; // // Configuration information for DDM // typedef struct _DDM_CONFIG_INFO { DWORD dwAuthenticateTime; DWORD dwCallbackTime; DWORD dwAutoDisconnectTime; DWORD dwSecurityTime; DWORD dwSystemTime; DWORD dwAuthenticateRetries; DWORD dwClientsPerProc; DWORD dwCallbackRetries; DWORD fFlags; DWORD dwLoggingLevel; BOOL fArapAllowed; BOOL fRemoteListen; DWORD dwServerFlags; DWORD dwNumRouterManagers; DWORD dwAnnouncePresenceTimer; SERVICE_STATUS* pServiceStatus; DWORD dwTraceId; HANDLE hHeap; HINSTANCE hInstAdminModule; HINSTANCE hInstSecurityModule; BOOL fRasSrvrInitialized; HANDLE hIpHlpApi; ALLOCATEANDGETIFTABLEFROMSTACK lpfnAllocateAndGetIfTableFromStack; ALLOCATEANDGETIPADDRTABLEFROMSTACK lpfnAllocateAndGetIpAddrTableFromStack; HANDLE hLogEvents; HKEY hkeyParameters; HKEY hkeyAccounting; HKEY hkeyAuthentication; LPDWORD lpdwNumThreadsRunning; LPVOID lpfnIfObjectAllocateAndInit; LPVOID lpfnIfObjectGetPointerByName; LPVOID lpfnIfObjectGetPointer; LPVOID lpfnIfObjectRemove; LPVOID lpfnIfObjectInsertInTable; LPVOID lpfnIfObjectWANDeviceInstalled; LPVOID lpfnMprAdminGetIpAddressForUser; LPVOID lpfnMprAdminReleaseIpAddress; LPVOID lpfnRasAdminAcceptNewConnection; LPVOID lpfnRasAdminAcceptNewConnection2; LPVOID lpfnRasAdminAcceptNewLink; LPVOID lpfnRasAdminConnectionHangupNotification; LPVOID lpfnRasAdminConnectionHangupNotification2; LPVOID lpfnRasAdminLinkHangupNotification; LPVOID lpfnRasAdminTerminateDll; LPVOID lpfnRouterIdentityObjectUpdate; DWORD (*lpfnRasAuthProviderTerminate)( VOID ); HINSTANCE hinstAuthModule; DWORD (*lpfnRasAcctProviderTerminate)( VOID ); HINSTANCE hinstAcctModule; DWORD (*lpfnRasAcctConfigChangeNotification)( DWORD ); DWORD (*lpfnRasAuthConfigChangeNotification)( DWORD ); CRITICAL_SECTION CSAccountingSessionId; DWORD dwAccountingSessionId; RASSECURITYPROC lpfnRasBeginSecurityDialog; RASSECURITYPROC lpfnRasEndSecurityDialog; LIST_ENTRY NotificationEventListHead; DWORD dwIndex; DWORD cAnalogIPAddresses; LPWSTR *apAnalogIPAddresses; DWORD cDigitalIPAddresses; LPWSTR *apDigitalIPAddresses; BOOL fRasmanReferenced; } DDM_CONFIG_INFO, *PDDM_CONFIG_INFO; // // The represents a device in the DDM // typedef struct _DEVICE_OBJECT { struct _DEVICE_OBJECT * pNext; HPORT hPort; // port handle returned by Ras Manager HRASCONN hRasConn; // Handle to an outgoing call HCONN hConnection; // Handle to the connection bundle HCONN hBapConnection; // Used to notify BAP of callback failure DEV_OBJ_STATE DeviceState; // DCB FSM states RASMAN_STATE ConnectionState;// state of connection, used by rasman if SECURITY_STATE SecurityState; // state of 3rd party security dialog DWORD fFlags; DWORD dwDeviceType; BYTE * pRasmanSendBuffer; //RasMan buffer used for 3rd party secdll BYTE * pRasmanRecvBuffer; //RasMan buffer used for RasPortReceive DWORD dwRecvBufferLen; DWORD dwHwErrorSignalCount; // used in signaling hw error DWORD dwCallbackDelay; DWORD dwCallbackRetries; DWORD dwTotalNumberOfCalls; DWORD dwIndex; // used for FEP processing in vpn case SYSTEMTIME ConnectionTime; ULARGE_INTEGER qwActiveTime; ULARGE_INTEGER qwTotalConnectionTime; ULARGE_INTEGER qwTotalBytesSent; ULARGE_INTEGER qwTotalBytesReceived; ULARGE_INTEGER qwTotalFramesSent; ULARGE_INTEGER qwTotalFramesReceived; WCHAR wchUserName[UNLEN+1]; // Username and domain name in // this structure are used for 3rd WCHAR wchDomainName[DNLEN+1]; // party authentication and logging. WCHAR wchPortName[MAX_PORT_NAME+1]; WCHAR wchMediaName[MAX_MEDIA_NAME+1]; WCHAR wchDeviceType[MAX_DEVICETYPE_NAME+1]; WCHAR wchDeviceName[MAX_DEVICE_NAME+1]; WCHAR wchCallbackNumber[MAX_PHONE_NUMBER_LEN + 1]; }DEVICE_OBJECT, *PDEVICE_OBJECT; // // The represents a port bundle in the DDM // typedef struct _CONNECTION_OBJECT { struct _CONNECTION_OBJECT *pNext; HCONN hConnection; HPORT hPort; HANDLE hDIMInterface; // Handle to the interface DWORD fFlags; ULARGE_INTEGER qwActiveTime; DWORD cActiveDevices; // Count of active devices in this list DWORD cDeviceListSize; // Size of devices list. PDEVICE_OBJECT* pDeviceList; // List of connected devices ROUTER_INTERFACE_TYPE InterfaceType; GUID guid; WCHAR wchInterfaceName[MAX_INTERFACE_NAME_LEN+1]; WCHAR wchUserName[UNLEN+1]; WCHAR wchDomainName[DNLEN+1]; BYTE bComputerName[NCBNAMSZ]; PPP_PROJECTION_RESULT PppProjectionResult; } CONNECTION_OBJECT, *PCONNECTION_OBJECT; // // Hash table for devices and connections. // typedef struct _DEVICE_TABLE { PDEVICE_OBJECT* DeviceBucket; // Array of device buckets. PCONNECTION_OBJECT* ConnectionBucket; // Array of bundle buckets. DWORD NumDeviceBuckets; // # of device buckets in array DWORD NumDeviceNodes; // Total # of devices in the table DWORD NumDevicesInUse; // Total # of devices in use DWORD NumConnectionBuckets;// Size of connection Hash Table DWORD NumConnectionNodes; // # of active connections CRITICAL_SECTION CriticalSection; // Mutex around this table } DEVICE_TABLE, *PDEVICE_TABLE; typedef struct _MEDIA_OBJECT { WCHAR wchMediaName[MAX_MEDIA_NAME+1]; DWORD dwNumAvailable; } MEDIA_OBJECT, *PMEDIA_OBJECT; typedef struct _MEDIA_TABLE { BOOL fCheckInterfaces; DWORD cMediaListSize; // In number of entries MEDIA_OBJECT * pMediaList; CRITICAL_SECTION CriticalSection; } MEDIA_TABLE; // // ********************** Globals variables for DDM ************************** // #ifdef _ALLOCATE_DDM_GLOBALS_ #define DDM_EXTERN #else #define DDM_EXTERN extern #endif DDM_EXTERN DDM_CONFIG_INFO gblDDMConfigInfo; DDM_EXTERN DEVICE_TABLE gblDeviceTable; // Hash table of Devices DDM_EXTERN MEDIA_TABLE gblMediaTable; // Table of resources available DDM_EXTERN ROUTER_MANAGER_OBJECT * gblRouterManagers; // List of Router Managers. DDM_EXTERN ROUTER_INTERFACE_TABLE* gblpInterfaceTable; // Hash table of Router Interfaces DDM_EXTERN HANDLE * gblSupervisorEvents; // Array of supervisor events DDM_EXTERN HANDLE * gblphEventDDMServiceState; //Notifys DDM of DIM change DDM_EXTERN HANDLE * gblphEventDDMTerminated; //Notifys DIM of termination DDM_EXTERN EVENT_HANDLER gblEventHandlerTable[NUM_DDM_EVENTS]; DDM_EXTERN LPWSTR gblpRouterPhoneBook; DDM_EXTERN LPWSTR gblpszAdminRequest; DDM_EXTERN LPWSTR gblpszUserRequest; DDM_EXTERN LPWSTR gblpszHardwareFailure; DDM_EXTERN LPWSTR gblpszUnknownReason; DDM_EXTERN LPWSTR gblpszPm; DDM_EXTERN LPWSTR gblpszAm; DDM_EXTERN LPWSTR gblpszUnknown; #ifdef MEM_LEAK_CHECK #define DDM_MEM_TABLE_SIZE 100 PVOID DdmMemTable[DDM_MEM_TABLE_SIZE]; #define LOCAL_ALLOC DebugAlloc #define LOCAL_FREE DebugFree #define LOCAL_REALLOC DebugReAlloc LPVOID DebugAlloc( DWORD Flags, DWORD dwSize ); BOOL DebugFree( PVOID pMem ); LPVOID DebugReAlloc( PVOID pMem, DWORD dwSize ); #else #define LOCAL_ALLOC(Flags,dwSize) HeapAlloc( gblDDMConfigInfo.hHeap, \ HEAP_ZERO_MEMORY, dwSize ) #define LOCAL_FREE(hMem) HeapFree( gblDDMConfigInfo.hHeap, 0, hMem ) #define LOCAL_REALLOC(hMem,dwSize) HeapReAlloc( gblDDMConfigInfo.hHeap, \ HEAP_ZERO_MEMORY,hMem,dwSize) #endif // // ************************* Function Prototypes for DDM ******************** // VOID SignalHwError( IN PDEVICE_OBJECT ); DWORD LoadDDMParameters( IN HKEY hkeyParameters, IN BOOL * pfIpAllowed ); DWORD LoadSecurityModule( VOID ); DWORD LoadAdminModule( VOID ); DWORD LoadAndInitAuthOrAcctProvider( IN BOOL fAuthenticationProvider, IN DWORD dwNASIpAddress, OUT DWORD * lpdwStartAccountingSessionId, OUT LPVOID * plpfnRasAuthProviderAuthenticateUser, OUT LPVOID * plpfnRasAuthProviderFreeAttributes, OUT LPVOID * plpfnRasAuthConfigChangeNotification, OUT LPVOID * plpfnRasAcctProviderStartAccounting, OUT LPVOID * plpfnRasAcctProviderInterimAccounting, OUT LPVOID * plpfnRasAcctProviderStopAccounting, OUT LPVOID * plpfnRasAcctProviderFreeAttributes, OUT LPVOID * plpfnRasAcctConfigChangeNotification ); DWORD DdmFindBoundProtocols( OUT BOOL * pfBoundToIp, OUT BOOL * pfBoundToIpx, OUT BOOL * pfBoundToATalk ); VOID AnnouncePresence( VOID ); VOID InitializeMessageQs( IN HANDLE hEventSecurity, IN HANDLE hEventPPP ); VOID DeleteMessageQs( VOID ); DWORD AddressPoolInit( VOID ); DWORD lProtocolEnabled( IN HKEY hKey, IN DWORD dwPid, IN BOOL fRasSrv, IN BOOL fRouter, IN BOOL * pfEnabled ); #endif