/*++ 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: . // // 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 // 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 pair. // Each such pair could support one or more TDI Protocols, each identified by a // 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