|
|
/*++
Copyright (c) 1995-1998 Microsoft Corporation
Module Name:
RCANdis.h
Abstract:
The module defines the constants, structures and function templates for the NDIS side of RCA
Author:
Shyam Pather (SPATHER)
Revision History:
Who When What -------- -------- ---------------------------------------------- SPATHER 04-20-99 Created / adapted from original RCA code by RMachin/JameelH
--*/
#ifndef _RCANDIS__H
#define _RCANDIS__H
#define RCA_CL_NAME L"RCA"
#define RCA_SAP_STRING L"WAN/RCA"
#define MAX_HASH_SIZE 64
#define NDIS_MAJOR_VERSION 0x05
#define NDIS_MINOR_VERSION 0x00
typedef VOID (*PFN_RCARECEIVE_CALLBACK) ( IN PVOID RcaVcContext, IN PVOID ClientReceiveContext, IN PNDIS_PACKET pPacket );
//
// Will be called with lock held.
//
typedef VOID (*PFN_RCASENDCOMPLETE_CALLBACK) ( IN PVOID RcaVcContext, IN PVOID ClientSendContext, IN PVOID PacketContext, IN PMDL pSentMdl, IN NDIS_STATUS Status );
//
// will be called at DISPATCH_LEVEL
// must not use vc context after this
//
typedef VOID (*PFN_VCCLOSE_CALLBACK) ( IN PVOID RcaVcContext, IN PVOID ClientReceiveContext, IN PVOID ClientSendContext );
typedef struct _RCA_CO_NDIS_HANDLERS { PFN_RCARECEIVE_CALLBACK ReceiveCallback; PFN_RCASENDCOMPLETE_CALLBACK SendCompleteCallback; PFN_VCCLOSE_CALLBACK VcCloseCallback; } RCA_CO_NDIS_HANDLERS, *PRCA_CO_NDIS_HANDLERS;
//
// Structure to hold info about how many bindings/SAP registrations we've made.
//
typedef struct _RCA_BINDING_INFO { ULONG AdapterCnt; ULONG SAPCnt; BOOL BindingsComplete; RCABlockStruc Block; } RCA_BINDING_INFO, *PRCA_BINDING_INFO;
//
// Forward references
//
typedef struct _RCA_VC RCA_VC, *PRCA_VC; typedef struct _RCA_ADAPTER RCA_ADAPTER, *PRCA_ADAPTER;
typedef struct _RCA_PROTOCOL_CONTEXT { #if DBG
ULONG rca_sig; #endif
PRCA_ADAPTER AdapterList; PRCA_VC VcHashTable[MAX_HASH_SIZE]; NDIS_SPIN_LOCK SpinLock; NDIS_HANDLE RCAClProtocolHandle; RCA_BINDING_INFO BindingInfo; RCA_CO_NDIS_HANDLERS Handlers; } RCA_PROTOCOL_CONTEXT, *PRCA_PROTOCOL_CONTEXT;
extern RCA_PROTOCOL_CONTEXT GlobalContext;
typedef struct _RCA_VC { #if DBG
ULONG rca_sig; #endif
struct _RCA_VC *NextVcOnAdapter; struct _RCA_VC **PrevVcOnAdapter; struct _RCA_VC *NextVcOnHash; struct _RCA_VC **PrevVcOnHash; struct _RCA_ADAPTER *pAdapter; ULONG Flags; ULONG RefCount; NDIS_SPIN_LOCK SpinLock; ULONGLONG uqBytesRead; NDIS_HANDLE NdisVcHandle; CO_CALL_PARAMETERS CallParameters; RCABlockStruc CloseBlock; ULONG ClosingState; PVOID ClientReceiveContext; PVOID ClientSendContext; LONG PendingSends; } RCA_VC, *PRCA_VC;
#define VC_ACTIVE 0x0001
#define VC_CLOSING 0x8000
#define CLOSING_INCOMING_CLOSE 0x01
#define CLOSING_CLOSE_COMPLETE 0x02
#define CLOSING_DELETE_VC 0x04
#define HASH_VC(_VcContext) (PtrToUlong((PVOID)(((ULONG_PTR)_VcContext >> 4) % MAX_HASH_SIZE)))
//
// We allocate one RCA_ADAPTER structure for each adapter that
// the RCA opens. A pointer to this structure is passed to NdisOpenAdapter
// as the BindingContext.
//
typedef struct _RCA_ADAPTER { #if DBG
ULONG rca_sig; #endif
ULONG AdapterFlags;
#define RCA_ADAPTERFLAGS_DEACTIVATE_IN_PROGRESS 0x0001
#define RCA_ADAPTERFLAGS_DEACTIVATE_COMPLETE 0x0002
#define RCA_ADAPTERFLAGS_DEREG_SAP 0x0004
#define RCA_ADAPTERFLAGS_DEREG_SAP_COMPLETE 0x0008
#define RCA_ADAPTERFLAGS_CLOSE_AF 0x0010
#define RCA_ADAPTERFLAGS_CLOSE_AF_COMPLETE 0x0020
#define RCA_ADAPTERFLAGS_UNBIND_IN_PROGRESS 0x0040
#define RCA_ADAPTERFLAGS_UNBIND_COMPLETE 0x0080
ULONG AfRegisteringCount; RCABlockStruc AfRegisterBlock; ULONG AfOpenCount; ULONG OldAdapterFlags; struct _RCA_ADAPTER *NextAdapter; struct _RCA_ADAPTER **PrevAdapter; struct _RCA_VC *VcList; NDIS_HANDLE NdisBindingHandle; // set by NdisOpenAdapter
NDIS_HANDLE NdisAfHandle; // set by NDIS on NdisOpenAddressFamily
NDIS_HANDLE NdisSapHandle; // For calls to NDIS re this SAP
RCABlockStruc Block; // used to block current thread
NDIS_SPIN_LOCK SpinLock; NDIS_WORK_ITEM DeactivateWorkItem; RCABlockStruc DeactivateBlock; NDIS_HANDLE SendBufferPool; NDIS_HANDLE RecvBufferPool; NDIS_HANDLE SendPacketPool; NDIS_HANDLE RecvPacketPool; RCABlockStruc CloseBlock; BOOL BlockedOnClose; } RCA_ADAPTER, *PRCA_ADAPTER;
#define RCA_SET_ADAPTER_FLAG_LOCKED(_pAdapter, _FlagValue) \
ACQUIRE_SPIN_LOCK(&_pAdapter->SpinLock); \ _pAdapter->AdapterFlags |= _FlagValue; \ RELEASE_SPIN_LOCK(&_pAdapter->SpinLock);
#define RCA_CLEAR_ADAPTER_FLAG_LOCKED(_pAdapter, _FlagValue) \
ACQUIRE_SPIN_LOCK(&_pAdapter->SpinLock); \ _pAdapter->AdapterFlags &= ~_FlagValue; \ RELEASE_SPIN_LOCK(&_pAdapter->SpinLock);
extern NDIS_STATUS RCACoNdisInitialize( IN PRCA_CO_NDIS_HANDLERS pHandlers, IN ULONG ulInitTimeout );
extern VOID RCACoNdisUninitialize( );
extern NDIS_STATUS RCACoNdisGetVcContextForReceive( IN UNICODE_STRING VcHandle, IN PVOID ClientReceiveContext, OUT PVOID *VcContext );
extern NDIS_STATUS RCACoNdisGetVcContextForSend( IN UNICODE_STRING VcHandle, IN PVOID ClientSendContext, OUT PVOID *VcContext );
extern NDIS_STATUS RCACoNdisReleaseSendVcContext( IN PVOID VcContext );
extern NDIS_STATUS RCACoNdisReleaseReceiveVcContext( IN PVOID VcContext );
extern NDIS_STATUS RCACoNdisCloseCallOnVc( IN PVOID VcContext );
extern NDIS_STATUS RCACoNdisCloseCallOnVcNoWait( IN PVOID VcContext );
extern NDIS_STATUS RCACoNdisSendFrame( IN PVOID VcContext, IN PMDL pMdl, IN PVOID PacketContext );
extern NDIS_STATUS RCACoNdisGetMdlFromPacket( IN PNDIS_PACKET pPacket, OUT PMDL *ppMdl );
extern VOID RCACoNdisReturnPacket( IN PNDIS_PACKET pPacket );
extern NDIS_STATUS RCACoNdisGetMaxSduSizes( IN PVOID VcContext, OUT ULONG *RxMaxSduSize, OUT ULONG *TxMaxSduSize );
extern NDIS_STATUS RCAPnPSetPower( IN PRCA_ADAPTER pAdapter, IN PNET_PNP_EVENT NetPnPEvent );
extern NDIS_STATUS RCAPnPQueryPower( IN PRCA_ADAPTER pAdapter, IN PNET_PNP_EVENT NetPnPEvent );
extern NDIS_STATUS RCAPnPQueryRemoveDevice( IN PRCA_ADAPTER pAdapter, IN PNET_PNP_EVENT NetPnPEvent );
extern NDIS_STATUS RCAPnPCancelRemoveDevice( IN PRCA_ADAPTER pAdapter, IN PNET_PNP_EVENT NetPnPEvent );
extern NDIS_STATUS RCAPnPEventBindsComplete( IN PRCA_ADAPTER pAdapter, IN PNET_PNP_EVENT NetPnPEvent );
extern NDIS_STATUS RCAPnPEventHandler( IN NDIS_HANDLE ProtocolBindingContext, IN PNET_PNP_EVENT NetPnPEvent );
extern VOID RCABindAdapter( OUT PNDIS_STATUS pStatus, IN NDIS_HANDLE BindContext, IN PNDIS_STRING DeviceName, IN PVOID SystemSpecific1, IN PVOID SystemSpecific2 );
extern VOID RCAOpenAdaperComplete( IN NDIS_HANDLE BindingContext, IN NDIS_STATUS Status, IN NDIS_STATUS OpenErrorStatus );
extern VOID RCADeactivateAdapterWorker( IN PNDIS_WORK_ITEM pWorkItem, IN PVOID Context );
extern VOID RCADeactivateAdapter( IN PRCA_ADAPTER pAdapter );
extern VOID RCAUnbindAdapter( OUT PNDIS_STATUS pStatus, IN NDIS_HANDLE ProtocolBindContext, IN PNDIS_HANDLE UnbindContext );
extern VOID RCAOpenAdapterComplete( IN NDIS_HANDLE BindingContext, IN NDIS_STATUS Status, IN NDIS_STATUS OpenErrorStatus );
extern VOID RCACloseAdapterComplete( IN NDIS_HANDLE BindingContext, IN NDIS_STATUS Status );
extern VOID RCANotifyAfRegistration( IN NDIS_HANDLE BindingContext, IN PCO_ADDRESS_FAMILY pFamily );
extern VOID RCAOpenAfComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolAfContext, IN NDIS_HANDLE NdisAfHandle );
extern VOID RCACloseAfComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolAfContext );
extern VOID RCARegisterSapComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolSapContext, IN PCO_SAP pSap, IN NDIS_HANDLE NdisSapHandle );
extern VOID RCADeregisterSapComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolSapContext );
//
// Dummy NDIS functions
//
extern VOID RCATransferDataComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status, IN UINT BytesTransferred);
extern VOID RCAResetComplete( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status );
extern VOID RCARequestComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_REQUEST NdisRequest, IN NDIS_STATUS Status );
extern NDIS_STATUS RCAReceive( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookAheadBuffer, IN UINT LookAheadBufferSize, IN UINT PacketSize );
extern INT RCAReceivePacket( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet );
extern VOID RCAStatus( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS GeneralStatus, IN PVOID StatusBuffer, IN UINT StatusBufferSize );
extern VOID RCAStatusComplete( IN NDIS_HANDLE ProtocolBindingContext );
extern VOID RCACoStatus( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE ProtocolVcContext OPTIONAL, IN NDIS_STATUS GeneralStatus, IN PVOID StatusBuffer, IN UINT StatusBufferSize );
extern VOID RCASendComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status );
extern VOID RCAModifyCallQosComplete( IN NDIS_STATUS status, IN NDIS_HANDLE ProtocolVcContext, IN PCO_CALL_PARAMETERS CallParameters );
extern VOID RCAAddPartyComplete( IN NDIS_STATUS status, IN NDIS_HANDLE ProtocolPartyContext, IN NDIS_HANDLE NdisPartyHandle, IN PCO_CALL_PARAMETERS CallParameters );
extern VOID RCADropPartyComplete( IN NDIS_STATUS status, IN NDIS_HANDLE ProtocolPartyContext );
extern VOID RCAIncomingCallQosChange( IN NDIS_HANDLE ProtocolVcContext, IN PCO_CALL_PARAMETERS CallParameters );
extern VOID RCAIncomingDropParty( IN NDIS_STATUS DropStatus, IN NDIS_HANDLE ProtocolPartyContext, IN PVOID CloseData OPTIONAL, IN UINT Size OPTIONAL );
extern VOID RCACoRequestComplete( IN NDIS_STATUS NdisStatus, IN NDIS_HANDLE ProtocolAfContext, IN NDIS_HANDLE ProtocolVcContext OPTIONAL, IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, IN OUT PNDIS_REQUEST NdisRequest );
//
// Co-NDIS client stuff.
//
extern BOOLEAN RCAReferenceVc( IN PRCA_VC pRcaVc );
extern VOID RCADereferenceVc( IN PRCA_VC pRcaVc );
extern VOID RCACoSendComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolVcContext, IN PNDIS_PACKET pNdisPacket );
extern UINT RCACoReceivePacket( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE ProtocolVcContext, IN PNDIS_PACKET pNdisPacket );
extern VOID RCAReceiveComplete( IN NDIS_HANDLE ProtocolBindingContext );
extern NDIS_STATUS RCACreateVc( IN NDIS_HANDLE ProtocolAfContext, IN NDIS_HANDLE NdisVcHandle, OUT PNDIS_HANDLE pProtocolVcContext );
extern NDIS_STATUS RCADeleteVc( IN NDIS_HANDLE ProtocolVcContext );
extern NDIS_STATUS RCAIncomingCall( IN NDIS_HANDLE ProtocolSapContext, IN NDIS_HANDLE ProtocolVcContext, IN OUT PCO_CALL_PARAMETERS pCallParams );
extern VOID RCAIncomingCloseCall( IN NDIS_STATUS closeStatus, IN NDIS_HANDLE ProtocolVcContext, IN PVOID CloseData OPTIONAL, IN UINT Size OPTIONAL );
extern VOID RCACloseCallComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolVcContext, IN NDIS_HANDLE ProtocolPartyContext OPTIONAL );
extern VOID RCACallConnected( IN NDIS_HANDLE ProtocolVcContext );
extern NDIS_STATUS RCARequest( IN NDIS_HANDLE ProtocolAfContext, IN NDIS_HANDLE ProtocolVcContext OPTIONAL, IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, IN OUT PNDIS_REQUEST NdisRequest );
/*++
VOID RCAFreeCopyPacket( IN PNDIS_PACKET pNdisPacket )
Routine Description:
Free a local receive packet into our pool.
Arguments:
pAdapter - Pointer to our adapter structure pNdisPacket - Packet to be freed.
Return Value: None
--*/
#define RCAFreeCopyPacket(_pPacket) \
{ \ PNDIS_BUFFER pNdisBuffer; \ PUCHAR pBuffer; \ ULONG BufferLength; \ \ NdisQueryPacket((_pPacket), \ NULL, \ NULL, \ &pNdisBuffer, \ NULL); \ \ NdisQueryBuffer(pNdisBuffer, \ &pBuffer, \ &BufferLength); \ \ if (NULL != pNdisBuffer) \ NdisFreeBuffer(pNdisBuffer); \ \ if (NULL != (_pPacket)) \ NdisFreePacket((_pPacket)); \ \ if (NULL != pBuffer) \ RCAFreeMem(pBuffer); \ }
#endif // _RCANDIS__H
|