Sync with the new ipfw3 version.
[ipfw.git] / original_passthru / passthru.h
diff --git a/original_passthru/passthru.h b/original_passthru/passthru.h
new file mode 100644 (file)
index 0000000..badde8a
--- /dev/null
@@ -0,0 +1,477 @@
+/*++\r
+\r
+Copyright (c) 1992-2000  Microsoft Corporation\r
+\r
+Module Name:\r
+\r
+    passthru.h\r
+\r
+Abstract:\r
+\r
+    Ndis Intermediate Miniport driver sample. This is a passthru driver.\r
+\r
+Author:\r
+\r
+Environment:\r
+\r
+\r
+Revision History:\r
+\r
\r
+--*/\r
+\r
+#ifdef NDIS51_MINIPORT\r
+#define PASSTHRU_MAJOR_NDIS_VERSION            5\r
+#define PASSTHRU_MINOR_NDIS_VERSION            1\r
+#else\r
+#define PASSTHRU_MAJOR_NDIS_VERSION            4\r
+#define PASSTHRU_MINOR_NDIS_VERSION            0\r
+#endif\r
+\r
+#ifdef NDIS51\r
+#define PASSTHRU_PROT_MAJOR_NDIS_VERSION    5\r
+#define PASSTHRU_PROT_MINOR_NDIS_VERSION    0\r
+#else\r
+#define PASSTHRU_PROT_MAJOR_NDIS_VERSION    4\r
+#define PASSTHRU_PROT_MINOR_NDIS_VERSION    0\r
+#endif\r
+\r
+#define MAX_BUNDLEID_LENGTH 50\r
+\r
+#define TAG 'ImPa'\r
+#define WAIT_INFINITE 0\r
+\r
+\r
+\r
+//advance declaration\r
+typedef struct _ADAPT ADAPT, *PADAPT;\r
+\r
+DRIVER_INITIALIZE DriverEntry;\r
+extern\r
+NTSTATUS\r
+DriverEntry(\r
+    IN PDRIVER_OBJECT            DriverObject,\r
+    IN PUNICODE_STRING           RegistryPath\r
+    );\r
+\r
+DRIVER_DISPATCH PtDispatch;\r
+NTSTATUS\r
+PtDispatch(\r
+    IN PDEVICE_OBJECT            DeviceObject,\r
+    IN PIRP                      Irp\r
+    );\r
+\r
+NDIS_STATUS\r
+PtRegisterDevice(\r
+    VOID\r
+    );\r
+\r
+NDIS_STATUS\r
+PtDeregisterDevice(\r
+    VOID\r
+   );\r
+\r
+DRIVER_UNLOAD PtUnload;\r
+VOID\r
+PtUnloadProtocol(\r
+    VOID\r
+    );\r
+\r
+//\r
+// Protocol proto-types\r
+//\r
+extern\r
+VOID\r
+PtOpenAdapterComplete(\r
+    IN NDIS_HANDLE                ProtocolBindingContext,\r
+    IN NDIS_STATUS                Status,\r
+    IN NDIS_STATUS                OpenErrorStatus\r
+    );\r
+\r
+extern\r
+VOID\r
+PtCloseAdapterComplete(\r
+    IN NDIS_HANDLE                ProtocolBindingContext,\r
+    IN NDIS_STATUS                Status\r
+    );\r
+\r
+extern\r
+VOID\r
+PtResetComplete(\r
+    IN NDIS_HANDLE                ProtocolBindingContext,\r
+    IN NDIS_STATUS                Status\r
+    );\r
+\r
+extern\r
+VOID\r
+PtRequestComplete(\r
+    IN NDIS_HANDLE                ProtocolBindingContext,\r
+    IN PNDIS_REQUEST              NdisRequest,\r
+    IN NDIS_STATUS                Status\r
+    );\r
+\r
+extern\r
+VOID\r
+PtStatus(\r
+    IN NDIS_HANDLE                ProtocolBindingContext,\r
+    IN NDIS_STATUS                GeneralStatus,\r
+    IN PVOID                      StatusBuffer,\r
+    IN UINT                       StatusBufferSize\r
+    );\r
+\r
+extern\r
+VOID\r
+PtStatusComplete(\r
+    IN NDIS_HANDLE                ProtocolBindingContext\r
+    );\r
+\r
+extern\r
+VOID\r
+PtSendComplete(\r
+    IN NDIS_HANDLE                ProtocolBindingContext,\r
+    IN PNDIS_PACKET               Packet,\r
+    IN NDIS_STATUS                Status\r
+    );\r
+\r
+extern\r
+VOID\r
+PtTransferDataComplete(\r
+    IN NDIS_HANDLE                ProtocolBindingContext,\r
+    IN PNDIS_PACKET               Packet,\r
+    IN NDIS_STATUS                Status,\r
+    IN UINT                       BytesTransferred\r
+    );\r
+\r
+extern\r
+NDIS_STATUS\r
+PtReceive(\r
+    IN NDIS_HANDLE                ProtocolBindingContext,\r
+    IN NDIS_HANDLE                MacReceiveContext,\r
+    IN PVOID                      HeaderBuffer,\r
+    IN UINT                       HeaderBufferSize,\r
+    IN PVOID                      LookAheadBuffer,\r
+    IN UINT                       LookaheadBufferSize,\r
+    IN UINT                       PacketSize\r
+    );\r
+\r
+extern\r
+VOID\r
+PtReceiveComplete(\r
+    IN NDIS_HANDLE                ProtocolBindingContext\r
+    );\r
+\r
+extern\r
+INT\r
+PtReceivePacket(\r
+    IN NDIS_HANDLE                ProtocolBindingContext,\r
+    IN PNDIS_PACKET               Packet\r
+    );\r
+\r
+extern\r
+VOID\r
+PtBindAdapter(\r
+    OUT PNDIS_STATUS              Status,\r
+    IN  NDIS_HANDLE               BindContext,\r
+    IN  PNDIS_STRING              DeviceName,\r
+    IN  PVOID                     SystemSpecific1,\r
+    IN  PVOID                     SystemSpecific2\r
+    );\r
+\r
+extern\r
+VOID\r
+PtUnbindAdapter(\r
+    OUT PNDIS_STATUS              Status,\r
+    IN  NDIS_HANDLE               ProtocolBindingContext,\r
+    IN  NDIS_HANDLE               UnbindContext\r
+    );\r
+    \r
+VOID\r
+PtUnload(\r
+    IN PDRIVER_OBJECT             DriverObject\r
+    );\r
+\r
+\r
+\r
+extern \r
+NDIS_STATUS\r
+PtPNPHandler(\r
+    IN NDIS_HANDLE                ProtocolBindingContext,\r
+    IN PNET_PNP_EVENT             pNetPnPEvent\r
+    );\r
+\r
+\r
+\r
+\r
+NDIS_STATUS\r
+PtPnPNetEventReconfigure(\r
+    IN PADAPT            pAdapt,\r
+    IN PNET_PNP_EVENT    pNetPnPEvent\r
+    );    \r
+\r
+NDIS_STATUS \r
+PtPnPNetEventSetPower (\r
+    IN PADAPT                    pAdapt,\r
+    IN PNET_PNP_EVENT            pNetPnPEvent\r
+    );\r
+    \r
+\r
+//\r
+// Miniport proto-types\r
+//\r
+NDIS_STATUS\r
+MPInitialize(\r
+    OUT PNDIS_STATUS             OpenErrorStatus,\r
+    OUT PUINT                    SelectedMediumIndex,\r
+    IN PNDIS_MEDIUM              MediumArray,\r
+    IN UINT                      MediumArraySize,\r
+    IN NDIS_HANDLE               MiniportAdapterHandle,\r
+    IN NDIS_HANDLE               WrapperConfigurationContext\r
+    );\r
+\r
+VOID\r
+MPSendPackets(\r
+    IN NDIS_HANDLE                MiniportAdapterContext,\r
+    IN PPNDIS_PACKET              PacketArray,\r
+    IN UINT                       NumberOfPackets\r
+    );\r
+\r
+NDIS_STATUS\r
+MPSend(\r
+    IN NDIS_HANDLE                MiniportAdapterContext,\r
+    IN PNDIS_PACKET               Packet,\r
+    IN UINT                       Flags\r
+    );\r
+\r
+NDIS_STATUS\r
+MPQueryInformation(\r
+    IN NDIS_HANDLE                MiniportAdapterContext,\r
+    IN NDIS_OID                   Oid,\r
+    IN PVOID                      InformationBuffer,\r
+    IN ULONG                      InformationBufferLength,\r
+    OUT PULONG                    BytesWritten,\r
+    OUT PULONG                    BytesNeeded\r
+    );\r
+\r
+NDIS_STATUS\r
+MPSetInformation(\r
+    IN NDIS_HANDLE                                      MiniportAdapterContext,\r
+    IN NDIS_OID                                         Oid,\r
+    __in_bcount(InformationBufferLength) IN PVOID       InformationBuffer,\r
+    IN ULONG                                            InformationBufferLength,\r
+    OUT PULONG                                          BytesRead,\r
+    OUT PULONG                                          BytesNeeded\r
+    );\r
+\r
+VOID\r
+MPReturnPacket(\r
+    IN NDIS_HANDLE                MiniportAdapterContext,\r
+    IN PNDIS_PACKET               Packet\r
+    );\r
+\r
+NDIS_STATUS\r
+MPTransferData(\r
+    OUT PNDIS_PACKET              Packet,\r
+    OUT PUINT                     BytesTransferred,\r
+    IN NDIS_HANDLE                MiniportAdapterContext,\r
+    IN NDIS_HANDLE                MiniportReceiveContext,\r
+    IN UINT                       ByteOffset,\r
+    IN UINT                       BytesToTransfer\r
+    );\r
+\r
+VOID\r
+MPHalt(\r
+    IN NDIS_HANDLE                MiniportAdapterContext\r
+    );\r
+\r
+\r
+VOID\r
+MPQueryPNPCapabilities(  \r
+    OUT PADAPT                    MiniportProtocolContext, \r
+    OUT PNDIS_STATUS              Status\r
+    );\r
+\r
+\r
+#ifdef NDIS51_MINIPORT\r
+\r
+VOID\r
+MPCancelSendPackets(\r
+    IN NDIS_HANDLE            MiniportAdapterContext,\r
+    IN PVOID                  CancelId\r
+    );\r
+\r
+VOID\r
+MPAdapterShutdown(\r
+    IN NDIS_HANDLE                MiniportAdapterContext\r
+    );\r
+\r
+VOID\r
+MPDevicePnPEvent(\r
+    IN NDIS_HANDLE                MiniportAdapterContext,\r
+    IN NDIS_DEVICE_PNP_EVENT      DevicePnPEvent,\r
+    IN PVOID                      InformationBuffer,\r
+    IN ULONG                      InformationBufferLength\r
+    );\r
+\r
+#endif // NDIS51_MINIPORT\r
+\r
+VOID\r
+MPFreeAllPacketPools(\r
+    IN PADAPT                    pAdapt\r
+    );\r
+\r
+\r
+VOID\r
+MPProcessSetPowerOid(\r
+    IN OUT PNDIS_STATUS                             pNdisStatus,\r
+    IN PADAPT                                       pAdapt,\r
+    __in_bcount(InformationBufferLength) IN PVOID   InformationBuffer,\r
+    IN ULONG                                        InformationBufferLength,\r
+    OUT PULONG                                      BytesRead,\r
+    OUT PULONG                                      BytesNeeded\r
+    );\r
+\r
+VOID\r
+PtReferenceAdapt(\r
+    IN PADAPT     pAdapt\r
+    );\r
+\r
+BOOLEAN\r
+PtDereferenceAdapt(\r
+    IN PADAPT     pAdapt\r
+    );\r
+\r
+//\r
+// There should be no DbgPrint's in the Free version of the driver\r
+//\r
+#if DBG\r
+\r
+#define DBGPRINT(Fmt)                                        \\r
+    {                                                        \\r
+        DbgPrint("Passthru: ");                                \\r
+        DbgPrint Fmt;                                        \\r
+    }\r
+\r
+#else // if DBG\r
+\r
+#define DBGPRINT(Fmt)                                            \r
+\r
+#endif // if DBG \r
+\r
+#define    NUM_PKTS_IN_POOL    256\r
+\r
+\r
+//\r
+// Protocol reserved part of a sent packet that is allocated by us.\r
+//\r
+typedef struct _SEND_RSVD\r
+{\r
+    PNDIS_PACKET    OriginalPkt;\r
+} SEND_RSVD, *PSEND_RSVD;\r
+\r
+//\r
+// Miniport reserved part of a received packet that is allocated by\r
+// us. Note that this should fit into the MiniportReserved space\r
+// in an NDIS_PACKET.\r
+//\r
+typedef struct _RECV_RSVD\r
+{\r
+    PNDIS_PACKET    OriginalPkt;\r
+} RECV_RSVD, *PRECV_RSVD;\r
+\r
+C_ASSERT(sizeof(RECV_RSVD) <= sizeof(((PNDIS_PACKET)0)->MiniportReserved));\r
+\r
+//\r
+// Event Codes related to the PassthruEvent Structure\r
+//\r
+\r
+typedef enum \r
+{\r
+    Passthru_Invalid,\r
+    Passthru_SetPower,\r
+    Passthru_Unbind\r
+\r
+} PASSSTHRU_EVENT_CODE, *PPASTHRU_EVENT_CODE; \r
+\r
+//\r
+// Passthru Event with  a code to state why they have been state\r
+//\r
+\r
+typedef struct _PASSTHRU_EVENT\r
+{\r
+    NDIS_EVENT Event;\r
+    PASSSTHRU_EVENT_CODE Code;\r
+\r
+} PASSTHRU_EVENT, *PPASSTHRU_EVENT;\r
+\r
+\r
+//\r
+// Structure used by both the miniport as well as the protocol part of the intermediate driver\r
+// to represent an adapter and its corres. lower bindings\r
+//\r
+typedef struct _ADAPT\r
+{\r
+    struct _ADAPT *                Next;\r
+    \r
+    NDIS_HANDLE                    BindingHandle;    // To the lower miniport\r
+    NDIS_HANDLE                    MiniportHandle;    // NDIS Handle to for miniport up-calls\r
+    NDIS_HANDLE                    SendPacketPoolHandle;\r
+    NDIS_HANDLE                    RecvPacketPoolHandle;\r
+    NDIS_STATUS                    Status;            // Open Status\r
+    NDIS_EVENT                     Event;            // Used by bind/halt for Open/Close Adapter synch.\r
+    NDIS_MEDIUM                    Medium;\r
+    NDIS_REQUEST                   Request;        // This is used to wrap a request coming down\r
+                                                // to us. This exploits the fact that requests\r
+                                                // are serialized down to us.\r
+    PULONG                         BytesNeeded;\r
+    PULONG                         BytesReadOrWritten;\r
+    BOOLEAN                        ReceivedIndicationFlags[32];\r
+    \r
+    BOOLEAN                        OutstandingRequests;      // TRUE iff a request is pending\r
+                                                        // at the miniport below\r
+    BOOLEAN                        QueuedRequest;            // TRUE iff a request is queued at\r
+                                                        // this IM miniport\r
+\r
+    BOOLEAN                        StandingBy;                // True - When the miniport or protocol is transitioning from a D0 to Standby (>D0) State\r
+    BOOLEAN                        UnbindingInProcess;\r
+    NDIS_SPIN_LOCK                 Lock;\r
+                                                        // False - At all other times, - Flag is cleared after a transition to D0\r
+\r
+    NDIS_DEVICE_POWER_STATE        MPDeviceState;            // Miniport's Device State \r
+    NDIS_DEVICE_POWER_STATE        PTDeviceState;            // Protocol's Device State \r
+    NDIS_STRING                    DeviceName;                // For initializing the miniport edge\r
+    NDIS_EVENT                     MiniportInitEvent;        // For blocking UnbindAdapter while\r
+                                                        // an IM Init is in progress.\r
+    BOOLEAN                        MiniportInitPending;    // TRUE iff IMInit in progress\r
+    NDIS_STATUS                    LastIndicatedStatus;    // The last indicated media status\r
+    NDIS_STATUS                    LatestUnIndicateStatus; // The latest suppressed media status\r
+    ULONG                          OutstandingSends;\r
+    LONG                           RefCount;\r
+    BOOLEAN                        MiniportIsHalted;\r
+} ADAPT, *PADAPT;\r
+\r
+extern    NDIS_HANDLE                        ProtHandle, DriverHandle;\r
+extern    NDIS_MEDIUM                        MediumArray[4];\r
+extern    PADAPT                             pAdaptList;\r
+extern    NDIS_SPIN_LOCK                     GlobalLock;\r
+\r
+\r
+#define ADAPT_MINIPORT_HANDLE(_pAdapt)    ((_pAdapt)->MiniportHandle)\r
+#define ADAPT_DECR_PENDING_SENDS(_pAdapt)     \\r
+    {                                         \\r
+        NdisAcquireSpinLock(&(_pAdapt)->Lock);   \\r
+        (_pAdapt)->OutstandingSends--;           \\r
+        NdisReleaseSpinLock(&(_pAdapt)->Lock);   \\r
+    }\r
+\r
+//\r
+// Custom Macros to be used by the passthru driver \r
+//\r
+/*\r
+BOOLEAN\r
+IsIMDeviceStateOn(\r
+   PADAPT \r
+   )\r
+\r
+*/\r
+#define IsIMDeviceStateOn(_pP)        ((_pP)->MPDeviceState == NdisDeviceStateD0 && (_pP)->PTDeviceState == NdisDeviceStateD0 ) \r
+\r