windows-nt/Source/XPSP1/NT/net/atm/samples/atmsmpl/driver/atmsmdrv.h
2020-09-26 16:20:57 +08:00

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