///////////////////////////////////////////////////////////////////////////// // // // Copyright (c) 1996, 1997 Microsoft Corporation // // // Module Name: // slip.h // // Abstract: // // // Author: // // P Porzuczek // // Environment: // // Revision History: // // ////////////////////////////////////////////////////////////////////////////// #ifndef _SLIP_H_ #define _SLIP_H_ #define ENTRIES(a) (sizeof(a)/sizeof(*(a))) /////////////////////////////////////////////////////////////////////////////// // // #define SLIPNAME "SLIP" #define SLIPNAMEUNICODE L"SLIP" /////////////////////////////////////////////////////////////////////////////// // // This defines the name of the WMI device that manages service IOCTLS // #define CodecDeviceName (L"\\\\.\\" SLIPNAMEUNICODE) #define CodecSymbolicName (L"\\DosDevices\\" SLIPNAMEUNICODE) /////////////////////////////////////////////////////////////////////////////// // // typedef enum { SLIP_STREAM = 0, SLIP_IPV4, SLIP_NET_CONTROL } SLIP_STREAMS; /////////////////////////////////////////////////////////////////////////////// // // The MAX_STREAM_COUNT value must be equal to DRIVER_STREAM_COUNT // This particular value must be defined here to avoid circular references // #define MAX_STREAM_COUNT DRIVER_STREAM_COUNT /////////////////////////////////////////////////////////////////////////////// // // We manage multiple instances of each pin up to this limit // #define MAX_PIN_INSTANCES 8 #define BIT(n) (1L<<(n)) #define BITSIZE(v) (sizeof(v)*8) #define SETBIT(array,n) (array[n/BITSIZE(*array)] |= BIT(n%BITSIZE(*array))) #define CLEARBIT(array,n) (array[n/BITSIZE(*array)] &= ~BIT(n%BITSIZE(*array))) #define MAX_FRAMES 64 #define FRAME_LOW_WATER 5 ///////////////////////////////////////////////////////////////////////////// // // // typedef NTSTATUS (*QUERY_INTERFACE) (PVOID pvContext); typedef ULONG (*ADD_REF) (PVOID pvContext); typedef ULONG (*RELEASE) (PVOID pvContext); ///////////////////////////////////////////////////////////////////////////// // // // typedef struct _STATS_ { ULONG ulTotalDataSRBWrites; ULONG ulTotalBadPinSRBWrites; ULONG ulTotalDataSRBReads; ULONG ulTotalBadPinSRBReads; ULONG ulTotalSlipBuffersReceived; ULONG ulTotalSlipBuffersDropped; ULONG ulTotalSlipZeroLengthBuffers; ULONG ulTotalSlipBytesReceived; ULONG ulTotalSlipBytesDropped; ULONG ulTotalSlipFramesReceived; ULONG ulTotalSlipOldProtoFramesStarted; ULONG ulTotalSlipNewProtoFramesStarted; ULONG ulTotalSlipFramesIncomplete; ULONG ulTotalSlipFramesBadCRC; ULONG ulTotalSlipFramesTooBig; ULONG ulTotalSlipFramesTooSmall; ULONG ulTotalIPPacketsFound; ULONG ulTotalIPBytesFound; ULONG ulTotalIPPacketsSent; ULONG ulTotalIPBytesSent; ULONG ulTotalIPPacketsTooBig; ULONG ulTotalIPPacketsTooSmall; ULONG ulTotalIPPacketsDropped; ULONG ulTotalIPBytesDropped; ULONG ulTotalNabStreamsCreated; ULONG ulTotalNabStreamsTimedOut; } STATS, *PSTATS; ///////////////////////////////////////////////////////////////////////////// // // // typedef struct { QUERY_INTERFACE QueryInterface; ADD_REF AddRef; RELEASE Release; } FILTER_VTABLE, *PFILTER_VTABLE; ///////////////////////////////////////////////////////////////////////////// // // // definition of the full HW device extension structure This is the structure // that will be allocated in HW_INITIALIZATION by the stream class driver // Any information that is used in processing a device request (as opposed to // a STREAM based request) should be in this structure. A pointer to this // structure will be passed in all requests to the minidriver. (See // HW_STREAM_REQUEST_BLOCK in STRMINI.H) // typedef struct _SLIP_FILTER_ { LIST_ENTRY AdapterSRBQueue; KSPIN_LOCK AdapterSRBSpinLock; BOOLEAN bAdapterQueueInitialized; // // // BOOLEAN bInitializationComplete; // // Statistics // STATS Stats; // // // PDEVICE_OBJECT DeviceObject; // // // PDRIVER_OBJECT DriverObject; // // // PFILTER_VTABLE lpVTable; // // // ULONG ulRefCount; // // // PVOID pStream [2][1]; // // // ULONG ulActualInstances [2]; // Count of instances per stream // // // KSPIN_LOCK IpV4StreamDataSpinLock; // Data queue spin lock LIST_ENTRY IpV4StreamDataQueue; // Stream data queue KSPIN_LOCK StreamControlSpinLock; // Command queue spin lock LIST_ENTRY StreamControlQueue; // Stream command queue KSPIN_LOCK StreamDataSpinLock; // Data queue spin lock LIST_ENTRY StreamDataQueue; // Stream data queue // // // KSPIN_LOCK StreamUserSpinLock; LIST_ENTRY StreamContxList; LARGE_INTEGER liLastTimeChecked; LARGE_INTEGER liLastTimeStatsDumped; BOOLEAN bDiscontinuity; } SLIP_FILTER, *PSLIP_FILTER; ///////////////////////////////////////////////////////////////////////////// // // this structure is our per stream extension structure. This stores // information that is relevant on a per stream basis. Whenever a new stream // is opened, the stream class driver will allocate whatever extension size // is specified in the HwInitData.PerStreamExtensionSize. // typedef struct _STREAM_ { PSLIP_FILTER pFilter; PHW_STREAM_OBJECT pStreamObject; // For timer use KSSTATE KSState; // Run, Stop, Pause HANDLE hMasterClock; HANDLE hClock; ULONG ulStreamInstance; // 0..NumberOfPossibleInstances-1 KSDATAFORMAT OpenedFormat; // Based on the actual open request. KSDATARANGE MatchedFormat; ULONG Type; // type of this structure ULONG Size; // size of this structure } STREAM, *PSTREAM; /////////////////////////////////////////////////////////////////////////////// // // This structure is our per SRB extension, and carries the forward and backward // links for the pending SRB queue. // typedef struct _SRB_EXTENSION { LIST_ENTRY ListEntry; PHW_STREAM_REQUEST_BLOCK pSrb; } SRB_EXTENSION, *PSRB_EXTENSION; ////////////////////////////////////////////////////////////////////////////// // // the following section defines prototypes for the minidriver initialization // routines // BOOLEAN CodecInitialize ( IN OUT PHW_STREAM_REQUEST_BLOCK pSrb ); BOOLEAN CodecUnInitialize( PHW_STREAM_REQUEST_BLOCK pSrb ); BOOLEAN CodecQueryUnload ( PHW_STREAM_REQUEST_BLOCK pSrb ); // Not implemented currently BOOLEAN HwInterrupt ( IN PSLIP_FILTER pFilter ); VOID CodecStreamInfo( PHW_STREAM_REQUEST_BLOCK pSrb ); VOID CodecOpenStream( PHW_STREAM_REQUEST_BLOCK pSrb ); VOID CodecCloseStream( PHW_STREAM_REQUEST_BLOCK pSrb ); VOID STREAMAPI CodecReceivePacket( IN PHW_STREAM_REQUEST_BLOCK Srb ); VOID STREAMAPI CodecCancelPacket( IN PHW_STREAM_REQUEST_BLOCK Srb ); VOID STREAMAPI CodecTimeoutPacket( IN PHW_STREAM_REQUEST_BLOCK Srb ); VOID STREAMAPI CodecGetProperty( IN PHW_STREAM_REQUEST_BLOCK Srb ); VOID STREAMAPI CodecSetProperty( IN PHW_STREAM_REQUEST_BLOCK Srb ); BOOL CodecVerifyFormat( IN KSDATAFORMAT *pKSDataFormat, UINT StreamNumber, PKSDATARANGE pMatchedFormat ); BOOL CodecFormatFromRange( IN PHW_STREAM_REQUEST_BLOCK pSrb ); void CompleteStreamSRB ( IN PHW_STREAM_REQUEST_BLOCK pSrb, STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE NotificationType1, BOOL fUseNotification2, STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE NotificationType2 ); void CompleteDeviceSRB ( IN PHW_STREAM_REQUEST_BLOCK pSrb, IN STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE NotificationType, BOOL fReadyForNext ); ///////////////////////////////////////////////////////////////////////////////////// // // SRB Queue Management functions // BOOL STREAMAPI QueueAddIfNotEmpty( IN PHW_STREAM_REQUEST_BLOCK, IN PKSPIN_LOCK, IN PLIST_ENTRY ); BOOL STREAMAPI QueueAdd( IN PHW_STREAM_REQUEST_BLOCK, IN PKSPIN_LOCK, IN PLIST_ENTRY ); BOOL STREAMAPI QueueRemove( IN OUT PHW_STREAM_REQUEST_BLOCK *, IN PKSPIN_LOCK, IN PLIST_ENTRY ); BOOL STREAMAPI QueuePush ( IN PHW_STREAM_REQUEST_BLOCK pSrb, IN PKSPIN_LOCK pQueueSpinLock, IN PLIST_ENTRY pQueue ); BOOL STREAMAPI QueueRemoveSpecific( IN PHW_STREAM_REQUEST_BLOCK, IN PKSPIN_LOCK, IN PLIST_ENTRY ); BOOL STREAMAPI QueueEmpty( IN PKSPIN_LOCK, IN PLIST_ENTRY ); VOID STREAMAPI CodecReceivePacket( IN PHW_STREAM_REQUEST_BLOCK pSrb ); BOOLEAN CodecInitialize ( IN OUT PHW_STREAM_REQUEST_BLOCK pSrb ); VOID STREAMAPI CodecCancelPacket( PHW_STREAM_REQUEST_BLOCK pSrb ); VOID STREAMAPI CodecTimeoutPacket( PHW_STREAM_REQUEST_BLOCK pSrb ); BOOL CompareGUIDsAndFormatSize( IN PKSDATARANGE pDataRange1, IN PKSDATARANGE pDataRange2, BOOLEAN bCheckSize ); BOOL CompareStreamFormat ( IN PHW_STREAM_REQUEST_BLOCK pSrb ); BOOLEAN VerifyFormat( IN KSDATAFORMAT *pKSDataFormat, UINT StreamNumber, PKSDATARANGE pMatchedFormat ); VOID OpenStream ( PHW_STREAM_REQUEST_BLOCK pSrb ); VOID CloseStream ( PHW_STREAM_REQUEST_BLOCK pSrb ); VOID STREAMAPI ReceiveDataPacket ( IN PHW_STREAM_REQUEST_BLOCK pSrb ); VOID STREAMAPI ReceiveCtrlPacket( IN PHW_STREAM_REQUEST_BLOCK pSrb ); VOID IpSinkSetState( PHW_STREAM_REQUEST_BLOCK pSrb ); VOID SlipSetState( PHW_STREAM_REQUEST_BLOCK pSrb ); VOID SlipGetState( PHW_STREAM_REQUEST_BLOCK pSrb ); #endif // _SLIP_H_