This repo is obsolete, please see git://git.code.sf.net/p/dummynet/code@master
[ipfw.git] / original_passthru / passthru.h
1 /*++\r
2 \r
3 Copyright (c) 1992-2000  Microsoft Corporation\r
4 \r
5 Module Name:\r
6 \r
7     passthru.h\r
8 \r
9 Abstract:\r
10 \r
11     Ndis Intermediate Miniport driver sample. This is a passthru driver.\r
12 \r
13 Author:\r
14 \r
15 Environment:\r
16 \r
17 \r
18 Revision History:\r
19 \r
20  \r
21 --*/\r
22 \r
23 #ifdef NDIS51_MINIPORT\r
24 #define PASSTHRU_MAJOR_NDIS_VERSION            5\r
25 #define PASSTHRU_MINOR_NDIS_VERSION            1\r
26 #else\r
27 #define PASSTHRU_MAJOR_NDIS_VERSION            4\r
28 #define PASSTHRU_MINOR_NDIS_VERSION            0\r
29 #endif\r
30 \r
31 #ifdef NDIS51\r
32 #define PASSTHRU_PROT_MAJOR_NDIS_VERSION    5\r
33 #define PASSTHRU_PROT_MINOR_NDIS_VERSION    0\r
34 #else\r
35 #define PASSTHRU_PROT_MAJOR_NDIS_VERSION    4\r
36 #define PASSTHRU_PROT_MINOR_NDIS_VERSION    0\r
37 #endif\r
38 \r
39 #define MAX_BUNDLEID_LENGTH 50\r
40 \r
41 #define TAG 'ImPa'\r
42 #define WAIT_INFINITE 0\r
43 \r
44 \r
45 \r
46 //advance declaration\r
47 typedef struct _ADAPT ADAPT, *PADAPT;\r
48 \r
49 DRIVER_INITIALIZE DriverEntry;\r
50 extern\r
51 NTSTATUS\r
52 DriverEntry(\r
53     IN PDRIVER_OBJECT            DriverObject,\r
54     IN PUNICODE_STRING           RegistryPath\r
55     );\r
56 \r
57 DRIVER_DISPATCH PtDispatch;\r
58 NTSTATUS\r
59 PtDispatch(\r
60     IN PDEVICE_OBJECT            DeviceObject,\r
61     IN PIRP                      Irp\r
62     );\r
63 \r
64 NDIS_STATUS\r
65 PtRegisterDevice(\r
66     VOID\r
67     );\r
68 \r
69 NDIS_STATUS\r
70 PtDeregisterDevice(\r
71     VOID\r
72    );\r
73 \r
74 DRIVER_UNLOAD PtUnload;\r
75 VOID\r
76 PtUnloadProtocol(\r
77     VOID\r
78     );\r
79 \r
80 //\r
81 // Protocol proto-types\r
82 //\r
83 extern\r
84 VOID\r
85 PtOpenAdapterComplete(\r
86     IN NDIS_HANDLE                ProtocolBindingContext,\r
87     IN NDIS_STATUS                Status,\r
88     IN NDIS_STATUS                OpenErrorStatus\r
89     );\r
90 \r
91 extern\r
92 VOID\r
93 PtCloseAdapterComplete(\r
94     IN NDIS_HANDLE                ProtocolBindingContext,\r
95     IN NDIS_STATUS                Status\r
96     );\r
97 \r
98 extern\r
99 VOID\r
100 PtResetComplete(\r
101     IN NDIS_HANDLE                ProtocolBindingContext,\r
102     IN NDIS_STATUS                Status\r
103     );\r
104 \r
105 extern\r
106 VOID\r
107 PtRequestComplete(\r
108     IN NDIS_HANDLE                ProtocolBindingContext,\r
109     IN PNDIS_REQUEST              NdisRequest,\r
110     IN NDIS_STATUS                Status\r
111     );\r
112 \r
113 extern\r
114 VOID\r
115 PtStatus(\r
116     IN NDIS_HANDLE                ProtocolBindingContext,\r
117     IN NDIS_STATUS                GeneralStatus,\r
118     IN PVOID                      StatusBuffer,\r
119     IN UINT                       StatusBufferSize\r
120     );\r
121 \r
122 extern\r
123 VOID\r
124 PtStatusComplete(\r
125     IN NDIS_HANDLE                ProtocolBindingContext\r
126     );\r
127 \r
128 extern\r
129 VOID\r
130 PtSendComplete(\r
131     IN NDIS_HANDLE                ProtocolBindingContext,\r
132     IN PNDIS_PACKET               Packet,\r
133     IN NDIS_STATUS                Status\r
134     );\r
135 \r
136 extern\r
137 VOID\r
138 PtTransferDataComplete(\r
139     IN NDIS_HANDLE                ProtocolBindingContext,\r
140     IN PNDIS_PACKET               Packet,\r
141     IN NDIS_STATUS                Status,\r
142     IN UINT                       BytesTransferred\r
143     );\r
144 \r
145 extern\r
146 NDIS_STATUS\r
147 PtReceive(\r
148     IN NDIS_HANDLE                ProtocolBindingContext,\r
149     IN NDIS_HANDLE                MacReceiveContext,\r
150     IN PVOID                      HeaderBuffer,\r
151     IN UINT                       HeaderBufferSize,\r
152     IN PVOID                      LookAheadBuffer,\r
153     IN UINT                       LookaheadBufferSize,\r
154     IN UINT                       PacketSize\r
155     );\r
156 \r
157 extern\r
158 VOID\r
159 PtReceiveComplete(\r
160     IN NDIS_HANDLE                ProtocolBindingContext\r
161     );\r
162 \r
163 extern\r
164 INT\r
165 PtReceivePacket(\r
166     IN NDIS_HANDLE                ProtocolBindingContext,\r
167     IN PNDIS_PACKET               Packet\r
168     );\r
169 \r
170 extern\r
171 VOID\r
172 PtBindAdapter(\r
173     OUT PNDIS_STATUS              Status,\r
174     IN  NDIS_HANDLE               BindContext,\r
175     IN  PNDIS_STRING              DeviceName,\r
176     IN  PVOID                     SystemSpecific1,\r
177     IN  PVOID                     SystemSpecific2\r
178     );\r
179 \r
180 extern\r
181 VOID\r
182 PtUnbindAdapter(\r
183     OUT PNDIS_STATUS              Status,\r
184     IN  NDIS_HANDLE               ProtocolBindingContext,\r
185     IN  NDIS_HANDLE               UnbindContext\r
186     );\r
187     \r
188 VOID\r
189 PtUnload(\r
190     IN PDRIVER_OBJECT             DriverObject\r
191     );\r
192 \r
193 \r
194 \r
195 extern \r
196 NDIS_STATUS\r
197 PtPNPHandler(\r
198     IN NDIS_HANDLE                ProtocolBindingContext,\r
199     IN PNET_PNP_EVENT             pNetPnPEvent\r
200     );\r
201 \r
202 \r
203 \r
204 \r
205 NDIS_STATUS\r
206 PtPnPNetEventReconfigure(\r
207     IN PADAPT            pAdapt,\r
208     IN PNET_PNP_EVENT    pNetPnPEvent\r
209     );    \r
210 \r
211 NDIS_STATUS \r
212 PtPnPNetEventSetPower (\r
213     IN PADAPT                    pAdapt,\r
214     IN PNET_PNP_EVENT            pNetPnPEvent\r
215     );\r
216     \r
217 \r
218 //\r
219 // Miniport proto-types\r
220 //\r
221 NDIS_STATUS\r
222 MPInitialize(\r
223     OUT PNDIS_STATUS             OpenErrorStatus,\r
224     OUT PUINT                    SelectedMediumIndex,\r
225     IN PNDIS_MEDIUM              MediumArray,\r
226     IN UINT                      MediumArraySize,\r
227     IN NDIS_HANDLE               MiniportAdapterHandle,\r
228     IN NDIS_HANDLE               WrapperConfigurationContext\r
229     );\r
230 \r
231 VOID\r
232 MPSendPackets(\r
233     IN NDIS_HANDLE                MiniportAdapterContext,\r
234     IN PPNDIS_PACKET              PacketArray,\r
235     IN UINT                       NumberOfPackets\r
236     );\r
237 \r
238 NDIS_STATUS\r
239 MPSend(\r
240     IN NDIS_HANDLE                MiniportAdapterContext,\r
241     IN PNDIS_PACKET               Packet,\r
242     IN UINT                       Flags\r
243     );\r
244 \r
245 NDIS_STATUS\r
246 MPQueryInformation(\r
247     IN NDIS_HANDLE                MiniportAdapterContext,\r
248     IN NDIS_OID                   Oid,\r
249     IN PVOID                      InformationBuffer,\r
250     IN ULONG                      InformationBufferLength,\r
251     OUT PULONG                    BytesWritten,\r
252     OUT PULONG                    BytesNeeded\r
253     );\r
254 \r
255 NDIS_STATUS\r
256 MPSetInformation(\r
257     IN NDIS_HANDLE                                      MiniportAdapterContext,\r
258     IN NDIS_OID                                         Oid,\r
259     __in_bcount(InformationBufferLength) IN PVOID       InformationBuffer,\r
260     IN ULONG                                            InformationBufferLength,\r
261     OUT PULONG                                          BytesRead,\r
262     OUT PULONG                                          BytesNeeded\r
263     );\r
264 \r
265 VOID\r
266 MPReturnPacket(\r
267     IN NDIS_HANDLE                MiniportAdapterContext,\r
268     IN PNDIS_PACKET               Packet\r
269     );\r
270 \r
271 NDIS_STATUS\r
272 MPTransferData(\r
273     OUT PNDIS_PACKET              Packet,\r
274     OUT PUINT                     BytesTransferred,\r
275     IN NDIS_HANDLE                MiniportAdapterContext,\r
276     IN NDIS_HANDLE                MiniportReceiveContext,\r
277     IN UINT                       ByteOffset,\r
278     IN UINT                       BytesToTransfer\r
279     );\r
280 \r
281 VOID\r
282 MPHalt(\r
283     IN NDIS_HANDLE                MiniportAdapterContext\r
284     );\r
285 \r
286 \r
287 VOID\r
288 MPQueryPNPCapabilities(  \r
289     OUT PADAPT                    MiniportProtocolContext, \r
290     OUT PNDIS_STATUS              Status\r
291     );\r
292 \r
293 \r
294 #ifdef NDIS51_MINIPORT\r
295 \r
296 VOID\r
297 MPCancelSendPackets(\r
298     IN NDIS_HANDLE            MiniportAdapterContext,\r
299     IN PVOID                  CancelId\r
300     );\r
301 \r
302 VOID\r
303 MPAdapterShutdown(\r
304     IN NDIS_HANDLE                MiniportAdapterContext\r
305     );\r
306 \r
307 VOID\r
308 MPDevicePnPEvent(\r
309     IN NDIS_HANDLE                MiniportAdapterContext,\r
310     IN NDIS_DEVICE_PNP_EVENT      DevicePnPEvent,\r
311     IN PVOID                      InformationBuffer,\r
312     IN ULONG                      InformationBufferLength\r
313     );\r
314 \r
315 #endif // NDIS51_MINIPORT\r
316 \r
317 VOID\r
318 MPFreeAllPacketPools(\r
319     IN PADAPT                    pAdapt\r
320     );\r
321 \r
322 \r
323 VOID\r
324 MPProcessSetPowerOid(\r
325     IN OUT PNDIS_STATUS                             pNdisStatus,\r
326     IN PADAPT                                       pAdapt,\r
327     __in_bcount(InformationBufferLength) IN PVOID   InformationBuffer,\r
328     IN ULONG                                        InformationBufferLength,\r
329     OUT PULONG                                      BytesRead,\r
330     OUT PULONG                                      BytesNeeded\r
331     );\r
332 \r
333 VOID\r
334 PtReferenceAdapt(\r
335     IN PADAPT     pAdapt\r
336     );\r
337 \r
338 BOOLEAN\r
339 PtDereferenceAdapt(\r
340     IN PADAPT     pAdapt\r
341     );\r
342 \r
343 //\r
344 // There should be no DbgPrint's in the Free version of the driver\r
345 //\r
346 #if DBG\r
347 \r
348 #define DBGPRINT(Fmt)                                        \\r
349     {                                                        \\r
350         DbgPrint("Passthru: ");                                \\r
351         DbgPrint Fmt;                                        \\r
352     }\r
353 \r
354 #else // if DBG\r
355 \r
356 #define DBGPRINT(Fmt)                                            \r
357 \r
358 #endif // if DBG \r
359 \r
360 #define    NUM_PKTS_IN_POOL    256\r
361 \r
362 \r
363 //\r
364 // Protocol reserved part of a sent packet that is allocated by us.\r
365 //\r
366 typedef struct _SEND_RSVD\r
367 {\r
368     PNDIS_PACKET    OriginalPkt;\r
369 } SEND_RSVD, *PSEND_RSVD;\r
370 \r
371 //\r
372 // Miniport reserved part of a received packet that is allocated by\r
373 // us. Note that this should fit into the MiniportReserved space\r
374 // in an NDIS_PACKET.\r
375 //\r
376 typedef struct _RECV_RSVD\r
377 {\r
378     PNDIS_PACKET    OriginalPkt;\r
379 } RECV_RSVD, *PRECV_RSVD;\r
380 \r
381 C_ASSERT(sizeof(RECV_RSVD) <= sizeof(((PNDIS_PACKET)0)->MiniportReserved));\r
382 \r
383 //\r
384 // Event Codes related to the PassthruEvent Structure\r
385 //\r
386 \r
387 typedef enum \r
388 {\r
389     Passthru_Invalid,\r
390     Passthru_SetPower,\r
391     Passthru_Unbind\r
392 \r
393 } PASSSTHRU_EVENT_CODE, *PPASTHRU_EVENT_CODE; \r
394 \r
395 //\r
396 // Passthru Event with  a code to state why they have been state\r
397 //\r
398 \r
399 typedef struct _PASSTHRU_EVENT\r
400 {\r
401     NDIS_EVENT Event;\r
402     PASSSTHRU_EVENT_CODE Code;\r
403 \r
404 } PASSTHRU_EVENT, *PPASSTHRU_EVENT;\r
405 \r
406 \r
407 //\r
408 // Structure used by both the miniport as well as the protocol part of the intermediate driver\r
409 // to represent an adapter and its corres. lower bindings\r
410 //\r
411 typedef struct _ADAPT\r
412 {\r
413     struct _ADAPT *                Next;\r
414     \r
415     NDIS_HANDLE                    BindingHandle;    // To the lower miniport\r
416     NDIS_HANDLE                    MiniportHandle;    // NDIS Handle to for miniport up-calls\r
417     NDIS_HANDLE                    SendPacketPoolHandle;\r
418     NDIS_HANDLE                    RecvPacketPoolHandle;\r
419     NDIS_STATUS                    Status;            // Open Status\r
420     NDIS_EVENT                     Event;            // Used by bind/halt for Open/Close Adapter synch.\r
421     NDIS_MEDIUM                    Medium;\r
422     NDIS_REQUEST                   Request;        // This is used to wrap a request coming down\r
423                                                 // to us. This exploits the fact that requests\r
424                                                 // are serialized down to us.\r
425     PULONG                         BytesNeeded;\r
426     PULONG                         BytesReadOrWritten;\r
427     BOOLEAN                        ReceivedIndicationFlags[32];\r
428     \r
429     BOOLEAN                        OutstandingRequests;      // TRUE iff a request is pending\r
430                                                         // at the miniport below\r
431     BOOLEAN                        QueuedRequest;            // TRUE iff a request is queued at\r
432                                                         // this IM miniport\r
433 \r
434     BOOLEAN                        StandingBy;                // True - When the miniport or protocol is transitioning from a D0 to Standby (>D0) State\r
435     BOOLEAN                        UnbindingInProcess;\r
436     NDIS_SPIN_LOCK                 Lock;\r
437                                                         // False - At all other times, - Flag is cleared after a transition to D0\r
438 \r
439     NDIS_DEVICE_POWER_STATE        MPDeviceState;            // Miniport's Device State \r
440     NDIS_DEVICE_POWER_STATE        PTDeviceState;            // Protocol's Device State \r
441     NDIS_STRING                    DeviceName;                // For initializing the miniport edge\r
442     NDIS_EVENT                     MiniportInitEvent;        // For blocking UnbindAdapter while\r
443                                                         // an IM Init is in progress.\r
444     BOOLEAN                        MiniportInitPending;    // TRUE iff IMInit in progress\r
445     NDIS_STATUS                    LastIndicatedStatus;    // The last indicated media status\r
446     NDIS_STATUS                    LatestUnIndicateStatus; // The latest suppressed media status\r
447     ULONG                          OutstandingSends;\r
448     LONG                           RefCount;\r
449     BOOLEAN                        MiniportIsHalted;\r
450 } ADAPT, *PADAPT;\r
451 \r
452 extern    NDIS_HANDLE                        ProtHandle, DriverHandle;\r
453 extern    NDIS_MEDIUM                        MediumArray[4];\r
454 extern    PADAPT                             pAdaptList;\r
455 extern    NDIS_SPIN_LOCK                     GlobalLock;\r
456 \r
457 \r
458 #define ADAPT_MINIPORT_HANDLE(_pAdapt)    ((_pAdapt)->MiniportHandle)\r
459 #define ADAPT_DECR_PENDING_SENDS(_pAdapt)     \\r
460     {                                         \\r
461         NdisAcquireSpinLock(&(_pAdapt)->Lock);   \\r
462         (_pAdapt)->OutstandingSends--;           \\r
463         NdisReleaseSpinLock(&(_pAdapt)->Lock);   \\r
464     }\r
465 \r
466 //\r
467 // Custom Macros to be used by the passthru driver \r
468 //\r
469 /*\r
470 BOOLEAN\r
471 IsIMDeviceStateOn(\r
472    PADAPT \r
473    )\r
474 \r
475 */\r
476 #define IsIMDeviceStateOn(_pP)        ((_pP)->MPDeviceState == NdisDeviceStateD0 && (_pP)->PTDeviceState == NdisDeviceStateD0 ) \r
477 \r