Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1162 lines
32 KiB

//depot/Lab03_N/Net/rras/ndis/raspptp/common/raspptp.h#7 - edit change 19457 (text)
/*****************************************************************************
*
* Copyright (c) 1998-1999 Microsoft Corporation
*
* RASPPTP.H - RASPPTP includes, defines, structures and prototypes
*
* Author: Stan Adermann (stana)
*
* Created: 7/28/1998
*
*****************************************************************************/
#ifndef RASPPTP_H
#define RASPPTP_H
#include "osinc.h"
#ifdef STATIC
#undef STATIC
#endif
#define STATIC
#include "debug.h"
#include "protocol.h"
#include "ctdi.h"
#include <rc4.h>
#include <fipsapi.h>
//
// NDIS version compatibility in OSINC.H
//
// TAPI version compatibility
#define TAPI_EXT_VERSION 0x00010000
// Registry values
extern ULONG PptpMaxTransmit;
extern ULONG PptpWanEndpoints;
extern ULONG PptpBaseCallId;
extern ULONG PptpMaxCallId;
extern ULONG PptpCallIdMask;
extern BOOLEAN PptpClientSide;
extern ULONG PptpEchoTimeout;
extern BOOLEAN PptpEchoAlways;
extern USHORT PptpControlPort;
extern USHORT PptpProtocolNumber;
extern LONG PptpSendRecursionLimit;
extern ULONG PptpValidateAddress;
#define PPTP_SEND_RECURSION_LIMIT_DEFAULT 5
//extern CHAR PptpHostName[MAX_HOSTNAME_LENGTH];
#define CONFIG_INITIATE_UDP BIT(0)
#define CONFIG_ACCEPT_UDP BIT(1)
#define CONFIG_DONT_ACCEPT_GRE BIT(2)
// trace the various pended tx lists
extern ULONG PptpTraceMask;
#define PPTP_TRACE_TX_PKT BIT(0)
#define PPTP_TRACE_TX_IRP BIT(1)
typedef struct {
ULONG Address;
ULONG Mask;
} CLIENT_ADDRESS, *PCLIENT_ADDRESS;
extern ULONG CtdiTcpDisconnectTimeout;
extern ULONG CtdiTcpConnectTimeout;
extern BOOLEAN PptpAuthenticateIncomingCalls;
extern PCLIENT_ADDRESS g_AcceptClientList;
extern ULONG g_ulAcceptClientAddresses;
extern ULONG PptpMaxTunnelsPerIpAddress;
extern PCLIENT_ADDRESS g_TrustedClientList;
extern ULONG g_ulTrustedClientAddresses;
#define TAPI_MAX_LINE_ADDRESS_LENGTH 32
#define TAPI_ADDR_PER_LINE 1
#define TAPI_ADDRESSID 0
#define TAPI_DEVICECLASS_NAME "tapi/line"
#define TAPI_DEVICECLASS_ID 1
#define NDIS_DEVICECLASS_NAME "ndis"
#define NDIS_DEVICECLASS_ID 2
#define PPTP_CLOSE_TIMEOUT 1000 // ms
#define MAX_TARGET_ADDRESSES 16
#define CALL_STATES_MASK (LINECALLSTATE_UNKNOWN | \
LINECALLSTATE_IDLE | \
LINECALLSTATE_OFFERING | \
LINECALLSTATE_DIALING | \
LINECALLSTATE_PROCEEDING | \
LINECALLSTATE_CONNECTED | \
LINECALLSTATE_DISCONNECTED)
// Memory allocation tags
#define TAG(v) ((((v)&0xff)<<24) | (((v)&0xff00)<<8) | (((v)&0xff0000)>>8) | (((v)&0xff000000)>>24))
#define TAG_PPTP_ADAPTER TAG('PTPa')
#define TAG_PPTP_TUNNEL TAG('PTPT')
#define TAG_PPTP_TIMEOUT TAG('PTPt')
#define TAG_PPTP_CALL TAG('PTPC')
#define TAG_PPTP_CALL_LIST TAG('PTPc')
#define TAG_PPTP_ADDR_LIST TAG('PTPL')
#define TAG_CTDI_DATA TAG('PTCD')
#define TAG_CTDI_CONNECT_INFO TAG('PTCN')
#define TAG_CTDI_DGRAM TAG('PTCG')
#define TAG_CTDI_ROUTE TAG('PTCR')
#define TAG_CTDI_IRP TAG('PTCI')
#define TAG_CTDI_MESSAGE TAG('PTCM')
#define TAG_CTL_PACKET TAG('PTTP')
#define TAG_CTL_CONNINFO TAG('PTTI')
#define TAG_WORK_ITEM TAG('PTWI')
#define TAG_THREAD TAG('PTTH')
#define TAG_REG TAG('PTRG')
#define TAG_FREE TAG('FREE')
#define BIT(b) (1<<(b))
#define LOCKED TRUE
#define UNLOCKED FALSE
/* Types and structs -------------------------------------------------------*/
typedef void (*FREEFUNC)(PVOID);
typedef struct {
LONG Count;
FREEFUNC FreeFunction;
} REFERENCE_COUNT;
#define INIT_REFERENCE_OBJECT(o,freefunc) \
{ \
(o)->Reference.FreeFunction = (freefunc); \
(o)->Reference.Count = 1; \
DEBUGMSG(DBG_REF, (DTEXT("INIT REF (%08x, %d) %s\n"), (o), (o)->Reference.Count, #o)); \
}
#if DBG
#define REFERENCE_OBJECT(o) \
{ \
LONG Ref; \
Ref = NdisInterlockedIncrement(&(o)->Reference.Count); \
ASSERT(Ref != 1); \
DEBUGMSG(DBG_REF, (DTEXT("REFERENCE (%08x, %d) %s %d\n"), (o), (o)->Reference.Count, #o, __LINE__)); \
}
#else
#define REFERENCE_OBJECT(o) \
{ \
NdisInterlockedIncrement(&(o)->Reference.Count); \
DEBUGMSG(DBG_REF, (DTEXT("REFERENCE (%08x, %d) %s %d\n"), (o), (o)->Reference.Count, #o, __LINE__)); \
}
#endif
#define DEREFERENCE_OBJECT(o) \
{ \
ULONG Ref = NdisInterlockedDecrement(&(o)->Reference.Count); \
DEBUGMSG(DBG_REF, (DTEXT("DEREFERENCE(%08x, %d) %s %d\n"), (o), (o)->Reference.Count, #o, __LINE__)); \
if (Ref==0) \
{ \
ASSERT((o)->Reference.FreeFunction); \
DEBUGMSG(DBG_REF, (DTEXT("Last reference released, freeing %08x\n"), (o))); \
(o)->Reference.FreeFunction(o); \
} \
}
#if DBG
#define REFERENCE_OBJECT_EX(o, index) \
{ \
NdisInterlockedIncrement(&(o)->arrRef[index]); \
REFERENCE_OBJECT(o); \
}
#define DEREFERENCE_OBJECT_EX(o, index) \
{ \
NdisInterlockedDecrement(&(o)->arrRef[index]); \
DEREFERENCE_OBJECT(o); \
}
#else
#define REFERENCE_OBJECT_EX(o, index) \
{ \
REFERENCE_OBJECT(o); \
}
#define DEREFERENCE_OBJECT_EX(o, index) \
{ \
DEREFERENCE_OBJECT(o); \
}
#endif
#define REFERENCE_COUNT(o) ((o)->Reference.Count)
#define IS_CALL(call) ((call) && (call)->Signature==TAG_PPTP_CALL)
#define IS_CTL(ctl) ((ctl) && (ctl)->Signature==TAG_PPTP_TUNNEL)
#define IS_LINE_UP(call) (!((call)->Close.Checklist&CALL_CLOSE_LINE_DOWN))
// If you change this enum then be sure to change ControlStateToString() also.
typedef enum {
STATE_CTL_INVALID = 0,
STATE_CTL_LISTEN,
STATE_CTL_DIALING,
STATE_CTL_WAIT_REQUEST,
STATE_CTL_WAIT_REPLY,
STATE_CTL_ESTABLISHED,
STATE_CTL_WAIT_STOP,
STATE_CTL_CLEANUP,
NUM_CONTROL_STATES
} CONTROL_STATE;
// If you change this enum then be sure to change CallStateToString() also.
typedef enum {
STATE_CALL_INVALID = 0,
STATE_CALL_CLOSED,
STATE_CALL_IDLE,
STATE_CALL_OFFHOOK,
STATE_CALL_OFFERING,
STATE_CALL_PAC_OFFERING,
STATE_CALL_PAC_WAIT,
STATE_CALL_DIALING,
STATE_CALL_PROCEEDING,
STATE_CALL_ESTABLISHED,
STATE_CALL_WAIT_DISCONNECT,
STATE_CALL_CLEANUP,
NUM_CALL_STATES
} CALL_STATE;
typedef struct PPTP_ADAPTER *PPPTP_ADAPTER;
typedef enum {
CTL_REF_INITIAL = 0,
CTL_REF_PACKET,
CTL_REF_ENUM,
CTL_REF_CLEANUP,
CTL_REF_QUERYCONNINFO,
CTL_REF_QUERYADDRINFO,
CTL_REF_CALLCONNECT,
CTL_REF_CTLCONNECT,
CTL_REF_CONNECTCALLBACK,
CTL_REF_DISCONNECT,
CTL_REF_CLEANUPLOOSEENDS,
CTL_REF_CLEANUPCTLS,
CTL_REF_MAX
} CTL_REF;
typedef struct CONTROL_TUNNEL {
LIST_ENTRY ListEntry;
// Used to attach this control connection to the miniport context.
REFERENCE_COUNT Reference;
// Not protected by spinlock
ULONG Signature;
// PTPT
PPPTP_ADAPTER pAdapter;
// The associated adapter
CONTROL_STATE State;
// State of this control connection
LIST_ENTRY CallList;
// List of calls supported by this control connection.
// Protected by adapter lock
BOOLEAN Inbound;
// Indicates whether this tunnel originated here or elsewhere
UCHAR Padding[sizeof(ULONG_PTR)];
// We pad to protect the portions of the struct protected by different locks
// from alpha alignment problems.
// ^^^^^^ Protected by Adapter->Lock^^^^^^^^
//===================================================================
NDIS_SPIN_LOCK Lock;
// vvvvvv Protected by Ctl->Lock vvvvvvvvvvv
BOOLEAN Cleanup;
// True means a cleanup has been scheduled or is active.
LIST_ENTRY MessageList;
// Each entry represents a pptp message that has been sent and
// is awaiting a response or at least waiting to be acknowledged
// by the transport
HANDLE hCtdiEndpoint;
// Handle for the tunnel local endpoint. The connection must be closed first.
HANDLE hCtdi;
// Handle for control tunnel TCP connection.
UCHAR PartialPacketBuffer[MAX_CONTROL_PACKET_LENGTH];
ULONG BytesInPartialBuffer;
// TCP data received that does not constitute a full packet.
struct {
TA_IP_ADDRESS Address;
ULONG Version;
ULONG Framing;
ULONG Bearer;
UCHAR HostName[MAX_HOSTNAME_LENGTH];
UCHAR Vendor[MAX_VENDOR_LENGTH];
} Remote;
// Information provided by the remote.
ULONG LocalAddress;
PULONG PptpMessageLength;
// Points to an array of precalculated packet lengths, based on version
struct {
NDIS_MINIPORT_TIMER Timer;
ULONG Identifier;
BOOLEAN Needed;
#define PPTP_ECHO_TIMEOUT_DEFAULT 60
} Echo;
#define PPTP_MESSAGE_TIMEOUT_DEFAULT 30
NDIS_MINIPORT_TIMER WaitTimeout;
NDIS_MINIPORT_TIMER StopTimeout;
ULONG Speed;
// Contains line speed of this connect in BPS
#if DBG
ULONG arrRef[CTL_REF_MAX];
#endif
} CONTROL_TUNNEL, *PCONTROL_TUNNEL;
typedef struct CALL_SESSION {
LIST_ENTRY ListEntry;
// Used to attach a call session to a control connection
ULONG Signature;
// PTPC
PPPTP_ADAPTER pAdapter;
// The associated adapter
LIST_ENTRY TxListEntry;
// If we have packets to send, this connects us to the queue of the transmitting thread.
PCONTROL_TUNNEL pCtl;
// Pointer to this call's control connection.
UCHAR Padding[sizeof(ULONG_PTR)];
// We pad to protect the portions of the struct protected by different locks
// from alpha alignment problems.
// ^^^^^^^^^^ Protected by Adapter->Lock ^^^^^^^^^^^^^^
// ============================================================================
REFERENCE_COUNT Reference;
// Not protected by spinlock
NDIS_SPIN_LOCK Lock;
// vvvvvvvvvv Protected by Call->Lock vvvvvvvvvvvvvvvvv
CALL_STATE State;
// State of this call.
LIST_ENTRY TxPacketList;
// Context for each send currently queued
LIST_ENTRY TxActivePacketList;
// Context for each send currently active in transport
LIST_ENTRY RxPacketList;
// Context for each datagram received but not processed
ULONG_PTR RxPacketsPending;
// Count of RxPackets in RxPacketList
BOOLEAN PendingUse;
// This call is being used though it's in STATE_CALL_IDLE
BOOLEAN Inbound;
// TRUE indicates call did not originate here
BOOLEAN Open;
// Open has been called, but not close
BOOLEAN Transferring;
// TRUE means we are on the queue to transmit or receive packets.
HTAPI_CALL hTapiCall;
// Tapi's handle to the specific call
ULONG_PTR DeviceId;
// The ID of this call, essentially the index in the call array
ULONG_PTR FullDeviceId;
// The ID used in PPTP call id field and used as TAPI hdCall
USHORT SerialNumber;
// Unique for this call
NDIS_HANDLE NdisLinkContext;
// Ndis's handle, used in MiniportReceive, etc.
NDIS_WAN_SET_LINK_INFO WanLinkInfo;
struct {
ULONG SequenceNumber;
// Last received GRE sequence number
ULONG AckNumber;
// Last received GRE Ack number
TA_IP_ADDRESS Address;
// Remote address for datagrams
ULONG TxAccm;
ULONG RxAccm;
// PPP configuration
USHORT CallId;
// Peer ID as used in GRE packet
} Remote;
struct {
USHORT CallId;
// My ID as used in GRE packet
ULONG SequenceNumber;
// Next GRE Sequence number to send
ULONG AckNumber;
// Last sent GRE Ack number
} Packet;
// Struct for items used in creating/processing packets
ULONG MediaModeMask;
// Indicates what types of Tapi calls we accept,
// set by OID_TAPI_SET_DEFAULT_MEDIA_DETECTION
ULONG_PTR LineStateMask;
// This is the list of line states tapi is interested in.
// set by OID_TAPI_SET_STATUS_MESSAGES
UCHAR CallerId[MAX_PHONE_NUMBER_LENGTH];
// This is the remote phone number or IP if we recieved the call,
// and the IP or phone number we dialed if we placed the call.
struct {
NDIS_MINIPORT_TIMER Timer;
BOOLEAN Expedited;
BOOLEAN Scheduled;
ULONG Checklist;
#define CALL_CLOSE_CLEANUP_STATE BIT(0)
#define CALL_CLOSE_LINE_DOWN BIT(1)
#define CALL_CLOSE_DROP BIT(2)
#define CALL_CLOSE_DROP_COMPLETE BIT(3)
#define CALL_CLOSE_DISCONNECT BIT(4)
#define CALL_CLOSE_CLOSE_CALL BIT(5)
#define CALL_CLOSE_CLOSE_LINE BIT(6)
#define CALL_CLOSE_RESET BIT(7)
#define CALL_CLOSE_COMPLETE \
(CALL_CLOSE_CLEANUP_STATE |\
CALL_CLOSE_DROP |\
CALL_CLOSE_DROP_COMPLETE |\
CALL_CLOSE_DISCONNECT |\
CALL_CLOSE_CLOSE_CALL |\
CALL_CLOSE_LINE_DOWN |\
CALL_CLOSE_CLOSE_LINE |\
CALL_CLOSE_RESET)
} Close;
ULONG Speed;
// Connection speed
struct {
NDIS_MINIPORT_TIMER Timer;
BOOLEAN PacketQueued;
ULONG_PTR Padding;
NDIS_WAN_PACKET Packet;
ULONG_PTR Padding2;
UCHAR PacketBuffer[sizeof(GRE_HEADER)+sizeof(ULONG)*2];
ULONG_PTR Padding3;
// When we want to send just an ack, we actually create a packet of
// 0 bytes out of this buffer and pass it down. This buffer is touched
// out of our control, so we pad it to protect us from alpha alignment
// problems.
} Ack;
UCHAR LineAddress[TAPI_MAX_LINE_ADDRESS_LENGTH];
LONG SendCompleteRecursion;
NDIS_MINIPORT_TIMER DialTimer;
PPTP_DPC ReceiveDpc;
BOOLEAN Receiving;
struct {
BOOLEAN Cleanup;
UCHAR CleanupReason[80];
CALL_STATE FinalState;
NDIS_STATUS FinalError;
ULONG Event;
#define CALL_EVENT_TAPI_ANSWER BIT(0)
#define CALL_EVENT_TAPI_CLOSE_CALL BIT(1)
#define CALL_EVENT_TAPI_DROP BIT(2)
#define CALL_EVENT_TAPI_LINE_UP BIT(3)
#define CALL_EVENT_TAPI_LINE_DOWN BIT(4)
#define CALL_EVENT_TAPI_GET_CALL_INFO BIT(5)
#define CALL_EVENT_TAPI_MAKE_CALL BIT(6)
#define CALL_EVENT_PPTP_CLEAR_REQUEST BIT(7)
#define CALL_EVENT_PPTP_DISCONNECT BIT(8)
#define CALL_EVENT_PPTP_OUT_REQUEST BIT(9)
#define CALL_EVENT_PPTP_OUT_REPLY BIT(10)
#define CALL_EVENT_TCP_DISCONNECT BIT(11)
#define CALL_EVENT_TCP_NO_ANSWER BIT(12)
#define CALL_EVENT_TUNNEL_ESTABLISHED BIT(13)
} History;
NDIS_WORK_ITEM SendWorkItem;
NDIS_WORK_ITEM RecvWorkItem;
#if DBG
ULONG TraceIndex;
UCHAR DbgTrace[64];
#endif
} CALL_SESSION, *PCALL_SESSION;
typedef struct PPTP_ADAPTER {
NDIS_HANDLE hMiniportAdapter;
// NDIS context
NDIS_SPIN_LOCK Lock;
REFERENCE_COUNT Reference;
PCALL_SESSION *pCallArray;
// Array of all call sessions.
// Size of array is MaxOutboundCalls+MaxInboundCalls
LIST_ENTRY ControlTunnelList;
// List of all active control connections.
HANDLE hCtdiListen;
// This is the one listening handle
HANDLE hCtdiDg;
// Ctdi handle for PPTP datagram sends/recvs
NDIS_WAN_INFO Info;
// NdisWan related info
// Info.Endpoint should equal MaxOutboundCalls+MaxInboundCalls
struct {
ULONG DeviceIdBase;
ULONG_PTR LineStateMask;
// This is the list of line states tapi is interested in.
// set by OID_TAPI_SET_STATUS_MESSAGES
BOOLEAN Open;
HTAPI_LINE hTapiLine;
// Tapi's handle to the line device, for status callbacks
ULONG NumActiveCalls;
} Tapi;
// Struct to track Tapi specific info.
NDIS_MINIPORT_TIMER CleanupTimer;
// FIPS structures for random data generation
FIPS_FUNCTION_TABLE FipsFunctionTable;
PFILE_OBJECT pFipsFileObject;
PDEVICE_OBJECT pFipsDeviceObject;
RC4_KEYSTRUCT Rc4KeyData;
LONG lRandomCount;
BOOLEAN bRekeying;
} PPTP_ADAPTER, *PPPTP_ADAPTER;
typedef struct {
NDIS_SPIN_LOCK Lock;
ULONG InboundConnectAttempts;
ULONG InboundConnectComplete;
ULONG OutboundConnectAttempts;
ULONG OutboundConnectComplete;
ULONG TunnelsMade;
ULONG TunnelsAccepted;
ULONG CallsMade;
ULONG CallsAccepted;
ULONG PacketsSent;
ULONG PacketsSentComplete;
ULONG PacketsSentError;
ULONG PacketsReceived;
ULONG PacketsRejected;
ULONG PacketsMissed;
ULONG ulNewCallNullTapiHandle;
ULONG ulAnswerNullRequest;
ULONG ulAnswerNullCall;
ULONG ulAnswerNullControl;
ULONG ulAnswerNullReply;
ULONG ulAnswerCtlSendFail;
ULONG ulAnswerNotOffering;
ULONG ulDropNullRequest;
ULONG ulDropNullCall;
ULONG ulDropNullControl;
ULONG ulDropNullPacket;
ULONG ulDropCtlSendFail;
ULONG ulCloseCallNullRequest;
ULONG ulCloseCallNullCall;
ULONG ulCleanupWorkItemFail;
ULONG ulCtlAllocPacketNull;
ULONG ulCtlSendFail;
ULONG ulWorkItemFail;
ULONG ulMemAllocFail;
ULONG ulFindCallWithTapiHandle;
ULONG ulIoAllocateIrpFail;
ULONG ulIoBuildIrpFail;
ULONG ulIoAllocateMdlFail;
} COUNTERS;
typedef struct {
LIST_ENTRY ListEntry;
PVOID pBuffer;
PGRE_HEADER pGreHeader;
HANDLE hCtdi;
} DGRAM_CONTEXT, *PDGRAM_CONTEXT;
extern PPPTP_ADAPTER pgAdapter;
extern COUNTERS gCounters;
/* Prototypes --------------------------------------------------------------*/
PPPTP_ADAPTER
AdapterAlloc(NDIS_HANDLE NdisAdapterHandle);
VOID
AdapterFree(PPPTP_ADAPTER pAdapter);
NTSTATUS RngInit();
PCALL_SESSION
CallAlloc(PPPTP_ADAPTER pAdapter);
VOID
CallAssignSerialNumber(PCALL_SESSION pCall);
VOID
CallCleanup(
PCALL_SESSION pCall,
BOOLEAN Locked
);
VOID
CallDetachFromAdapter(PCALL_SESSION pCall);
PCALL_SESSION
CallFindAndLock(
IN PPPTP_ADAPTER pAdapter,
IN CALL_STATE State,
IN ULONG Flags
);
#define FIND_INCOMING BIT(0)
#define FIND_OUTGOING BIT(1)
VOID
CallFree(PCALL_SESSION pCall);
NDIS_STATUS
CallEventCallClearRequest(
PCALL_SESSION pCall,
UNALIGNED PPTP_CALL_CLEAR_REQUEST_PACKET *pPacket,
PCONTROL_TUNNEL pCtl
);
NDIS_STATUS
CallEventCallDisconnectNotify(
PCALL_SESSION pCall,
UNALIGNED PPTP_CALL_DISCONNECT_NOTIFY_PACKET *pPacket
);
NDIS_STATUS
CallEventCallInConnect(
IN PCALL_SESSION pCall,
IN UNALIGNED PPTP_CALL_IN_CONNECT_PACKET *pPacket
);
NDIS_STATUS
CallEventCallInRequest(
IN PPPTP_ADAPTER pAdapter,
IN PCONTROL_TUNNEL pCtl,
IN UNALIGNED PPTP_CALL_IN_REQUEST_PACKET *pPacket
);
NDIS_STATUS
CallEventCallOutReply(
IN PCALL_SESSION pCall,
IN UNALIGNED PPTP_CALL_OUT_REPLY_PACKET *pPacket
);
NDIS_STATUS
CallEventCallOutRequest(
IN PPPTP_ADAPTER pAdapter,
IN PCONTROL_TUNNEL pCtl,
IN UNALIGNED PPTP_CALL_OUT_REQUEST_PACKET *pPacket
);
NDIS_STATUS
CallEventDisconnect(
PCALL_SESSION pCall
);
NDIS_STATUS
CallEventConnectFailure(
PCALL_SESSION pCall,
NDIS_STATUS FailureReason
);
NDIS_STATUS
CallEventOutboundTunnelEstablished(
IN PCALL_SESSION pCall,
IN NDIS_STATUS EventStatus
);
PCALL_SESSION FASTCALL
CallGetCall(
IN PPPTP_ADAPTER pAdapter,
IN ULONG_PTR ulDeviceId
);
#define CallIsValidCall(pAdapter, id) (pAdapter->Tapi.DeviceIdBase == id ? TRUE : FALSE)
#define DeviceIdToIndex(pAdapter, id) ((id)-(pAdapter)->Tapi.DeviceIdBase)
#define CallGetLineCallState(State) (((ULONG)(State)<NUM_CALL_STATES) ? CallStateToLineCallStateMap[State] : LINECALLSTATE_UNKNOWN)
extern ULONG CallStateToLineCallStateMap[];
#define CALL_ID_INDEX_BITS 14
#define CallIdToDeviceId(CallId) PptpClientSide ? ((CallId)&((1<<CALL_ID_INDEX_BITS)-1)) : ((ULONG)(CallId))
NDIS_STATUS
CallReceiveDatagramCallback(
IN PVOID pContext,
IN PTRANSPORT_ADDRESS pAddress,
IN PUCHAR pBuffer,
IN ULONG ulLength
);
NDIS_STATUS
CallQueueReceivePacket(
PCALL_SESSION pCall,
PDGRAM_CONTEXT pDgContext
);
NDIS_STATUS
CallQueueTransmitPacket(
PCALL_SESSION pCall,
PNDIS_WAN_PACKET pWanPacket
);
// CallQueueTransmitPacket is OS-specific and not found in COMMON directory
BOOLEAN
CallConnectToCtl(
IN PCALL_SESSION pCall,
IN PCONTROL_TUNNEL pCtl,
IN BOOLEAN CallLocked
);
VOID
CallDisconnectFromCtl(
IN PCALL_SESSION pCall,
IN PCONTROL_TUNNEL pCtl
);
NDIS_STATUS
CallSetLinkInfo(
PPPTP_ADAPTER pAdapter,
IN PNDIS_WAN_SET_LINK_INFO pRequest
);
VOID
CallSetState(
IN PCALL_SESSION pCall,
IN CALL_STATE State,
IN ULONG_PTR StateParam,
IN BOOLEAN Locked
);
VOID
CallProcessPackets(
PNDIS_WORK_ITEM pNdisWorkItem,
PCALL_SESSION pCall
);
VOID
CallProcessRxPackets(
PNDIS_WORK_ITEM pNdisWorkItem,
PCALL_SESSION pCall
);
#if 0
VOID
CallProcessRxPackets(
IN PVOID SystemSpecific1,
IN PVOID Context,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
);
#endif
PCONTROL_TUNNEL
CtlAlloc(
PPPTP_ADAPTER pAdapter
);
PVOID
CtlAllocPacket(
PCONTROL_TUNNEL pCtl,
PPTP_MESSAGE_TYPE Message
);
VOID
CtlFree(PCONTROL_TUNNEL pCtl);
VOID
CtlFreePacket(
PCONTROL_TUNNEL pCtl,
PVOID pPacket
);
NDIS_STATUS
CtlListen(
IN PPPTP_ADAPTER pAdapter
);
VOID
CtlCleanup(
PCONTROL_TUNNEL pCtl,
BOOLEAN Locked
);
NDIS_STATUS
CtlConnectCall(
IN PPPTP_ADAPTER pAdapter,
IN PCALL_SESSION pCall,
IN PTA_IP_ADDRESS pTargetAddress
);
NDIS_STATUS
CtlDisconnectCall(
IN PCALL_SESSION pCall
);
NDIS_STATUS
CtlSend(
IN PCONTROL_TUNNEL pCtl,
IN PVOID pPacketBuffer
);
VOID
CtlpCleanupCtls(
PPPTP_ADAPTER pAdapter
);
#define FreeWorkItem(_pptp_item) MyMemFree((PVOID)(_pptp_item), sizeof(PPTP_WORK_ITEM))
NDIS_STATUS
InitThreading(
IN NDIS_HANDLE hMiniportAdapter
);
VOID
DeinitThreading();
VOID
InitCallLayer();
VOID
IpAddressToString(
IN ULONG ulIpAddress,
OUT CHAR* pszIpAddress );
VOID
MiniportHalt(
IN NDIS_HANDLE MiniportAdapterContext
);
NDIS_STATUS
MiniportInitialize(
OUT PNDIS_STATUS OpenErrorStatus,
OUT PUINT SelectedMediumIndex,
IN PNDIS_MEDIUM MediumArray,
IN UINT MediumArraySize,
IN NDIS_HANDLE NdisAdapterHandle,
IN NDIS_HANDLE WrapperConfigurationContext
);
NDIS_STATUS
MiniportQueryInformation(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesWritten,
OUT PULONG BytesNeeded
);
NDIS_STATUS
MiniportReset(
OUT PBOOLEAN AddressingReset,
IN NDIS_HANDLE MiniportAdapterContext
);
NDIS_STATUS
MiniportSetInformation(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesRead,
OUT PULONG BytesNeeded
);
NDIS_STATUS
MiniportWanSend(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_HANDLE NdisLinkHandle,
IN PNDIS_WAN_PACKET WanPacket
);
VOID
OsGetTapiLineAddress(ULONG Index, PUCHAR s, ULONG Length);
VOID
OsReadConfig(
NDIS_HANDLE hConfig
);
#if 0
VOID OsGetFullHostName(VOID);
#endif
NDIS_STATUS
OsSpecificTapiGetDevCaps(
ULONG_PTR ulDeviceId,
IN OUT PNDIS_TAPI_GET_DEV_CAPS pRequest
);
extern BOOLEAN PptpInitialized;
NDIS_STATUS
PptpInitialize(
PPPTP_ADAPTER pAdapter
);
NDIS_STATUS
ScheduleWorkItem(
WORK_PROC Callback,
PVOID Context,
PVOID InfoBuf,
ULONG InfoBufLen
);
PUCHAR
StringToIpAddress(
IN PUCHAR pszIpAddress,
IN OUT PTA_IP_ADDRESS pAddress,
OUT PBOOLEAN pValidAddress
);
PWCHAR
StringToIpAddressW(
IN PWCHAR pszIpAddress,
IN OUT PTA_IP_ADDRESS pAddress,
OUT PBOOLEAN pValidAddress
);
NDIS_STATUS
TapiAnswer(
IN PPPTP_ADAPTER pAdapter,
IN PNDIS_TAPI_ANSWER pRequest
);
NDIS_STATUS
TapiClose(
IN PPPTP_ADAPTER pAdapter,
IN PNDIS_TAPI_CLOSE pRequest
);
NDIS_STATUS
TapiCloseCall(
IN PPPTP_ADAPTER pAdapter,
IN PNDIS_TAPI_CLOSE_CALL pRequest
);
NDIS_STATUS
TapiDrop(
IN PPPTP_ADAPTER pAdapter,
IN PNDIS_TAPI_DROP pRequest
);
NDIS_STATUS
TapiGetAddressCaps(
IN PPPTP_ADAPTER pAdapter,
IN OUT PNDIS_TAPI_GET_ADDRESS_CAPS pRequest
);
NDIS_STATUS
TapiGetAddressStatus(
IN PPPTP_ADAPTER pAdapter,
IN OUT PNDIS_TAPI_GET_ADDRESS_STATUS pExtIdQuery
);
NDIS_STATUS
TapiGetCallInfo(
IN PPPTP_ADAPTER pAdapter,
IN OUT PNDIS_TAPI_GET_CALL_INFO pRequest,
IN OUT PULONG pRequiredLength
);
NDIS_STATUS
TapiGetCallStatus(
IN PPPTP_ADAPTER pAdapter,
IN OUT PNDIS_TAPI_GET_CALL_STATUS pRequest
);
NDIS_STATUS
TapiGetDevCaps(
IN PPPTP_ADAPTER pAdapter,
IN OUT PNDIS_TAPI_GET_DEV_CAPS pRequest
);
NDIS_STATUS
TapiGetExtensionId(
IN PPPTP_ADAPTER pAdapter,
IN OUT PNDIS_TAPI_GET_EXTENSION_ID pExtIdQuery
);
NDIS_STATUS
TapiGetId(
IN PPPTP_ADAPTER pAdapter,
IN OUT PNDIS_TAPI_GET_ID pRequest
);
#define TapiLineHandleToId(h) ((h)&0x7fffffff)
#define TapiIdToLineHandle(id) ((id)|0x80000000)
#define LinkHandleToId(h) ((ULONG_PTR)(((ULONG_PTR)(h))&0x7fffffff))
#define DeviceIdToLinkHandle(id) ((id)|0x80000000)
VOID
TapiLineDown(
PCALL_SESSION pCall
);
VOID
TapiLineUp(
PCALL_SESSION pCall
);
NDIS_STATUS
TapiMakeCall(
IN PPPTP_ADAPTER pAdapter,
IN OUT PNDIS_TAPI_MAKE_CALL pRequest
);
NDIS_STATUS
TapiNegotiateExtVersion(
IN PPPTP_ADAPTER pAdapter,
IN OUT PNDIS_TAPI_NEGOTIATE_EXT_VERSION pExtVersion
);
NDIS_STATUS
TapiOpen(
IN PPPTP_ADAPTER pAdapter,
IN OUT PNDIS_TAPI_OPEN pRequest
);
NDIS_STATUS
TapiProviderInitialize(
IN PPPTP_ADAPTER pAdapter,
IN OUT PNDIS_TAPI_PROVIDER_INITIALIZE pInitData
);
NDIS_STATUS
TapiProviderShutdown(
IN PPPTP_ADAPTER pAdapter,
IN OUT PNDIS_TAPI_PROVIDER_SHUTDOWN pRequest
);
NDIS_STATUS
TapiSetDefaultMediaDetection(
IN PPPTP_ADAPTER pAdapter,
IN OUT PNDIS_TAPI_SET_DEFAULT_MEDIA_DETECTION pRequest
);
NDIS_STATUS
TapiSetStatusMessages(
IN PPPTP_ADAPTER pAdapter,
IN OUT PNDIS_TAPI_SET_STATUS_MESSAGES pRequest
);
// Enum
#define ENUM_SIGNATURE TAG('ENUM')
typedef struct {
LIST_ENTRY ListEntry;
ULONG Signature;
} ENUM_CONTEXT, *PENUM_CONTEXT;
#define InitEnumContext(e) \
{ \
(e)->ListEntry.Flink = (e)->ListEntry.Blink = NULL; \
(e)->Signature = ENUM_SIGNATURE; \
}
PLIST_ENTRY FASTCALL
EnumListEntry(
IN PLIST_ENTRY pHead,
IN PENUM_CONTEXT pEnum,
IN PNDIS_SPIN_LOCK pLock
);
VOID
EnumComplete(
IN PENUM_CONTEXT pEnum,
IN PNDIS_SPIN_LOCK pLock
);
#endif // RASPPTP_H