|
|
/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
D:\nt\private\ntos\tdi\rawwan\core\nltdata.h
Abstract:
All private data structure definitions for Null Transport.
Revision History:
Who When What -------- -------- ---------------------------------------------- arvindm 04-17-97 Created
Notes:
--*/
#ifndef __TDI_RWANDATA__H
#define __TDI_RWANDATA__H
//
// Forward definitions
//
struct _RWAN_TDI_CONNECTION ; struct _RWAN_TDI_ADDRESS ; struct _RWAN_NDIS_VC ; struct _RWAN_NDIS_SAP ; struct _RWAN_NDIS_AF ; struct _RWAN_NDIS_AF_INFO ; struct _RWAN_TDI_PROTOCOL ;
struct _RWAN_CONN_REQUEST ; struct _RWAN_RECEIVE_INDICATION ;
typedef UCHAR RWAN_CONN_INSTANCE; typedef ULONG RWAN_CONN_ID;
//
// Completion routines.
//
typedef VOID (*PCOMPLETE_RTN)(PVOID CompletionContext, UINT, UINT);
typedef VOID (*PDATA_COMPLETE_RTN)(PVOID CompletionContext, UINT Status, UINT ByteCount);
typedef VOID (*PDELETE_COMPLETE_RTN)(PVOID CompletionContext);
//
// A structure to hold a call-back routine and context to
// be called when a structure is dereferenced away.
//
typedef struct _RWAN_DELETE_NOTIFY { PCOMPLETE_RTN pDeleteRtn; PVOID DeleteContext;
} RWAN_DELETE_NOTIFY, *PRWAN_DELETE_NOTIFY;
//
// ***** TDI Connection Object *****
//
// Our context for a TDI Connection Object. This is created during
// TdiOpenConnection(), and deleted during TdiCloseConnection().
//
// Reference Count keeps track of:
// - TdiOpenConnection
// - Linkage to Address Object
// - Linkage to NDIS VC or NDIS Party
// - Each party in list on VC (for C-Root)
// - Each work item queued for this Conn Object
//
typedef struct _RWAN_TDI_CONNECTION { #if DBG
ULONG ntc_sig; #endif
INT RefCount; USHORT State; USHORT Flags; // Pending events etc
PVOID ConnectionHandle; // TDI handle
struct _RWAN_TDI_ADDRESS * pAddrObject; // Associated Address Object
LIST_ENTRY ConnLink; // In list of connections on
// address object
RWAN_HANDLE AfSpConnContext; // Media-Sp module's context
RWAN_LOCK Lock; // Mutex
union { struct _RWAN_NDIS_VC * pNdisVc; struct _RWAN_NDIS_PARTY *pNdisParty; } NdisConnection; struct _RWAN_TDI_CONNECTION * pRootConnObject; // For PMP Calls
RWAN_CONN_INSTANCE ConnInstance; // Used to validate Conn Context
RWAN_DELETE_NOTIFY DeleteNotify; // Things to do on freeing this
struct _RWAN_CONN_REQUEST * pConnReq; // Info about a pended TDI request
NDIS_WORK_ITEM CloseWorkItem; // Used to schedule a Close
struct _RWAN_NDIS_VC * pNdisVcSave; #if DBG
ULONG ntcd_sig; USHORT OldState; USHORT OldFlags; #endif
} RWAN_TDI_CONNECTION, *PRWAN_TDI_CONNECTION;
#if DBG
#define ntc_signature 'cTwR'
#endif // DBG
#define NULL_PRWAN_TDI_CONNECTION ((PRWAN_TDI_CONNECTION)NULL)
//
// TDI Connection Object states
//
#define RWANS_CO_CREATED 0x0000 // After TdiOpenConnection
#define RWANS_CO_ASSOCIATED 0x0001 // After TdiAssociateAddress
#define RWANS_CO_LISTENING 0x0002 // After TdiListen
#define RWANS_CO_OUT_CALL_INITIATED 0x0003 // TdiConnect in progress
#define RWANS_CO_IN_CALL_INDICATED 0x0004 // Incoming call indicated to user
#define RWANS_CO_IN_CALL_ACCEPTING 0x0005 // TdiAccept in progress
#define RWANS_CO_CONNECTED 0x0006 // Connection established
#define RWANS_CO_DISCON_INDICATED 0x0007 // Incoming release indicated to user
#define RWANS_CO_DISCON_HELD 0x0008 // Incoming release not indicated to user
#define RWANS_CO_DISCON_REQUESTED 0x0009 // TdiDisconnect in progress
#define RWANS_CO_ABORTING 0x000A // Aborting
//
// TDI Connection Object flags
//
#define RWANF_CO_LEAF 0x0001 // This is a PMP leaf conn object
#define RWANF_CO_ROOT 0x0002 // This is a PMP root conn object
#define RWANF_CO_INDICATING_DATA 0x0010 // Receive processing going on
#define RWANF_CO_PAUSE_RECEIVE 0x0020 // The TDI Client has paused receiving
#define RWANF_CO_AFSP_CONTEXT_VALID 0x0040 // AfSpConnContext is valid
#define RWANF_CO_PENDED_DISCON 0x0100 // Pended a DisconInd until data ind is over
#define RWANF_CO_CLOSE_SCHEDULED 0x4000 // Scheduled work item for Closing
#define RWANF_CO_CLOSING 0x8000 // TdiCloseConnection in progress
//
// ***** TDI Address Object *****
//
// This is created on processing TdiOpenAddress, and deleted during
// TdiCloseAddress. If this is a non-NULL (i.e. listening) address object,
// we also register NDIS SAPs on all adapters supporting this address
// family.
//
// Reference Count keeps track of:
// - TdiOpenAddress
// - Each Connection Object associated with this
// - Each NDIS SAP registered for this
//
typedef struct _RWAN_TDI_ADDRESS { #if DBG
ULONG nta_sig; #endif // DBG
INT RefCount; USHORT State; USHORT Flags; // Pending events etc
struct _RWAN_TDI_PROTOCOL * pProtocol; // Back ptr to protocol
RWAN_HANDLE AfSpAddrContext; // Media-Sp module's context
struct _RWAN_TDI_CONNECTION * pRootConnObject; // For PMP Calls
LIST_ENTRY AddrLink; // In list of Address Objects
LIST_ENTRY IdleConnList; // After TDI_ASSOCIATE_ADDRESS
LIST_ENTRY ListenConnList; // After TDI_LISTEN
LIST_ENTRY ActiveConnList; // After connection setup
LIST_ENTRY SapList; // List of RWAN_NDIS_SAP structs
RWAN_EVENT Event; // Used for synchronization
RWAN_LOCK Lock; // Mutex
RWAN_DELETE_NOTIFY DeleteNotify; // Things to do on freeing this
PConnectEvent pConnInd; // Connect Indication up-call
PVOID ConnIndContext; // Context for Connect
PDisconnectEvent pDisconInd; // Disconnect Indication up-call
PVOID DisconIndContext; // Context for Disconnect
PErrorEvent pErrorInd; // Error Indication up-call
PVOID ErrorIndContext; // Context for Error
PRcvEvent pRcvInd; // Receive Indication up-call
PVOID RcvIndContext; // Context for Receive
USHORT AddressType; // From TdiOpenAddress
USHORT AddressLength; // From TdiOpenAddress
PVOID pAddress; // Protocol-dependent string
NDIS_STATUS SapStatus; // Failure from RegisterSap
} RWAN_TDI_ADDRESS, *PRWAN_TDI_ADDRESS;
#if DBG
#define nta_signature 'aTwR'
#endif // DBG
#define NULL_PRWAN_TDI_ADDRESS ((PRWAN_TDI_ADDRESS)NULL)
//
// Bit definitions for Flags in RWAN_TDI_ADDRESS
//
#define RWANF_AO_PMP_ROOT 0x0001 // Root of an outgoing PMP call
#define RWANF_AO_CLOSING 0x8000 // TdiCloseAddress() in progress
#define RWANF_AO_AFSP_CONTEXT_VALID 0x0040 // AfSpAddrContext is valid
//
// ***** NDIS VC Block *****
//
// Created during a CoCreateVc operation, and contains our context for
// an NDIS VC. For an outgoing call, creation is initiated by us, by
// calling NdisCoCreateVc. For an incoming call, the Call Manager initiates
// VC creation.
//
typedef struct _RWAN_NDIS_VC { #if DBG
ULONG nvc_sig; #endif
USHORT State; USHORT Flags; // Pending events etc
NDIS_HANDLE NdisVcHandle; // For all NDIS calls
struct _RWAN_TDI_CONNECTION * pConnObject; // To Connection Object
PCO_CALL_PARAMETERS pCallParameters; // Call setup parameters
struct _RWAN_NDIS_AF * pNdisAf; // Back pointer
struct _RWAN_NDIS_PARTY * pPartyMakeCall; // First party in PMP call
LIST_ENTRY VcLink; // In list of all VCs on AF
LIST_ENTRY NdisPartyList; // List of NDIS Party (PMP only)
ULONG AddingPartyCount; // Pending NdisClAddParty/MakeCall
ULONG ActivePartyCount; // Connected parties
ULONG DroppingPartyCount; // Pending NdisClDropParty
ULONG PendingPacketCount; // Pending send+rcv packets
ULONG MaxSendSize; struct _RWAN_RECEIVE_INDICATION *pRcvIndHead; // Head of the receive ind queue
struct _RWAN_RECEIVE_INDICATION *pRcvIndTail; // Tail of the receive ind queue
struct _RWAN_RECEIVE_REQUEST * pRcvReqHead; // Head of the receive req queue
struct _RWAN_RECEIVE_REQUEST * pRcvReqTail; // Tail of the receive req queue
#if DBG_LOG_PACKETS
ULONG DataLogSig; ULONG Index; struct _RWAND_DATA_LOG_ENTRY DataLog[MAX_RWAND_PKT_LOG]; #endif
} RWAN_NDIS_VC, *PRWAN_NDIS_VC;
#if DBG
#define nvc_signature 'cVwR'
#endif // DBG
#define NULL_PRWAN_NDIS_VC ((PRWAN_NDIS_VC)NULL)
//
// NDIS VC flags
//
#define RWANF_VC_OUTGOING 0x0001 // Created by us.
#define RWANF_VC_PMP 0x0002 // Point to Multipoint call
#define RWANF_VC_CLOSING_CALL 0x8000 // NdisClCloseCall in progress
#define RWANF_VC_NEEDS_CLOSE 0x4000 // Waiting for conditions to be right
// for NdisClCloseCall
//
// Various events seen on the VC
//
#define RWANF_VC_EVT_MAKECALL_OK 0x0010
#define RWANF_VC_EVT_MAKECALL_FAIL 0x0020
#define RWANF_VC_EVT_INCALL 0x0040
#define RWANF_VC_EVT_CALLCONN 0x0080
#define RWANF_VC_EVT_INCLOSE 0x0100
#define RWANF_VC_EVT_CLOSECOMP 0x0200
//
// ***** NDIS Party Block *****
//
// Represents our context for a party of an outgoing point to multipoint
// NDIS call. This is created on processing a Winsock2 JoinLeaf, and deleted
// when the leaf is no longer a member of the connection.
//
typedef struct _RWAN_NDIS_PARTY { #if DBG
ULONG npy_sig; #endif // DBG
USHORT State; USHORT Flags; // Pending events etc
NDIS_HANDLE NdisPartyHandle; // Supplied by NDIS
struct _RWAN_NDIS_VC * pVc; // Back pointer
struct _RWAN_TDI_CONNECTION * pConnObject; // To Connection Object
LIST_ENTRY PartyLink; // To next party on VC
PCO_CALL_PARAMETERS pCallParameters; // Party setup parameters
} RWAN_NDIS_PARTY, *PRWAN_NDIS_PARTY;
#if DBG
#define npy_signature 'yPwR'
#endif // DBG
#define NULL_PRWAN_NDIS_PARTY ((PRWAN_NDIS_PARTY)NULL)
#define RWANF_PARTY_DROPPING 0x8000
//
// ***** NDIS SAP Block *****
//
// This represents our context for an NDIS Service Access Point (SAP).
// When a new Address Object is created, and it represents a listening
// endpoint, we register SAPs on all adapters that support the bound
// address family. A SAP block contains information for one such SAP.
//
typedef struct _RWAN_NDIS_SAP { #if DBG
ULONG nsp_sig; #endif // DBG
struct _RWAN_TDI_ADDRESS * pAddrObject; // Back pointer
USHORT Flags; LIST_ENTRY AddrObjLink; // To list of SAPs on addr object
LIST_ENTRY AfLink; // To list of SAPs on AF
NDIS_HANDLE NdisSapHandle; // Supplied by NDIS
struct _RWAN_NDIS_AF * pNdisAf; // Back pointer
PCO_SAP pCoSap;
} RWAN_NDIS_SAP, *PRWAN_NDIS_SAP;
#if DBG
#define nsp_signature 'pSwR'
#endif // DBG
#define NULL_PRWAN_NDIS_SAP ((PRWAN_NDIS_SAP)NULL)
#define RWANF_SAP_CLOSING 0x8000
//
// ***** NDIS AF Block *****
//
// This represents our context for an NDIS Address Family open.
// When we get notified of a Call Manager that supports a protocol
// that is of interest to us, on an adapter that we are bound to,
// we open the AF represented by the Call Manager. This goes away
// when we unbind from the adapter.
//
// Note that there could be multiple Call Managers running over
// a single adapter, each supporting a different NDIS AF.
//
// An NDIS AF supports one or more Winsock2 triples: <Family, Type, Proto>.
//
// Reference Count keeps track of:
// - OpenAf
// - Each VC on this AF open
// - Each SAP on this AF open
//
typedef struct _RWAN_NDIS_AF { #if DBG
ULONG naf_sig; #endif // DBG
INT RefCount; // Reference Count
USHORT State; USHORT Flags; // Pending events etc
LIST_ENTRY AfLink; // In list of AFs on adapter
NDIS_HANDLE NdisAfHandle; // Supplied by NDIS
LIST_ENTRY NdisVcList; // List of open VCs
LIST_ENTRY NdisSapList; // List of registered SAPs
RWAN_HANDLE AfSpAFContext; // AF-specific module's context
// for this open
struct _RWAN_NDIS_ADAPTER * pAdapter; // Back pointer
struct _RWAN_NDIS_AF_INFO * pAfInfo; // Information about this NDIS AF
LIST_ENTRY AfInfoLink; // In list of AFs with same Info
RWAN_LOCK Lock; // Mutex
ULONG MaxAddrLength; // For this Address Family
RWAN_DELETE_NOTIFY DeleteNotify; // Things to do on freeing this
} RWAN_NDIS_AF, *PRWAN_NDIS_AF;
#if DBG
#define naf_signature 'fAwR'
#endif // DBG
#define NULL_PRWAN_NDIS_AF ((PRWAN_NDIS_AF)NULL)
#define RWANF_AF_CLOSING 0x8000
#define RWANF_AF_IN_ADAPTER_LIST 0x0001 // AfLink is valid
//
// ***** NDIS Adapter Block *****
//
// This is our context for an NDIS Adapter Binding. One of these is
// created for each adapter that we bind to.
//
typedef struct _RWAN_NDIS_ADAPTER { #if DBG
ULONG nad_sig; #endif
USHORT State; USHORT Flags; // Pending events etc
NDIS_HANDLE NdisAdapterHandle; // Supplied by NDIS
NDIS_MEDIUM Medium; // Supported by adapter
PNDIS_MEDIUM pMediaArray; // Used in NdisOpenAdapter
UINT MediumIndex; // Used in NdisOpenAdapter
PVOID BindContext; // From BindAdapter/UnbindAdapter
RWAN_LOCK Lock; // Mutex
LIST_ENTRY AdapterLink; // In list of all adapters
LIST_ENTRY AfList; // List of opened AFs on adapter
struct _RWAN_RECEIVE_INDICATION *pCompletedReceives; // List of completed rcv indns
NDIS_STRING DeviceName; // Name of adapter
} RWAN_NDIS_ADAPTER, *PRWAN_NDIS_ADAPTER;
#if DBG
#define nad_signature 'dAwR'
#endif // DBG
#define NULL_PRWAN_NDIS_ADAPTER ((PRWAN_NDIS_ADAPTER)NULL)
//
// Adapter states:
//
#define RWANS_AD_CREATED 0x0000
#define RWANS_AD_OPENING 0x0001
#define RWANS_AD_OPENED 0x0002
#define RWANS_AD_CLOSING 0x0003
//
// Adapter flags:
//
#define RWANF_AD_UNBIND_PENDING 0x0001
//
// ***** TDI Protocol Block *****
//
// Maintains information about one Winsock protocol <Family, Protocol, Type>
// supported by NullTrans. On NT, each TDI protocol block is represented
// by a Device Object.
//
typedef struct _RWAN_TDI_PROTOCOL { #if DBG
ULONG ntp_sig; #endif // DBG
UINT TdiProtocol; // Matches TdiOpenAddress
UINT SockAddressFamily; UINT SockProtocol; UINT SockType; PVOID pRWanDeviceObject; // NT: to RWAN_DEVICE_OBJECT
BOOLEAN bAllowAddressObjects; BOOLEAN bAllowConnObjects; USHORT MaxAddrLength; // For this TDI protocol
LIST_ENTRY AddrObjList; // List of open AddressObjects
LIST_ENTRY TdiProtocolLink; // In list of all TDI protocols
struct _RWAN_NDIS_AF_INFO * pAfInfo; // NDIS Address Family
LIST_ENTRY AfInfoLink; // List of TDI Protocols on AfInfo
RWAN_EVENT Event; // Used for synchronization
AFSP_DEREG_TDI_PROTO_COMP_HANDLER pAfSpDeregTdiProtocolComplete; TDI_PROVIDER_INFO ProviderInfo; TDI_PROVIDER_STATISTICS ProviderStats;
} RWAN_TDI_PROTOCOL, *PRWAN_TDI_PROTOCOL;
#if DBG
#define ntp_signature 'pTwR'
#endif // DBG
#define NULL_PRWAN_TDI_PROTOCOL ((PRWAN_TDI_PROTOCOL)NULL)
//
// ***** NDIS Address-Family Information Block *****
//
// This contains information about a supported <NDIS AF, NDIS Medium> pair.
// Each such pair could support one or more TDI Protocols, each identified by a
// <Family, Protocol, Type> triple.
//
typedef struct _RWAN_NDIS_AF_INFO { #if DBG
ULONG nai_sig; #endif // DBG
USHORT Flags; LIST_ENTRY AfInfoLink; // In list of supported NDIS AFs
LIST_ENTRY TdiProtocolList; // List of RWAN_TDI_PROTOCOL
LIST_ENTRY NdisAfList; // List of RWAN_NDIS_AF
RWAN_HANDLE AfSpContext; // AF-specific module's context
RWAN_NDIS_AF_CHARS AfChars;
} RWAN_NDIS_AF_INFO, *PRWAN_NDIS_AF_INFO;
#if DBG
#define nai_signature 'iAwR'
#endif // DBG
#define RWANF_AFI_CLOSING 0x8000
//
// ***** Global Information Block *****
//
// Root of all information for NullTrans. One of these structures exists
// per system.
//
typedef struct _RWAN_GLOBALS { #if DBG
ULONG nlg_sig; #endif // DBG
NDIS_HANDLE ProtocolHandle; // from NdisRegisterProtocol
LIST_ENTRY AfInfoList; // All supported NDIS AFs
ULONG AfInfoCount; // Size of above list
LIST_ENTRY ProtocolList; // All supported TDI protocols
ULONG ProtocolCount; // Size of above list
LIST_ENTRY AdapterList; // All bound adapters
ULONG AdapterCount; // Size of above list
RWAN_LOCK GlobalLock; // Mutex
RWAN_LOCK AddressListLock; // Mutex for AddrObject table
RWAN_LOCK ConnTableLock; // Mutex for ConnObject table
RWAN_CONN_INSTANCE ConnInstance; // Counts ConnId's allocated sofar
PRWAN_TDI_CONNECTION * pConnTable; // Pointers to open connections
ULONG ConnTableSize; // Size of above table
ULONG MaxConnections; // Max size of above table
ULONG NextConnIndex; // Starting point for next search
RWAN_EVENT Event; // Used for synchronization
BOOLEAN UnloadDone; // Has our UnloadProtocol run?
#ifdef NT
PDRIVER_OBJECT pDriverObject; // From DriverEntry()
LIST_ENTRY DeviceObjList; // All device objs we've created
#endif // NT
} RWAN_GLOBALS, *PRWAN_GLOBALS;
#if DBG
#define nlg_signature 'lGwR'
#endif // DBG
//
// ***** Request structure *****
//
// This structure keeps context information about each TDI request
// that we pend.
//
typedef struct _RWAN_REQUEST { #if DBG
ULONG nrq_sig; #endif // DBG
PCOMPLETE_RTN pReqComplete; // Call-back routine
PVOID ReqContext; // Context for above
TDI_STATUS Status; // Final status
} RWAN_REQUEST, *PRWAN_REQUEST;
#if DBG
#define nrq_signature 'qRwR'
#endif // DBG
//
// ***** Connect Request structure *****
//
// This structure is used to maintain information about a pended
// TDI_CONNECT or TDI_LISTEN or TDI_ACCEPT or TDI_DISCONNECT.
//
typedef struct _RWAN_CONN_REQUEST { #if DBG
ULONG nrc_sig; #endif // DBG
struct _RWAN_REQUEST Request; // Common stuff
struct _TDI_CONNECTION_INFORMATION * pConnInfo; // Return info
USHORT Flags;
} RWAN_CONN_REQUEST, *PRWAN_CONN_REQUEST;
#if DBG
#define nrc_signature 'cRwR'
#endif // DBG
//
// ***** Data Request structure *****
//
// This is the common part of a send/receive data request.
//
typedef struct _RWAN_DATA_REQUEST { PDATA_COMPLETE_RTN pReqComplete; PVOID ReqContext;
} RWAN_DATA_REQUEST, *PRWAN_DATA_REQUEST;
//
// ***** Send Request structure *****
//
// This structure is used to maintain information about a pended
// TDI_SEND.
//
typedef struct _RWAN_SEND_REQUEST { #if DBG
ULONG nrs_sig; #endif // DBG
struct _RWAN_DATA_REQUEST Request; // Common stuff
USHORT SendFlags; UINT SendLength;
} RWAN_SEND_REQUEST, *PRWAN_SEND_REQUEST;
#if DBG
#define nrs_signature 'sRwR'
#endif // DBG
//
// ***** Receive Request structure *****
//
// This structure is used to maintain information about a pended
// TDI_RECEIVE.
//
typedef struct _RWAN_RECEIVE_REQUEST { #if DBG
ULONG nrr_sig; #endif // DBG
struct _RWAN_RECEIVE_REQUEST * pNextRcvReq; // For chaining
struct _RWAN_DATA_REQUEST Request; // Common stuff
PUSHORT pUserFlags; // Info about the rcv
UINT TotalBufferLength; // From TdiReceive
UINT AvailableBufferLength; // out of the above
PNDIS_BUFFER pBuffer; // Current buffer in chain
PUCHAR pWriteData; // Write pointer
UINT BytesLeftInBuffer; // Left in current buffer
} RWAN_RECEIVE_REQUEST, *PRWAN_RECEIVE_REQUEST;
#if DBG
#define nrr_signature 'rRwR'
#endif // DBG
//
// ***** Receive Indication structure *****
//
// This structure is used to maintain information about one
// indicated NDIS packet.
//
typedef struct _RWAN_RECEIVE_INDICATION { #if DBG
ULONG nri_sig; #endif // DBG
struct _RWAN_RECEIVE_INDICATION * pNextRcvInd; // For chaining
PNDIS_BUFFER pBuffer; // Next byte is read from
// this buffer:
PUCHAR pReadData; // Points to next byte
// to be read
UINT BytesLeftInBuffer; UINT TotalBytesLeft; // Within this packet
PNDIS_PACKET pPacket; UINT PacketLength; BOOLEAN bIsMiniportPacket; // Does this packet
// belong to the miniport
PRWAN_NDIS_VC pVc; // back-pointer
} RWAN_RECEIVE_INDICATION, *PRWAN_RECEIVE_INDICATION;
#if DBG
#define nri_signature 'iRwR'
#endif // DBG
//
// Saved context for an NDIS Request sent to the miniport on behalf of
// an AF/media specific module.
//
typedef struct _RWAN_NDIS_REQ_CONTEXT { struct _RWAN_NDIS_AF * pAf; RWAN_HANDLE AfSpReqContext;
} RWAN_NDIS_REQ_CONTEXT, *PRWAN_NDIS_REQ_CONTEXT;
#endif // __TDI_RWANDATA__H
|