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.

477 lines
12 KiB

  1. /*++
  2. Copyright (c) 2001 Microsoft Corporation
  3. Module Name:
  4. tunmp.h
  5. Abstract:
  6. Data structures, defines and function prototypes for TUNMP.
  7. Environment:
  8. Kernel mode only.
  9. Revision History:
  10. alid 10/22/2001 Created
  11. --*/
  12. #ifndef __TUNMP__H
  13. #define __TUNMP__H
  14. typedef struct _TUN_MEDIA_INFO
  15. {
  16. ULONG MaxFrameLen;
  17. UINT MacHeaderLen;
  18. ULONG LinkSpeed;
  19. } TUN_MEDIA_INFO, *PTUN_MEDIA_INFO;
  20. extern const TUN_MEDIA_INFO MediaParams[];
  21. extern NDIS_HANDLE NdisWrapperHandle;
  22. //internal device name and size
  23. #define DEVICE_NAME L"\\Device\\Tun"
  24. //device name visible to users
  25. #define SYMBOLIC_NAME L"\\GLOBAL??\\Tun"
  26. extern LONG GlobalDeviceInstanceNumber;
  27. extern NDIS_SPIN_LOCK TunGlobalLock;
  28. extern LIST_ENTRY TunAdapterList;
  29. #define TUN_MAX_MULTICAST_ADDRESS 16
  30. #define TUN_MAC_ADDR_LEN 6
  31. #define TUN_MAX_LOOKAHEAD 256
  32. //
  33. // The Open Context represents an open of our device object.
  34. // We allocate this on processing a BindAdapter from NDIS,
  35. // and free it when all references (see below) to it are gone.
  36. //
  37. // Binding/unbinding to an NDIS device:
  38. //
  39. // On processing a BindAdapter call from NDIS, we set up a binding
  40. // to the specified NDIS device (miniport). This binding is
  41. // torn down when NDIS asks us to Unbind by calling
  42. // our UnbindAdapter handler.
  43. //
  44. // Receiving data:
  45. //
  46. // While an NDIS binding exists, read IRPs are queued on this
  47. // structure, to be processed when packets are received.
  48. // If data arrives in the absense of a pended read IRP, we
  49. // queue it, to the extent of one packet, i.e. we save the
  50. // contents of the latest packet received. We fail read IRPs
  51. // received when no NDIS binding exists (or is in the process
  52. // of being torn down).
  53. //
  54. // Sending data:
  55. //
  56. // Write IRPs are used to send data. Each write IRP maps to
  57. // a single NDIS packet. Packet send-completion is mapped to
  58. // write IRP completion. We use NDIS 5.1 CancelSend to support
  59. // write IRP cancellation. Write IRPs that arrive when we don't
  60. // have an active NDIS binding are failed.
  61. //
  62. // Reference count:
  63. //
  64. // The following are long-lived references:
  65. // OPEN_DEVICE ioctl (goes away on processing a Close IRP)
  66. // Pended read IRPs
  67. // Queued received packets
  68. // Uncompleted write IRPs (outstanding sends)
  69. // Existence of NDIS binding
  70. //
  71. typedef struct _TUN_ADAPTER
  72. {
  73. LIST_ENTRY Link; // Link into global list
  74. ULONG Flags; // State information
  75. ULONG RefCount;
  76. TUN_LOCK Lock;
  77. NDIS_MEDIUM Medium;
  78. PFILE_OBJECT pFileObject; // Set on OPEN_DEVICE
  79. NDIS_HANDLE MiniportHandle;
  80. ULONG MaxLookAhead;
  81. ULONG PacketFilter;
  82. ULONG MediumLinkSpeed;
  83. ULONG MediumMinPacketLen;
  84. ULONG MediumMaxPacketLen;
  85. UINT MediumMacHeaderLen;
  86. ULONG MediumMaxFrameLen;
  87. UCHAR PermanentAddress[TUN_MAC_ADDR_LEN];
  88. UCHAR CurrentAddress[TUN_MAC_ADDR_LEN];
  89. ULONG SendPackets; // number of frames that are sent
  90. ULONG RcvPackets; // number of frames that are received
  91. ULONG RcvBytes;
  92. ULONG SendBytes;
  93. ULONG XmitError;
  94. ULONG XmitErrorNoReadIrps;
  95. ULONG RcvError;
  96. ULONG RcvNoBuffer;
  97. NDIS_HANDLE SendPacketPool;
  98. ULONG MacOptions;
  99. LIST_ENTRY PendedWrites; // pended Write IRPs
  100. ULONG PendedSendCount;// number of outstanding Write IRPs
  101. LIST_ENTRY PendedReads; // pended Read IRPs
  102. ULONG PendedReadCount;// number of outstanding Read IRPs
  103. LIST_ENTRY RecvPktQueue; // queued rcv packets
  104. ULONG RecvPktCount; // number of outstanding NDIS Send requests
  105. PDEVICE_OBJECT DeviceObject;
  106. NDIS_HANDLE NdisDeviceHandle;
  107. ULONG DeviceInstanceNumber;
  108. NDIS_DEVICE_POWER_STATE PowerState;
  109. NDIS_STRING MiniportName;
  110. PNDIS_EVENT HaltEvent;
  111. ULONG mc_sig; // Signature for sanity
  112. } TUN_ADAPTER, *PTUN_ADAPTER;
  113. #define mc_signature 'nuTN'
  114. #define TUN_SET_FLAG(_M, _F) ((_M)->Flags |= (_F))
  115. #define TUN_CLEAR_FLAG(_M, _F) ((_M)->Flags &= ~(_F))
  116. #define TUN_TEST_FLAG(_M, _F) (((_M)->Flags & (_F)) != 0)
  117. #define TUN_TEST_FLAGS(_M, _F) (((_M)->Flags & (_F)) == (_F))
  118. //
  119. // Definitions for Flags above.
  120. //
  121. #define TUN_ADAPTER_ACTIVE 0x00000001 // packet filter is non zero
  122. #define TUN_ADAPTER_OPEN 0x00000002 // app has an open handle
  123. #define TUN_MEDIA_CONNECTED 0x00000004
  124. #define TUN_COMPLETE_REQUEST 0x00000008
  125. #define TUN_ADAPTER_OFF 0x00000010
  126. #define TUN_ADAPTER_CANT_HALT 0x00000020
  127. //
  128. // Send packet pool bounds
  129. //
  130. #define MIN_SEND_PACKET_POOL_SIZE 20
  131. #define MAX_SEND_PACKET_POOL_SIZE 400
  132. //
  133. // MiniportReserved in written packets. We save a pointer to the IRP
  134. // that generated the send.
  135. //
  136. // The RefCount is used to determine when to free the packet back
  137. // to its pool. It is used to synchronize between a thread completing
  138. // a send and a thread attempting to cancel a send.
  139. //
  140. typedef struct _TUN_SEND_PACKET_RSVD
  141. {
  142. PIRP pIrp;
  143. ULONG RefCount;
  144. } TUN_SEND_PACKET_RSVD, *PTUN_SEND_PACKET_RSVD;
  145. //
  146. // Receive packet pool bounds
  147. //
  148. #define MIN_RECV_PACKET_POOL_SIZE 4
  149. #define MAX_RECV_PACKET_POOL_SIZE 20
  150. //
  151. // Max receive packets we allow to be queued up
  152. //
  153. //1 check to see if this value is good enough
  154. #define MAX_RECV_QUEUE_SIZE 10
  155. //
  156. // MiniportReserved in received packets: we link these
  157. // packets up in a queue waiting for Read IRPs.
  158. //
  159. typedef struct _TUN_RECV_PACKET_RSVD
  160. {
  161. LIST_ENTRY Link;
  162. } TUN_RECV_PACKET_RSVD, *PTUN_RECV_PACKET_RSVD;
  163. #define TUN_ALLOC_TAG 'untN'
  164. //
  165. // Prototypes.
  166. //
  167. NTSTATUS
  168. DriverEntry(
  169. IN PDRIVER_OBJECT pDriverObject,
  170. IN PUNICODE_STRING pRegistryPath
  171. );
  172. VOID
  173. TunUnload(
  174. IN PDRIVER_OBJECT DriverObject
  175. );
  176. NTSTATUS
  177. TunOpen(
  178. IN PDEVICE_OBJECT pDeviceObject,
  179. IN PIRP pIrp
  180. );
  181. NTSTATUS
  182. TunClose(
  183. IN PDEVICE_OBJECT pDeviceObject,
  184. IN PIRP pIrp
  185. );
  186. NTSTATUS
  187. TunCleanup(
  188. IN PDEVICE_OBJECT pDeviceObject,
  189. IN PIRP pIrp
  190. );
  191. NTSTATUS
  192. TunIoControl(
  193. IN PDEVICE_OBJECT pDeviceObject,
  194. IN PIRP pIrp
  195. );
  196. VOID
  197. TunMpRefAdapter(
  198. IN PTUN_ADAPTER pAdapter
  199. );
  200. VOID
  201. TunMpDerefAdapter(
  202. IN PTUN_ADAPTER pAdapter
  203. );
  204. #if DBG
  205. VOID
  206. TunMpDbgRefAdapter(
  207. IN PTUN_ADAPTER pAdapter,
  208. IN ULONG FileNumber,
  209. IN ULONG LineNumber
  210. );
  211. VOID
  212. TunMpDbgDerefAdapter(
  213. IN PTUN_ADAPTER pAdapter,
  214. IN ULONG FileNumber,
  215. IN ULONG LineNumber
  216. );
  217. #endif // DBG
  218. VOID
  219. TunPnPEvent(
  220. IN NDIS_HANDLE MiniportAdapterContext,
  221. IN NDIS_DEVICE_PNP_EVENT DevicePnPEvent,
  222. IN PVOID InformationBuffer,
  223. IN ULONG InformationBufferLength
  224. );
  225. VOID
  226. TunWaitForPendingIO(
  227. IN PTUN_ADAPTER pAdapter,
  228. IN BOOLEAN DoCancelReads
  229. );
  230. PTUN_ADAPTER
  231. TunLookupDevice(
  232. IN PUCHAR pBindingInfo,
  233. IN ULONG BindingInfoLength
  234. );
  235. NDIS_STATUS
  236. TunQueryOidValue(
  237. IN PTUN_ADAPTER pAdapter,
  238. OUT PVOID pDataBuffer,
  239. IN ULONG BufferLength,
  240. OUT PULONG pBytesWritten
  241. );
  242. NDIS_STATUS
  243. TunSetOidValue(
  244. IN PTUN_ADAPTER pAdapter,
  245. OUT PVOID pDataBuffer,
  246. IN ULONG BufferLength
  247. );
  248. NTSTATUS
  249. TunRead(
  250. IN PDEVICE_OBJECT pDeviceObject,
  251. IN PIRP pIrp
  252. );
  253. VOID
  254. TunCancelRead(
  255. IN PDEVICE_OBJECT pDeviceObject,
  256. IN PIRP pIrp
  257. );
  258. VOID
  259. TunServiceReads(
  260. IN PTUN_ADAPTER pAdapter
  261. );
  262. INT
  263. TunReceivePacket(
  264. IN NDIS_HANDLE ProtocolBindingContext,
  265. IN PNDIS_PACKET pNdisPacket
  266. );
  267. VOID
  268. TunShutdownBinding(
  269. IN PTUN_ADAPTER pAdapter
  270. );
  271. VOID
  272. TunCancelPendingReads(
  273. IN PTUN_ADAPTER pAdapter
  274. );
  275. VOID
  276. TunFlushReceiveQueue(
  277. IN PTUN_ADAPTER pAdapter
  278. );
  279. NTSTATUS
  280. TunWrite(
  281. IN PDEVICE_OBJECT pDeviceObject,
  282. IN PIRP pIrp
  283. );
  284. //
  285. // Tun miniport entry points
  286. //
  287. NDIS_STATUS
  288. TunMpInitialize(
  289. OUT PNDIS_STATUS OpenErrorStatus,
  290. OUT PUINT SelectedMediumIndex,
  291. IN PNDIS_MEDIUM MediumArray,
  292. IN UINT MediumArraySize,
  293. IN NDIS_HANDLE MiniportAdapterHandle,
  294. IN NDIS_HANDLE ConfigurationContext
  295. );
  296. VOID
  297. TunMpHalt(
  298. IN NDIS_HANDLE MiniportAdapterContext
  299. );
  300. VOID
  301. TunMpShutdown(
  302. IN NDIS_HANDLE MiniportAdapterContext
  303. );
  304. NDIS_STATUS
  305. TunMpSetInformation(
  306. IN NDIS_HANDLE MiniportAdapterContext,
  307. IN NDIS_OID Oid,
  308. IN PVOID InformationBuffer,
  309. IN ULONG InformationBufferLength,
  310. OUT PULONG BytesRead,
  311. OUT PULONG BytesNeeded
  312. );
  313. NDIS_STATUS
  314. TunMpQueryInformation(
  315. IN NDIS_HANDLE MiniportAdapterContext,
  316. IN NDIS_OID Oid,
  317. IN PVOID InformationBuffer,
  318. IN ULONG InformationBufferLength,
  319. OUT PULONG BytesWritten,
  320. OUT PULONG BytesNeeded
  321. );
  322. VOID
  323. TunMpReturnPacket(
  324. IN NDIS_HANDLE pMiniportAdapterContext,
  325. IN PNDIS_PACKET pNdisPacket
  326. );
  327. VOID
  328. TunMpSendPackets(
  329. IN NDIS_HANDLE MiniportAdapterContext,
  330. IN PPNDIS_PACKET PacketArray,
  331. IN UINT NumberOfPackets
  332. );
  333. NTSTATUS
  334. TunFOpen(
  335. IN PDEVICE_OBJECT pDeviceObject,
  336. IN PIRP pIrp
  337. );
  338. NTSTATUS
  339. TunFClose(
  340. IN PDEVICE_OBJECT pDeviceObject,
  341. IN PIRP pIrp
  342. );
  343. NTSTATUS
  344. TunFCleanup(
  345. IN PDEVICE_OBJECT pDeviceObject,
  346. IN PIRP pIrp
  347. );
  348. NTSTATUS
  349. TunFIoControl(
  350. IN PDEVICE_OBJECT pDeviceObject,
  351. IN PIRP pIrp
  352. );
  353. NDIS_STATUS
  354. TunMpCreateDevice(
  355. IN PTUN_ADAPTER pAdapter
  356. );
  357. NTSTATUS
  358. CreateDeviceDriverSecurityDescriptor(
  359. IN PVOID DeviceOrDriverObject
  360. );
  361. NTSTATUS
  362. TunSetSecurity(
  363. IN PDEVICE_OBJECT DeviceObject
  364. );
  365. NTSTATUS
  366. TunCreateSD(
  367. VOID
  368. );
  369. VOID
  370. TunDeleteSD(
  371. VOID
  372. );
  373. VOID
  374. TunMpUnload(
  375. IN PDRIVER_OBJECT DriverObject
  376. );
  377. #endif // __TUNMP__H