/*++

Copyright (c) 1995  Microsoft Corporation

Module Name:

    routing\ip\rtrmgr\globals.h

Abstract:

    Header for IP Router Manager globals

Revision History:

    Gurdeep Singh Pall          6/8/95  Created

--*/

#ifndef __GLOBALS_H__
#define __GLOBALS_H__

//
// Interface Control Block (ICB) list.
//

LIST_ENTRY  ICBList ;

//
// Hash lookup for mapping interfaceids to picb
//

LIST_ENTRY  ICBHashLookup[ICB_HASH_TABLE_SIZE];

//
// Hash lookup for mapping ICB sequence number to picb
//

LIST_ENTRY  ICBSeqNumLookup[ICB_HASH_TABLE_SIZE];

//
// Hash lookup for bindings
//

LIST_ENTRY  g_leBindingTable[BINDING_HASH_TABLE_SIZE];


//
// Hash table for interface to adapter mapping
//

//LIST_ENTRY  g_rgleAdapterMapTable[ADAPTER_HASH_TABLE_SIZE];

//
// Routing Protocols list
//

LIST_ENTRY  g_leProtoCbList;

//
// Timer Queue for Router Discovery advts
//

LIST_ENTRY g_leTimerQueueHead;

//
// Trace Handle used for traces/logging
//

DWORD  TraceHandle ;

//
// Handle used for logging events
//

HANDLE g_hLogHandle;

//
// Level of logging 
//

DWORD g_dwLoggingLevel;

//
// Flag indicating if the router is being started in LAN only or 
// LAN and WAN mode.
//

BOOL    RouterRoleLanOnly ;

//
// Handle to the heap used for all allocations
//

HANDLE  IPRouterHeap ;

//
// Info useful in making RTMv2 calls
//

RTM_REGN_PROFILE  g_rtmProfile;

//
// RTM Handle for static/admin routes
//

HANDLE  g_hLocalRoute;
HANDLE  g_hAutoStaticRoute;
HANDLE  g_hStaticRoute;
HANDLE  g_hNonDodRoute;
HANDLE  g_hNetMgmtRoute;

// RTM handle for obtaining notifications

HANDLE  g_hNotification;

//
// RTM handle for obtaining default route notifications
//

HANDLE  g_hDefaultRouteNotification;

//
// Handle to event used for stopping the IP Router
//

HANDLE  g_hStopRouterEvent ;

//
// Handle to event used for demand dial
//

HANDLE  g_hDemandDialEvent ;

//
// Handle to event used for demand dial
//

HANDLE  g_hIpInIpEvent;

//
// Handle to event used for stack change notifications
//

HANDLE  g_hStackChangeEvent;

//
// Handle to event used request forwarding change from worker
//

HANDLE  g_hSetForwardingEvent;

//
// Handle to event used to get notification about forwarding changes
//

HANDLE  g_hForwardingChangeEvent;

//
// Handle to event used by Routing Protocols for notification
//

HANDLE  g_hRoutingProtocolEvent ;

//
// Timer to handle Router discover advts
//

HANDLE g_hRtrDiscTimer;

//
// Timer to handle Ras Server advertisements
//

HANDLE g_hRasAdvTimer;

//
// Timer to handle MZAP advertisements
//

HANDLE g_hMzapTimer;

//
// Event for Winsock2
//

HANDLE g_hRtrDiscSocketEvent;

//
// Event for mrinfo/mtrace services
//

HANDLE g_hMcMiscSocketEvent;
WSABUF g_wsaMcRcvBuf;
BYTE   g_byMcMiscBuffer[1500];


HANDLE g_hMcastEvents[NUM_MCAST_IRPS];

//
// Events for Route Change notifications
//

HANDLE g_hRouteChangeEvents[NUM_ROUTE_CHANGE_IRPS];


//
// Handle to WANARP device
//

HANDLE  g_hWanarpRead;
HANDLE  g_hWanarpWrite;

//
// Count of all routing protocols configured
//

DWORD TotalRoutingProtocols ;

//
// Lock for tracking router usage: this facilitates stop router functionality
//

CRITICAL_SECTION    RouterStateLock ;

//
// Structure keeping the router state
//

IPRouterState         RouterState ;

//
// used for WANARP demand dial mechanism
//

WANARP_NOTIFICATION     wnWanarpMsg;
OVERLAPPED              WANARPOverlapped;

//
// Critical section for the forwarding state data
//

CRITICAL_SECTION        g_csFwdState;

//
// The last request to the worker thread
//

BOOL                    g_bEnableFwdRequest;

//
// The last action by the worker
//

BOOL                    g_bFwdEnabled;

//
// Should we set routes to the stack?
//

BOOL                    g_bSetRoutesToStack;

//
// Flag indicating if NETBT proxy should be enabled
//

BOOL                    g_bEnableNetbtBcastFrowarding;

//
// The NETBT proxy mode prior to starting RRAS
//

DWORD                   g_dwOldNetbtProxyMode;

//
// copy of the support functions Routing Protocols need
//

extern SUPPORT_FUNCTIONS        g_sfnDimFunctions;

//
// Router Discovery stuff
//

extern PICMP_ROUTER_ADVT_MSG    g_pIcmpAdvt;
extern SOCKADDR_IN              g_sinAllSystemsAddr;
extern WSABUF                   g_wsabufICMPAdvtBuffer;
extern WSABUF                   g_wsaIpRcvBuf;

