Adjust X11BASE so that ssh/sshd find xauth with pkgsrc.
[dragonfly.git] / sys / emulation / ndis / ndis_var.h
1 /*
2  * Copyright (c) 2003
3  *      Bill Paul <wpaul@windriver.com>.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by Bill Paul.
16  * 4. Neither the name of the author nor the names of any co-contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
24  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
30  * THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  * $FreeBSD: src/sys/compat/ndis/ndis_var.h,v 1.27 2004/07/11 00:19:30 wpaul Exp $
33  * $DragonFly: src/sys/emulation/ndis/ndis_var.h,v 1.3 2005/12/31 23:35:40 dillon Exp $
34  */
35
36 #ifndef _NDIS_VAR_H_
37 #define _NDIS_VAR_H_
38
39 /* Forward declarations */
40 struct ndis_miniport_block;
41 struct ndis_mdriver_block;
42 typedef struct ndis_miniport_block ndis_miniport_block;
43 typedef struct ndis_mdriver_block ndis_mdriver_block;
44
45 /* Base types */
46 typedef uint32_t ndis_status;
47 typedef void *ndis_handle;
48 typedef uint32_t ndis_oid;
49 typedef uint32_t ndis_error_code;
50 typedef register_t ndis_kspin_lock;
51 typedef uint8_t ndis_kirql;
52
53 /*
54  * NDIS status codes (there are lots of them). The ones that
55  * don't seem to fit the pattern are actually mapped to generic
56  * NT status codes.
57  */
58
59 #define NDIS_STATUS_SUCCESS             0
60 #define NDIS_STATUS_PENDING             0x00000103
61 #define NDIS_STATUS_NOT_RECOGNIZED      0x00010001
62 #define NDIS_STATUS_NOT_COPIED          0x00010002
63 #define NDIS_STATUS_NOT_ACCEPTED        0x00010003
64 #define NDIS_STATUS_CALL_ACTIVE         0x00010007
65 #define NDIS_STATUS_ONLINE              0x40010003
66 #define NDIS_STATUS_RESET_START         0x40010004
67 #define NDIS_STATUS_RESET_END           0x40010005
68 #define NDIS_STATUS_RING_STATUS         0x40010006
69 #define NDIS_STATUS_CLOSED              0x40010007
70 #define NDIS_STATUS_WAN_LINE_UP         0x40010008
71 #define NDIS_STATUS_WAN_LINE_DOWN       0x40010009
72 #define NDIS_STATUS_WAN_FRAGMENT        0x4001000A
73 #define NDIS_STATUS_MEDIA_CONNECT       0x4001000B
74 #define NDIS_STATUS_MEDIA_DISCONNECT    0x4001000C
75 #define NDIS_STATUS_HARDWARE_LINE_UP    0x4001000D
76 #define NDIS_STATUS_HARDWARE_LINE_DOWN  0x4001000E
77 #define NDIS_STATUS_INTERFACE_UP        0x4001000F
78 #define NDIS_STATUS_INTERFACE_DOWN      0x40010010
79 #define NDIS_STATUS_MEDIA_BUSY          0x40010011
80 #define NDIS_STATUS_MEDIA_SPECIFIC_INDICATION   0x40010012
81 #define NDIS_STATUS_WW_INDICATION NDIS_STATUS_MEDIA_SPECIFIC_INDICATION
82 #define NDIS_STATUS_LINK_SPEED_CHANGE   0x40010013
83 #define NDIS_STATUS_WAN_GET_STATS       0x40010014
84 #define NDIS_STATUS_WAN_CO_FRAGMENT     0x40010015
85 #define NDIS_STATUS_WAN_CO_LINKPARAMS   0x40010016
86 #define NDIS_STATUS_NOT_RESETTABLE      0x80010001
87 #define NDIS_STATUS_SOFT_ERRORS         0x80010003
88 #define NDIS_STATUS_HARD_ERRORS         0x80010004
89 #define NDIS_STATUS_BUFFER_OVERFLOW     0x80000005
90 #define NDIS_STATUS_FAILURE             0xC0000001
91 #define NDIS_STATUS_RESOURCES           0xC000009A
92 #define NDIS_STATUS_CLOSING             0xC0010002
93 #define NDIS_STATUS_BAD_VERSION         0xC0010004
94 #define NDIS_STATUS_BAD_CHARACTERISTICS 0xC0010005
95 #define NDIS_STATUS_ADAPTER_NOT_FOUND   0xC0010006
96 #define NDIS_STATUS_OPEN_FAILED         0xC0010007
97 #define NDIS_STATUS_DEVICE_FAILED       0xC0010008
98 #define NDIS_STATUS_MULTICAST_FULL      0xC0010009
99 #define NDIS_STATUS_MULTICAST_EXISTS    0xC001000A
100 #define NDIS_STATUS_MULTICAST_NOT_FOUND 0xC001000B
101 #define NDIS_STATUS_REQUEST_ABORTED     0xC001000C
102 #define NDIS_STATUS_RESET_IN_PROGRESS   0xC001000D
103 #define NDIS_STATUS_CLOSING_INDICATING  0xC001000E
104 #define NDIS_STATUS_NOT_SUPPORTED       0xC00000BB
105 #define NDIS_STATUS_INVALID_PACKET      0xC001000F
106 #define NDIS_STATUS_OPEN_LIST_FULL      0xC0010010
107 #define NDIS_STATUS_ADAPTER_NOT_READY   0xC0010011
108 #define NDIS_STATUS_ADAPTER_NOT_OPEN    0xC0010012
109 #define NDIS_STATUS_NOT_INDICATING      0xC0010013
110 #define NDIS_STATUS_INVALID_LENGTH      0xC0010014
111 #define NDIS_STATUS_INVALID_DATA        0xC0010015
112 #define NDIS_STATUS_BUFFER_TOO_SHORT    0xC0010016
113 #define NDIS_STATUS_INVALID_OID         0xC0010017
114 #define NDIS_STATUS_ADAPTER_REMOVED     0xC0010018
115 #define NDIS_STATUS_UNSUPPORTED_MEDIA   0xC0010019
116 #define NDIS_STATUS_GROUP_ADDRESS_IN_USE        0xC001001A
117 #define NDIS_STATUS_FILE_NOT_FOUND      0xC001001B
118 #define NDIS_STATUS_ERROR_READING_FILE  0xC001001C
119 #define NDIS_STATUS_ALREADY_MAPPED      0xC001001D
120 #define NDIS_STATUS_RESOURCE_CONFLICT   0xC001001E
121 #define NDIS_STATUS_NO_CABLE            0xC001001F
122 #define NDIS_STATUS_INVALID_SAP         0xC0010020
123 #define NDIS_STATUS_SAP_IN_USE          0xC0010021
124 #define NDIS_STATUS_INVALID_ADDRESS     0xC0010022
125 #define NDIS_STATUS_VC_NOT_ACTIVATED    0xC0010023
126 #define NDIS_STATUS_DEST_OUT_OF_ORDER   0xC0010024
127 #define NDIS_STATUS_VC_NOT_AVAILABLE    0xC0010025
128 #define NDIS_STATUS_CELLRATE_NOT_AVAILABLE      0xC0010026
129 #define NDIS_STATUS_INCOMPATABLE_QOS    0xC0010027
130 #define NDIS_STATUS_AAL_PARAMS_UNSUPPORTED      0xC0010028
131 #define NDIS_STATUS_NO_ROUTE_TO_DESTINATION     0xC0010029
132 #define NDIS_STATUS_TOKEN_RING_OPEN_ERROR       0xC0011000
133 #define NDIS_STATUS_INVALID_DEVICE_REQUEST      0xC0000010
134 #define NDIS_STATUS_NETWORK_UNREACHABLE         0xC000023C
135
136 /*
137  * NDIS event codes. They are usually reported to NdisWriteErrorLogEntry().
138  */
139
140 #define EVENT_NDIS_RESOURCE_CONFLICT    0xC0001388
141 #define EVENT_NDIS_OUT_OF_RESOURCE      0xC0001389
142 #define EVENT_NDIS_HARDWARE_FAILURE     0xC000138A
143 #define EVENT_NDIS_ADAPTER_NOT_FOUND    0xC000138B
144 #define EVENT_NDIS_INTERRUPT_CONNECT    0xC000138C
145 #define EVENT_NDIS_DRIVER_FAILURE       0xC000138D
146 #define EVENT_NDIS_BAD_VERSION          0xC000138E
147 #define EVENT_NDIS_TIMEOUT              0x8000138F
148 #define EVENT_NDIS_NETWORK_ADDRESS      0xC0001390
149 #define EVENT_NDIS_UNSUPPORTED_CONFIGURATION    0xC0001391
150 #define EVENT_NDIS_INVALID_VALUE_FROM_ADAPTER   0xC0001392
151 #define EVENT_NDIS_MISSING_CONFIGURATION_PARAMETER      0xC0001393
152 #define EVENT_NDIS_BAD_IO_BASE_ADDRESS  0xC0001394
153 #define EVENT_NDIS_RECEIVE_SPACE_SMALL  0x40001395
154 #define EVENT_NDIS_ADAPTER_DISABLED     0x80001396
155 #define EVENT_NDIS_IO_PORT_CONFLICT     0x80001397
156 #define EVENT_NDIS_PORT_OR_DMA_CONFLICT 0x80001398
157 #define EVENT_NDIS_MEMORY_CONFLICT      0x80001399
158 #define EVENT_NDIS_INTERRUPT_CONFLICT   0x8000139A
159 #define EVENT_NDIS_DMA_CONFLICT         0x8000139B
160 #define EVENT_NDIS_INVALID_DOWNLOAD_FILE_ERROR  0xC000139C
161 #define EVENT_NDIS_MAXRECEIVES_ERROR    0x8000139D
162 #define EVENT_NDIS_MAXTRANSMITS_ERROR   0x8000139E
163 #define EVENT_NDIS_MAXFRAMESIZE_ERROR   0x8000139F
164 #define EVENT_NDIS_MAXINTERNALBUFS_ERROR        0x800013A0
165 #define EVENT_NDIS_MAXMULTICAST_ERROR   0x800013A1
166 #define EVENT_NDIS_PRODUCTID_ERROR      0x800013A2
167 #define EVENT_NDIS_LOBE_FAILUE_ERROR    0x800013A3
168 #define EVENT_NDIS_SIGNAL_LOSS_ERROR    0x800013A4
169 #define EVENT_NDIS_REMOVE_RECEIVED_ERROR        0x800013A5
170 #define EVENT_NDIS_TOKEN_RING_CORRECTION        0x400013A6
171 #define EVENT_NDIS_ADAPTER_CHECK_ERROR  0xC00013A7
172 #define EVENT_NDIS_RESET_FAILURE_ERROR  0x800013A8
173 #define EVENT_NDIS_CABLE_DISCONNECTED_ERROR     0x800013A9
174 #define EVENT_NDIS_RESET_FAILURE_CORRECTION     0x800013AA
175
176 /*
177  * NDIS OIDs used by the queryinfo/setinfo routines.
178  * Some are required by all NDIS drivers, some are specific to
179  * a particular type of device, and some are purely optional.
180  * Unfortunately, one of the purely optional OIDs is the one
181  * that lets us set the MAC address of the device.
182  */
183
184 /* Required OIDs */
185 #define OID_GEN_SUPPORTED_LIST                  0x00010101
186 #define OID_GEN_HARDWARE_STATUS                 0x00010102
187 #define OID_GEN_MEDIA_SUPPORTED                 0x00010103
188 #define OID_GEN_MEDIA_IN_USE                    0x00010104
189 #define OID_GEN_MAXIMUM_LOOKAHEAD               0x00010105
190 #define OID_GEN_MAXIMUM_FRAME_SIZE              0x00010106
191 #define OID_GEN_LINK_SPEED                      0x00010107
192 #define OID_GEN_TRANSMIT_BUFFER_SPACE           0x00010108
193 #define OID_GEN_RECEIVE_BUFFER_SPACE            0x00010109
194 #define OID_GEN_TRANSMIT_BLOCK_SIZE             0x0001010A
195 #define OID_GEN_RECEIVE_BLOCK_SIZE              0x0001010B
196 #define OID_GEN_VENDOR_ID                       0x0001010C
197 #define OID_GEN_VENDOR_DESCRIPTION              0x0001010D
198 #define OID_GEN_CURRENT_PACKET_FILTER           0x0001010E
199 #define OID_GEN_CURRENT_LOOKAHEAD               0x0001010F
200 #define OID_GEN_DRIVER_VERSION                  0x00010110
201 #define OID_GEN_MAXIMUM_TOTAL_SIZE              0x00010111
202 #define OID_GEN_PROTOCOL_OPTIONS                0x00010112
203 #define OID_GEN_MAC_OPTIONS                     0x00010113
204 #define OID_GEN_MEDIA_CONNECT_STATUS            0x00010114
205 #define OID_GEN_MAXIMUM_SEND_PACKETS            0x00010115
206 #define OID_GEN_VENDOR_DRIVER_VERSION           0x00010116
207 #define OID_GEN_SUPPORTED_GUIDS                 0x00010117
208 #define OID_GEN_NETWORK_LAYER_ADDRESSES         0x00010118      /* Set only */
209 #define OID_GEN_TRANSPORT_HEADER_OFFSET         0x00010119      /* Set only */
210 #define OID_GEN_MACHINE_NAME                    0x0001021A
211 #define OID_GEN_RNDIS_CONFIG_PARAMETER          0x0001021B      /* Set only */
212 #define OID_GEN_VLAN_ID                         0x0001021C
213
214 /* Optional OIDs. */
215 #define OID_GEN_MEDIA_CAPABILITIES              0x00010201
216 #define OID_GEN_PHYSICAL_MEDIUM                 0x00010202
217
218 /* Required statistics OIDs. */
219 #define OID_GEN_XMIT_OK                         0x00020101
220 #define OID_GEN_RCV_OK                          0x00020102
221 #define OID_GEN_XMIT_ERROR                      0x00020103
222 #define OID_GEN_RCV_ERROR                       0x00020104
223 #define OID_GEN_RCV_NO_BUFFER                   0x00020105
224
225 /* Optional OID statistics */
226 #define OID_GEN_DIRECTED_BYTES_XMIT             0x00020201
227 #define OID_GEN_DIRECTED_FRAMES_XMIT            0x00020202
228 #define OID_GEN_MULTICAST_BYTES_XMIT            0x00020203
229 #define OID_GEN_MULTICAST_FRAMES_XMIT           0x00020204
230 #define OID_GEN_BROADCAST_BYTES_XMIT            0x00020205
231 #define OID_GEN_BROADCAST_FRAMES_XMIT           0x00020206
232 #define OID_GEN_DIRECTED_BYTES_RCV              0x00020207
233 #define OID_GEN_DIRECTED_FRAMES_RCV             0x00020208
234 #define OID_GEN_MULTICAST_BYTES_RCV             0x00020209
235 #define OID_GEN_MULTICAST_FRAMES_RCV            0x0002020A
236 #define OID_GEN_BROADCAST_BYTES_RCV             0x0002020B
237 #define OID_GEN_BROADCAST_FRAMES_RCV            0x0002020C
238 #define OID_GEN_RCV_CRC_ERROR                   0x0002020D
239 #define OID_GEN_TRANSMIT_QUEUE_LENGTH           0x0002020E
240 #define OID_GEN_GET_TIME_CAPS                   0x0002020F
241 #define OID_GEN_GET_NETCARD_TIME                0x00020210
242 #define OID_GEN_NETCARD_LOAD                    0x00020211
243 #define OID_GEN_DEVICE_PROFILE                  0x00020212
244
245 /* 802.3 (ethernet) OIDs */
246 #define OID_802_3_PERMANENT_ADDRESS             0x01010101
247 #define OID_802_3_CURRENT_ADDRESS               0x01010102
248 #define OID_802_3_MULTICAST_LIST                0x01010103
249 #define OID_802_3_MAXIMUM_LIST_SIZE             0x01010104
250 #define OID_802_3_MAC_OPTIONS                   0x01010105
251 #define NDIS_802_3_MAC_OPTION_PRIORITY          0x00000001
252 #define OID_802_3_RCV_ERROR_ALIGNMENT           0x01020101
253 #define OID_802_3_XMIT_ONE_COLLISION            0x01020102
254 #define OID_802_3_XMIT_MORE_COLLISIONS          0x01020103
255 #define OID_802_3_XMIT_DEFERRED                 0x01020201
256 #define OID_802_3_XMIT_MAX_COLLISIONS           0x01020202
257 #define OID_802_3_RCV_OVERRUN                   0x01020203
258 #define OID_802_3_XMIT_UNDERRUN                 0x01020204
259 #define OID_802_3_XMIT_HEARTBEAT_FAILURE        0x01020205
260 #define OID_802_3_XMIT_TIMES_CRS_LOST           0x01020206
261 #define OID_802_3_XMIT_LATE_COLLISIONS          0x01020207
262
263 /* PnP and power management OIDs */
264 #define OID_PNP_CAPABILITIES                    0xFD010100
265 #define OID_PNP_SET_POWER                       0xFD010101
266 #define OID_PNP_QUERY_POWER                     0xFD010102
267 #define OID_PNP_ADD_WAKE_UP_PATTERN             0xFD010103
268 #define OID_PNP_REMOVE_WAKE_UP_PATTERN          0xFD010104
269 #define OID_PNP_WAKE_UP_PATTERN_LIST            0xFD010105
270 #define OID_PNP_ENABLE_WAKE_UP                  0xFD010106
271
272 /* PnP/PM Statistics (Optional). */
273 #define OID_PNP_WAKE_UP_OK                      0xFD020200
274 #define OID_PNP_WAKE_UP_ERROR                   0xFD020201
275
276 /* The following bits are defined for OID_PNP_ENABLE_WAKE_UP */
277 #define NDIS_PNP_WAKE_UP_MAGIC_PACKET           0x00000001
278 #define NDIS_PNP_WAKE_UP_PATTERN_MATCH          0x00000002
279 #define NDIS_PNP_WAKE_UP_LINK_CHANGE            0x00000004
280
281 /* 802.11 OIDs */
282 #define OID_802_11_BSSID                        0x0D010101
283 #define OID_802_11_SSID                         0x0D010102
284 #define OID_802_11_NETWORK_TYPES_SUPPORTED      0x0D010203
285 #define OID_802_11_NETWORK_TYPE_IN_USE          0x0D010204
286 #define OID_802_11_TX_POWER_LEVEL               0x0D010205
287 #define OID_802_11_RSSI                         0x0D010206
288 #define OID_802_11_RSSI_TRIGGER                 0x0D010207
289 #define OID_802_11_INFRASTRUCTURE_MODE          0x0D010108
290 #define OID_802_11_FRAGMENTATION_THRESHOLD      0x0D010209
291 #define OID_802_11_RTS_THRESHOLD                0x0D01020A
292 #define OID_802_11_NUMBER_OF_ANTENNAS           0x0D01020B
293 #define OID_802_11_RX_ANTENNA_SELECTED          0x0D01020C
294 #define OID_802_11_TX_ANTENNA_SELECTED          0x0D01020D
295 #define OID_802_11_SUPPORTED_RATES              0x0D01020E
296 #define OID_802_11_DESIRED_RATES                0x0D010210
297 #define OID_802_11_CONFIGURATION                0x0D010211
298 #define OID_802_11_STATISTICS                   0x0D020212
299 #define OID_802_11_ADD_WEP                      0x0D010113
300 #define OID_802_11_REMOVE_WEP                   0x0D010114
301 #define OID_802_11_DISASSOCIATE                 0x0D010115
302 #define OID_802_11_POWER_MODE                   0x0D010216
303 #define OID_802_11_BSSID_LIST                   0x0D010217
304 #define OID_802_11_AUTHENTICATION_MODE          0x0D010118
305 #define OID_802_11_PRIVACY_FILTER               0x0D010119
306 #define OID_802_11_BSSID_LIST_SCAN              0x0D01011A
307 #define OID_802_11_WEP_STATUS                   0x0D01011B
308 #define OID_802_11_ENCRYPTION_STATUS            OID_802_11_WEP_STATUS
309 #define OID_802_11_RELOAD_DEFAULTS              0x0D01011C
310 #define OID_802_11_ADD_KEY                      0x0D01011D
311 #define OID_802_11_REMOVE_KEY                   0x0D01011E
312 #define OID_802_11_ASSOCIATION_INFORMATION      0x0D01011F
313 #define OID_802_11_TEST                         0x0D010120
314
315 /* structures/definitions for 802.11 */
316 #define NDIS_80211_NETTYPE_11FH         0x00000000
317 #define NDIS_80211_NETTYPE_11DS         0x00000001
318 #define NDIS_80211_NETTYPE_11OFDM5      0x00000002
319 #define NDIS_80211_NETTYPE_11OFDM24     0x00000003
320
321 struct ndis_80211_nettype_list {
322         uint32_t                ntl_items;
323         uint32_t                ntl_type[1];
324 };
325
326 #define NDIS_80211_POWERMODE_CAM        0x00000000
327 #define NDIS_80211_POWERMODE_MAX_PSP    0x00000001
328 #define NDIS_80211_POWERMODE_FAST_PSP   0x00000002
329
330 typedef uint32_t ndis_80211_power;      /* Power in milliwatts */
331 typedef uint32_t ndis_80211_rssi;       /* Signal strength in dBm */
332
333 struct ndis_80211_config_fh {
334         uint32_t                ncf_length;
335         uint32_t                ncf_hoppatterh;
336         uint32_t                ncf_hopset;
337         uint32_t                ncf_dwelltime;
338 };
339
340 typedef struct ndis_80211_config_fh ndis_80211_config_fh;
341
342 struct ndis_80211_config {
343         uint32_t                nc_length;
344         uint32_t                nc_beaconperiod;
345         uint32_t                nc_atimwin;
346         uint32_t                nc_dsconfig;
347         ndis_80211_config_fh    nc_fhconfig;
348 };
349
350 typedef struct ndis_80211_config ndis_80211_config;
351
352 struct ndis_80211_stats {
353         uint32_t                ns_length;
354         uint64_t                ns_txfragcnt;
355         uint64_t                ns_txmcastcnt;
356         uint64_t                ns_failedcnt;
357         uint64_t                ns_retrycnt;
358         uint64_t                ns_multiretrycnt;
359         uint64_t                ns_rtssuccesscnt;
360         uint64_t                ns_rtsfailcnt;
361         uint64_t                ns_ackfailcnt;
362         uint64_t                ns_dupeframecnt;
363         uint64_t                ns_rxfragcnt;
364         uint64_t                ns_rxmcastcnt;
365         uint64_t                ns_fcserrcnt;
366 };
367
368 typedef struct ndis_80211_stats ndis_80211_stats;
369
370 typedef uint32_t ndis_80211_key_idx;
371
372 struct ndis_80211_wep {
373         uint32_t                nw_length;
374         uint32_t                nw_keyidx;
375         uint32_t                nw_keylen;
376         uint8_t                 nw_keydata[256];
377 };
378
379 typedef struct ndis_80211_wep ndis_80211_wep;
380
381 #define NDIS_80211_WEPKEY_TX            0x80000000
382 #define NDIS_80211_WEPKEY_PERCLIENT     0x40000000
383
384 #define NDIS_80211_NET_INFRA_IBSS       0x00000000
385 #define NDIS_80211_NET_INFRA_BSS        0x00000001
386 #define NDIS_80211_NET_INFRA_AUTO       0x00000002
387
388 #define NDIS_80211_AUTHMODE_OPEN        0x00000000
389 #define NDIS_80211_AUTHMODE_SHARED      0x00000001
390 #define NDIS_80211_AUTHMODE_AUTO        0x00000002
391 #define NDIS_80211_AUTHMODE_WPA         0x00000003
392 #define NDIS_80211_AUTHMODE_WPAPSK      0x00000004
393 #define NDIS_80211_AUTHMODE_WPANONE     0x00000005
394
395 typedef uint8_t ndis_80211_rates[8];
396 typedef uint8_t ndis_80211_rates_ex[16];
397 typedef uint8_t ndis_80211_macaddr[6];
398
399 struct ndis_80211_ssid {
400         uint32_t                ns_ssidlen;
401         uint8_t                 ns_ssid[32];
402 };
403
404 typedef struct ndis_80211_ssid ndis_80211_ssid;
405
406 struct ndis_wlan_bssid {
407         uint32_t                nwb_length;
408         ndis_80211_macaddr      nwb_macaddr;
409         uint8_t                 nwb_rsvd[2];
410         ndis_80211_ssid         nwb_ssid;
411         uint32_t                nwb_privacy;
412         ndis_80211_rssi         nwb_rssi;
413         uint32_t                nwb_nettype;
414         ndis_80211_config       nwb_config;
415         uint32_t                nwb_netinfra;
416         ndis_80211_rates        nwb_supportedrates;
417 };
418
419 typedef struct ndis_wlan_bssid ndis_wlan_bssid;
420
421 struct ndis_80211_bssid_list {
422         uint32_t                nbl_items;
423         ndis_wlan_bssid         nbl_bssid[1];
424 };
425
426 typedef struct ndis_80211_bssid_list ndis_80211_bssid_list;
427
428 struct ndis_wlan_bssid_ex {
429         uint32_t                nwbx_len;
430         ndis_80211_macaddr      nwbx_macaddr;
431         uint8_t                 nwbx_rsvd[2];
432         ndis_80211_ssid         nwbx_ssid;
433         uint32_t                nwbx_privacy;
434         ndis_80211_rssi         nwbx_rssi;
435         uint32_t                nwbx_nettype;
436         ndis_80211_config       nwbx_config;
437         uint32_t                nwbx_netinfra;
438         ndis_80211_rates_ex     nwbx_supportedrates;
439         uint32_t                nwbx_ielen;
440         uint32_t                nwbx_ies[1];
441 };
442
443 typedef struct ndis_wlan_bssid_ex ndis_wlan_bssid_ex;
444
445 struct ndis_80211_bssid_list_ex {
446         uint32_t                nblx_items;
447         ndis_wlan_bssid_ex      nblx_bssid[1];
448 };
449
450 typedef struct ndis_80211_bssid_list_ex ndis_80211_bssid_list_ex;
451
452 struct ndis_80211_fixed_ies {
453         uint8_t                 nfi_tstamp[8];
454         uint16_t                nfi_beaconint;
455         uint16_t                nfi_caps;
456 };
457
458 struct ndis_80211_variable_ies {
459         uint8_t                 nvi_elemid;
460         uint8_t                 nvi_len;
461         uint8_t                 nvi_data[1];
462 };
463
464 typedef uint32_t ndis_80211_fragthresh;
465 typedef uint32_t ndis_80211_rtsthresh;
466 typedef uint32_t ndis_80211_antenna;
467
468 #define NDIS_80211_PRIVFILT_ACCEPTALL   0x00000000
469 #define NDIS_80211_PRIVFILT_8021XWEP    0x00000001
470
471 #define NDIS_80211_WEPSTAT_ENABLED      0x00000000
472 #define NDIS_80211_WEPSTAT_ENC1ENABLED  NDIS_80211_WEPSTAT_ENABLED
473 #define NDIS_80211_WEPSTAT_DISABLED     0x00000001
474 #define NDIS_80211_WEPSTAT_ENCDISABLED  NDIS_80211_WEPSTAT_DISABLED
475 #define NDIS_80211_WEPSTAT_KEYABSENT    0x00000002
476 #define NDIS_80211_WEPSTAT_ENC1KEYABSENT        NDIS_80211_WEPSTAT_KEYABSENT
477 #define NDIS_80211_WEPSTAT_NOTSUPPORTED 0x00000003
478 #define NDIS_80211_WEPSTAT_ENCNOTSUPPORTED      NDIS_80211_WEPSTAT_NOTSUPPORTED
479 #define NDIS_80211_WEPSTAT_ENC2ENABLED  0x00000004
480 #define NDIS_80211_WEPSTAT_ENC2KEYABSENT        0x00000005
481 #define NDIS_80211_WEPSTAT_ENC3ENABLED  0x00000006
482 #define NDIS_80211_WEPSTAT_ENC3KEYABSENT        0x00000007
483
484 #define NDIS_80211_RELOADDEFAULT_WEP    0x00000000
485
486 #define NDIS_80211_STATUSTYPE_AUTH      0x00000000
487
488 struct ndis_80211_status_indication {
489         uint32_t                nsi_type;
490 };
491
492 typedef struct ndis_80211_status_indication ndis_80211_status_indication;
493
494 struct ndis_80211_auth_request {
495         uint32_t                nar_len;
496         ndis_80211_macaddr      nar_bssid;
497         uint32_t                nar_flags;
498 };
499
500 typedef struct ndis_80211_auth_request ndis_80211_auth_request;
501
502 struct ndis_80211_key {
503         uint32_t                nk_len;
504         uint32_t                nk_keyidx;
505         uint32_t                nk_keylen;
506         ndis_80211_macaddr      nk_bssid;
507         uint64_t                nk_keyrsc;
508         uint8_t                 nk_keydata[256];
509 };
510
511 typedef struct ndis_80211_key ndis_80211_key;
512
513 struct ndis_80211_remove_key {
514         uint32_t                nk_len;
515         uint32_t                nk_keyidx;
516         ndis_80211_macaddr      nk_bssid;
517 };
518
519 typedef struct ndis_80211_remove_key ndis_80211_remove_key;
520
521 #define NDIS_80211_AI_REQFI_CAPABILITIES        0x00000001
522 #define NDIS_80211_AI_REQFI_LISTENINTERVAL      0x00000002
523 #define NDIS_80211_AI_REQFI_CURRENTAPADDRESS    0x00000004
524
525 #define NDIS_80211_AI_RESFI_CAPABILITIES        0x00000001
526 #define NDIS_80211_AI_RESFI_STATUSCODE          0x00000002
527 #define NDIS_80211_AI_RESFI_ASSOCIATIONID       0x00000004
528
529 struct ndis_80211_ai_reqfi {
530         uint16_t                naq_caps;
531         uint16_t                naq_listentint;
532         ndis_80211_macaddr      naq_currentapaddr;
533 };
534
535 typedef struct ndis_80211_ai_reqfi ndis_80211_ai_reqfi;
536
537 struct ndis_80211_ai_resfi {
538         uint16_t                nas_caps;
539         uint16_t                nas_statuscode;
540         uint16_t                nas_associd;
541 };
542
543 typedef struct ndis_80211_ai_resfi ndis_80211_ai_resfi;
544
545 struct ndis_80211_assoc_info {
546         uint32_t                nai_len;
547         uint16_t                nai_avail_req_fixed_ies;
548         ndis_80211_ai_reqfi     nai_req_fixed_ies;
549         uint32_t                nai_req_ielen;
550         uint32_t                nai_offset_req_ies;
551         uint16_t                nai_avail_resp_fixed_ies;
552         ndis_80211_ai_resfi     nai_resp_fixed_iex;
553         uint32_t                nai_resp_ielen;
554         uint32_t                nai_offset_resp_ies;
555 };
556
557 typedef struct ndis_80211_assoc_info ndis_80211_assoc_info;
558
559 struct ndis_80211_auth_event {
560         ndis_80211_status_indication    nae_status;
561         ndis_80211_auth_request         nae_request[1];
562 };
563
564 typedef struct ndis_80211_auth_event ndis_80211_auth_event;
565
566 struct ndis_80211_test {
567         uint32_t                nt_len;
568         uint32_t                nt_type;
569         union {
570                 ndis_80211_auth_event   nt_authevent;
571                 uint32_t                nt_rssitrigger;
572         } u;
573 };
574
575 typedef struct ndis_80211_test ndis_80211_test;
576
577 /* TCP OIDs. */
578
579 #define OID_TCP_TASK_OFFLOAD                    0xFC010201
580 #define OID_TCP_TASK_IPSEC_ADD_SA               0xFC010202
581 #define OID_TCP_TASK_IPSEC_DELETE_SA            0xFC010203
582 #define OID_TCP_SAN_SUPPORT                     0xFC010204
583
584
585 #define NDIS_TASK_OFFLOAD_VERSION 1
586
587 #define NDIS_TASK_TCPIP_CSUM                    0x00000000
588 #define NDIS_TASK_IPSEC                         0x00000001
589 #define NDIS_TASK_TCP_LARGESEND                 0x00000002
590
591 #define NDIS_ENCAP_UNSPEC                       0x00000000
592 #define NDIS_ENCAP_NULL                         0x00000001
593 #define NDIS_ENCAP_IEEE802_3                    0x00000002
594 #define NDIS_ENCAP_IEEE802_5                    0x00000003
595 #define NDIS_ENCAP_SNAP_ROUTED                  0x00000004
596 #define NDIS_ENCAP_SNAP_BRIDGED                 0x00000005
597
598 #define NDIS_ENCAPFLAG_FIXEDHDRLEN              0x00000001
599
600 struct ndis_encap_fmt {
601         uint32_t                nef_encap;
602         uint32_t                nef_flags;
603         uint32_t                nef_encaphdrlen;
604 };
605
606 typedef struct ndis_encap_fmt ndis_encap_fmt;
607
608 struct ndis_task_offload_hdr {
609         uint32_t                ntoh_vers;
610         uint32_t                ntoh_len;
611         uint32_t                ntoh_rsvd;
612         uint32_t                ntoh_offset_firsttask;
613         ndis_encap_fmt          ntoh_encapfmt;
614 };
615
616 typedef struct ndis_task_offload_hdr ndis_task_offload_hdr;
617
618 struct ndis_task_offload {
619         uint32_t                nto_vers;
620         uint32_t                nto_len;
621         uint32_t                nto_task;
622         uint32_t                nto_offset_nexttask;
623         uint32_t                nto_taskbuflen;
624         uint8_t                 nto_taskbuf[1];
625 };
626
627 typedef struct ndis_task_offload ndis_task_offload;
628
629 #define NDIS_TCPSUM_FLAGS_IP_OPTS       0x00000001
630 #define NDIS_TCPSUM_FLAGS_TCP_OPTS      0x00000002
631 #define NDIS_TCPSUM_FLAGS_TCP_CSUM      0x00000004
632 #define NDIS_TCPSUM_FLAGS_UDP_CSUM      0x00000008
633 #define NDIS_TCPSUM_FLAGS_IP_CSUM       0x00000010
634
635 struct ndis_task_tcpip_csum {
636         uint32_t                nttc_v4tx;
637         uint32_t                nttc_v4rx;
638         uint32_t                nttc_v6tx;
639         uint32_t                nttc_v6rx;
640 };
641
642 typedef struct ndis_task_tcpip_csum ndis_task_tcpip_csum;
643
644 struct ndis_task_tcp_largesend {
645         uint32_t                nttl_vers;
646         uint32_t                nttl_maxofflen;
647         uint32_t                nttl_minsegcnt;
648         uint8_t                 nttl_tcpopt;
649         uint8_t                 nttl_ipopt;
650 };
651
652 typedef struct ndis_task_tcp_largesend ndis_task_tcp_largesend;
653
654 #define NDIS_IPSEC_AH_MD5               0x00000001
655 #define NDIS_IPSEC_AH_SHA1              0x00000002
656 #define NDIS_IPSEC_AH_TRANSPORT         0x00000004
657 #define NDIS_IPSEC_AH_TUNNEL            0x00000008
658 #define NDIS_IPSEC_AH_SEND              0x00000010
659 #define NDIS_IPSEC_AH_RECEIVE           0x00000020
660
661 #define NDIS_IPSEC_ESP_DES              0x00000001
662 #define NDIS_IPSEC_ESP_RSVD             0x00000002
663 #define NDIS_IPSEC_ESP_3DES             0x00000004
664 #define NDIS_IPSEC_ESP_NULL             0x00000008
665 #define NDIS_IPSEC_ESP_TRANSPORT        0x00000010
666 #define NDIS_IPSEC_ESP_TUNNEL           0x00000020
667 #define NDIS_IPSEC_ESP_SEND             0x00000040
668 #define NDIS_IPSEC_ESP_RECEIVE          0x00000080
669
670 struct ndis_task_ipsec {
671         uint32_t                nti_ah_esp_combined;
672         uint32_t                nti_ah_transport_tunnel_combined;
673         uint32_t                nti_v4_options;
674         uint32_t                nti_rsvd;
675         uint32_t                nti_v4ah;
676         uint32_t                nti_v4esp;
677 };
678
679 typedef struct ndis_task_ipsec ndis_task_ipsec;
680
681 /*
682  * Attribures of NDIS drivers. Not all drivers support
683  * all attributes.
684  */
685
686 #define NDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT           0x00000002
687 #define NDIS_ATTRIBUTE_IGNORE_TOKEN_RING_ERRORS         0x00000004
688 #define NDIS_ATTRIBUTE_BUS_MASTER                       0x00000008
689 #define NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER              0x00000010
690 #define NDIS_ATTRIBUTE_DESERIALIZE                      0x00000020
691 #define NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND               0x00000040
692 #define NDIS_ATTRIBUTE_SURPRISE_REMOVE_OK               0x00000080
693 #define NDIS_ATTRIBUTE_NOT_CO_NDIS                      0x00000100
694 #define NDIS_ATTRIBUTE_USES_SAFE_BUFFER_APIS            0x00000200
695
696 enum ndis_media_state {
697         nmc_connected,
698         nmc_disconnected
699 };
700
701 typedef enum ndis_media_state ndis_media_state;
702
703 /* Ndis Packet Filter Bits (OID_GEN_CURRENT_PACKET_FILTER). */
704
705 #define NDIS_PACKET_TYPE_DIRECTED               0x00000001
706 #define NDIS_PACKET_TYPE_MULTICAST              0x00000002
707 #define NDIS_PACKET_TYPE_ALL_MULTICAST          0x00000004
708 #define NDIS_PACKET_TYPE_BROADCAST              0x00000008
709 #define NDIS_PACKET_TYPE_SOURCE_ROUTING         0x00000010
710 #define NDIS_PACKET_TYPE_PROMISCUOUS            0x00000020
711 #define NDIS_PACKET_TYPE_SMT                    0x00000040
712 #define NDIS_PACKET_TYPE_ALL_LOCAL              0x00000080
713 #define NDIS_PACKET_TYPE_GROUP                  0x00001000
714 #define NDIS_PACKET_TYPE_ALL_FUNCTIONAL         0x00002000
715 #define NDIS_PACKET_TYPE_FUNCTIONAL             0x00004000
716 #define NDIS_PACKET_TYPE_MAC_FRAME              0x00008000
717
718
719 /* Ndis MAC option bits (OID_GEN_MAC_OPTIONS). */
720
721 #define NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA             0x00000001
722 #define NDIS_MAC_OPTION_RECEIVE_SERIALIZED              0x00000002
723 #define NDIS_MAC_OPTION_TRANSFERS_NOT_PEND              0x00000004
724 #define NDIS_MAC_OPTION_NO_LOOPBACK                     0x00000008
725 #define NDIS_MAC_OPTION_FULL_DUPLEX                     0x00000010
726 #define NDIS_MAC_OPTION_EOTX_INDICATION                 0x00000020
727 #define NDIS_MAC_OPTION_8021P_PRIORITY                  0x00000040
728 #define NDIS_MAC_OPTION_SUPPORTS_MAC_ADDRESS_OVERWRITE  0x00000080
729 #define NDIS_MAC_OPTION_RECEIVE_AT_DPC                  0x00000100
730 #define NDIS_MAC_OPTION_8021Q_VLAN                      0x00000200
731 #define NDIS_MAC_OPTION_RESERVED                        0x80000000
732
733 #define NDIS_DMA_24BITS         0x00
734 #define NDIS_DMA_32BITS         0x01
735 #define NDIS_DMA_64BITS         0x02
736
737 struct ndis_physaddr {
738         uint64_t                np_quad;
739 #ifdef notdef
740         uint32_t                np_low;
741         uint32_t                np_high;
742 #endif
743 };
744
745 typedef struct ndis_physaddr ndis_physaddr;
746
747 struct ndis_ansi_string {
748         uint16_t                nas_len;
749         uint16_t                nas_maxlen;
750         char                    *nas_buf;
751 };
752
753 typedef struct ndis_ansi_string ndis_ansi_string;
754
755 /*
756  * nus_buf is really a wchar_t *, but it's inconvenient to include
757  * all the necessary header goop needed to define it, and it's a
758  * pointer anyway, so for now, just make it a uint16_t *.
759  */
760 struct ndis_unicode_string {
761         uint16_t                nus_len;
762         uint16_t                nus_maxlen;
763         uint16_t                *nus_buf;
764 };
765
766 typedef struct ndis_unicode_string ndis_unicode_string;
767
768
769 enum ndis_parm_type {
770         ndis_parm_int,
771         ndis_parm_hexint,
772         ndis_parm_string,
773         ndis_parm_multistring,
774         ndis_parm_binary
775 };
776
777 typedef enum ndis_parm_type ndis_parm_type;
778
779 struct ndis_binary_data {
780         uint16_t                nbd_len;
781         void                    *nbd_buf;
782 };
783
784 typedef struct ndis_binary_data ndis_binary_data;
785
786 struct ndis_config_parm {
787         ndis_parm_type          ncp_type;
788         union {
789                 uint32_t                ncp_intdata;
790                 ndis_unicode_string     ncp_stringdata;
791                 ndis_binary_data        ncp_binarydata;
792         } ncp_parmdata;
793 };
794
795 typedef struct ndis_config_parm ndis_config_parm;
796
797 #ifdef notdef
798 struct ndis_list_entry {
799         struct ndis_list_entry *nle_flink;
800         struct ndis_list_entry *nle_blink;
801 };
802
803 typedef struct ndis_list_entry ndis_list_entry;
804 #endif
805
806 struct ndis_bind_paths {
807         uint32_t                nbp_number;
808         ndis_unicode_string     nbp_paths[1];
809 };
810
811 typedef struct ndis_bind_paths ndis_bind_paths;
812
813 #ifdef notdef
814 struct dispatch_header {
815         uint8_t                 dh_type;
816         uint8_t                 dh_abs;
817         uint8_t                 dh_size;
818         uint8_t                 dh_inserted;
819         uint32_t                dh_sigstate;
820         list_entry              dh_waitlisthead;
821 };
822 #endif
823
824 #define dispatch_header nt_dispatch_header
825
826 struct ndis_ktimer {
827         struct dispatch_header  nk_header;
828         uint64_t                nk_duetime;
829         list_entry              nk_timerlistentry;
830         void                    *nk_dpc;
831         uint32_t                nk_period;
832 };
833
834 struct ndis_kevent {
835         struct dispatch_header  nk_header;
836 };
837
838 struct ndis_event {
839         struct nt_kevent        ne_event;
840 };
841
842 typedef struct ndis_event ndis_event;
843
844 /* Kernel defered procedure call (i.e. timer callback) */
845
846 struct ndis_kdpc;
847 typedef void (*ndis_kdpc_func)(struct ndis_kdpc *, void *, void *, void *);
848
849 struct ndis_kdpc {
850         uint16_t                nk_type;
851         uint8_t                 nk_num;
852         uint8_t                 nk_importance;
853         list_entry              nk_dpclistentry;
854         ndis_kdpc_func          nk_deferedfunc;
855         void                    *nk_deferredctx;
856         void                    *nk_sysarg1;
857         void                    *nk_sysarg2;
858         uint32_t                *nk_lock;
859 };
860
861 struct ndis_timer {
862         struct ktimer           nt_ktimer;
863         struct kdpc             nt_kdpc;
864 };
865
866 typedef struct ndis_timer ndis_timer;
867
868 typedef void (*ndis_timer_function)(void *, void *, void *, void *);
869
870 struct ndis_miniport_timer {
871         struct ktimer           nmt_ktimer;
872         struct kdpc             nmt_kdpc;
873         ndis_timer_function     nmt_timerfunc;
874         void                    *nmt_timerctx;
875         ndis_miniport_block     *nmt_block;
876         struct ndis_miniport_timer      *nmt_nexttimer;
877 };
878
879 typedef struct ndis_miniport_timer ndis_miniport_timer;
880
881 struct ndis_spin_lock {
882         ndis_kspin_lock         nsl_spinlock;
883         ndis_kirql              nsl_kirql;
884 };
885
886 typedef struct ndis_spin_lock ndis_spin_lock;
887
888 struct ndis_request {
889         uint8_t                 nr_macreserved[4*sizeof(void *)];
890         uint32_t                nr_requesttype;
891         union _ndis_data {
892                 struct _ndis_query_information {
893                         ndis_oid        nr_oid;
894                         void            *nr_infobuf;
895                         uint32_t        nr_infobuflen;
896                         uint32_t        nr_byteswritten;
897                         uint32_t        nr_bytesneeded;
898                 } ndis_query_information;
899                 struct _ndis_set_information {
900                         ndis_oid        nr_oid;
901                         void            *nr_infobuf;
902                         uint32_t        nr_infobuflen;
903                         uint32_t        nr_byteswritten;
904                         uint32_t        nr_bytesneeded;
905                 } ndis_set_information;
906         } ndis_data;
907         /* NDIS 5.0 extentions */
908         uint8_t                 nr_ndis_rsvd[9 * sizeof(void *)];
909         union {
910                 uint8_t         nr_callmgr_rsvd[2 * sizeof(void *)];
911                 uint8_t         nr_protocol_rsvd[2 * sizeof(void *)];
912         } u;
913         uint8_t                 nr_miniport_rsvd[2 * sizeof(void *)];
914 };
915
916 typedef struct ndis_request ndis_request;
917
918 /*
919  * Filler, not used.
920  */
921 struct ndis_miniport_interrupt {
922         void                    *ni_introbj;
923         ndis_kspin_lock         ni_dpccountlock;
924         void                    *ni_rsvd;
925         void                    *ni_isrfunc;
926         void                    *ni_dpcfunc;
927         struct ndis_kdpc        ni_dpc;
928         ndis_miniport_block     *ni_block;
929         uint8_t                 ni_dpccnt;
930         uint8_t                 ni_filler1;
931         struct ndis_kevent      ni_dpcsdoneevent;
932         uint8_t                 ni_shared;
933         uint8_t                 ni_isrreq;
934 };
935
936 typedef struct ndis_miniport_interrupt ndis_miniport_interrupt;
937
938 enum ndis_interrupt_mode {
939         nim_level,
940         nim_latched
941 };
942
943 typedef enum ndis_interrupt_mode ndis_interrupt_mode;
944
945 struct ndis_work_item;
946
947 typedef __stdcall void (*ndis_proc)(struct ndis_work_item *, void *);
948
949 struct ndis_work_item {
950         void                    *nwi_ctx;
951         ndis_proc               nwi_func;
952         uint8_t                 nwi_wraprsvd[sizeof(void *) * 8];
953 };
954
955 typedef struct ndis_work_item ndis_work_item;
956
957 struct ndis_buffer {
958         struct ndis_buffer      *nb_next;
959         uint16_t                nb_size;
960         uint16_t                nb_flags;
961         void                    *nb_process;
962         void                    *nb_mappedsystemva;
963         void                    *nb_startva;
964         uint32_t                nb_bytecount;
965         uint32_t                nb_byteoffset;
966 };
967
968 typedef struct ndis_buffer ndis_buffer;
969
970 struct ndis_sc_element {
971         ndis_physaddr           nse_addr;
972         uint32_t                nse_len;
973         uint32_t                *nse_rsvd;
974 };
975
976 typedef struct ndis_sc_element ndis_sc_element;
977
978 #define NDIS_MAXSEG             32
979 #define NDIS_BUS_SPACE_SHARED_MAXADDR   0x3E7FFFFF
980
981 struct ndis_sc_list {
982         uint32_t                nsl_frags;
983         uint32_t                *nsl_rsvd;
984         ndis_sc_element         nsl_elements[NDIS_MAXSEG];
985 };
986
987 typedef struct ndis_sc_list ndis_sc_list;
988
989 struct ndis_tcpip_csum {
990         union {
991                 uint32_t                ntc_txflags;
992                 uint32_t                ntc_rxflags;
993                 uint32_t                ntc_val;
994         } u;
995 };
996
997 typedef struct ndis_tcpip_csum ndis_tcpip_csum;
998
999 #define NDIS_TXCSUM_DO_IPV4             0x00000001
1000 #define NDIS_TXCSUM_DO_IPV6             0x00000002
1001 #define NDIS_TXCSUM_DO_TCP              0x00000004
1002 #define NDIS_TXCSUM_DO_UDP              0x00000008
1003 #define NDIS_TXCSUM_DO_IP               0x00000010
1004
1005 #define NDIS_RXCSUM_TCP_FAILED          0x00000001
1006 #define NDIS_RXCSUM_UDP_FAILED          0x00000002
1007 #define NDIS_RXCSUM_IP_FAILED           0x00000004
1008 #define NDIS_RXCSUM_TCP_PASSED          0x00000008
1009 #define NDIS_RXCSUM_UDP_PASSED          0x00000010
1010 #define NDIS_RXCSUM_IP_PASSED           0x00000020
1011 #define NDIS_RXCSUM_LOOPBACK            0x00000040
1012
1013 struct ndis_vlan {
1014         union {
1015                 struct {
1016                         uint32_t                        nvt_userprio:3;
1017                         uint32_t                        nvt_canformatid:1;
1018                         uint32_t                        nvt_vlanid:12;
1019                         uint32_t                        nvt_rsvd:16;
1020                 } nv_taghdr;
1021         } u;
1022 };
1023
1024 typedef struct ndis_vlan ndis_vlan;
1025
1026 enum ndis_perpkt_info {
1027         ndis_tcpipcsum_info,
1028         ndis_ipsec_info,
1029         ndis_largesend_info,
1030         ndis_classhandle_info,
1031         ndis_rsvd,
1032         ndis_sclist_info,
1033         ndis_ieee8021q_info,
1034         ndis_originalpkt_info,
1035         ndis_packetcancelid,
1036         ndis_maxpkt_info
1037 };
1038
1039 typedef enum ndis_perpkt_info ndis_perpkt_info;
1040
1041 struct ndis_packet_extension {
1042         void                    *npe_info[ndis_maxpkt_info];
1043 };
1044
1045 typedef struct ndis_packet_extension ndis_packet_extension;
1046
1047 struct ndis_packet_private {
1048         uint32_t                npp_physcnt;
1049         uint32_t                npp_totlen;
1050         ndis_buffer             *npp_head;
1051         ndis_buffer             *npp_tail;
1052
1053         void                    *npp_pool;
1054         uint32_t                npp_count;
1055         uint32_t                npp_flags;
1056         uint8_t                 npp_validcounts;
1057         uint8_t                 npp_ndispktflags;
1058         uint16_t                npp_packetooboffset;
1059 };
1060
1061 #define NDIS_FLAGS_PROTOCOL_ID_MASK             0x0000000F
1062 #define NDIS_FLAGS_MULTICAST_PACKET             0x00000010
1063 #define NDIS_FLAGS_RESERVED2                    0x00000020
1064 #define NDIS_FLAGS_RESERVED3                    0x00000040
1065 #define NDIS_FLAGS_DONT_LOOPBACK                0x00000080
1066 #define NDIS_FLAGS_IS_LOOPBACK_PACKET           0x00000100
1067 #define NDIS_FLAGS_LOOPBACK_ONLY                0x00000200
1068 #define NDIS_FLAGS_RESERVED4                    0x00000400
1069 #define NDIS_FLAGS_DOUBLE_BUFFERED              0x00000800
1070 #define NDIS_FLAGS_SENT_AT_DPC                  0x00001000
1071 #define NDIS_FLAGS_USES_SG_BUFFER_LIST          0x00002000
1072
1073 #define NDIS_PACKET_WRAPPER_RESERVED                    0x3F
1074 #define NDIS_PACKET_CONTAINS_MEDIA_SPECIFIC_INFO        0x40
1075 #define NDIS_PACKET_ALLOCATED_BY_NDIS                   0x80
1076
1077 #define NDIS_PROTOCOL_ID_DEFAULT        0x00
1078 #define NDIS_PROTOCOL_ID_TCP_IP         0x02
1079 #define NDIS_PROTOCOL_ID_IPX            0x06
1080 #define NDIS_PROTOCOL_ID_NBF            0x07
1081 #define NDIS_PROTOCOL_ID_MAX            0x0F
1082 #define NDIS_PROTOCOL_ID_MASK           0x0F
1083
1084 typedef struct ndis_packet_private ndis_packet_private;
1085
1086 enum ndis_classid {
1087         ndis_class_802_3prio,
1088         ndis_class_wirelesswan_mbx,
1089         ndis_class_irda_packetinfo,
1090         ndis_class_atm_aainfo
1091 };
1092
1093 typedef enum ndis_classid ndis_classid;
1094
1095 struct ndis_mediaspecific_info {
1096         uint32_t                nmi_nextentoffset;
1097         ndis_classid            nmi_classid;
1098         uint32_t                nmi_size;
1099         uint8_t                 nmi_classinfo[1];
1100 };
1101
1102 typedef struct ndis_mediaspecific_info ndis_mediaspecific_info;
1103
1104 struct ndis_packet_oob {
1105         union {
1106                 uint64_t                npo_timetotx;
1107                 uint64_t                npo_timetxed;
1108         } u;
1109         uint64_t                        npo_timerxed;
1110         uint32_t                        npo_hdrlen;
1111         uint32_t                        npo_mediaspecific_len;
1112         void                            *npo_mediaspecific;
1113         ndis_status                     npo_status;
1114 };
1115
1116 typedef struct ndis_packet_oob ndis_packet_oob;
1117
1118 struct ndis_packet {
1119         ndis_packet_private     np_private;
1120         union {
1121                 /* For connectionless miniports. */
1122                 struct {
1123                         uint8_t         np_miniport_rsvd[2 * sizeof(void *)];
1124                         uint8_t         np_wrapper_rsvd[2 * sizeof(void *)];
1125                 } np_clrsvd;
1126                 /* For de-serialized miniports */
1127                 struct {
1128                         uint8_t         np_miniport_rsvdex[3 * sizeof(void *)];
1129                         uint8_t         np_wrapper_rsvdex[sizeof(void *)];
1130                 } np_dsrsvd;
1131                 struct {
1132                         uint8_t         np_mac_rsvd[4 * sizeof(void *)];
1133                 } np_macrsvd;
1134         } u;
1135         uint32_t                *np_rsvd[2];
1136
1137         /*
1138          * This next part is probably wrong, but we need some place
1139          * to put the out of band data structure...
1140          */
1141         ndis_packet_oob         np_oob;
1142         ndis_packet_extension   np_ext;
1143         ndis_sc_list            np_sclist;
1144
1145         /* BSD-specific stuff which should be invisible to drivers. */
1146
1147         uint32_t                np_refcnt;
1148         void                    *np_softc;
1149         void                    *np_m0;
1150         int                     np_txidx;
1151 };
1152
1153 typedef struct ndis_packet ndis_packet;
1154
1155 /* mbuf ext type for NDIS */
1156 #define EXT_NDIS                0x999
1157
1158 struct ndis_filterdbs {
1159         union {
1160                 void                    *nf_ethdb;
1161                 void                    *nf_nulldb;
1162         } u;
1163         void                    *nf_trdb;
1164         void                    *nf_fddidb;
1165         void                    *nf_arcdb;
1166 };
1167
1168 typedef struct ndis_filterdbs ndis_filterdbs;
1169
1170 enum ndis_medium {
1171     NdisMedium802_3,
1172     NdisMedium802_5,
1173     NdisMediumFddi,
1174     NdisMediumWan,
1175     NdisMediumLocalTalk,
1176     NdisMediumDix,              /* defined for convenience, not a real medium */
1177     NdisMediumArcnetRaw,
1178     NdisMediumArcnet878_2,
1179     NdisMediumAtm,
1180     NdisMediumWirelessWan,
1181     NdisMediumIrda,
1182     NdisMediumBpc,
1183     NdisMediumCoWan,
1184     NdisMedium1394,
1185     NdisMediumMax
1186 };
1187
1188 typedef enum ndis_medium ndis_medium;
1189 /*
1190 enum interface_type {
1191         InterfaceTypeUndefined = -1,
1192         Internal,
1193         Isa,
1194         Eisa,
1195         MicroChannel,
1196         TurboChannel,
1197         PCIBus,
1198         VMEBus,
1199         NuBus,
1200         PCMCIABus,
1201         CBus,
1202         MPIBus,
1203         MPSABus,
1204         ProcessorInternal,
1205         InternalPowerBus,
1206         PNPISABus,
1207         PNPBus,
1208         MaximumInterfaceType
1209 };
1210 */
1211 enum ndis_interface_type {
1212         NdisInterfaceInternal = Internal,
1213         NdisInterfaceIsa = Isa,
1214         NdisInterfaceEisa = Eisa,
1215         NdisInterfaceMca = MicroChannel,
1216         NdisInterfaceTurboChannel = TurboChannel,
1217         NdisInterfacePci = PCIBus,
1218         NdisInterfacePcMcia = PCMCIABus
1219 };
1220
1221 typedef enum ndis_interface_type ndis_interface_type;
1222
1223 struct ndis_paddr_unit {
1224         ndis_physaddr           npu_physaddr;
1225         uint32_t                npu_len;
1226 };
1227
1228 typedef struct ndis_paddr_unit ndis_paddr_unit;
1229
1230 struct ndis_map_arg {
1231         ndis_paddr_unit         *nma_fraglist;
1232         int                     nma_cnt;
1233         int                     nma_max;
1234 };
1235
1236 /*
1237  * Miniport characteristics were originally defined in the NDIS 3.0
1238  * spec and then extended twice, in NDIS 4.0 and 5.0.
1239  */
1240
1241 struct ndis_miniport_characteristics {
1242
1243         /* NDIS 3.0 */
1244
1245         uint8_t                 nmc_version_major;
1246         uint8_t                 nmc_version_minor;
1247         uint16_t                nmc_pad;
1248         uint32_t                nmc_rsvd;
1249         void *                  nmc_checkhang_func;
1250         void *                  nmc_disable_interrupts_func;
1251         void *                  nmc_enable_interrupts_func;
1252         void *                  nmc_halt_func;
1253         void *                  nmc_interrupt_func;
1254         void *                  nmc_init_func;
1255         void *                  nmc_isr_func;
1256         void *                  nmc_queryinfo_func;
1257         void *                  nmc_reconfig_func;
1258         void *                  nmc_reset_func;
1259         void *                  nmc_sendsingle_func;
1260         void *                  nmc_setinfo_func;
1261         void *                  nmc_transferdata_func;
1262
1263         /* NDIS 4.0 extentions */
1264
1265         void *                  nmc_return_packet_func;
1266         void *                  nmc_sendmulti_func;
1267         void *                  nmc_allocate_complete_func;
1268
1269         /* NDIS 5.0 extensions */
1270
1271         void *                  nmc_cocreatevc_func;
1272         void *                  nmc_codeletevc_func;
1273         void *                  nmc_coactivatevc_func;
1274         void *                  nmc_codeactivatevc_func;
1275         void *                  nmc_comultisend_func;
1276         void *                  nmc_corequest_func;
1277
1278         /* NDIS 5.1 extentions */
1279
1280         void *                  nmc_canceltxpkts_handler;
1281         void *                  nmc_pnpevent_handler;
1282         void *                  nmc_shutdown_handler;
1283         void *                  nmc_rsvd0;
1284         void *                  nmc_rsvd1;
1285         void *                  nmc_rsvd2;
1286         void *                  nmc_rsvd3;
1287 };
1288
1289 typedef struct ndis_miniport_characteristics ndis_miniport_characteristics;
1290
1291 struct ndis_driver_object {
1292         char                    *ndo_ifname;
1293         void                    *ndo_softc;
1294         ndis_miniport_characteristics ndo_chars;
1295 };
1296
1297 typedef struct ndis_driver_object ndis_driver_object;
1298
1299 struct ndis_reference {
1300         ndis_kspin_lock         nr_spinlock;
1301         uint16_t                nr_refcnt;
1302         uint8_t                 nr_closing;
1303 };
1304
1305 typedef struct ndis_reference ndis_reference;
1306
1307 struct ndis_timer_entry {
1308         struct callout          nte_ch;
1309         ndis_miniport_timer     *nte_timer;
1310         TAILQ_ENTRY(ndis_timer_entry)   link;
1311 };
1312
1313 TAILQ_HEAD(nte_head, ndis_timer_entry);
1314
1315 struct ndis_fh {
1316         void                    *nf_vp;
1317         void                    *nf_map;
1318         uint32_t                nf_maplen; 
1319 };
1320
1321 typedef struct ndis_fh ndis_fh;
1322
1323 /*
1324  * The miniport block is basically the internal NDIS handle. We need
1325  * to define this because, unfortunately, it is not entirely opaque
1326  * to NDIS drivers. For one thing, it contains the function pointer
1327  * to the NDIS packet receive handler, which is invoked out of the
1328  * NDIS block via a macro rather than a function pointer. (The
1329  * NdisMIndicateReceivePacket() routine is a macro rather than
1330  * a function.) For another, the driver maintains a pointer to the
1331  * miniport block and passes it as a handle to various NDIS functions.
1332  * (The driver never really knows this because it's hidden behind
1333  * an ndis_handle though.)
1334  *
1335  * The miniport block has two parts: the first part contains fields
1336  * that must never change, since they are referenced by driver
1337  * binaries through macros. The second part is ignored by the driver,
1338  * but contains various things used internaly by NDIS.SYS. In our
1339  * case, we define the first 'immutable' part exactly as it appears
1340  * in Windows, but don't bother duplicating the Windows definitions
1341  * for the second part. Instead, we replace them with a few BSD-specific
1342  * things.
1343  */
1344
1345 struct ndis_miniport_block {
1346         /*
1347          * Windows-specific portion -- DO NOT MODIFY OR NDIS
1348          * DRIVERS WILL NOT WORK.
1349          */ 
1350         void                    *nmb_signature; /* magic number */
1351         ndis_miniport_block     *nmb_nextminiport;
1352         ndis_mdriver_block      *nmb_driverhandle;
1353         ndis_handle             nmb_miniportadapterctx;
1354         ndis_unicode_string     nmb_name;
1355         ndis_bind_paths         *nmb_bindpaths;
1356         ndis_handle             nmb_openqueue;
1357         ndis_reference          nmb_ref;
1358         ndis_handle             nmb_devicectx;
1359         uint8_t                 nmb_padding;
1360         uint8_t                 nmb_lockacquired;
1361         uint8_t                 nmb_pmodeopens;
1362         uint8_t                 nmb_assignedcpu;
1363         ndis_kspin_lock         nmb_lock;
1364         ndis_request            *nmb_mediarequest;
1365         ndis_miniport_interrupt *nmb_interrupt;
1366         uint32_t                nmb_flags;
1367         uint32_t                nmb_pnpflags;
1368         list_entry              nmb_packetlist;
1369         ndis_packet             *nmb_firstpendingtxpacket;
1370         ndis_packet             *nmb_returnpacketqueue;
1371         uint32_t                nmb_requestbuffer;
1372         void                    *nmb_setmcastbuf;
1373         ndis_miniport_block     *nmb_primaryminiport;
1374         void                    *nmb_wrapperctx;
1375         void                    *nmb_busdatactx;
1376         uint32_t                nmb_pnpcaps;
1377         cm_resource_list        *nmb_resources;
1378         ndis_timer              nmb_wkupdpctimer;
1379         ndis_unicode_string     nmb_basename;
1380         ndis_unicode_string     nmb_symlinkname;
1381         uint32_t                nmb_checkforhangsecs;
1382         uint16_t                nmb_cfhticks;
1383         uint16_t                nmb_cfhcurrticks;
1384         ndis_status             nmb_resetstatus;
1385         ndis_handle             nmb_resetopen;
1386         ndis_filterdbs          nmb_filterdbs;
1387         void                    *nmb_pktind_func;
1388         void                    *nmb_senddone_func;
1389         void                    *nmb_sendrsrc_func;
1390         void                    *nmb_resetdone_func;
1391         ndis_medium             nmb_medium;
1392         uint32_t                nmb_busnum;
1393         uint32_t                nmb_bustye;
1394         uint32_t                nmb_adaptertype;
1395         void                    *nmb_deviceobj;
1396         void                    *nmb_physdeviceobj;
1397         void                    *nmb_nextdeviceobj;
1398         void                    *nmb_mapreg;
1399         void                    *nmb_callmgraflist;
1400         void                    *nmb_miniportthread;
1401         void                    *nmb_setinfobuf;
1402         uint16_t                nmb_setinfobuflen;
1403         uint16_t                nmb_maxsendpkts;
1404         ndis_status             nmb_fakestatus;
1405         void                    *nmb_lockhandler;
1406         ndis_unicode_string     *nmb_adapterinstancename;
1407         void                    *nmb_timerqueue;
1408         uint32_t                nmb_mactoptions;
1409         ndis_request            *nmb_pendingreq;
1410         uint32_t                nmb_maxlongaddrs;
1411         uint32_t                nmb_maxshortaddrs;
1412         uint32_t                nmb_currlookahead;
1413         uint32_t                nmb_maxlookahead;
1414         void                    *nmb_interrupt_func;
1415         void                    *nmb_disableintr_func;
1416         void                    *nmb_enableintr_func;
1417         void                    *nmb_sendpkts_func;
1418         void                    *nmb_deferredsend_func;
1419         void                    *nmb_ethrxindicate_func;
1420         void                    *nmb_txrxindicate_func;
1421         void                    *nmb_fddirxindicate_func;
1422         void                    *nmb_ethrxdone_func;
1423         void                    *nmb_txrxdone_func;
1424         void                    *nmb_fddirxcond_func;
1425         void                    *nmb_status_func;
1426         void                    *nmb_statusdone_func;
1427         void                    *nmb_tdcond_func;
1428         void                    *nmb_querydone_func;
1429         void                    *nmb_setdone_func;
1430         void                    *nmb_wantxdone_func;
1431         void                    *nmb_wanrx_func;
1432         void                    *nmb_wanrxdone_func;
1433         /*
1434          * End of windows-specific portion of miniport block. Everything
1435          * below is BSD-specific.
1436          */
1437         struct ifnet            *nmb_ifp;
1438         uint8_t                 nmb_dummybuf[128];
1439         device_object           nmb_devobj;
1440         ndis_config_parm        nmb_replyparm;
1441         int                     nmb_pciidx;
1442         device_t                nmb_dev;
1443         ndis_resource_list      *nmb_rlist;
1444         ndis_status             nmb_getstat;
1445         ndis_status             nmb_setstat;
1446         struct nte_head         nmb_timerlist;
1447         vm_offset_t             nmb_img;
1448         TAILQ_ENTRY(ndis_miniport_block)        link;
1449 };
1450
1451 TAILQ_HEAD(nd_head, ndis_miniport_block);
1452
1453 typedef __stdcall ndis_status (*ndis_init_handler)(ndis_status *, uint32_t *,
1454                 ndis_medium *, uint32_t, ndis_handle, ndis_handle);
1455 typedef __stdcall ndis_status (*ndis_queryinfo_handler)(ndis_handle, ndis_oid,
1456                 void *, uint32_t, uint32_t *, uint32_t *);
1457 typedef __stdcall ndis_status (*ndis_setinfo_handler)(ndis_handle, ndis_oid,
1458                 void *, uint32_t, uint32_t *, uint32_t *);
1459 typedef __stdcall ndis_status (*ndis_sendsingle_handler)(ndis_handle,
1460                 ndis_packet *, uint32_t);
1461 typedef __stdcall ndis_status (*ndis_sendmulti_handler)(ndis_handle,
1462                 ndis_packet **, uint32_t);
1463 typedef __stdcall void (*ndis_isr_handler)(uint8_t *, uint8_t *, ndis_handle);
1464 typedef __stdcall void (*ndis_interrupt_handler)(ndis_handle);
1465 typedef __stdcall int (*ndis_reset_handler)(uint8_t *, ndis_handle);
1466 typedef __stdcall void (*ndis_halt_handler)(ndis_handle);
1467 typedef __stdcall void (*ndis_return_handler)(ndis_handle, ndis_packet *);
1468 typedef __stdcall void (*ndis_enable_interrupts_handler)(ndis_handle);
1469 typedef __stdcall void (*ndis_disable_interrupts_handler)(ndis_handle);
1470 typedef __stdcall void (*ndis_shutdown_handler)(void *);
1471 typedef __stdcall void (*ndis_allocdone_handler)(ndis_handle, void *,
1472                 ndis_physaddr *, uint32_t, void *);
1473 typedef __stdcall uint8_t (*ndis_checkforhang_handler)(ndis_handle);
1474
1475 typedef __stdcall ndis_status (*driver_entry)(void *, ndis_unicode_string *);
1476
1477 extern image_patch_table ndis_functbl[];
1478
1479 #define NDIS_TASKQUEUE  1
1480 #define NDIS_SWI        2
1481
1482 #define NDIS_PSTATE_RUNNING     1
1483 #define NDIS_PSTATE_SLEEPING    2
1484
1485 __BEGIN_DECLS
1486 struct ndis_softc;
1487
1488 extern int ndis_libinit(void);
1489 extern int ndis_libfini(void);
1490 extern int ndis_ascii_to_unicode(char *, uint16_t **);
1491 extern int ndis_unicode_to_ascii(uint16_t *, int, char **);
1492 extern int ndis_load_driver(vm_offset_t, void *);
1493 extern int ndis_unload_driver(void *);
1494 extern int ndis_mtop(struct mbuf *, ndis_packet **);
1495 extern int ndis_ptom(struct mbuf **, ndis_packet *);
1496 extern int ndis_get_info(void *, ndis_oid, void *, int *);
1497 extern int ndis_set_info(void *, ndis_oid, void *, int *);
1498 extern int ndis_get_supported_oids(void *, ndis_oid **, int *);
1499 extern int ndis_send_packets(void *, ndis_packet **, int);
1500 extern int ndis_send_packet(void *, ndis_packet *);
1501 extern int ndis_convert_res(void *);
1502 extern int ndis_alloc_amem(void *);
1503 extern void ndis_free_amem(void *);
1504 extern void ndis_free_packet(ndis_packet *);
1505 extern void ndis_free_bufs(ndis_buffer *);
1506 extern void ndis_return_packet(struct ndis_softc *sc, ndis_packet *p);
1507 extern int ndis_reset_nic(void *);
1508 extern int ndis_halt_nic(void *);
1509 extern int ndis_shutdown_nic(void *);
1510 extern int ndis_init_nic(void *);
1511 extern int ndis_isr(void *, int *, int *);
1512 extern int ndis_intrhand(void *);
1513 extern void ndis_enable_intr(void *);
1514 extern void ndis_disable_intr(void *);
1515 extern int ndis_init_dma(void *);
1516 extern int ndis_destroy_dma(void *);
1517 extern int ndis_create_sysctls(void *);
1518 extern int ndis_add_sysctl(void *, char *, char *, char *, int);
1519 extern int ndis_flush_sysctls(void *);
1520 extern int ndis_sched(void (*)(void *), void *, int);
1521 extern int ndis_unsched(void (*)(void *), void *, int);
1522 extern int ndis_thsuspend(struct thread *, int);
1523 extern void ndis_thresume(struct thread *);
1524 extern int ndis_strcasecmp(const char *, const char *);
1525 __END_DECLS
1526
1527 #endif /* _NDIS_VAR_H_ */