summaryrefslogtreecommitdiff
path: root/network/ndis/extension/base/SxBase.h
blob: b5471f288780820568e450a1b7f44a9542bdc83a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/*++

Copyright (c) Microsoft Corporation. All Rights Reserved.

Module Name:

    SxBase.h

Abstract:

    This file contains the common code for building a switch extension. This
    file includes all the standard NDIS handling and exposes a function based
    interface for the control path and data path. This also has reusable code
    for basic operations such as pause/resume handling etc.


--*/

extern NDIS_STRING SxExtensionFriendlyName;
extern NDIS_STRING SxExtensionGuid;

typedef enum _SX_SWITCH_DATAFLOW_STATE
{
    SxSwitchPaused,
    SxSwitchRunning
} SX_SWITCH_DATAFLOW_STATE, *PSX_SWITCH_DATAFLOW_STATE;

typedef enum _SX_SWITCH_CONTROFLOW_STATE
{
    SxSwitchUnknown,
    SxSwitchAttached,
    SxSwitchDetached
} SX_SWITCH_CONTROLFLOW_STATE, *PSX_SWITCH_CONTROLFLOW_STATE;

typedef struct _SX_SWITCH_OBJECT
{
    //
    // The Link *must* always be the first field.
    //
    LIST_ENTRY Link;

    //
    // The extension context is the context used in the specific logic
    // of this extension.
    // This is allocated and returned in SxExtSwitchCreate
    //
    PNDIS_HANDLE ExtensionContext;

    //
    // Ndis related fields.
    //
    NDIS_HANDLE NdisFilterHandle;
    NDIS_SWITCH_CONTEXT NdisSwitchContext;
    NDIS_SWITCH_OPTIONAL_HANDLERS NdisSwitchHandlers;

    //
    // Switch state.
    //
    SX_SWITCH_DATAFLOW_STATE DataFlowState;
    SX_SWITCH_CONTROLFLOW_STATE ControlFlowState;

    //
    // Management fields.
    //
    volatile LONG PendingInjectedNblCount;
    volatile LONG PendingOidCount;

    //
    // Control Path Management.
    //
    PNDIS_SWITCH_NIC_OID_REQUEST OldNicRequest;

} SX_SWITCH_OBJECT, *PSX_SWITCH_OBJECT;

typedef struct _SX_OID_REQUEST
{
    NDIS_OID_REQUEST NdisOidRequest;
    NDIS_EVENT ReqEvent;
    NDIS_STATUS Status;
    ULONG BytesNeeded;

} SX_OID_REQUEST, *PSX_OID_REQUEST;

typedef struct _FILTER_DEVICE_EXTENSION
{
    ULONG            Signature;
    NDIS_HANDLE      Handle;
} FILTER_DEVICE_EXTENSION, *PFILTER_DEVICE_EXTENSION;


//
// Function prototypes
//
DRIVER_INITIALIZE DriverEntry;

DRIVER_UNLOAD SxNdisUnload;

FILTER_SET_OPTIONS SxNdisSetOptions;

FILTER_SET_MODULE_OPTIONS SxNdisSetFilterModuleOptions;

FILTER_ATTACH SxNdisAttach;

FILTER_DETACH SxNdisDetach;

FILTER_PAUSE SxNdisPause;

FILTER_RESTART SxNdisRestart;

FILTER_OID_REQUEST SxNdisOidRequest;

FILTER_CANCEL_OID_REQUEST SxNdisCancelOidRequest;

FILTER_OID_REQUEST_COMPLETE SxNdisOidRequestComplete;

FILTER_SEND_NET_BUFFER_LISTS SxNdisSendNetBufferLists;

FILTER_RETURN_NET_BUFFER_LISTS SxNdisReturnNetBufferLists;

FILTER_SEND_NET_BUFFER_LISTS_COMPLETE SxNdisSendNetBufferListsComplete;

FILTER_RECEIVE_NET_BUFFER_LISTS SxNdisReceiveNetBufferLists;

FILTER_CANCEL_SEND_NET_BUFFER_LISTS SxNdisCancelSendNetBufferLists;

FILTER_STATUS SxNdisStatus;

FILTER_NET_PNP_EVENT SxNdisNetPnPEvent;

VOID
SxpNdisCompleteInternalOidRequest(
    _In_ PSX_SWITCH_OBJECT Switch,
    _In_ PNDIS_OID_REQUEST NdisRequest,
    _In_ NDIS_STATUS Status
    );


//
// Some debug stuff.
//
#define DL_EXTRA_LOUD       20
#define DL_VERY_LOUD        10
#define DL_LOUD             8
#define DL_INFO             6
#define DL_TRACE            5
#define DL_WARN             4
#define DL_ERROR            2
#define DL_FATAL            0

#if DBG

extern ULONG SxDebugLevel;

#define DEBUGP(lev, stmt)                                               \
        {                                                               \
            if ((lev) <= SxDebugLevel)                                  \
            {                                                           \
                DbgPrint("%S: ",SxExtServiceName); DbgPrint stmt;       \
            }                                                           \
        }

#else

#define DEBUGP(lev, stmt)

#endif