/*++ Copyright (c) 1989 Microsoft Corporation Module Name: transprt.h Abstract: This module implements all transport related functions in the SMB connection engine Revision History: Balan Sethu Raman [SethuR] 6-March-1995 Notes: --*/ #ifndef _TRANSPRT_H_ #define _TRANSPRT_H_ // The SMBCE_TRANSPORT data structure encapsulates all the information w.r.t a // particular transport for the connection engine. All the transports that are // of interest to the SMB mini redirector are maintained in a doubly linked list // // The connection engine tries all the transports in this list when trying to // establish a connection to a server. Currently only connection oriented // transports are handled. typedef struct _SMBCE_TRANSPORT_ { SMBCE_OBJECT_HEADER; RXCE_TRANSPORT RxCeTransport; RXCE_ADDRESS RxCeAddress; ULONG Priority; // the priority in the binding list. BOOLEAN Active; // Additional information regarding quality of service and other selection // criterion for a transport will be included here. } SMBCE_TRANSPORT, *PSMBCE_TRANSPORT; typedef struct _SMBCE_TRANSPORT_ARRAY_ { ULONG ReferenceCount; ULONG Count; PSMBCE_TRANSPORT *SmbCeTransports; PRXCE_ADDRESS *LocalAddresses; } SMBCE_TRANSPORT_ARRAY, *PSMBCE_TRANSPORT_ARRAY; typedef struct _SMBCE_TRANSPORTS_ { RX_SPIN_LOCK Lock; PSMBCE_TRANSPORT_ARRAY pTransportArray; } SMBCE_TRANSPORTS, *PSMBCE_TRANSPORTS; extern SMBCE_TRANSPORTS MRxSmbTransports; // Transport entries are added to the list of known transports upon receipt of // PnP notifications. Currently the list is static since transport disabling // notifications are not handled by the underlying TDI/PnP layer. // The following routines provide the ability for adding/deleting entries to // this list. extern PSMBCE_TRANSPORT_ARRAY SmbCeReferenceTransportArray(VOID); extern NTSTATUS SmbCeDereferenceTransportArray(PSMBCE_TRANSPORT_ARRAY pTransportArray); extern NTSTATUS SmbCeAddTransport(PSMBCE_TRANSPORT pTransport); extern NTSTATUS SmbCeRemoveTransport(PSMBCE_TRANSPORT pTransport); #define SmbCeGetAvailableTransportCount() \ (MRxSmbTransports.Count) // The connection engine maintains a reference count associated with each transport // which indicates the number of servers that are using the transport. This will // eventually provide the mechanism for disabling/enabling transport on receipt // of PnP notifications. #define SmbCeReferenceTransport(pTransport) \ SmbCepReferenceTransport(pTransport) #define SmbCeDereferenceTransport(pTransport) \ SmbCepDereferenceTransport(pTransport) // The server transport types encapsulate the various usages of the underlying // transport to communicate with a server. For example the type of interactions // with a mailslot server ( primarily datagrams ) is very different from the // interactions with a FILE SERVER ( connection oriented send/receives). The // type of interactions can be further classified by the underlying connection // characterstics, e.g., connecting to a FILE_SERVER over a RAS connection as // opposed to connecting to a file server over EtherNet. // // The interactions are currently classified into four types, MAILSOT, Virtual // Circuit, Datagram and Htbrid ( VC + Datagram ). // // The type chosen will depend upon the characterstics of the available // connection. Each type is associated with its own dispatch vector which // encapsulates the interaction between the connection engine and the transport. // // This includes Send,Receive, Receive Ind. etc. These are modelled after the // TDI interfaces. typedef enum _SMBCE_SERVER_TRANSPORT_TYPE_ { SMBCE_STT_MAILSLOT = 1, SMBCE_STT_VC = 2, SMBCE_STT_DATAGRAM = 4, SMBCE_STT_HYBRID = 8 } SMBCE_SERVER_TRANSPORT_TYPE, *PSMBCE_SERVER_TRANSPORT_TYPE; typedef struct SMBCE_SERVER_TRANSPORT { SMBCE_OBJECT_HEADER; struct TRANSPORT_DISPATCH_VECTOR *pDispatchVector; struct _SMBCE_TRANSPORT_ *pTransport; PKEVENT pRundownEvent; // used for finalization. ULONG MaximumSendSize; // max data size } SMBCE_SERVER_TRANSPORT, *PSMBCE_SERVER_TRANSPORT; // The SMBCE_SERVER_TRANSPORT instances are reference counted. The following // routines provide the referencing mechanism. Defining them as macros also // provides us with a easy debugging capability, i.e., it can be easily modified // to include a FILE/LINE number each time an instance is referenced and // dereferenced #define SmbCeReferenceServerTransport(pServerTransportPointer) \ SmbCepReferenceServerTransport(pServerTransportPointer) #define SmbCeDereferenceServerTransport(pServerTransportPointer) \ SmbCepDereferenceServerTransport(pServerTransportPointer) // The server transport establishment mechanism requires a callback mechanism // to handle the asynchronous connection establishment cases. typedef VOID (*PSMBCE_SERVER_TRANSPORT_CONSTRUCTION_CALLBACK)( PVOID pContext); typedef VOID (*PSMBCE_SERVER_TRANSPORT_DESTRUCTION_CALLBACK)( PVOID pContext); typedef enum _SMBCE_SERVER_TRANSPORT_CONSTRUCTION_STATE { SmbCeServerTransportConstructionBegin, SmbCeServerMailSlotTransportConstructionBegin, SmbCeServerMailSlotTransportConstructionEnd, SmbCeServerVcTransportConstructionBegin, SmbCeServerVcTransportConstructionEnd, SmbCeServerTransportConstructionEnd } SMBCE_SERVER_TRANSPORT_CONSTRUCTION_STATE, *PSMBCE_SERVER_TRANSPORT_CONSTRUCTION_STATE; typedef struct _SMBCE_SERVER_TRANSPORT_CONSTRUCTION_CONTEXT { NTSTATUS Status; SMBCE_SERVER_TRANSPORT_CONSTRUCTION_STATE State; PSMBCE_SERVER_TRANSPORT_CONSTRUCTION_CALLBACK pCompletionRoutine; PMRX_SRVCALL_CALLBACK_CONTEXT pCallbackContext; PKEVENT pCompletionEvent; PSMBCEDB_SERVER_ENTRY pServerEntry; ULONG TransportsToBeConstructed; PSMBCE_SERVER_TRANSPORT pMailSlotTransport; PSMBCE_SERVER_TRANSPORT pTransport; RX_WORK_QUEUE_ITEM WorkQueueItem; } SMBCE_SERVER_TRANSPORT_CONSTRUCTION_CONTEXT, *PSMBCE_SERVER_TRANSPORT_CONSTRUCTION_CONTEXT; // The SERVER transport dispatch vector prototypes typedef NTSTATUS (*PTRANSPORT_DISPATCH_SEND)( PSMBCE_SERVER_TRANSPORT pTransport, PSMBCEDB_SERVER_ENTRY pServerEntry, ULONG SendOptions, PMDL pSmbMdl, ULONG SendLength, PVOID pSendCompletionContext); typedef NTSTATUS (*PTRANSPORT_DISPATCH_SEND_DATAGRAM)( PSMBCE_SERVER_TRANSPORT pTransport, PSMBCEDB_SERVER_ENTRY pServerEntry, ULONG SendOptions, PMDL pSmbMdl, ULONG SendLength, PVOID pSendCompletionContext); typedef NTSTATUS (*PTRANSPORT_DISPATCH_TRANCEIVE)( PSMBCE_SERVER_TRANSPORT pTransport, PSMBCEDB_SERVER_ENTRY pServerEntry, PSMB_EXCHANGE pExchange, ULONG SendOptions, PMDL pSmbMdl, ULONG SendLength, PVOID pSendCompletionContext); typedef NTSTATUS (*PTRANSPORT_DISPATCH_RECEIVE)( PSMBCE_SERVER_TRANSPORT pTransport, PSMBCEDB_SERVER_ENTRY pServerEntry, PSMB_EXCHANGE pExchange); typedef NTSTATUS (*PTRANSPORT_DISPATCH_INITIALIZE_EXCHANGE)( PSMBCE_SERVER_TRANSPORT pTransport, PSMB_EXCHANGE pExchange); typedef NTSTATUS (*PTRANSPORT_DISPATCH_UNINITIALIZE_EXCHANGE)( PSMBCE_SERVER_TRANSPORT pTransport, PSMB_EXCHANGE pExchange); typedef VOID (*PTRANSPORT_DISPATCH_TEARDOWN)( PSMBCE_SERVER_TRANSPORT pTransport); typedef NTSTATUS (*PTRANSPORT_DISPATCH_INITIATE_DISCONNECT)( PSMBCE_SERVER_TRANSPORT pTransport); typedef struct TRANSPORT_DISPATCH_VECTOR { PTRANSPORT_DISPATCH_SEND Send; PTRANSPORT_DISPATCH_SEND_DATAGRAM SendDatagram; PTRANSPORT_DISPATCH_TRANCEIVE Tranceive; PTRANSPORT_DISPATCH_RECEIVE Receive; PRX_WORKERTHREAD_ROUTINE TimerEventHandler; PTRANSPORT_DISPATCH_INITIALIZE_EXCHANGE InitializeExchange; PTRANSPORT_DISPATCH_UNINITIALIZE_EXCHANGE UninitializeExchange; PTRANSPORT_DISPATCH_TEARDOWN TearDown; PTRANSPORT_DISPATCH_INITIATE_DISCONNECT InitiateDisconnect; } TRANSPORT_DISPATCH_VECTOR, *PTRANSPORT_DISPATCH_VECTOR; // A macro for invoking a routine through the SMBCE_SERVER_TRANSPORT // dispatch vector. #define SMBCE_TRANSPORT_DISPATCH(pServerEntry,Routine,Arguments) \ (*((pServerEntry)->pTransport->pDispatchVector->Routine))##Arguments // The currently known transport type dispatch vectors and the mechanisms // for instanting an instance. extern TRANSPORT_DISPATCH_VECTOR MRxSmbVctTransportDispatch; extern TRANSPORT_DISPATCH_VECTOR MRxSmbMsTransportDispatch; extern NTSTATUS MsInstantiateServerTransport( IN OUT PSMBCE_SERVER_TRANSPORT_CONSTRUCTION_CONTEXT pContext); extern NTSTATUS VctInstantiateServerTransport( IN OUT PSMBCE_SERVER_TRANSPORT_CONSTRUCTION_CONTEXT pContext); extern VOID SmbCeConstructServerTransport( IN OUT PSMBCE_SERVER_TRANSPORT_CONSTRUCTION_CONTEXT pContext); // The following routines constitute the interface by which the clients of // the connection engine initialize/send/receive/uninitialize data to the // remote servers extern NTSTATUS SmbCeInitializeExchangeTransport( PSMB_EXCHANGE pExchange); extern NTSTATUS SmbCeUninitializeExchangeTransport( PSMB_EXCHANGE pExchange); extern NTSTATUS SmbCeInitiateDisconnect( IN OUT PSMBCEDB_SERVER_ENTRY pServerEntry); // The routines for constructing the transports provide the flexibility to // construct certain combination of transports. This is provided by the // SmbCepInitializeServerTransport routine and the different flavours of // construction routines provided #define SMBCE_CONSTRUCT_ALL_TRANSPORTS \ (SMBCE_STT_MAILSLOT | SMBCE_STT_VC) extern NTSTATUS SmbCepInitializeServerTransport( PSMBCEDB_SERVER_ENTRY pServerEntry, PSMBCE_SERVER_TRANSPORT_CONSTRUCTION_CALLBACK pCallbackRoutine, PMRX_SRVCALL_CALLBACK_CONTEXT pCallbackContext, ULONG TransportsToBeConsstructed); #define SmbCeInitializeServerTransport(pServerEntry,pCallbackRoutine,pCallbackContext) \ SmbCepInitializeServerTransport( \ (pServerEntry), \ (pCallbackRoutine), \ (pCallbackContext), \ SMBCE_CONSTRUCT_ALL_TRANSPORTS) #define SmbCeInitializeServerMailSlotTransport(pServerEntry,pCallbackRoutine,pCallbackContext) \ SmbCepInitializeServerTransport( \ (pServerEntry), \ (pCallbackRoutine), \ (pCallbackContext), \ SMBCE_STT_MAILSLOT) extern NTSTATUS SmbCeUninitializeServerTransport( PSMBCEDB_SERVER_ENTRY pServerEntry, PSMBCE_SERVER_TRANSPORT_DESTRUCTION_CALLBACK pCallbackRoutine, PVOID pCallbackContext); extern VOID SmbCeCompleteUninitializeServerTransport( PSMBCEDB_SERVER_ENTRY pServerEntry); extern NTSTATUS SmbCepReferenceTransport( IN OUT PSMBCE_TRANSPORT pTransport); extern NTSTATUS SmbCepDereferenceTransport( IN OUT PSMBCE_TRANSPORT pTransport); extern PSMBCE_TRANSPORT SmbCeFindTransport( PUNICODE_STRING pTransportName); extern NTSTATUS SmbCepReferenceServerTransport( IN OUT PSMBCE_SERVER_TRANSPORT *pTransportPointer); extern NTSTATUS SmbCepDereferenceServerTransport( IN OUT PSMBCE_SERVER_TRANSPORT *pTransportPointer); extern PFILE_OBJECT SmbCepReferenceEndpointFileObject( IN PSMBCE_SERVER_TRANSPORT pTransport); extern NTSTATUS SmbCeSend( PSMB_EXCHANGE pExchange, ULONG SendOptions, PMDL pSmbMdl, ULONG SendLength); extern NTSTATUS SmbCeSendToServer( PSMBCEDB_SERVER_ENTRY pServerEntry, ULONG SendOptions, PMDL pSmbMdl, ULONG SendLength); extern NTSTATUS SmbCeSendDatagram( PSMB_EXCHANGE pExchange, ULONG SendOptions, PMDL pSmbMdl, ULONG SendLength); extern NTSTATUS SmbCeTranceive( PSMB_EXCHANGE pExchange, ULONG SendOptions, PMDL pRxCeDataBuffer, ULONG SendLength); extern NTSTATUS SmbCeReceive( PSMB_EXCHANGE pExchange); // // Call ups from the transport to the connection engine // extern NTSTATUS SmbCeReceiveInd( IN PSMBCEDB_SERVER_ENTRY pServerEntry, IN ULONG BytesIndicated, IN ULONG BytesAvailable, OUT ULONG *pBytesTaken, IN PVOID pTsdu, // pointer describing this TSDU, typically a lump of bytes OUT PMDL *pDataBufferPointer, // the buffer in which data is to be copied. OUT PULONG pDataBufferSize, // amount of data to copy IN ULONG ReceiveFlags ); extern NTSTATUS SmbCeDataReadyInd( IN PSMBCEDB_SERVER_ENTRY pServerEntry, IN PMDL pBuffer, IN ULONG DataSize, IN NTSTATUS DataReadyStatus ); extern NTSTATUS SmbCeErrorInd( IN PSMBCEDB_SERVER_ENTRY pServerEntry, IN NTSTATUS IndicatedStatus ); extern NTSTATUS SmbCeSendCompleteInd( IN PSMBCEDB_SERVER_ENTRY pServerEntry, IN PVOID pCompletionContext, IN NTSTATUS SendCompletionStatus ); extern VOID MRxSmbLogTransportError( PUNICODE_STRING pTransportName, PUNICODE_STRING pDomainName, NTSTATUS Status, ULONG Id); #endif // _TRANSPRT_H_