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