455 lines
14 KiB
C
455 lines
14 KiB
C
/*++
|
|
|
|
Copyright (c) 1990-1998 Microsoft Corporation, All Rights Reserved.
|
|
|
|
Module Name:
|
|
|
|
atmsmdrv.h
|
|
|
|
Abstract:
|
|
|
|
ATM sample client driver header file.
|
|
|
|
Note : We use one lock per interface. When there are more VC's per
|
|
interface we could have a locking mechanism that is finer than this.
|
|
|
|
Author:
|
|
|
|
Anil Francis Thomas (10/98)
|
|
|
|
Environment:
|
|
|
|
Kernel
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef __ATMSMDRV_H_
|
|
#define __ATMSMDRV_H_
|
|
|
|
#define DEFAULT_NUM_PKTS_IN_POOL 512
|
|
|
|
#define MAX_FREE_PKTS_TO_KEEP 512
|
|
#define MAX_PKTS_AT_ONCE_ON_TIMER 25
|
|
#define DEFAULT_TIMER_INTERVAL MIN_DELAY // in millisec
|
|
|
|
|
|
#define ATM_SAMPLE_CLIENT_DEVICE_NAME L"\\Device\\ATMSampleClient"
|
|
#define ATM_SAMPLE_CLIENT_SYMBOLIC_NAME L"\\DosDevices\\ATMSampleClient"
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
typedef struct _HwAddr {
|
|
ATM_ADDRESS Address;
|
|
PATM_ADDRESS SubAddress;
|
|
} HW_ADDR, *PHW_ADDR;
|
|
|
|
|
|
//
|
|
// Flow Specifications for an ATM Connection. The structure
|
|
// represents a bidirectional flow.
|
|
//
|
|
typedef struct _ATMSM_FLOW_SPEC
|
|
{
|
|
ULONG SendBandwidth; // Bytes/Sec
|
|
ULONG SendMaxSize; // Bytes
|
|
ULONG ReceiveBandwidth; // Bytes/Sec
|
|
ULONG ReceiveMaxSize; // Bytes
|
|
SERVICETYPE ServiceType;
|
|
|
|
} ATMSM_FLOW_SPEC, *PATMSM_FLOW_SPEC;
|
|
|
|
|
|
//
|
|
// used for blocking request
|
|
//
|
|
typedef struct _ATMSM_BLOCK {
|
|
NDIS_EVENT Event;
|
|
NDIS_STATUS Status;
|
|
} ATMSM_BLOCK, *PATMSM_BLOCK;
|
|
|
|
#define INIT_BLOCK_STRUCT(pBlock) NdisInitializeEvent(&((pBlock)->Event))
|
|
#define RESET_BLOCK_STRUCT(pBlock) NdisResetEvent(&((pBlock)->Event))
|
|
#define WAIT_ON_BLOCK_STRUCT(pBlock) \
|
|
(NdisWaitEvent(&((pBlock)->Event), 0), (pBlock)->Status)
|
|
#define SIGNAL_BLOCK_STRUCT(pBlock, _Status) { \
|
|
(pBlock)->Status = _Status; \
|
|
NdisSetEvent(&((pBlock)->Event)); \
|
|
}
|
|
|
|
//
|
|
// Some forward declarations
|
|
//
|
|
typedef struct _AtmSmPMPMember ATMSM_PMP_MEMBER, *PATMSM_PMP_MEMBER;
|
|
typedef struct _AtmSmVc ATMSM_VC, *PATMSM_VC;
|
|
typedef struct _AtmSmAdapter ATMSM_ADAPTER, *PATMSM_ADAPTER;
|
|
|
|
|
|
|
|
//
|
|
// used to represent a party in the point to multipoint call
|
|
//
|
|
typedef struct _AtmSmPMPMember{
|
|
ULONG ulSignature;
|
|
|
|
PATMSM_PMP_MEMBER pNext;
|
|
PATMSM_VC pVc; // back pointer to the Vc
|
|
ULONG ulFlags; // State and other info
|
|
NDIS_HANDLE NdisPartyHandle;// NDIS handle for this leaf
|
|
HW_ADDR HwAddr; // From CallingPartyAddress
|
|
|
|
}ATMSM_PMP_MEMBER, *PATMSM_PMP_MEMBER;
|
|
|
|
#define atmsm_member_signature 'MMMS'
|
|
|
|
|
|
// Flags in ATMSM_PMP_MEMBER
|
|
#define ATMSM_MEMBER_IDLE 0x00000001
|
|
#define ATMSM_MEMBER_CONNECTING 0x00000002
|
|
#define ATMSM_MEMBER_CONNECTED 0x00000004
|
|
#define ATMSM_MEMBER_CLOSING 0x00000008
|
|
#define ATMSM_MEMBER_STATES 0x0000000F
|
|
#define ATMSM_MEMBER_DROP_TRIED 0x01000000
|
|
#define ATMSM_MEMBER_INVALID 0x80000000 // Invalidated entry
|
|
|
|
#define ATMSM_GET_MEMBER_STATE(_pMember) \
|
|
(_pMember->ulFlags & ATMSM_MEMBER_STATES)
|
|
|
|
#define ATMSM_SET_MEMBER_STATE(_pMember, _State) \
|
|
(_pMember->ulFlags = ((_pMember->ulFlags & ~ATMSM_MEMBER_STATES) \
|
|
| _State))
|
|
#define ATMSM_IS_MEMBER_INVALID(_pMember) \
|
|
(_pMember->ulFlags & ATMSM_MEMBER_INVALID)
|
|
|
|
|
|
//
|
|
// VC
|
|
//
|
|
// Reference count:
|
|
// Incoming call (PP and PMP) VC 1 at create + 1 at call connect
|
|
// Outgoing call (PP) 1 at create
|
|
// Outgoing call (PMP) 1 at create + 1 for each Member
|
|
//
|
|
typedef struct _AtmSmVc
|
|
{
|
|
// Note Vc signature is used always
|
|
ULONG ulSignature;
|
|
|
|
ULONG VcType;
|
|
LIST_ENTRY List;
|
|
ULONG ulRefCount;
|
|
ULONG ulFlags;
|
|
NDIS_HANDLE NdisVcHandle;
|
|
PATMSM_ADAPTER pAdapt;
|
|
ULONG MaxSendSize;// From AAL parameters
|
|
|
|
// the following is used in the case of unicast and incoming PMP call
|
|
HW_ADDR HwAddr;
|
|
|
|
// the following the IRP that initiated an outgoing call
|
|
PIRP pConnectIrp;
|
|
|
|
// the following are used for outgoing PMP calls
|
|
ULONG ulNumTotalMembers;
|
|
ULONG ulNumActiveMembers;
|
|
ULONG ulNumConnectingMembers;
|
|
ULONG ulNumDroppingMembers;
|
|
PATMSM_PMP_MEMBER pPMPMembers;
|
|
|
|
//
|
|
// Send queue to hold packets when the Vc is connecting
|
|
//
|
|
PNDIS_PACKET pSendLastPkt; // cache the last packet for
|
|
// adding to tail
|
|
PNDIS_PACKET pSendPktNext;
|
|
ULONG ulSendPktsCount;
|
|
|
|
} ATMSM_VC, *PATMSM_VC;
|
|
|
|
#define atmsm_vc_signature 'CVMS'
|
|
#define atmsm_dead_vc_signature 'VAED'
|
|
|
|
#define ATMSM_VC_IDLE 0x00000001 // outgoing
|
|
#define ATMSM_VC_ACTIVE 0x00000002 // out\in
|
|
#define ATMSM_VC_CALLPROCESSING 0x00000004 // in
|
|
#define ATMSM_VC_SETUP_IN_PROGRESS 0x00000008 // out
|
|
#define ATMSM_VC_ADDING_PARTIES 0x00000010 // out
|
|
#define ATMSM_VC_CLOSING 0x00000020 // out\in
|
|
#define ATMSM_VC_CLOSED 0x00000040 // out\in
|
|
#define ATMSM_VC_NEED_CLOSING 0x00000080 // pmp out
|
|
#define ATMSM_VC_STATES 0x000000FF
|
|
|
|
#define ATMSM_GET_VC_STATE(_pVc) \
|
|
(_pVc->ulFlags & ATMSM_VC_STATES)
|
|
|
|
#define ATMSM_SET_VC_STATE(_pVc, _State) \
|
|
(_pVc->ulFlags = ((_pVc->ulFlags & ~ATMSM_VC_STATES) \
|
|
| _State))
|
|
//
|
|
// VC types:
|
|
//
|
|
#define VC_TYPE_INCOMING ((ULONG)1)
|
|
#define VC_TYPE_PP_OUTGOING ((ULONG)2)
|
|
#define VC_TYPE_PMP_OUTGOING ((ULONG)3)
|
|
|
|
|
|
//
|
|
// ADAPTER
|
|
//
|
|
// Reference count:
|
|
// 1 at create +
|
|
// 1 for Open AF +
|
|
// 1 for each Vc +
|
|
// 1 for each request
|
|
//
|
|
typedef struct _AtmSmAdapter {
|
|
|
|
// Note adapter signature is used always
|
|
ULONG ulSignature;
|
|
|
|
PATMSM_ADAPTER pAdapterNext;
|
|
|
|
ULONG ulRefCount; // reference count
|
|
ULONG ulFlags; // Flags Opened,Closed etc
|
|
|
|
NDIS_STRING BoundToAdapterName; // Adapter we are bound to
|
|
|
|
NDIS_HANDLE NdisBindContext; // BindContext in BindAdapter
|
|
NDIS_HANDLE UnbindContext; // UnBindContext in UnbindAdapter
|
|
|
|
NDIS_HANDLE NdisBindingHandle; // To the Adapter
|
|
NDIS_MEDIUM Medium;
|
|
|
|
PNDIS_EVENT pCleanupEvent; // pointer to an event used in
|
|
// Close Adapter
|
|
|
|
ATMSM_BLOCK RequestBlock; // Used for making requests
|
|
|
|
// AF related
|
|
NDIS_HANDLE NdisAfHandle;
|
|
CO_ADDRESS_FAMILY AddrFamily; // For use by NdisClOpenAddressFamily
|
|
|
|
// Sap related
|
|
NDIS_HANDLE NdisSapHandle;
|
|
PCO_SAP pSap; // For use by NdisClRegisterSap
|
|
|
|
|
|
ATMSM_FLOW_SPEC VCFlowSpec;
|
|
|
|
|
|
// Lock used for manipulating Pools and packets
|
|
NDIS_SPIN_LOCK AdapterLock;
|
|
|
|
// Packet Pool Handle
|
|
NDIS_HANDLE PacketPoolHandle;
|
|
|
|
// Buffer Pool Handle
|
|
NDIS_HANDLE BufferPoolHandle;
|
|
|
|
LIST_ENTRY InactiveVcHead; // Created Vcs go here.
|
|
LIST_ENTRY ActiveVcHead; // Vcs with active calls go here.
|
|
|
|
ATM_ADDRESS ConfiguredAddress; // Configured address of the adapter
|
|
|
|
NDIS_CO_LINK_SPEED LinkSpeed;
|
|
ULONG MaxPacketSize;
|
|
|
|
// used for recvs on this adapter
|
|
PIRP pRecvIrp; // refers to the user request
|
|
|
|
//
|
|
// Recv queue (for buffering received packets)
|
|
//
|
|
PNDIS_PACKET pRecvLastPkt; // cache the last packet for
|
|
// adding to tail
|
|
PNDIS_PACKET pRecvPktNext;
|
|
ULONG ulRecvPktsCount;
|
|
|
|
// the timer object for returning packets that are queued
|
|
NDIS_TIMER RecvTimerOb;
|
|
|
|
|
|
//
|
|
// Interface Properties
|
|
//
|
|
BOOLEAN fRecvTimerQueued;
|
|
|
|
BOOLEAN fAdapterOpenedForRecv;
|
|
|
|
UCHAR SelByte;
|
|
|
|
} ATMSM_ADAPTER, *PATMSM_ADAPTER;
|
|
|
|
#define atmsm_adapter_signature 'DAMS'
|
|
#define atmsm_dead_adapter_signature 'DAED'
|
|
|
|
// Values for ulFlags
|
|
#define ADAPT_CREATED 0x00000001
|
|
#define ADAPT_OPENED 0x00000002
|
|
#define ADAPT_AF_OPENED 0x00000004
|
|
#define ADAPT_SAP_REGISTERED 0x00000008
|
|
#define ADAPT_SHUTTING_DOWN 0x00000010
|
|
#define ADAPT_CLOSING 0x00000020
|
|
#define ADAPT_ADDRESS_INVALID 0x00010000
|
|
|
|
|
|
//
|
|
// Structure used for representing Global Properties
|
|
//
|
|
typedef struct _AtmSmGlobal {
|
|
|
|
ULONG ulSignature;
|
|
|
|
// Initialization sequence flag
|
|
ULONG ulInitSeqFlag;
|
|
|
|
ULONG ulNumCreates;
|
|
|
|
// Global Properties - maintained for reference (to return in Get calls)
|
|
ULONG ulRecvDelay; // millisecs
|
|
ULONG ulSendDelay; // millisecs
|
|
ULONG ulSimulateSendPktLoss; // Percentage
|
|
ULONG ulSimulateRecvPktLoss; // Percentage
|
|
BOOLEAN fSimulateResLimit;
|
|
BOOLEAN fDontRecv;
|
|
BOOLEAN fDontSend;
|
|
|
|
|
|
NDIS_HANDLE ProtHandle;
|
|
NDIS_HANDLE MiniportHandle;
|
|
|
|
PATMSM_ADAPTER pAdapterList;
|
|
ULONG ulAdapterCount;
|
|
PDRIVER_OBJECT pDriverObject;
|
|
PDEVICE_OBJECT pDeviceObject;
|
|
|
|
// General purpose Lock
|
|
NDIS_SPIN_LOCK Lock;
|
|
|
|
}ATMSM_GLOBAL, *PATMSM_GLOBAL;
|
|
|
|
#define atmsm_global_signature 'LGMS'
|
|
|
|
// values for ulInitSeqFlag
|
|
#define CREATED_IO_DEVICE 0x00000001
|
|
#define REGISTERED_SYM_NAME 0x00000002
|
|
#define REGISTERED_WITH_NDIS 0x00000004
|
|
|
|
|
|
//
|
|
// If the adapter is opened for recvs,
|
|
// received data is buffered for a while before returning to the
|
|
// miniport. Buffers passed from the user mode is filled with
|
|
// arriving data. If no buffers arrive user mode call pends.
|
|
//
|
|
|
|
|
|
//
|
|
// Prototype of the routines handling DeviceIoCntrl
|
|
//
|
|
typedef NTSTATUS (*PATMSM_IOCTL_FUNCS)(
|
|
PIRP pIrp,
|
|
PIO_STACK_LOCATION pIrpSp
|
|
);
|
|
|
|
//
|
|
// Protocol reserved part of the packet
|
|
// This is used for packets send down to miniport below us.
|
|
// The pNext is also used while holding these packets in
|
|
// our queues (Free, Send, Recv). ulTime is used as the time
|
|
// at which the packet was queued
|
|
//
|
|
typedef struct _ProtRsvd
|
|
{
|
|
ULONG ulTime; // in milliseconds
|
|
PNDIS_PACKET pPktNext;
|
|
PIRP pSendIrp;
|
|
} PROTO_RSVD, *PPROTO_RSVD;
|
|
|
|
|
|
#define GET_PROTO_RSVD(pPkt) \
|
|
((PPROTO_RSVD)(pPkt->ProtocolReserved))
|
|
|
|
//
|
|
// Some global data
|
|
//
|
|
extern ATMSM_GLOBAL AtmSmGlobal;
|
|
extern ATM_BLLI_IE AtmSmDefaultBlli;
|
|
extern ATM_BHLI_IE AtmSmDefaultBhli;
|
|
extern ATMSM_FLOW_SPEC AtmSmDefaultVCFlowSpec;
|
|
extern PATMSM_IOCTL_FUNCS AtmSmFuncProcessIoctl[ATMSM_MAX_FUNCTION_CODE+1];
|
|
extern ULONG AtmSmIoctlTable[ATMSM_NUM_IOCTLS];
|
|
|
|
#define BYTES_TO_CELLS(_b) ((_b)/48)
|
|
|
|
//
|
|
// Rounded-off size of generic Q.2931 IE header
|
|
//
|
|
#define ROUND_OFF(_size) (((_size) + 3) & ~0x4)
|
|
|
|
#define SIZEOF_Q2931_IE ROUND_OFF(sizeof(Q2931_IE))
|
|
#define SIZEOF_AAL_PARAMETERS_IE ROUND_OFF(sizeof(AAL_PARAMETERS_IE))
|
|
#define SIZEOF_ATM_TRAFFIC_DESCR_IE ROUND_OFF(sizeof(ATM_TRAFFIC_DESCRIPTOR_IE))
|
|
#define SIZEOF_ATM_BBC_IE ROUND_OFF(sizeof(ATM_BROADBAND_BEARER_CAPABILITY_IE))
|
|
#define SIZEOF_ATM_BLLI_IE ROUND_OFF(sizeof(ATM_BLLI_IE))
|
|
#define SIZEOF_ATM_QOS_IE ROUND_OFF(sizeof(ATM_QOS_CLASS_IE))
|
|
|
|
//
|
|
// Total space required for Information Elements in an outgoing call.
|
|
//
|
|
#define ATMSM_MAKE_CALL_IE_SPACE ( \
|
|
SIZEOF_Q2931_IE + SIZEOF_AAL_PARAMETERS_IE + \
|
|
SIZEOF_Q2931_IE + SIZEOF_ATM_TRAFFIC_DESCR_IE + \
|
|
SIZEOF_Q2931_IE + SIZEOF_ATM_BBC_IE + \
|
|
SIZEOF_Q2931_IE + SIZEOF_ATM_BLLI_IE + \
|
|
SIZEOF_Q2931_IE + SIZEOF_ATM_QOS_IE )
|
|
|
|
|
|
//
|
|
// Total space required for Information Elements in an outgoing AddParty.
|
|
//
|
|
#define ATMSM_ADD_PARTY_IE_SPACE ( \
|
|
SIZEOF_Q2931_IE + SIZEOF_AAL_PARAMETERS_IE + \
|
|
SIZEOF_Q2931_IE + SIZEOF_ATM_BLLI_IE )
|
|
|
|
|
|
//
|
|
// Some defaults
|
|
//
|
|
#define DEFAULT_SEND_BANDWIDTH (ATM_USER_DATA_RATE_SONET_155*100/8)
|
|
// Bytes/sec
|
|
#define DEFAULT_RECV_BANDWIDTH 0
|
|
#define DEFAULT_MAX_PACKET_SIZE 9180 // Bytes
|
|
|
|
#define RECV_BUFFERING_TIME 500 // millisecs
|
|
|
|
//
|
|
// useful Macros
|
|
//
|
|
#define ACQUIRE_GLOBAL_LOCK() NdisAcquireSpinLock(&AtmSmGlobal.Lock)
|
|
#define RELEASE_GLOBAL_LOCK() NdisReleaseSpinLock(&AtmSmGlobal.Lock)
|
|
|
|
#define ACQUIRE_ADAPTER_GEN_LOCK(pA) NdisAcquireSpinLock(&pA->AdapterLock)
|
|
#define RELEASE_ADAPTER_GEN_LOCK(pA) NdisReleaseSpinLock(&pA->AdapterLock)
|
|
|
|
|
|
#define SET_ADAPTER_RECV_TIMER(pA, uiTimerDelay) { \
|
|
NdisSetTimer(&pA->RecvTimerOb, \
|
|
uiTimerDelay); \
|
|
pA->fRecvTimerQueued = TRUE; \
|
|
}
|
|
|
|
#define CANCEL_ADAPTER_RECV_TIMER(pA, pfTimerCancelled) { \
|
|
NdisCancelTimer(&pA->RecvTimerOb, \
|
|
pfTimerCancelled); \
|
|
pA->fRecvTimerQueued = FALSE; \
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif
|