/*++ Copyright (c) 1997, Microsoft Corporation Module Name: pptp.h Abstract: This module contains declarations for the NAT's PPTP-support routines. Author: Abolade Gbadegesin (t-abolag) 18-Aug-1997 Revision History: --*/ #ifndef _NAT_PPTP_H_ #define _NAT_PPTP_H_ // // Structure: NAT_PPTP_MAPPING // // This structure stores a mapping created for a PPTP tunnel. // // Any PPTP tunnel is uniquely identified by the quadruple // // // // We need to ensure that the 'PrivateCallID's are unique for all the machines // behind the NAT. // // Hence, the NAT watches all PPTP control sessions (TCP port 1723), and for // any PPTP call detected, allocates a call ID to replace the ID chosen by // the private-network PPTP endpoint. // // The allocation is recorded by creating an entry in a list of PPTP mappings, // which is sorted for outbound-tunnel-message searching on // // // // and sorted for inbound-tunnel-message searching on // // . // // When a mapping is first created, it is marked half-open and is inserted // only in the inbound-list, since no remote-call-ID is available to serve // as the secondary key in the outbound list. Later, when the call-reply // is received, the mapping is also placed on the outbound list. // // Access to the list of PPTP mappings is granted by 'PptpMappingLock'. // // N.B. On the rare occasions when 'MappingLock' must be held at the same time // as one of 'InterfaceLock', 'EditorLock', and 'DirectorLock', 'MappingLock' // must always be acquired first. // typedef struct _NAT_PPTP_MAPPING { LIST_ENTRY Link[NatMaximumDirection]; ULONG64 PrivateKey; ULONG64 PublicKey; ULONG64 PortKey; USHORT PrivateCallId; USHORT PublicCallId; USHORT RemoteCallId; ULONG Flags; LONG64 LastAccessTime; } NAT_PPTP_MAPPING, *PNAT_PPTP_MAPPING; // // PPTP mapping flags // #define NAT_PPTP_FLAG_HALF_OPEN 0x00000001 #define NAT_PPTP_FLAG_DISCONNECTED 0x00000002 #define NAT_PPTP_HALF_OPEN(m) \ ((m)->Flags & NAT_PPTP_FLAG_HALF_OPEN) #define NAT_PPTP_DISCONNECTED(m) \ ((m)->Flags & NAT_PPTP_FLAG_DISCONNECTED) // // PPTP key-manipulation macros // #define MAKE_PPTP_KEY(RemoteAddress,OtherAddress) \ ((ULONG)(RemoteAddress) | ((ULONG64)((ULONG)(OtherAddress)) << 32)) #define PPTP_KEY_REMOTE(Key) ((ULONG)(Key)) #define PPTP_KEY_PRIVATE(Key) ((ULONG)((Key) >> 32)) #define PPTP_KEY_PUBLIC(Key) ((ULONG)((Key) >> 32)) #define MAKE_PPTP_PORT_KEY(PrivatePort,PublicPort,RemotePort) \ ((PrivatePort) | \ ((ULONG64)((PublicPort) & 0xFFFF) << 16) | \ ((ULONG64)((RemotePort) & 0xFFFF) << 32)) #define PPTP_PORT_KEY_REMOTE(Key) ((USHORT)(((Key) >> 32) & 0xFFFF)) #define PPTP_PORT_KEY_PUBLIC(Key) ((USHORT)(((Key) >> 16) & 0xFFFF)) #define PPTP_PORT_KEY_PRIVATE(Key) ((USHORT)(Key)) // // PPTP mapping allocation macros // #define ALLOCATE_PPTP_BLOCK() \ ExAllocateFromNPagedLookasideList(&PptpLookasideList) #define FREE_PPTP_BLOCK(Block) \ ExFreeToNPagedLookasideList(&PptpLookasideList,(Block)) // // Define the depth of the lookaside list for allocating PPTP mappings // #define PPTP_LOOKASIDE_DEPTH 10 // // Global data declarations // extern NPAGED_LOOKASIDE_LIST PptpLookasideList; extern LIST_ENTRY PptpMappingList[NatMaximumDirection]; extern KSPIN_LOCK PptpMappingLock; extern IP_NAT_REGISTER_EDITOR PptpRegisterEditorClient; extern IP_NAT_REGISTER_EDITOR PptpRegisterEditorServer; // // PPTP mapping management routines // NTSTATUS NatAllocatePublicPptpCallId( ULONG64 PublicKey, PUSHORT CallIdp, PLIST_ENTRY *InsertionPoint OPTIONAL ); NTSTATUS NatCreatePptpMapping( ULONG RemoteAddress, ULONG PrivateAddress, USHORT PrivateCallId, ULONG PublicAddress, PUSHORT CallIdp, IP_NAT_DIRECTION Direction, USHORT PrivatePort, USHORT PublicPort, USHORT RemotePort, PNAT_PPTP_MAPPING* MappingCreated ); NTSTATUS NatInitializePptpManagement( VOID ); PNAT_PPTP_MAPPING NatLookupInboundPptpMapping( ULONG64 PublicKey, USHORT PrivateCallId, PLIST_ENTRY* InsertionPoint ); PNAT_PPTP_MAPPING NatLookupOutboundPptpMapping( ULONG64 PrivateKey, USHORT RemoteCallId, PLIST_ENTRY* InsertionPoint ); VOID NatShutdownPptpManagement( VOID ); // // PPTP control-connection editor routines // NTSTATUS NatClientToServerDataHandlerPptp( IN PVOID InterfaceHandle, IN PVOID SessionHandle, IN PVOID DataHandle, IN PVOID EditorContext, IN PVOID EditorSessionContext, IN PVOID ReceiveBuffer, IN ULONG DataOffset, IN IP_NAT_DIRECTION Direction ); NTSTATUS NatDeleteHandlerPptp( IN PVOID InterfaceHandle, IN PVOID SessionHandle, IN PVOID EditorContext, IN PVOID EditorSessionContext ); NTSTATUS NatInboundDataHandlerPptpClient( IN PVOID InterfaceHandle, IN PVOID SessionHandle, IN PVOID DataHandle, IN PVOID EditorContext, IN PVOID EditorSessionContext, IN PVOID RecvBuffer, IN ULONG DataOffset ); NTSTATUS NatInboundDataHandlerPptpServer( IN PVOID InterfaceHandle, IN PVOID SessionHandle, IN PVOID DataHandle, IN PVOID EditorContext, IN PVOID EditorSessionContext, IN PVOID RecvBuffer, IN ULONG DataOffset ); NTSTATUS NatOutboundDataHandlerPptpClient( IN PVOID InterfaceHandle, IN PVOID SessionHandle, IN PVOID DataHandle, IN PVOID EditorContext, IN PVOID EditorSessionContext, IN PVOID RecvBuffer, IN ULONG DataOffset ); NTSTATUS NatOutboundDataHandlerPptpServer( IN PVOID InterfaceHandle, IN PVOID SessionHandle, IN PVOID DataHandle, IN PVOID EditorContext, IN PVOID EditorSessionContext, IN PVOID RecvBuffer, IN ULONG DataOffset ); NTSTATUS NatServerToClientDataHandlerPptp( IN PVOID InterfaceHandle, IN PVOID SessionHandle, IN PVOID DataHandle, IN PVOID EditorContext, IN PVOID EditorSessionContext, IN PVOID ReceiveBuffer, IN ULONG DataOffset, IN IP_NAT_DIRECTION Direction ); XLATE_IP_ROUTINE(NatTranslatePptp) #endif // _NAT_PPTP_H_