//
// Buffer to hold maximum length IP header and 8 bytes of the ICMP packet
//

DWORD  g_pdwIpAndIcmpBuf[ICMP_RCV_BUFFER_LEN];

PIP_HEADER g_pIpHeader;

//
// externs defined in exdeclar.h
//

//
// The CB for the Internal Interface
//

extern PICB   g_pInternalInterfaceCb;

//
// The CB for the Loopback Interface
//

extern PICB   g_pLoopbackInterfaceCb;

//
// Counter for sequence numbers
//

extern DWORD    g_dwNextICBSeqNumberCounter;

//
// Number of addresses in the system
//

extern ULONG    g_ulNumBindings;
extern ULONG    g_ulNumInterfaces;
extern ULONG    g_ulNumNonClientInterfaces;

extern HANDLE g_hIpDevice;
extern HANDLE g_hMcastDevice;
extern HANDLE g_hIpRouteChangeDevice;

extern BOOL   g_bUninitServer;

extern IP_CACHE  g_IpInfo;
extern TCP_CACHE g_TcpInfo;
extern UDP_CACHE g_UdpInfo;

extern HANDLE   g_hIfHeap;
extern HANDLE   g_hIpAddrHeap;
extern HANDLE   g_hIpForwardHeap;
extern HANDLE   g_hIpNetHeap;
extern HANDLE   g_hTcpHeap;
extern HANDLE   g_hUdpHeap;

LIST_ENTRY          g_leStackRoutesToRestore;

ULONG   g_ulGatewayCount;
ULONG   g_ulGatewayMaxCount;

PGATEWAY_INFO   g_pGateways;


extern HANDLE    g_hMibRtmHandle;

extern DWORD g_TimeoutTable[NUM_CACHE];

extern DWORD (*g_LoadFunctionTable[NUM_CACHE])();

extern DWORD 
(*g_AccessFunctionTable[NUMBER_OF_EXPORTED_VARIABLES])(DWORD dwQueryType, 
                                                       DWORD dwInEntrySize, 
                                                       PMIB_OPAQUE_QUERY lpInEntry, 
                                                       LPDWORD lpOutEntrySize, 
                                                       PMIB_OPAQUE_INFO lpOutEntry,
                                                       LPBOOL lpbCache);

                    
extern DWORD g_LastUpdateTable[NUM_CACHE];
extern DWORD g_dwStartTime;

extern RTL_RESOURCE g_LockTable[NUM_LOCKS];

extern MCAST_OVERLAPPED g_rginMcastMsg[NUM_MCAST_IRPS];

extern IPNotifyData g_IpNotifyData;
extern ROUTE_CHANGE_INFO g_rgIpRouteNotifyOutput[NUM_ROUTE_CHANGE_IRPS];

extern HKEY         g_hIpIpIfKey;

extern HANDLE       g_hMHbeatSocketEvent;

extern HANDLE       g_hMzapSocketEvent;

//
// Entrypoints into DIM
//

DWORD (*ConnectInterface)(IN HANDLE hDIMInterface, IN DWORD dwProtocolId);

DWORD (*DisconnectInterface)(IN HANDLE hDIMInterface, IN DWORD dwProtocolId);

DWORD
(*SaveInterfaceInfo)(
    IN HANDLE hDIMInterface,
    IN DWORD dwProtocolId,
    IN LPVOID pInterfaceInfo,
    IN DWORD cBInterfaceInfoSize
    );

DWORD
(*RestoreInterfaceInfo)(
    IN HANDLE hDIMInterface,
    IN DWORD dwProtocolId,
    IN LPVOID lpInterfaceInfo,
    IN LPDWORD lpcbInterfaceInfoSize
    );


VOID  (*RouterStopped)(IN DWORD dwProtocolId, IN DWORD dwError);


DWORD
(APIENTRY *SaveGlobalInfo)(
            IN      DWORD           dwProtocolId,
            IN      LPVOID          pGlobalInfo,
            IN      DWORD           cbGlobalInfoSize );

VOID
(APIENTRY *EnableInterfaceWithDIM)(
            IN      HANDLE          hDIMInterface,
            IN      DWORD           dwProtocolId,
            IN      BOOL            fEnabled);


//
// Callbacks into MGM
//

PMGM_INDICATE_MFE_DELETION          g_pfnMgmMfeDeleted;
PMGM_NEW_PACKET_INDICATION          g_pfnMgmNewPacket;
PMGM_BLOCK_GROUPS                   g_pfnMgmBlockGroups;
PMGM_UNBLOCK_GROUPS                 g_pfnMgmUnBlockGroups;
PMGM_WRONG_IF_INDICATION            g_pfnMgmWrongIf;


INFO_CB     g_rgicInfoCb[NUM_INFO_CBS];

CHAR    g_rgcLoopbackString[MAXLEN_IFDESCR + 1];
CHAR    g_rgcInternalString[MAXLEN_IFDESCR + 1];
CHAR    g_rgcWanString[MAXLEN_IFDESCR + 1];
CHAR    g_rgcIpIpString[MAXLEN_IFDESCR + 1];

HINSTANCE   g_hOwnModule;

HANDLE      g_hMprConfig;

#endif