UBUNTU: ubuntu: ndiswrapper -- version 1.55
[linux-flexiantxendom0.git] / ubuntu / ndiswrapper / ndis.h
1 /*
2  *  Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani
3  *
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation; either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  *  GNU General Public License for more details.
13  *
14  */
15
16 #ifndef _NDIS_H_
17 #define _NDIS_H_
18
19 #include "ntoskernel.h"
20
21 //#define ALLOW_POOL_OVERFLOW 1
22
23 #define NDIS_DMA_24BITS 0
24 #define NDIS_DMA_32BITS 1
25 #define NDIS_DMA_64BITS 2
26
27 #ifdef CONFIG_X86_64
28 #define MAXIMUM_PROCESSORS  64
29 #else
30 #define MAXIMUM_PROCESSORS  32
31 #endif
32
33 typedef UINT NDIS_STATUS;
34 typedef UCHAR NDIS_DMA_SIZE;
35 typedef LONG ndis_rssi;
36 typedef ULONG ndis_key_index;
37 typedef ULONG ndis_tx_power_level;
38 typedef ULONGULONG ndis_key_rsc;
39 typedef UCHAR ndis_rates[NDIS_MAX_RATES];
40 typedef UCHAR ndis_rates_ex[NDIS_MAX_RATES_EX];
41 typedef UCHAR mac_address[ETH_ALEN];
42 typedef ULONG ndis_fragmentation_threshold;
43 typedef ULONG ndis_rts_threshold;
44 typedef ULONG ndis_antenna;
45 typedef ULONG ndis_oid;
46
47 typedef UCHAR ndis_pmkid_vavlue[16];
48
49 typedef uint64_t NDIS_PHY_ADDRESS;
50
51 struct ndis_sg_element {
52         PHYSICAL_ADDRESS address;
53         ULONG length;
54         ULONG_PTR reserved;
55 };
56
57 struct ndis_sg_list {
58         ULONG nent;
59         ULONG_PTR reserved;
60         struct ndis_sg_element elements[];
61 };
62
63 /* when sending packets, ndiswrapper associates exactly one sg element
64  * in sg list */
65 struct wrap_tx_sg_list {
66         ULONG nent;
67         ULONG_PTR reserved;
68         struct ndis_sg_element elements[1];
69 };
70
71 struct ndis_phy_addr_unit {
72         NDIS_PHY_ADDRESS phy_addr;
73         UINT length;
74 };
75
76 typedef struct mdl ndis_buffer;
77
78 struct ndis_buffer_pool {
79         ndis_buffer *free_descr;
80 //      NT_SPIN_LOCK lock;
81         spinlock_t lock;
82         UINT max_descr;
83         UINT num_allocated_descr;
84 };
85
86 #define NDIS_PROTOCOL_ID_DEFAULT        0x00
87 #define NDIS_PROTOCOL_ID_TCP_IP         0x02
88 #define NDIS_PROTOCOL_ID_IPX            0x06
89 #define NDIS_PROTOCOL_ID_NBF            0x07
90 #define NDIS_PROTOCOL_ID_MAX            0x0F
91 #define NDIS_PROTOCOL_ID_MASK           0x0F
92
93 #define fPACKET_WRAPPER_RESERVED                0x3F
94 #define fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO    0x40
95 #define fPACKET_ALLOCATED_BY_NDIS               0x80
96
97 #define PROTOCOL_RESERVED_SIZE_IN_PACKET (4 * sizeof(void *))
98
99 struct transport_header_offset {
100         USHORT protocol_type;
101         USHORT header_offset;
102 };
103
104 struct ndis_network_address {
105         USHORT length;
106         USHORT type;
107         UCHAR address[1];
108 };
109
110 struct ndis_network_address_list {
111         LONG count;
112         USHORT type;
113         struct ndis_network_address address[1];
114 };
115
116 struct ndis_tcp_ip_checksum_packet_info {
117         union {
118                 struct {
119                         ULONG v4:1;
120                         ULONG v6:1;
121                         ULONG tcp:1;
122                         ULONG udp:1;
123                         ULONG ip:1;
124                 } tx;
125                 struct {
126                         ULONG tcp_failed:1;
127                         ULONG udp_failed:1;
128                         ULONG ip_failed:1;
129                         ULONG tcp_succeeded:1;
130                         ULONG udp_succeeded:1;
131                         ULONG ip_succeeded:1;
132                         ULONG loopback:1;
133                 } rx;
134                 ULONG value;
135         };
136 };
137
138 enum ndis_task {
139         TcpIpChecksumNdisTask, IpSecNdisTask, TcpLargeSendNdisTask, MaxNdisTask
140 };
141
142 enum ndis_encapsulation {
143         UNSPECIFIED_Encapsulation, NULL_Encapsulation,
144         IEEE_802_3_Encapsulation, IEEE_802_5_Encapsulation,
145         LLC_SNAP_ROUTED_Encapsulation, LLC_SNAP_BRIDGED_Encapsulation
146 };
147
148 #define NDIS_TASK_OFFLOAD_VERSION 1
149
150 struct ndis_encapsulation_format {
151         enum ndis_encapsulation encap;
152         struct {
153                 ULONG fixed_header_size:1;
154                 ULONG reserved:31;
155         } flags;
156         ULONG header_size;
157 };
158
159 struct ndis_task_offload_header {
160         ULONG version;
161         ULONG size;
162         ULONG reserved;
163         ULONG offset_first_task;
164         struct ndis_encapsulation_format encap_format;
165 };
166
167 struct ndis_task_offload {
168         ULONG version;
169         ULONG size;
170         enum ndis_task task;
171         ULONG offset_next_task;
172         ULONG task_buf_length;
173         UCHAR task_buf[1];
174 };
175
176 struct v4_checksum {
177         union {
178                 struct {
179                         ULONG ip_opts:1;
180                         ULONG tcp_opts:1;
181                         ULONG tcp_csum:1;
182                         ULONG udp_csum:1;
183                         ULONG ip_csum:1;
184                 };
185                 ULONG value;
186         };
187 };
188
189 struct v6_checksum {
190         ULONG ip_supported:1;
191         ULONG tcp_supported:1;
192         ULONG tcp_csum:1;
193         ULONG udp_csum:1;
194 };
195
196 struct ndis_task_tcp_ip_checksum {
197         struct v4_checksum v4_tx;
198         struct v4_checksum v4_rx;
199         struct v6_checksum v6_tx;
200         struct v6_checksum v6_rx;
201 };
202
203 struct ndis_task_tcp_large_send {
204         ULONG version;
205         ULONG max_size;
206         ULONG min_seg_count;
207         BOOLEAN tcp_opts;
208         BOOLEAN ip_opts;
209 };
210
211 struct ndis_packet;
212
213 struct ndis_packet_pool {
214         struct ndis_packet *free_descr;
215 //      NT_SPIN_LOCK lock;
216         spinlock_t lock;
217         UINT max_descr;
218         UINT num_allocated_descr;
219         UINT num_used_descr;
220         UINT proto_rsvd_length;
221 };
222
223 struct ndis_packet_stack {
224         ULONG_PTR IM_reserved[2];
225         ULONG_PTR ndis_reserved[4];
226 };
227
228 enum ndis_per_packet_info {
229         TcpIpChecksumPacketInfo, IpSecPacketInfo, TcpLargeSendPacketInfo,
230         ClassificationHandlePacketInfo, NdisReserved,
231         ScatterGatherListPacketInfo, Ieee8021QInfo, OriginalPacketInfo,
232         PacketCancelId, MaxPerPacketInfo
233 };
234
235 struct ndis_packet_extension {
236         void *info[MaxPerPacketInfo];
237 };
238
239 struct ndis_packet_private {
240         UINT nr_pages;
241         UINT len;
242         ndis_buffer *buffer_head;
243         ndis_buffer *buffer_tail;
244         struct ndis_packet_pool *pool;
245         UINT count;
246         ULONG flags;
247         BOOLEAN valid_counts;
248         UCHAR packet_flags;
249         USHORT oob_offset;
250 };
251
252 struct ndis_packet {
253         struct ndis_packet_private private;
254         /* for use by miniport */
255         union {
256                 /* for connectionless mininports */
257                 struct {
258                         UCHAR miniport_reserved[2 * sizeof(void *)];
259                         UCHAR wrapper_reserved[2 * sizeof(void *)];
260                 } cl_reserved;
261                 /* for deserialized miniports */
262                 struct {
263                         UCHAR miniport_reserved_ex[3 * sizeof(void *)];
264                         UCHAR wrapper_reserved_ex[sizeof(void *)];
265                 } deserailized_reserved;
266                 struct {
267                         UCHAR mac_reserved[4 * sizeof(void *)];
268                 } mac_reserved;
269         };
270         ULONG_PTR reserved[2];
271         UCHAR protocol_reserved[1];
272 };
273
274 /* OOB data */
275 struct ndis_packet_oob_data {
276         union {
277                 ULONGLONG time_to_tx;
278                 ULONGLONG time_txed;
279         };
280         ULONGLONG time_rxed;
281         UINT header_size;
282         UINT media_size;
283         void *media;
284         NDIS_STATUS status;
285
286         /* ndiswrapper specific info; extension should be right after
287          * ndis's oob_data */
288         struct ndis_packet_extension ext;
289         union {
290                 /* used for tx only */
291                 struct {
292                         struct sk_buff *tx_skb;
293                         union {
294                                 struct wrap_tx_sg_list wrap_tx_sg_list;
295                                 struct ndis_sg_list *tx_sg_list;
296                         };
297                 };
298                 /* used for rx only */
299                 struct {
300                         unsigned char header[ETH_HLEN];
301                         unsigned char *look_ahead;
302                         UINT look_ahead_size;
303                 };
304         };
305 };
306
307 #define NDIS_PACKET_OOB_DATA(packet)                                    \
308         (struct ndis_packet_oob_data *)(((void *)(packet)) +            \
309                                         (packet)->private.oob_offset)
310
311 enum ndis_device_pnp_event {
312         NdisDevicePnPEventQueryRemoved, NdisDevicePnPEventRemoved,
313         NdisDevicePnPEventSurpriseRemoved, NdisDevicePnPEventQueryStopped,
314         NdisDevicePnPEventStopped, NdisDevicePnPEventPowerProfileChanged,
315         NdisDevicePnPEventMaximum
316 };
317
318 enum ndis_request_type {
319         NdisRequestQueryInformation, NdisRequestSetInformation,
320         NdisRequestQueryStatistics, NdisRequestOpen, NdisRequestClose,
321         NdisRequestSend, NdisRequestTransferData, NdisRequestReset,
322         NdisRequestGeneric1, NdisRequestGeneric2, NdisRequestGeneric3,
323         NdisRequestGeneric4
324 };
325
326 struct ndis_request {
327         mac_address mac;
328         enum ndis_request_type request_type;
329         union data {
330                 struct query_info {
331                         UINT oid;
332                         void *buf;
333                         UINT buf_len;
334                         UINT written;
335                         UINT needed;
336                 } query_info;
337                 struct set_info {
338                         UINT oid;
339                         void *buf;
340                         UINT buf_len;
341                         UINT written;
342                         UINT needed;
343                 } set_info;
344         } data;
345 };
346
347 enum ndis_medium {
348         NdisMedium802_3, NdisMedium802_5, NdisMediumFddi, NdisMediumWan,
349         NdisMediumLocalTalk, NdisMediumDix, NdisMediumArcnetRaw,
350         NdisMediumArcnet878_2, NdisMediumAtm, NdisMediumWirelessWan,
351         NdisMediumIrda, NdisMediumBpc, NdisMediumCoWan,
352         NdisMedium1394, NdisMediumMax
353 };
354
355 enum ndis_physical_medium {
356         NdisPhysicalMediumUnspecified, NdisPhysicalMediumWirelessLan,
357         NdisPhysicalMediumCableModem, NdisPhysicalMediumPhoneLine,
358         NdisPhysicalMediumPowerLine, NdisPhysicalMediumDSL,
359         NdisPhysicalMediumFibreChannel, NdisPhysicalMedium1394,
360         NdisPhysicalMediumWirelessWan, NdisPhysicalMediumMax
361 };
362
363 enum ndis_power_state {
364         NdisDeviceStateUnspecified = 0,
365         NdisDeviceStateD0, NdisDeviceStateD1, NdisDeviceStateD2,
366         NdisDeviceStateD3, NdisDeviceStateMaximum
367 };
368
369 enum ndis_power_profile {
370         NdisPowerProfileBattery, NdisPowerProfileAcOnLine
371 };
372
373 struct ndis_pm_wakeup_capabilities {
374         enum ndis_power_state min_magic_packet_wakeup;
375         enum ndis_power_state min_pattern_wakeup;
376         enum ndis_power_state min_link_change_wakeup;
377 };
378
379 #define NDIS_PNP_WAKE_UP_MAGIC_PACKET                   0x00000001
380 #define NDIS_PNP_WAKE_UP_PATTERN_MATCH                  0x00000002
381 #define NDIS_PNP_WAKE_UP_LINK_CHANGE                    0x00000004
382
383 enum net_pnp_event_code {
384         NetEventSetPower, NetEventQueryPower, NetEventQueryRemoveDevice,
385         NetEventCancelRemoveDevice, NetEventReconfigure, NetEventBindList,
386         NetEventBindsComplete, NetEventPnPCapabilities, NetEventMaximum
387 };
388
389 struct net_pnp_event {
390         enum net_pnp_event_code code;
391         void *buf;
392         ULONG buf_length;
393         ULONG_PTR ndis_reserved[4];
394         ULONG_PTR transport_reserved[4];
395         ULONG_PTR tdi_reserved[4];
396         ULONG_PTR tdi_client_reserved[4];
397 };
398
399 struct ndis_pnp_capabilities {
400         ULONG flags;
401         struct ndis_pm_wakeup_capabilities wakeup;
402 };
403
404 typedef void (*ndis_isr_handler)(BOOLEAN *recognized, BOOLEAN *queue_handler,
405                                  void *handle) wstdcall;
406 typedef void (*ndis_interrupt_handler)(void *ctx) wstdcall;
407
408 struct miniport {
409         /* NDIS 3.0 */
410         UCHAR major_version;
411         UCHAR minor_version;
412         USHORT filler;
413         UINT reserved;
414         BOOLEAN (*hangcheck)(void *ctx) wstdcall;
415         void (*disable_interrupt)(void *ctx) wstdcall;
416         void (*enable_interrupt)(void *ctx) wstdcall;
417         void (*mp_halt)(void *ctx) wstdcall;
418         ndis_interrupt_handler handle_interrupt;
419         NDIS_STATUS (*init)(NDIS_STATUS *error_status, UINT *medium_index,
420                             enum ndis_medium medium[], UINT medium_array_size,
421                             void *handle, void *conf_handle) wstdcall;
422         ndis_isr_handler isr;
423         NDIS_STATUS (*queryinfo)(void *ctx, ndis_oid oid, void *buffer,
424                              ULONG buflen, ULONG *written,
425                              ULONG *needed) wstdcall;
426         void *reconfig;
427         NDIS_STATUS (*reset)(BOOLEAN *reset_address, void *ctx) wstdcall;
428         NDIS_STATUS (*send)(void *ctx, struct ndis_packet *packet,
429                             UINT flags) wstdcall;
430         NDIS_STATUS (*setinfo)(void *ctx, ndis_oid oid, void *buffer,
431                                ULONG buflen, ULONG *written,
432                                ULONG *needed) wstdcall;
433         NDIS_STATUS (*tx_data)(struct ndis_packet *ndis_packet,
434                                UINT *bytes_txed, void *mp_ctx, void *rx_ctx,
435                                UINT offset, UINT bytes_to_tx) wstdcall;
436         /* NDIS 4.0 extensions */
437         void (*return_packet)(void *ctx, void *packet) wstdcall;
438         void (*send_packets)(void *ctx, struct ndis_packet **packets,
439                              INT nr_of_packets) wstdcall;
440         void (*alloc_complete)(void *handle, void *virt,
441                                NDIS_PHY_ADDRESS *phys,
442                                ULONG size, void *ctx) wstdcall;
443         /* NDIS 5.0 extensions */
444         NDIS_STATUS (*co_create_vc)(void *ctx, void *vc_handle,
445                                     void *vc_ctx) wstdcall;
446         NDIS_STATUS (*co_delete_vc)(void *vc_ctx) wstdcall;
447         NDIS_STATUS (*co_activate_vc)(void *vc_ctx, void *call_params) wstdcall;
448         NDIS_STATUS (*co_deactivate_vc)(void *vc_ctx) wstdcall;
449         NDIS_STATUS (*co_send_packets)(void *vc_ctx, void **packets,
450                                        UINT nr_of_packets) wstdcall;
451         NDIS_STATUS (*co_request)(void *ctx, void *vc_ctx, UINT *req) wstdcall;
452         /* NDIS 5.1 extensions */
453         void (*cancel_send_packets)(void *ctx, void *id) wstdcall;
454         void (*pnp_event_notify)(void *ctx, enum ndis_device_pnp_event event,
455                                  void *inf_buf, ULONG inf_buf_len) wstdcall;
456         void (*shutdown)(void *ctx) wstdcall;
457         void *reserved1;
458         void *reserved2;
459         void *reserved3;
460         void *reserved4;
461 };
462
463 struct ndis_spinlock {
464         NT_SPIN_LOCK klock;
465         KIRQL irql;
466 };
467
468 union ndis_rw_lock_refcount {
469         UCHAR cache_line[16];
470 };
471
472 struct ndis_rw_lock {
473         union {
474                 struct {
475                         NT_SPIN_LOCK klock;
476                         void *context;
477                 };
478                 UCHAR reserved[16];
479         };
480         union {
481                 union ndis_rw_lock_refcount ref_count[MAXIMUM_PROCESSORS];
482                 /* ndiswrapper specific */
483                 volatile int count;
484         };
485 };
486
487 struct lock_state {
488         USHORT state;
489         KIRQL irql;
490 };
491
492 struct ndis_work_item;
493 typedef void (*NDIS_PROC)(struct ndis_work_item *, void *) wstdcall;
494
495 struct ndis_work_item {
496         void *ctx;
497         NDIS_PROC func;
498         union {
499                 UCHAR reserved[8 * sizeof(void *)];
500                 /* ndiswrapper specific */
501                 struct nt_list list;
502         };
503 };
504
505 struct alloc_shared_mem {
506         void *ctx;
507         ULONG size;
508         BOOLEAN cached;
509 };
510
511 struct ndis_mp_block;
512
513 /* this is opaque to drivers, so we can use it as we please */
514 struct ndis_mp_interrupt {
515         struct kinterrupt *kinterrupt;
516         NT_SPIN_LOCK lock;
517         union {
518                 void *reserved;
519                 unsigned int irq;
520         };
521         ndis_isr_handler isr;
522         ndis_interrupt_handler mp_dpc;
523         struct kdpc intr_dpc;
524         struct ndis_mp_block *nmb;
525         UCHAR dpc_count;
526         BOOLEAN enable;
527         struct nt_event dpc_completed_event;
528         BOOLEAN shared;
529         BOOLEAN req_isr;
530 };
531
532 struct ndis_binary_data {
533         USHORT len;
534         void *buf;
535 };
536
537 enum ndis_parameter_type {
538         NdisParameterInteger, NdisParameterHexInteger,
539         NdisParameterString, NdisParameterMultiString, NdisParameterBinary,
540 };
541
542 typedef struct unicode_string NDIS_STRING;
543
544 struct ndis_configuration_parameter {
545         enum ndis_parameter_type type;
546         union {
547                 ULONG integer;
548                 NDIS_STRING string;
549         } data;
550 };
551
552 struct ndis_driver {
553         struct miniport mp;
554 };
555
556 /* IDs used to store extensions in driver_object's custom extension */
557 #define NDIS_DRIVER_CLIENT_ID 10
558
559 struct ndis_wireless_stats {
560         ULONG length;
561         LARGE_INTEGER tx_frag;
562         LARGE_INTEGER tx_multi_frag;
563         LARGE_INTEGER failed;
564         LARGE_INTEGER retry;
565         LARGE_INTEGER multi_retry;
566         LARGE_INTEGER rtss_succ;
567         LARGE_INTEGER rtss_fail;
568         LARGE_INTEGER ack_fail;
569         LARGE_INTEGER frame_dup;
570         LARGE_INTEGER rx_frag;
571         LARGE_INTEGER rx_multi_frag;
572         LARGE_INTEGER fcs_err;
573         LARGE_INTEGER tkip_local_mic_failures;
574         LARGE_INTEGER tkip_icv_errors;
575         LARGE_INTEGER tkip_counter_measures_invoked;
576         LARGE_INTEGER tkip_replays;
577         LARGE_INTEGER ccmp_format_errors;
578         LARGE_INTEGER ccmp_replays;
579         LARGE_INTEGER ccmp_decrypt_errors;
580         LARGE_INTEGER fourway_handshake_failures;
581         LARGE_INTEGER wep_undecryptable_count;
582         LARGE_INTEGER wep_icv_errorcount;
583         LARGE_INTEGER decrypt_success_count;
584         LARGE_INTEGER decrypt_failure_count;
585 };
586
587 enum ndis_status_type {
588         Ndis802_11StatusType_Authentication,
589         Ndis802_11StatusType_MediaStreamMode,
590         Ndis802_11StatusType_PMKID_CandidateList,
591         Ndis802_11StatusType_RadioState,
592 };
593
594 struct ndis_status_indication {
595         enum ndis_status_type status_type;
596 };
597
598 enum ndis_radio_status {
599         Ndis802_11RadioStatusOn, Ndis802_11RadioStatusHardwareOff,
600         Ndis802_11RadioStatusSoftwareOff,
601 };
602
603 struct ndis_radio_status_indication
604 {
605         enum ndis_status_type status_type;
606         enum ndis_radio_status radio_state;
607 };
608
609 enum ndis_media_state {
610         NdisMediaStateConnected,
611         NdisMediaStateDisconnected,
612 };
613
614 enum ndis_media_stream_mode {
615         Ndis802_11MediaStreamOff, Ndis802_11MediaStreamOn
616 };
617
618 enum wrapper_work {
619         LINK_STATUS_OFF, LINK_STATUS_ON, SET_MULTICAST_LIST, COLLECT_IW_STATS,
620         HANGCHECK, NETIF_WAKEQ,
621 };
622
623 struct encr_info {
624         struct encr_key {
625                 ULONG length;
626                 UCHAR key[NDIS_ENCODING_TOKEN_MAX];
627         } keys[MAX_ENCR_KEYS];
628         unsigned short tx_key_index;
629 };
630
631 struct ndis_essid {
632         ULONG length;
633         UCHAR essid[NDIS_ESSID_MAX_SIZE];
634 };
635
636 enum ndis_infrastructure_mode {
637         Ndis802_11IBSS, Ndis802_11Infrastructure, Ndis802_11AutoUnknown,
638         Ndis802_11InfrastructureMax
639 };
640
641 enum authentication_mode {
642         Ndis802_11AuthModeOpen, Ndis802_11AuthModeShared,
643         Ndis802_11AuthModeAutoSwitch, Ndis802_11AuthModeWPA,
644         Ndis802_11AuthModeWPAPSK, Ndis802_11AuthModeWPANone,
645         Ndis802_11AuthModeWPA2, Ndis802_11AuthModeWPA2PSK,
646         Ndis802_11AuthModeMax
647 };
648
649 enum encryption_status {
650         Ndis802_11WEPEnabled,
651         Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled,
652         Ndis802_11WEPDisabled,
653         Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled,
654         Ndis802_11WEPKeyAbsent,
655         Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent,
656         Ndis802_11WEPNotSupported,
657         Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported,
658         Ndis802_11Encryption2Enabled, Ndis802_11Encryption2KeyAbsent,
659         Ndis802_11Encryption3Enabled, Ndis802_11Encryption3KeyAbsent
660 };
661
662 struct ndis_auth_encr_pair {
663         enum authentication_mode auth_mode;
664         enum encryption_status encr_mode;
665 };
666
667 struct ndis_capability {
668         ULONG length;
669         ULONG version;
670         ULONG num_PMKIDs;
671         ULONG num_auth_encr_pair;
672         struct ndis_auth_encr_pair auth_encr_pair[1];
673 };
674
675 struct ndis_guid {
676         struct guid guid;
677         union {
678                 ndis_oid oid;
679                 NDIS_STATUS status;
680         };
681         ULONG size;
682         ULONG flags;
683 };
684
685 struct ndis_timer {
686         struct nt_timer nt_timer;
687         struct kdpc kdpc;
688 };
689
690 struct ndis_mp_timer {
691         struct nt_timer nt_timer;
692         struct kdpc kdpc;
693         DPC func;
694         void *ctx;
695         struct ndis_mp_block *nmb;
696         struct ndis_mp_timer *next;
697 };
698
699 typedef struct cm_partial_resource_list NDIS_RESOURCE_LIST;
700
701 struct ndis_event {
702         struct nt_event nt_event;
703 };
704
705 struct ndis_bind_paths {
706         UINT number;
707         struct unicode_string paths[1];
708 };
709
710 struct ndis_reference {
711         NT_SPIN_LOCK lock;
712         USHORT ref_count;
713         BOOLEAN closing;
714 };
715
716 struct ndis_filterdbs {
717         union {
718                 void *eth_db;
719                 void *null_db;
720         };
721         void *tr_db;
722         void *fddi_db;
723         void *arc_db;
724 };
725
726 enum ndis_interface_type {
727         NdisInterfaceInternal, NdisInterfaceIsa, NdisInterfaceEisa,
728         NdisInterfaceMca, NdisInterfaceTurboChannel, NdisInterfacePci,
729         NdisInterfacePcMcia,
730 };
731
732 struct auth_encr_capa {
733         unsigned long auth;
734         unsigned long encr;
735 };
736
737 struct ndis_pmkid_candidate {
738         mac_address bssid;
739         DWORD flags;
740 };
741
742 struct ndis_pmkid_candidate_list {
743         ULONG version;
744         ULONG num_candidates;
745         struct ndis_pmkid_candidate candidates[1];
746 };
747
748 /*
749  * This struct contains function pointers that the drivers references
750  * directly via macros, so it's important that they are at the correct
751  * position.
752  */
753 struct ndis_mp_block {
754         void *signature;
755         struct ndis_mp_block *next;
756         struct driver_object *drv_obj;
757         void *mp_ctx;
758         struct unicode_string name;
759         struct ndis_bind_paths *bindpaths;
760         void *openqueue;
761         struct ndis_reference reference;
762         void *device_ctx;
763         UCHAR padding;
764         UCHAR lock_acquired;
765         UCHAR pmode_opens;
766         UCHAR assigned_cpu;
767         NT_SPIN_LOCK lock;
768         enum ndis_request_type *mediarequest;
769         struct ndis_mp_interrupt *interrupt;
770         ULONG flags;
771         ULONG pnp_flags;
772         struct nt_list packet_list;
773         struct ndis_packet *first_pending_tx_packet;
774         struct ndis_packet *return_packet_queue;
775         ULONG request_buffer;
776         void *set_mcast_buffer;
777         struct ndis_mp_block *primary_mp;
778         void *wrapper_ctx;
779         void *bus_data_ctx;
780         ULONG pnp_capa;
781         void *resources;
782         struct ndis_timer wakeup_dpc_timer;
783         struct unicode_string basename;
784         struct unicode_string symlink_name;
785         ULONG ndis_hangcheck_interval;
786         USHORT hanghcheck_ticks;
787         USHORT hangcheck_tick;
788         NDIS_STATUS ndis_reset_status;
789         void *resetopen;
790         struct ndis_filterdbs filterdbs;
791         void *rx_packet;
792         void *send_complete;
793         void *send_resource_avail;
794         void *reset_complete;
795
796         enum ndis_medium media_type;
797         ULONG bus_number;
798         enum ndis_interface_type bus_type;
799         enum ndis_interface_type adapter_type;
800         struct device_object *fdo;
801         struct device_object *pdo;
802         struct device_object *next_device;
803         void *mapreg;
804         void *call_mgraflist;
805         void *mp_thread;
806         void *setinfobuf;
807         USHORT setinfo_buf_len;
808         USHORT max_send_pkts;
809         NDIS_STATUS fake_status;
810         void *lock_handler;
811         struct unicode_string *adapter_instance_name;
812         void *timer_queue;
813         UINT mac_options;
814         void *pending_req;
815         UINT max_long_addrs;
816         UINT max_short_addrs;
817         UINT cur_lookahead;
818         UINT max_lookahead;
819
820         ndis_interrupt_handler irq_bh;
821         void *disable_intr;
822         void *enable_intr;
823         void *send_pkts;
824         void *deferred_send;
825         void *eth_rx_indicate;
826         void *tr_rx_indicate;
827         void *fddi_rx_indicate;
828         void *eth_rx_complete;
829         void *tr_rx_complete;
830         void *fddi_rx_complete;
831
832         void *status;
833         void *status_complete;
834         void *td_complete;
835
836         void *queryinfo_complete;
837         void *setinfo_complete;
838         void *wan_tx_complete;
839         void *wan_rx;
840         void *wan_rx_complete;
841         /* ndiswrapper specific */
842         struct ndis_device *wnd;
843 };
844
845 struct ndis_device {
846         struct ndis_mp_block *nmb;
847         struct wrap_device *wd;
848         struct net_device *net_dev;
849         void *shutdown_ctx;
850         struct ndis_mp_interrupt *mp_interrupt;
851         struct kdpc irq_kdpc;
852         unsigned long mem_start;
853         unsigned long mem_end;
854
855         struct net_device_stats net_stats;
856         struct iw_statistics iw_stats;
857         BOOLEAN iw_stats_enabled;
858         struct ndis_wireless_stats ndis_stats;
859
860         work_struct_t tx_work;
861         struct ndis_packet *tx_ring[TX_RING_SIZE];
862         u8 tx_ring_start;
863         u8 tx_ring_end;
864         u8 is_tx_ring_full;
865         u8 tx_ok;
866         spinlock_t tx_ring_lock;
867         struct semaphore tx_ring_mutex;
868         unsigned int max_tx_packets;
869         struct semaphore ndis_req_mutex;
870         struct task_struct *ndis_req_task;
871         int ndis_req_done;
872         NDIS_STATUS ndis_req_status;
873         ULONG packet_filter;
874
875         ULONG sg_dma_size;
876         ULONG dma_map_count;
877         dma_addr_t *dma_map_addr;
878
879         int hangcheck_interval;
880         struct timer_list hangcheck_timer;
881         int iw_stats_interval;
882         struct timer_list iw_stats_timer;
883         unsigned long scan_timestamp;
884         struct encr_info encr_info;
885         char nick[IW_ESSID_MAX_SIZE + 1];
886         struct ndis_essid essid;
887         struct auth_encr_capa capa;
888         enum ndis_infrastructure_mode infrastructure_mode;
889         int max_pmkids;
890         int num_pmkids;
891         struct ndis_pmkid *pmkids;
892         mac_address mac;
893         struct proc_dir_entry *procfs_iface;
894
895         work_struct_t ndis_work;
896         unsigned long ndis_pending_work;
897         UINT attributes;
898         int iw_auth_wpa_version;
899         int iw_auth_cipher_pairwise;
900         int iw_auth_cipher_group;
901         int iw_auth_key_mgmt;
902         int iw_auth_80211_alg;
903         struct ndis_packet_pool *tx_packet_pool;
904         struct ndis_buffer_pool *tx_buffer_pool;
905         int multicast_size;
906         struct v4_checksum rx_csum;
907         struct v4_checksum tx_csum;
908         enum ndis_physical_medium physical_medium;
909         ULONG ndis_wolopts;
910         struct nt_slist wrap_timer_slist;
911         int drv_ndis_version;
912         struct ndis_pnp_capabilities pnp_capa;
913         char netdev_name[IFNAMSIZ];
914 };
915
916 BOOLEAN ndis_isr(struct kinterrupt *kinterrupt, void *ctx) wstdcall;
917
918 int ndis_init(void);
919 void ndis_exit(void);
920 int ndis_init_device(struct ndis_device *wnd);
921 void ndis_exit_device(struct ndis_device *wnd);
922
923 int wrap_procfs_add_ndis_device(struct ndis_device *wnd);
924 void wrap_procfs_remove_ndis_device(struct ndis_device *wnd);
925
926 void NdisAllocatePacketPoolEx(NDIS_STATUS *status,
927                               struct ndis_packet_pool **pool_handle,
928                               UINT num_descr, UINT overflowsize,
929                               UINT proto_rsvd_length) wstdcall;
930 void NdisFreePacketPool(struct ndis_packet_pool *pool) wstdcall;
931 void NdisAllocatePacket(NDIS_STATUS *status, struct ndis_packet **packet,
932                         struct ndis_packet_pool *pool) wstdcall;
933 void NdisFreePacket(struct ndis_packet *descr) wstdcall;
934 void NdisAllocateBufferPool(NDIS_STATUS *status,
935                             struct ndis_buffer_pool **pool_handle,
936                             UINT num_descr) wstdcall;
937 void NdisFreeBufferPool(struct ndis_buffer_pool *pool) wstdcall;
938 void NdisAllocateBuffer(NDIS_STATUS *status, ndis_buffer **buffer,
939                         struct ndis_buffer_pool *pool, void *virt,
940                         UINT length) wstdcall;
941 void NdisFreeBuffer(ndis_buffer *descr) wstdcall;
942 void NdisMIndicateReceivePacket(struct ndis_mp_block *nmb,
943                                 struct ndis_packet **packets,
944                                 UINT nr_packets) wstdcall;
945 void NdisMSendComplete(struct ndis_mp_block *nmb, struct ndis_packet *packet,
946                        NDIS_STATUS status) wstdcall;
947 void NdisMSendResourcesAvailable(struct ndis_mp_block *nmb) wstdcall;
948 void NdisMIndicateStatus(struct ndis_mp_block *nmb,
949                          NDIS_STATUS status, void *buf, UINT len) wstdcall;
950 void NdisMIndicateStatusComplete(struct ndis_mp_block *nmb) wstdcall;
951 void NdisMQueryInformationComplete(struct ndis_mp_block *nmb,
952                                    NDIS_STATUS status) wstdcall;
953 void NdisMSetInformationComplete(struct ndis_mp_block *nmb,
954                                  NDIS_STATUS status) wstdcall;
955 void NdisMResetComplete(struct ndis_mp_block *nmb, NDIS_STATUS status,
956                         BOOLEAN address_reset) wstdcall;
957 ULONG NDIS_BUFFER_TO_SPAN_PAGES(ndis_buffer *buffer) wstdcall;
958 BOOLEAN NdisWaitEvent(struct ndis_event *event, UINT timeout) wstdcall;
959 void NdisSetEvent(struct ndis_event *event) wstdcall;
960 void NdisMDeregisterInterrupt(struct ndis_mp_interrupt *mp_interrupt) wstdcall;
961 void EthRxIndicateHandler(struct ndis_mp_block *nmb, void *rx_ctx,
962                           char *header1, char *header, UINT header_size,
963                           void *look_ahead, UINT look_ahead_size,
964                           UINT packet_size) wstdcall;
965 void EthRxComplete(struct ndis_mp_block *nmb) wstdcall;
966 void NdisMTransferDataComplete(struct ndis_mp_block *nmb,
967                                struct ndis_packet *packet, NDIS_STATUS status,
968                                UINT bytes_txed) wstdcall;
969 void NdisWriteConfiguration(NDIS_STATUS *status, struct ndis_mp_block *nmb,
970                             struct unicode_string *key,
971                             struct ndis_configuration_parameter *param) wstdcall;
972 void NdisReadConfiguration(NDIS_STATUS *status,
973                            struct ndis_configuration_parameter **param,
974                            struct ndis_mp_block *nmb,
975                            struct unicode_string *key,
976                            enum ndis_parameter_type type) wstdcall;
977
978 /* Required OIDs */
979 #define OID_GEN_SUPPORTED_LIST                  0x00010101
980 #define OID_GEN_HARDWARE_STATUS                 0x00010102
981 #define OID_GEN_MEDIA_SUPPORTED                 0x00010103
982 #define OID_GEN_MEDIA_IN_USE                    0x00010104
983 #define OID_GEN_MAXIMUM_LOOKAHEAD               0x00010105
984 #define OID_GEN_MAXIMUM_FRAME_SIZE              0x00010106
985 #define OID_GEN_LINK_SPEED                      0x00010107
986 #define OID_GEN_TRANSMIT_BUFFER_SPACE           0x00010108
987 #define OID_GEN_RECEIVE_BUFFER_SPACE            0x00010109
988 #define OID_GEN_TRANSMIT_BLOCK_SIZE             0x0001010A
989 #define OID_GEN_RECEIVE_BLOCK_SIZE              0x0001010B
990 #define OID_GEN_VENDOR_ID                       0x0001010C
991 #define OID_GEN_VENDOR_DESCRIPTION              0x0001010D
992 #define OID_GEN_CURRENT_PACKET_FILTER           0x0001010E
993 #define OID_GEN_CURRENT_LOOKAHEAD               0x0001010F
994 #define OID_GEN_DRIVER_VERSION                  0x00010110
995 #define OID_GEN_MAXIMUM_TOTAL_SIZE              0x00010111
996 #define OID_GEN_PROTOCOL_OPTIONS                0x00010112
997 #define OID_GEN_MAC_OPTIONS                     0x00010113
998 #define OID_GEN_MEDIA_CONNECT_STATUS            0x00010114
999 #define OID_GEN_MAXIMUM_SEND_PACKETS            0x00010115
1000 #define OID_GEN_VENDOR_DRIVER_VERSION           0x00010116
1001 #define OID_GEN_SUPPORTED_GUIDS                 0x00010117
1002 #define OID_GEN_NETWORK_LAYER_ADDRESSES         0x00010118      /* Set only */
1003 #define OID_GEN_TRANSPORT_HEADER_OFFSET         0x00010119      /* Set only */
1004 #define OID_GEN_MACHINE_NAME                    0x0001021A
1005 #define OID_GEN_RNDIS_CONFIG_PARAMETER          0x0001021B      /* Set only */
1006 #define OID_GEN_VLAN_ID                         0x0001021C
1007
1008 /* Optional OIDs. */
1009 #define OID_GEN_MEDIA_CAPABILITIES              0x00010201
1010 #define OID_GEN_PHYSICAL_MEDIUM                 0x00010202
1011
1012 /* Required statistics OIDs. */
1013 #define OID_GEN_XMIT_OK                         0x00020101
1014 #define OID_GEN_RCV_OK                          0x00020102
1015 #define OID_GEN_XMIT_ERROR                      0x00020103
1016 #define OID_GEN_RCV_ERROR                       0x00020104
1017 #define OID_GEN_RCV_NO_BUFFER                   0x00020105
1018
1019 /* Optional OID statistics */
1020 #define OID_GEN_DIRECTED_BYTES_XMIT             0x00020201
1021 #define OID_GEN_DIRECTED_FRAMES_XMIT            0x00020202
1022 #define OID_GEN_MULTICAST_BYTES_XMIT            0x00020203
1023 #define OID_GEN_MULTICAST_FRAMES_XMIT           0x00020204
1024 #define OID_GEN_BROADCAST_BYTES_XMIT            0x00020205
1025 #define OID_GEN_BROADCAST_FRAMES_XMIT           0x00020206
1026 #define OID_GEN_DIRECTED_BYTES_RCV              0x00020207
1027 #define OID_GEN_DIRECTED_FRAMES_RCV             0x00020208
1028 #define OID_GEN_MULTICAST_BYTES_RCV             0x00020209
1029 #define OID_GEN_MULTICAST_FRAMES_RCV            0x0002020A
1030 #define OID_GEN_BROADCAST_BYTES_RCV             0x0002020B
1031 #define OID_GEN_BROADCAST_FRAMES_RCV            0x0002020C
1032 #define OID_GEN_RCV_CRC_ERROR                   0x0002020D
1033 #define OID_GEN_TRANSMIT_QUEUE_LENGTH           0x0002020E
1034 #define OID_GEN_GET_TIME_CAPS                   0x0002020F
1035 #define OID_GEN_GET_NETCARD_TIME                0x00020210
1036 #define OID_GEN_NETCARD_LOAD                    0x00020211
1037 #define OID_GEN_DEVICE_PROFILE                  0x00020212
1038
1039 /* 802.3 (ethernet) OIDs */
1040 #define OID_802_3_PERMANENT_ADDRESS             0x01010101
1041 #define OID_802_3_CURRENT_ADDRESS               0x01010102
1042 #define OID_802_3_MULTICAST_LIST                0x01010103
1043 #define OID_802_3_MAXIMUM_LIST_SIZE             0x01010104
1044 #define OID_802_3_MAC_OPTIONS                   0x01010105
1045 #define NDIS_802_3_MAC_OPTION_PRIORITY          0x00000001
1046 #define OID_802_3_RCV_ERROR_ALIGNMENT           0x01020101
1047 #define OID_802_3_XMIT_ONE_COLLISION            0x01020102
1048 #define OID_802_3_XMIT_MORE_COLLISIONS          0x01020103
1049 #define OID_802_3_XMIT_DEFERRED                 0x01020201
1050 #define OID_802_3_XMIT_MAX_COLLISIONS           0x01020202
1051 #define OID_802_3_RCV_OVERRUN                   0x01020203
1052 #define OID_802_3_XMIT_UNDERRUN                 0x01020204
1053 #define OID_802_3_XMIT_HEARTBEAT_FAILURE        0x01020205
1054 #define OID_802_3_XMIT_TIMES_CRS_LOST           0x01020206
1055 #define OID_802_3_XMIT_LATE_COLLISIONS          0x01020207
1056
1057 /* PnP and power management OIDs */
1058 #define OID_PNP_CAPABILITIES                    0xFD010100
1059 #define OID_PNP_SET_POWER                       0xFD010101
1060 #define OID_PNP_QUERY_POWER                     0xFD010102
1061 #define OID_PNP_ADD_WAKE_UP_PATTERN             0xFD010103
1062 #define OID_PNP_REMOVE_WAKE_UP_PATTERN          0xFD010104
1063 #define OID_PNP_WAKE_UP_PATTERN_LIST            0xFD010105
1064 #define OID_PNP_ENABLE_WAKE_UP                  0xFD010106
1065
1066 /* PnP/PM Statistics (Optional). */
1067 #define OID_PNP_WAKE_UP_OK                      0xFD020200
1068 #define OID_PNP_WAKE_UP_ERROR                   0xFD020201
1069
1070 /* The following bits are defined for OID_PNP_ENABLE_WAKE_UP */
1071 #define NDIS_PNP_WAKE_UP_MAGIC_PACKET           0x00000001
1072 #define NDIS_PNP_WAKE_UP_PATTERN_MATCH          0x00000002
1073 #define NDIS_PNP_WAKE_UP_LINK_CHANGE            0x00000004
1074
1075 /* 802.11 OIDs */
1076 #define OID_802_11_BSSID                        0x0D010101
1077 #define OID_802_11_SSID                         0x0D010102
1078 #define OID_802_11_NETWORK_TYPES_SUPPORTED      0x0D010203
1079 #define OID_802_11_NETWORK_TYPE_IN_USE          0x0D010204
1080 #define OID_802_11_TX_POWER_LEVEL               0x0D010205
1081 #define OID_802_11_RSSI                         0x0D010206
1082 #define OID_802_11_RSSI_TRIGGER                 0x0D010207
1083 #define OID_802_11_INFRASTRUCTURE_MODE          0x0D010108
1084 #define OID_802_11_FRAGMENTATION_THRESHOLD      0x0D010209
1085 #define OID_802_11_RTS_THRESHOLD                0x0D01020A
1086 #define OID_802_11_NUMBER_OF_ANTENNAS           0x0D01020B
1087 #define OID_802_11_RX_ANTENNA_SELECTED          0x0D01020C
1088 #define OID_802_11_TX_ANTENNA_SELECTED          0x0D01020D
1089 #define OID_802_11_SUPPORTED_RATES              0x0D01020E
1090 #define OID_802_11_DESIRED_RATES                0x0D010210
1091 #define OID_802_11_CONFIGURATION                0x0D010211
1092 #define OID_802_11_STATISTICS                   0x0D020212
1093 #define OID_802_11_ADD_WEP                      0x0D010113
1094 #define OID_802_11_REMOVE_WEP                   0x0D010114
1095 #define OID_802_11_DISASSOCIATE                 0x0D010115
1096 #define OID_802_11_POWER_MODE                   0x0D010216
1097 #define OID_802_11_BSSID_LIST                   0x0D010217
1098 #define OID_802_11_AUTHENTICATION_MODE          0x0D010118
1099 #define OID_802_11_PRIVACY_FILTER               0x0D010119
1100 #define OID_802_11_BSSID_LIST_SCAN              0x0D01011A
1101 #define OID_802_11_WEP_STATUS                   0x0D01011B
1102 #define OID_802_11_ENCRYPTION_STATUS            OID_802_11_WEP_STATUS
1103 #define OID_802_11_RELOAD_DEFAULTS              0x0D01011C
1104 #define OID_802_11_ADD_KEY                      0x0D01011D
1105 #define OID_802_11_REMOVE_KEY                   0x0D01011E
1106 #define OID_802_11_ASSOCIATION_INFORMATION      0x0D01011F
1107 #define OID_802_11_TEST                         0x0D010120
1108 #define OID_802_11_MEDIA_STREAM_MODE            0x0D010121
1109 #define OID_802_11_CAPABILITY                   0x0D010122
1110 #define OID_802_11_PMKID                        0x0D010123
1111
1112 #define NDIS_STATUS_SUCCESS             0
1113 #define NDIS_STATUS_PENDING             0x00000103
1114 #define NDIS_STATUS_NOT_RECOGNIZED      0x00010001
1115 #define NDIS_STATUS_NOT_COPIED          0x00010002
1116 #define NDIS_STATUS_NOT_ACCEPTED        0x00010003
1117 #define NDIS_STATUS_CALL_ACTIVE         0x00010007
1118 #define NDIS_STATUS_ONLINE              0x40010003
1119 #define NDIS_STATUS_RESET_START         0x40010004
1120 #define NDIS_STATUS_RESET_END           0x40010005
1121 #define NDIS_STATUS_RING_STATUS         0x40010006
1122 #define NDIS_STATUS_CLOSED              0x40010007
1123 #define NDIS_STATUS_WAN_LINE_UP         0x40010008
1124 #define NDIS_STATUS_WAN_LINE_DOWN       0x40010009
1125 #define NDIS_STATUS_WAN_FRAGMENT        0x4001000A
1126 #define NDIS_STATUS_MEDIA_CONNECT       0x4001000B
1127 #define NDIS_STATUS_MEDIA_DISCONNECT    0x4001000C
1128 #define NDIS_STATUS_HARDWARE_LINE_UP    0x4001000D
1129 #define NDIS_STATUS_HARDWARE_LINE_DOWN  0x4001000E
1130 #define NDIS_STATUS_INTERFACE_UP        0x4001000F
1131 #define NDIS_STATUS_INTERFACE_DOWN      0x40010010
1132 #define NDIS_STATUS_MEDIA_BUSY          0x40010011
1133 #define NDIS_STATUS_MEDIA_SPECIFIC_INDICATION   0x40010012
1134 #define NDIS_STATUS_WW_INDICATION NDIS_STATUS_MEDIA_SPECIFIC_INDICATION
1135 #define NDIS_STATUS_LINK_SPEED_CHANGE   0x40010013
1136 #define NDIS_STATUS_WAN_GET_STATS       0x40010014
1137 #define NDIS_STATUS_WAN_CO_FRAGMENT     0x40010015
1138 #define NDIS_STATUS_WAN_CO_LINKPARAMS   0x40010016
1139 #define NDIS_STATUS_NOT_RESETTABLE      0x80010001
1140 #define NDIS_STATUS_SOFT_ERRORS         0x80010003
1141 #define NDIS_STATUS_HARD_ERRORS         0x80010004
1142 #define NDIS_STATUS_BUFFER_OVERFLOW     0x80000005
1143 #define NDIS_STATUS_FAILURE             0xC0000001
1144 #define NDIS_STATUS_INVALID_PARAMETER 0xC000000D
1145 #define NDIS_STATUS_RESOURCES           0xC000009A
1146 #define NDIS_STATUS_CLOSING             0xC0010002
1147 #define NDIS_STATUS_BAD_VERSION         0xC0010004
1148 #define NDIS_STATUS_BAD_CHARACTERISTICS 0xC0010005
1149 #define NDIS_STATUS_ADAPTER_NOT_FOUND   0xC0010006
1150 #define NDIS_STATUS_OPEN_FAILED         0xC0010007
1151 #define NDIS_STATUS_DEVICE_FAILED       0xC0010008
1152 #define NDIS_STATUS_MULTICAST_FULL      0xC0010009
1153 #define NDIS_STATUS_MULTICAST_EXISTS    0xC001000A
1154 #define NDIS_STATUS_MULTICAST_NOT_FOUND 0xC001000B
1155 #define NDIS_STATUS_REQUEST_ABORTED     0xC001000C
1156 #define NDIS_STATUS_RESET_IN_PROGRESS   0xC001000D
1157 #define NDIS_STATUS_CLOSING_INDICATING  0xC001000E
1158 #define NDIS_STATUS_BAD_VERSION         0xC0010004
1159 #define NDIS_STATUS_NOT_SUPPORTED       0xC00000BB
1160 #define NDIS_STATUS_INVALID_PACKET      0xC001000F
1161 #define NDIS_STATUS_OPEN_LIST_FULL      0xC0010010
1162 #define NDIS_STATUS_ADAPTER_NOT_READY   0xC0010011
1163 #define NDIS_STATUS_ADAPTER_NOT_OPEN    0xC0010012
1164 #define NDIS_STATUS_NOT_INDICATING      0xC0010013
1165 #define NDIS_STATUS_INVALID_LENGTH      0xC0010014
1166 #define NDIS_STATUS_INVALID_DATA        0xC0010015
1167 #define NDIS_STATUS_BUFFER_TOO_SHORT    0xC0010016
1168 #define NDIS_STATUS_INVALID_OID         0xC0010017
1169 #define NDIS_STATUS_ADAPTER_REMOVED     0xC0010018
1170 #define NDIS_STATUS_UNSUPPORTED_MEDIA   0xC0010019
1171 #define NDIS_STATUS_GROUP_ADDRESS_IN_USE        0xC001001A
1172 #define NDIS_STATUS_FILE_NOT_FOUND      0xC001001B
1173 #define NDIS_STATUS_ERROR_READING_FILE  0xC001001C
1174 #define NDIS_STATUS_ALREADY_MAPPED      0xC001001D
1175 #define NDIS_STATUS_RESOURCE_CONFLICT   0xC001001E
1176 #define NDIS_STATUS_NO_CABLE            0xC001001F
1177 #define NDIS_STATUS_INVALID_SAP         0xC0010020
1178 #define NDIS_STATUS_SAP_IN_USE          0xC0010021
1179 #define NDIS_STATUS_INVALID_ADDRESS     0xC0010022
1180 #define NDIS_STATUS_VC_NOT_ACTIVATED    0xC0010023
1181 #define NDIS_STATUS_DEST_OUT_OF_ORDER   0xC0010024
1182 #define NDIS_STATUS_VC_NOT_AVAILABLE    0xC0010025
1183 #define NDIS_STATUS_CELLRATE_NOT_AVAILABLE      0xC0010026
1184 #define NDIS_STATUS_INCOMPATABLE_QOS    0xC0010027
1185 #define NDIS_STATUS_AAL_PARAMS_UNSUPPORTED      0xC0010028
1186 #define NDIS_STATUS_NO_ROUTE_TO_DESTINATION     0xC0010029
1187 #define NDIS_STATUS_TOKEN_RING_OPEN_ERROR       0xC0011000
1188 #define NDIS_STATUS_INVALID_DEVICE_REQUEST      0xC0000010
1189 #define NDIS_STATUS_NETWORK_UNREACHABLE         0xC000023C
1190
1191 /* Event codes */
1192
1193 #define EVENT_NDIS_RESOURCE_CONFLICT    0xC0001388
1194 #define EVENT_NDIS_OUT_OF_RESOURCE      0xC0001389
1195 #define EVENT_NDIS_HARDWARE_FAILURE     0xC000138A
1196 #define EVENT_NDIS_ADAPTER_NOT_FOUND    0xC000138B
1197 #define EVENT_NDIS_INTERRUPT_CONNECT    0xC000138C
1198 #define EVENT_NDIS_DRIVER_FAILURE       0xC000138D
1199 #define EVENT_NDIS_BAD_VERSION          0xC000138E
1200 #define EVENT_NDIS_TIMEOUT              0x8000138F
1201 #define EVENT_NDIS_NETWORK_ADDRESS      0xC0001390
1202 #define EVENT_NDIS_UNSUPPORTED_CONFIGURATION    0xC0001391
1203 #define EVENT_NDIS_INVALID_VALUE_FROM_ADAPTER   0xC0001392
1204 #define EVENT_NDIS_MISSING_CONFIGURATION_PARAMETER      0xC0001393
1205 #define EVENT_NDIS_BAD_IO_BASE_ADDRESS  0xC0001394
1206 #define EVENT_NDIS_RECEIVE_SPACE_SMALL  0x40001395
1207 #define EVENT_NDIS_ADAPTER_DISABLED     0x80001396
1208 #define EVENT_NDIS_IO_PORT_CONFLICT     0x80001397
1209 #define EVENT_NDIS_PORT_OR_DMA_CONFLICT 0x80001398
1210 #define EVENT_NDIS_MEMORY_CONFLICT      0x80001399
1211 #define EVENT_NDIS_INTERRUPT_CONFLICT   0x8000139A
1212 #define EVENT_NDIS_DMA_CONFLICT         0x8000139B
1213 #define EVENT_NDIS_INVALID_DOWNLOAD_FILE_ERROR  0xC000139C
1214 #define EVENT_NDIS_MAXRECEIVES_ERROR    0x8000139D
1215 #define EVENT_NDIS_MAXTRANSMITS_ERROR   0x8000139E
1216 #define EVENT_NDIS_MAXFRAMESIZE_ERROR   0x8000139F
1217 #define EVENT_NDIS_MAXINTERNALBUFS_ERROR        0x800013A0
1218 #define EVENT_NDIS_MAXMULTICAST_ERROR   0x800013A1
1219 #define EVENT_NDIS_PRODUCTID_ERROR      0x800013A2
1220 #define EVENT_NDIS_LOBE_FAILUE_ERROR    0x800013A3
1221 #define EVENT_NDIS_SIGNAL_LOSS_ERROR    0x800013A4
1222 #define EVENT_NDIS_REMOVE_RECEIVED_ERROR        0x800013A5
1223 #define EVENT_NDIS_TOKEN_RING_CORRECTION        0x400013A6
1224 #define EVENT_NDIS_ADAPTER_CHECK_ERROR  0xC00013A7
1225 #define EVENT_NDIS_RESET_FAILURE_ERROR  0x800013A8
1226 #define EVENT_NDIS_CABLE_DISCONNECTED_ERROR     0x800013A9
1227 #define EVENT_NDIS_RESET_FAILURE_CORRECTION     0x800013AA
1228
1229 /* packet filter bits used by NDIS_OID_PACKET_FILTER */
1230 #define NDIS_PACKET_TYPE_DIRECTED               0x00000001
1231 #define NDIS_PACKET_TYPE_MULTICAST              0x00000002
1232 #define NDIS_PACKET_TYPE_ALL_MULTICAST          0x00000004
1233 #define NDIS_PACKET_TYPE_BROADCAST              0x00000008
1234 #define NDIS_PACKET_TYPE_SOURCE_ROUTING         0x00000010
1235 #define NDIS_PACKET_TYPE_PROMISCUOUS            0x00000020
1236 #define NDIS_PACKET_TYPE_SMT                    0x00000040
1237 #define NDIS_PACKET_TYPE_ALL_LOCAL              0x00000080
1238 #define NDIS_PACKET_TYPE_GROUP                  0x00001000
1239 #define NDIS_PACKET_TYPE_ALL_FUNCTIONAL         0x00002000
1240 #define NDIS_PACKET_TYPE_FUNCTIONAL             0x00004000
1241 #define NDIS_PACKET_TYPE_MAC_FRAME              0x00008000
1242
1243 /* memory allocation flags */
1244 #define NDIS_MEMORY_CONTIGUOUS                  0x00000001
1245 #define NDIS_MEMORY_NONCACHED                   0x00000002
1246
1247 /* Atrribute flags to NdisMSetAtrributesEx */
1248 #define NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUT    0x00000001
1249 #define NDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT   0x00000002
1250 #define NDIS_ATTRIBUTE_IGNORE_TOKEN_RING_ERRORS 0x00000004
1251 #define NDIS_ATTRIBUTE_BUS_MASTER               0x00000008
1252 #define NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER      0x00000010
1253 #define NDIS_ATTRIBUTE_DESERIALIZE              0x00000020
1254 #define NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND       0x00000040
1255 #define NDIS_ATTRIBUTE_SURPRISE_REMOVE_OK       0x00000080
1256 #define NDIS_ATTRIBUTE_NOT_CO_NDIS              0x00000100
1257 #define NDIS_ATTRIBUTE_USES_SAFE_BUFFER_APIS    0x00000200
1258
1259 #define OID_TCP_TASK_OFFLOAD                    0xFC010201
1260
1261 #define NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA     0x00000001
1262 #define NDIS_MAC_OPTION_RECEIVE_SERIALIZED      0x00000002
1263 #define NDIS_MAC_OPTION_TRANSFERS_NOT_PEND      0x00000004
1264 #define NDIS_MAC_OPTION_NO_LOOPBACK             0x00000008
1265 #define NDIS_MAC_OPTION_FULL_DUPLEX             0x00000010
1266 #define NDIS_MAC_OPTION_EOTX_INDICATION         0x00000020
1267 #define NDIS_MAC_OPTION_8021P_PRIORITY          0x00000040
1268 #define NDIS_MAC_OPTION_SUPPORTS_MAC_ADDRESS_OVERWRITE  0x00000080
1269 #define NDIS_MAC_OPTION_RECEIVE_AT_DPC          0x00000100
1270 #define NDIS_MAC_OPTION_8021Q_VLAN              0x00000200
1271 #define NDIS_MAC_OPTION_RESERVED                0x80000000
1272
1273 #define deserialized_driver(wnd) (wnd->attributes & NDIS_ATTRIBUTE_DESERIALIZE)
1274
1275 static inline void serialize_lock(struct ndis_device *wnd)
1276 {
1277         nt_spin_lock(&wnd->nmb->lock);
1278 }
1279
1280 static inline void serialize_unlock(struct ndis_device *wnd)
1281 {
1282         nt_spin_unlock(&wnd->nmb->lock);
1283 }
1284
1285 static inline KIRQL serialize_lock_irql(struct ndis_device *wnd)
1286 {
1287         if (deserialized_driver(wnd))
1288                 return raise_irql(DISPATCH_LEVEL);
1289         else
1290                 return nt_spin_lock_irql(&wnd->nmb->lock, DISPATCH_LEVEL);
1291 }
1292
1293 static inline void serialize_unlock_irql(struct ndis_device *wnd,
1294                                          KIRQL irql)
1295 {
1296         if (deserialized_driver(wnd))
1297                 lower_irql(irql);
1298         else
1299                 nt_spin_unlock_irql(&wnd->nmb->lock, irql);
1300 }
1301
1302 static inline void if_serialize_lock(struct ndis_device *wnd)
1303 {
1304         if (!deserialized_driver(wnd))
1305                 nt_spin_lock(&wnd->nmb->lock);
1306 }
1307
1308 static inline void if_serialize_unlock(struct ndis_device *wnd)
1309 {
1310         if (!deserialized_driver(wnd))
1311                 nt_spin_unlock(&wnd->nmb->lock);
1312 }
1313
1314 #endif /* NDIS_H */