Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

456 lines
10 KiB

  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. //
  4. // Copyright (c) 1996, 1997 Microsoft Corporation
  5. //
  6. //
  7. // Module Name:
  8. // slip.h
  9. //
  10. // Abstract:
  11. //
  12. //
  13. // Author:
  14. //
  15. // P Porzuczek
  16. //
  17. // Environment:
  18. //
  19. // Revision History:
  20. //
  21. //
  22. //////////////////////////////////////////////////////////////////////////////
  23. #ifndef _SLIP_H_
  24. #define _SLIP_H_
  25. #define ENTRIES(a) (sizeof(a)/sizeof(*(a)))
  26. ///////////////////////////////////////////////////////////////////////////////
  27. //
  28. //
  29. #define SLIPNAME "SLIP"
  30. #define SLIPNAMEUNICODE L"SLIP"
  31. ///////////////////////////////////////////////////////////////////////////////
  32. //
  33. // This defines the name of the WMI device that manages service IOCTLS
  34. //
  35. #define CodecDeviceName (L"\\\\.\\" SLIPNAMEUNICODE)
  36. #define CodecSymbolicName (L"\\DosDevices\\" SLIPNAMEUNICODE)
  37. ///////////////////////////////////////////////////////////////////////////////
  38. //
  39. //
  40. typedef enum
  41. {
  42. SLIP_STREAM = 0,
  43. SLIP_IPV4,
  44. } SLIP_STREAMS;
  45. ///////////////////////////////////////////////////////////////////////////////
  46. //
  47. // The MAX_STREAM_COUNT value must be equal to DRIVER_STREAM_COUNT
  48. // This particular value must be defined here to avoid circular references
  49. //
  50. #define MAX_STREAM_COUNT DRIVER_STREAM_COUNT
  51. ///////////////////////////////////////////////////////////////////////////////
  52. //
  53. // We manage multiple instances of each pin up to this limit
  54. //
  55. #define MAX_PIN_INSTANCES 8
  56. #define BIT(n) (1L<<(n))
  57. #define BITSIZE(v) (sizeof(v)*8)
  58. #define SETBIT(array,n) (array[n/BITSIZE(*array)] |= BIT(n%BITSIZE(*array)))
  59. #define CLEARBIT(array,n) (array[n/BITSIZE(*array)] &= ~BIT(n%BITSIZE(*array)))
  60. /////////////////////////////////////////////////////////////////////////////
  61. //
  62. //
  63. //
  64. typedef NTSTATUS (*QUERY_INTERFACE) (PVOID pvContext);
  65. typedef ULONG (*ADD_REF) (PVOID pvContext);
  66. typedef ULONG (*RELEASE) (PVOID pvContext);
  67. /////////////////////////////////////////////////////////////////////////////
  68. //
  69. //
  70. //
  71. typedef struct _STATS_
  72. {
  73. ULONG ulTotalDataSRBWrites;
  74. ULONG ulTotalBadPinSRBWrites;
  75. ULONG ulTotalDataSRBReads;
  76. ULONG ulTotalBadPinSRBReads;
  77. ULONG ulTotalSlipBuffersReceived;
  78. ULONG ulTotalSlipBuffersDropped;
  79. ULONG ulTotalSlipZeroLengthBuffers;
  80. ULONG ulTotalSlipBytesReceived;
  81. ULONG ulTotalSlipBytesDropped;
  82. ULONG ulTotalSlipFramesReceived;
  83. ULONG ulTotalSlipOldProtoFramesStarted;
  84. ULONG ulTotalSlipNewProtoFramesStarted;
  85. ULONG ulTotalSlipFramesIncomplete;
  86. ULONG ulTotalSlipFramesBadCRC;
  87. ULONG ulTotalSlipFramesTooBig;
  88. ULONG ulTotalSlipFramesTooSmall;
  89. ULONG ulTotalIPPacketsFound;
  90. ULONG ulTotalIPBytesFound;
  91. ULONG ulTotalIPPacketsSent;
  92. ULONG ulTotalIPBytesSent;
  93. ULONG ulTotalIPPacketsTooBig;
  94. ULONG ulTotalIPPacketsTooSmall;
  95. ULONG ulTotalIPPacketsDropped;
  96. ULONG ulTotalIPBytesDropped;
  97. ULONG ulTotalNabStreamsCreated;
  98. ULONG ulTotalNabStreamsTimedOut;
  99. } STATS, *PSTATS;
  100. /////////////////////////////////////////////////////////////////////////////
  101. //
  102. //
  103. //
  104. typedef struct
  105. {
  106. QUERY_INTERFACE QueryInterface;
  107. ADD_REF AddRef;
  108. RELEASE Release;
  109. } FILTER_VTABLE, *PFILTER_VTABLE;
  110. /////////////////////////////////////////////////////////////////////////////
  111. //
  112. //
  113. // definition of the full HW device extension structure This is the structure
  114. // that will be allocated in HW_INITIALIZATION by the stream class driver
  115. // Any information that is used in processing a device request (as opposed to
  116. // a STREAM based request) should be in this structure. A pointer to this
  117. // structure will be passed in all requests to the minidriver. (See
  118. // HW_STREAM_REQUEST_BLOCK in STRMINI.H)
  119. //
  120. typedef struct _SLIP_FILTER_
  121. {
  122. LIST_ENTRY AdapterSRBQueue;
  123. KSPIN_LOCK AdapterSRBSpinLock;
  124. BOOLEAN bAdapterQueueInitialized;
  125. //
  126. //
  127. //
  128. BOOLEAN bInitializationComplete;
  129. //
  130. // Statistics
  131. //
  132. STATS Stats;
  133. //
  134. //
  135. //
  136. PDEVICE_OBJECT DeviceObject;
  137. //
  138. //
  139. //
  140. PDRIVER_OBJECT DriverObject;
  141. //
  142. //
  143. //
  144. PFILTER_VTABLE lpVTable;
  145. //
  146. //
  147. //
  148. ULONG ulRefCount;
  149. //
  150. //
  151. //
  152. PVOID pStream [2][1];
  153. //
  154. //
  155. //
  156. ULONG ulActualInstances [2]; // Count of instances per stream
  157. //
  158. //
  159. //
  160. KSPIN_LOCK IpV4StreamDataSpinLock; // Data queue spin lock
  161. LIST_ENTRY IpV4StreamDataQueue; // Stream data queue
  162. KSPIN_LOCK StreamControlSpinLock; // Command queue spin lock
  163. LIST_ENTRY StreamControlQueue; // Stream command queue
  164. KSPIN_LOCK StreamDataSpinLock; // Data queue spin lock
  165. LIST_ENTRY StreamDataQueue; // Stream data queue
  166. //
  167. //
  168. //
  169. KSPIN_LOCK StreamUserSpinLock;
  170. LIST_ENTRY StreamContxList;
  171. LARGE_INTEGER liLastTimeChecked;
  172. LARGE_INTEGER liLastTimeStatsDumped;
  173. BOOLEAN bDiscontinuity;
  174. } SLIP_FILTER, *PSLIP_FILTER;
  175. /////////////////////////////////////////////////////////////////////////////
  176. //
  177. // this structure is our per stream extension structure. This stores
  178. // information that is relevant on a per stream basis. Whenever a new stream
  179. // is opened, the stream class driver will allocate whatever extension size
  180. // is specified in the HwInitData.PerStreamExtensionSize.
  181. //
  182. typedef struct _STREAM_
  183. {
  184. PSLIP_FILTER pFilter;
  185. PHW_STREAM_OBJECT pStreamObject; // For timer use
  186. KSSTATE KSState; // Run, Stop, Pause
  187. ULONG ulStreamInstance; // 0..NumberOfPossibleInstances-1
  188. KSDATAFORMAT OpenedFormat; // Based on the actual open request.
  189. KSDATARANGE MatchedFormat;
  190. ULONG Type; // type of this structure
  191. ULONG Size; // size of this structure
  192. KSPIN_LOCK KSStateSpinLock;
  193. } STREAM, *PSTREAM;
  194. ///////////////////////////////////////////////////////////////////////////////
  195. //
  196. // This structure is our per SRB extension, and carries the forward and backward
  197. // links for the pending SRB queue.
  198. //
  199. typedef struct _SRB_EXTENSION
  200. {
  201. LIST_ENTRY ListEntry;
  202. PHW_STREAM_REQUEST_BLOCK pSrb;
  203. } SRB_EXTENSION, *PSRB_EXTENSION;
  204. //////////////////////////////////////////////////////////////////////////////
  205. //
  206. // the following section defines prototypes for the minidriver initialization
  207. // routines
  208. //
  209. BOOLEAN
  210. CodecInitialize (
  211. IN OUT PHW_STREAM_REQUEST_BLOCK pSrb
  212. );
  213. BOOLEAN
  214. CodecUnInitialize(
  215. PHW_STREAM_REQUEST_BLOCK pSrb
  216. );
  217. BOOLEAN
  218. CodecQueryUnload (
  219. PHW_STREAM_REQUEST_BLOCK pSrb
  220. ); // Not implemented currently
  221. BOOLEAN
  222. HwInterrupt (
  223. IN PSLIP_FILTER pFilter
  224. );
  225. VOID
  226. CodecStreamInfo(
  227. PHW_STREAM_REQUEST_BLOCK pSrb
  228. );
  229. VOID
  230. CodecOpenStream(
  231. PHW_STREAM_REQUEST_BLOCK pSrb
  232. );
  233. VOID
  234. CodecCloseStream(
  235. PHW_STREAM_REQUEST_BLOCK pSrb
  236. );
  237. VOID STREAMAPI
  238. CodecReceivePacket(
  239. IN PHW_STREAM_REQUEST_BLOCK Srb
  240. );
  241. VOID STREAMAPI
  242. CodecCancelPacket(
  243. IN PHW_STREAM_REQUEST_BLOCK Srb
  244. );
  245. VOID STREAMAPI
  246. CodecTimeoutPacket(
  247. IN PHW_STREAM_REQUEST_BLOCK Srb
  248. );
  249. VOID STREAMAPI
  250. CodecGetProperty(
  251. IN PHW_STREAM_REQUEST_BLOCK Srb
  252. );
  253. VOID STREAMAPI
  254. CodecSetProperty(
  255. IN PHW_STREAM_REQUEST_BLOCK Srb
  256. );
  257. BOOL
  258. CodecVerifyFormat(
  259. IN KSDATAFORMAT *pKSDataFormat,
  260. UINT StreamNumber,
  261. PKSDATARANGE pMatchedFormat
  262. );
  263. BOOL
  264. CodecFormatFromRange(
  265. IN PHW_STREAM_REQUEST_BLOCK pSrb
  266. );
  267. void
  268. CompleteStreamSRB (
  269. IN PHW_STREAM_REQUEST_BLOCK pSrb,
  270. STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE NotificationType1,
  271. BOOL fUseNotification2,
  272. STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE NotificationType2
  273. );
  274. void
  275. CompleteDeviceSRB (
  276. IN PHW_STREAM_REQUEST_BLOCK pSrb,
  277. IN STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE NotificationType,
  278. BOOL fReadyForNext
  279. );
  280. /////////////////////////////////////////////////////////////////////////////////////
  281. //
  282. // SRB Queue Management functions
  283. //
  284. BOOL STREAMAPI
  285. QueueAdd(
  286. IN PHW_STREAM_REQUEST_BLOCK,
  287. IN PKSPIN_LOCK,
  288. IN PLIST_ENTRY
  289. );
  290. BOOL STREAMAPI
  291. QueueRemove(
  292. IN OUT PHW_STREAM_REQUEST_BLOCK *,
  293. IN PKSPIN_LOCK,
  294. IN PLIST_ENTRY
  295. );
  296. BOOL STREAMAPI
  297. QueueRemoveSpecific(
  298. IN PHW_STREAM_REQUEST_BLOCK,
  299. IN PKSPIN_LOCK,
  300. IN PLIST_ENTRY
  301. );
  302. BOOL STREAMAPI
  303. QueueEmpty(
  304. IN PKSPIN_LOCK,
  305. IN PLIST_ENTRY
  306. );
  307. VOID
  308. STREAMAPI
  309. CodecReceivePacket(
  310. IN PHW_STREAM_REQUEST_BLOCK pSrb
  311. );
  312. BOOLEAN
  313. CodecInitialize (
  314. IN OUT PHW_STREAM_REQUEST_BLOCK pSrb
  315. );
  316. VOID
  317. STREAMAPI
  318. CodecCancelPacket(
  319. PHW_STREAM_REQUEST_BLOCK pSrb
  320. );
  321. VOID
  322. STREAMAPI
  323. CodecTimeoutPacket(
  324. PHW_STREAM_REQUEST_BLOCK pSrb
  325. );
  326. BOOL
  327. CompareGUIDsAndFormatSize(
  328. IN PKSDATARANGE pDataRange1,
  329. IN PKSDATARANGE pDataRange2,
  330. BOOLEAN bCheckSize
  331. );
  332. BOOL
  333. CompareStreamFormat (
  334. IN PHW_STREAM_REQUEST_BLOCK pSrb
  335. );
  336. BOOLEAN
  337. VerifyFormat(
  338. IN KSDATAFORMAT *pKSDataFormat,
  339. UINT StreamNumber,
  340. PKSDATARANGE pMatchedFormat
  341. );
  342. VOID
  343. OpenStream (
  344. PHW_STREAM_REQUEST_BLOCK pSrb
  345. );
  346. VOID
  347. CloseStream (
  348. PHW_STREAM_REQUEST_BLOCK pSrb
  349. );
  350. VOID
  351. STREAMAPI
  352. ReceiveDataPacket (
  353. IN PHW_STREAM_REQUEST_BLOCK pSrb
  354. );
  355. VOID
  356. STREAMAPI
  357. ReceiveCtrlPacket(
  358. IN PHW_STREAM_REQUEST_BLOCK pSrb
  359. );
  360. VOID
  361. SlipSetState(
  362. PHW_STREAM_REQUEST_BLOCK pSrb
  363. );
  364. VOID
  365. SlipGetState(
  366. PHW_STREAM_REQUEST_BLOCK pSrb
  367. );
  368. #endif // _SLIP_H_