2 * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani
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.
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.
19 #include "ntoskernel.h"
21 //#define ALLOW_POOL_OVERFLOW 1
23 #define NDIS_DMA_24BITS 0
24 #define NDIS_DMA_32BITS 1
25 #define NDIS_DMA_64BITS 2
28 #define MAXIMUM_PROCESSORS 64
30 #define MAXIMUM_PROCESSORS 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;
47 typedef UCHAR ndis_pmkid_vavlue[16];
49 typedef uint64_t NDIS_PHY_ADDRESS;
51 struct ndis_sg_element {
52 PHYSICAL_ADDRESS address;
60 struct ndis_sg_element elements[];
63 /* when sending packets, ndiswrapper associates exactly one sg element
65 struct wrap_tx_sg_list {
68 struct ndis_sg_element elements[1];
71 struct ndis_phy_addr_unit {
72 NDIS_PHY_ADDRESS phy_addr;
76 typedef struct mdl ndis_buffer;
78 struct ndis_buffer_pool {
79 ndis_buffer *free_descr;
83 UINT num_allocated_descr;
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
93 #define fPACKET_WRAPPER_RESERVED 0x3F
94 #define fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO 0x40
95 #define fPACKET_ALLOCATED_BY_NDIS 0x80
97 #define PROTOCOL_RESERVED_SIZE_IN_PACKET (4 * sizeof(void *))
99 struct transport_header_offset {
100 USHORT protocol_type;
101 USHORT header_offset;
104 struct ndis_network_address {
110 struct ndis_network_address_list {
113 struct ndis_network_address address[1];
116 struct ndis_tcp_ip_checksum_packet_info {
129 ULONG tcp_succeeded:1;
130 ULONG udp_succeeded:1;
131 ULONG ip_succeeded:1;
139 TcpIpChecksumNdisTask, IpSecNdisTask, TcpLargeSendNdisTask, MaxNdisTask
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
148 #define NDIS_TASK_OFFLOAD_VERSION 1
150 struct ndis_encapsulation_format {
151 enum ndis_encapsulation encap;
153 ULONG fixed_header_size:1;
159 struct ndis_task_offload_header {
163 ULONG offset_first_task;
164 struct ndis_encapsulation_format encap_format;
167 struct ndis_task_offload {
171 ULONG offset_next_task;
172 ULONG task_buf_length;
190 ULONG ip_supported:1;
191 ULONG tcp_supported:1;
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;
203 struct ndis_task_tcp_large_send {
213 struct ndis_packet_pool {
214 struct ndis_packet *free_descr;
215 // NT_SPIN_LOCK lock;
218 UINT num_allocated_descr;
220 UINT proto_rsvd_length;
223 struct ndis_packet_stack {
224 ULONG_PTR IM_reserved[2];
225 ULONG_PTR ndis_reserved[4];
228 enum ndis_per_packet_info {
229 TcpIpChecksumPacketInfo, IpSecPacketInfo, TcpLargeSendPacketInfo,
230 ClassificationHandlePacketInfo, NdisReserved,
231 ScatterGatherListPacketInfo, Ieee8021QInfo, OriginalPacketInfo,
232 PacketCancelId, MaxPerPacketInfo
235 struct ndis_packet_extension {
236 void *info[MaxPerPacketInfo];
239 struct ndis_packet_private {
242 ndis_buffer *buffer_head;
243 ndis_buffer *buffer_tail;
244 struct ndis_packet_pool *pool;
247 BOOLEAN valid_counts;
253 struct ndis_packet_private private;
254 /* for use by miniport */
256 /* for connectionless mininports */
258 UCHAR miniport_reserved[2 * sizeof(void *)];
259 UCHAR wrapper_reserved[2 * sizeof(void *)];
261 /* for deserialized miniports */
263 UCHAR miniport_reserved_ex[3 * sizeof(void *)];
264 UCHAR wrapper_reserved_ex[sizeof(void *)];
265 } deserailized_reserved;
267 UCHAR mac_reserved[4 * sizeof(void *)];
270 ULONG_PTR reserved[2];
271 UCHAR protocol_reserved[1];
275 struct ndis_packet_oob_data {
277 ULONGLONG time_to_tx;
286 /* ndiswrapper specific info; extension should be right after
288 struct ndis_packet_extension ext;
290 /* used for tx only */
292 struct sk_buff *tx_skb;
294 struct wrap_tx_sg_list wrap_tx_sg_list;
295 struct ndis_sg_list *tx_sg_list;
298 /* used for rx only */
300 unsigned char header[ETH_HLEN];
301 unsigned char *look_ahead;
302 UINT look_ahead_size;
307 #define NDIS_PACKET_OOB_DATA(packet) \
308 (struct ndis_packet_oob_data *)(((void *)(packet)) + \
309 (packet)->private.oob_offset)
311 enum ndis_device_pnp_event {
312 NdisDevicePnPEventQueryRemoved, NdisDevicePnPEventRemoved,
313 NdisDevicePnPEventSurpriseRemoved, NdisDevicePnPEventQueryStopped,
314 NdisDevicePnPEventStopped, NdisDevicePnPEventPowerProfileChanged,
315 NdisDevicePnPEventMaximum
318 enum ndis_request_type {
319 NdisRequestQueryInformation, NdisRequestSetInformation,
320 NdisRequestQueryStatistics, NdisRequestOpen, NdisRequestClose,
321 NdisRequestSend, NdisRequestTransferData, NdisRequestReset,
322 NdisRequestGeneric1, NdisRequestGeneric2, NdisRequestGeneric3,
326 struct ndis_request {
328 enum ndis_request_type request_type;
348 NdisMedium802_3, NdisMedium802_5, NdisMediumFddi, NdisMediumWan,
349 NdisMediumLocalTalk, NdisMediumDix, NdisMediumArcnetRaw,
350 NdisMediumArcnet878_2, NdisMediumAtm, NdisMediumWirelessWan,
351 NdisMediumIrda, NdisMediumBpc, NdisMediumCoWan,
352 NdisMedium1394, NdisMediumMax
355 enum ndis_physical_medium {
356 NdisPhysicalMediumUnspecified, NdisPhysicalMediumWirelessLan,
357 NdisPhysicalMediumCableModem, NdisPhysicalMediumPhoneLine,
358 NdisPhysicalMediumPowerLine, NdisPhysicalMediumDSL,
359 NdisPhysicalMediumFibreChannel, NdisPhysicalMedium1394,
360 NdisPhysicalMediumWirelessWan, NdisPhysicalMediumMax
363 enum ndis_power_state {
364 NdisDeviceStateUnspecified = 0,
365 NdisDeviceStateD0, NdisDeviceStateD1, NdisDeviceStateD2,
366 NdisDeviceStateD3, NdisDeviceStateMaximum
369 enum ndis_power_profile {
370 NdisPowerProfileBattery, NdisPowerProfileAcOnLine
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;
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
383 enum net_pnp_event_code {
384 NetEventSetPower, NetEventQueryPower, NetEventQueryRemoveDevice,
385 NetEventCancelRemoveDevice, NetEventReconfigure, NetEventBindList,
386 NetEventBindsComplete, NetEventPnPCapabilities, NetEventMaximum
389 struct net_pnp_event {
390 enum net_pnp_event_code code;
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];
399 struct ndis_pnp_capabilities {
401 struct ndis_pm_wakeup_capabilities wakeup;
404 typedef void (*ndis_isr_handler)(BOOLEAN *recognized, BOOLEAN *queue_handler,
405 void *handle) wstdcall;
406 typedef void (*ndis_interrupt_handler)(void *ctx) wstdcall;
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;
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;
463 struct ndis_spinlock {
468 union ndis_rw_lock_refcount {
469 UCHAR cache_line[16];
472 struct ndis_rw_lock {
481 union ndis_rw_lock_refcount ref_count[MAXIMUM_PROCESSORS];
482 /* ndiswrapper specific */
492 struct ndis_work_item;
493 typedef void (*NDIS_PROC)(struct ndis_work_item *, void *) wstdcall;
495 struct ndis_work_item {
499 UCHAR reserved[8 * sizeof(void *)];
500 /* ndiswrapper specific */
505 struct alloc_shared_mem {
511 struct ndis_mp_block;
513 /* this is opaque to drivers, so we can use it as we please */
514 struct ndis_mp_interrupt {
515 struct kinterrupt *kinterrupt;
521 ndis_isr_handler isr;
522 ndis_interrupt_handler mp_dpc;
523 struct kdpc intr_dpc;
524 struct ndis_mp_block *nmb;
527 struct nt_event dpc_completed_event;
532 struct ndis_binary_data {
537 enum ndis_parameter_type {
538 NdisParameterInteger, NdisParameterHexInteger,
539 NdisParameterString, NdisParameterMultiString, NdisParameterBinary,
542 typedef struct unicode_string NDIS_STRING;
544 struct ndis_configuration_parameter {
545 enum ndis_parameter_type type;
556 /* IDs used to store extensions in driver_object's custom extension */
557 #define NDIS_DRIVER_CLIENT_ID 10
559 struct ndis_wireless_stats {
561 LARGE_INTEGER tx_frag;
562 LARGE_INTEGER tx_multi_frag;
563 LARGE_INTEGER failed;
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;
587 enum ndis_status_type {
588 Ndis802_11StatusType_Authentication,
589 Ndis802_11StatusType_MediaStreamMode,
590 Ndis802_11StatusType_PMKID_CandidateList,
591 Ndis802_11StatusType_RadioState,
594 struct ndis_status_indication {
595 enum ndis_status_type status_type;
598 enum ndis_radio_status {
599 Ndis802_11RadioStatusOn, Ndis802_11RadioStatusHardwareOff,
600 Ndis802_11RadioStatusSoftwareOff,
603 struct ndis_radio_status_indication
605 enum ndis_status_type status_type;
606 enum ndis_radio_status radio_state;
609 enum ndis_media_state {
610 NdisMediaStateConnected,
611 NdisMediaStateDisconnected,
614 enum ndis_media_stream_mode {
615 Ndis802_11MediaStreamOff, Ndis802_11MediaStreamOn
619 LINK_STATUS_OFF, LINK_STATUS_ON, SET_MULTICAST_LIST, COLLECT_IW_STATS,
620 HANGCHECK, NETIF_WAKEQ,
626 UCHAR key[NDIS_ENCODING_TOKEN_MAX];
627 } keys[MAX_ENCR_KEYS];
628 unsigned short tx_key_index;
633 UCHAR essid[NDIS_ESSID_MAX_SIZE];
636 enum ndis_infrastructure_mode {
637 Ndis802_11IBSS, Ndis802_11Infrastructure, Ndis802_11AutoUnknown,
638 Ndis802_11InfrastructureMax
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
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
662 struct ndis_auth_encr_pair {
663 enum authentication_mode auth_mode;
664 enum encryption_status encr_mode;
667 struct ndis_capability {
671 ULONG num_auth_encr_pair;
672 struct ndis_auth_encr_pair auth_encr_pair[1];
686 struct nt_timer nt_timer;
690 struct ndis_mp_timer {
691 struct nt_timer nt_timer;
695 struct ndis_mp_block *nmb;
696 struct ndis_mp_timer *next;
699 typedef struct cm_partial_resource_list NDIS_RESOURCE_LIST;
702 struct nt_event nt_event;
705 struct ndis_bind_paths {
707 struct unicode_string paths[1];
710 struct ndis_reference {
716 struct ndis_filterdbs {
726 enum ndis_interface_type {
727 NdisInterfaceInternal, NdisInterfaceIsa, NdisInterfaceEisa,
728 NdisInterfaceMca, NdisInterfaceTurboChannel, NdisInterfacePci,
732 struct auth_encr_capa {
737 struct ndis_pmkid_candidate {
742 struct ndis_pmkid_candidate_list {
744 ULONG num_candidates;
745 struct ndis_pmkid_candidate candidates[1];
749 * This struct contains function pointers that the drivers references
750 * directly via macros, so it's important that they are at the correct
753 struct ndis_mp_block {
755 struct ndis_mp_block *next;
756 struct driver_object *drv_obj;
758 struct unicode_string name;
759 struct ndis_bind_paths *bindpaths;
761 struct ndis_reference reference;
768 enum ndis_request_type *mediarequest;
769 struct ndis_mp_interrupt *interrupt;
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;
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;
790 struct ndis_filterdbs filterdbs;
793 void *send_resource_avail;
794 void *reset_complete;
796 enum ndis_medium media_type;
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;
804 void *call_mgraflist;
807 USHORT setinfo_buf_len;
808 USHORT max_send_pkts;
809 NDIS_STATUS fake_status;
811 struct unicode_string *adapter_instance_name;
816 UINT max_short_addrs;
820 ndis_interrupt_handler irq_bh;
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;
833 void *status_complete;
836 void *queryinfo_complete;
837 void *setinfo_complete;
838 void *wan_tx_complete;
840 void *wan_rx_complete;
841 /* ndiswrapper specific */
842 struct ndis_device *wnd;
846 struct ndis_mp_block *nmb;
847 struct wrap_device *wd;
848 struct net_device *net_dev;
850 struct ndis_mp_interrupt *mp_interrupt;
851 struct kdpc irq_kdpc;
852 unsigned long mem_start;
853 unsigned long mem_end;
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;
860 work_struct_t tx_work;
861 struct ndis_packet *tx_ring[TX_RING_SIZE];
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;
872 NDIS_STATUS ndis_req_status;
877 dma_addr_t *dma_map_addr;
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;
891 struct ndis_pmkid *pmkids;
893 struct proc_dir_entry *procfs_iface;
895 work_struct_t ndis_work;
896 unsigned long ndis_pending_work;
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;
906 struct v4_checksum rx_csum;
907 struct v4_checksum tx_csum;
908 enum ndis_physical_medium physical_medium;
910 struct nt_slist wrap_timer_slist;
911 int drv_ndis_version;
912 struct ndis_pnp_capabilities pnp_capa;
913 char netdev_name[IFNAMSIZ];
916 BOOLEAN ndis_isr(struct kinterrupt *kinterrupt, void *ctx) wstdcall;
919 void ndis_exit(void);
920 int ndis_init_device(struct ndis_device *wnd);
921 void ndis_exit_device(struct ndis_device *wnd);
923 int wrap_procfs_add_ndis_device(struct ndis_device *wnd);
924 void wrap_procfs_remove_ndis_device(struct ndis_device *wnd);
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;
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
1008 /* Optional OIDs. */
1009 #define OID_GEN_MEDIA_CAPABILITIES 0x00010201
1010 #define OID_GEN_PHYSICAL_MEDIUM 0x00010202
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
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
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
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
1066 /* PnP/PM Statistics (Optional). */
1067 #define OID_PNP_WAKE_UP_OK 0xFD020200
1068 #define OID_PNP_WAKE_UP_ERROR 0xFD020201
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
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
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
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
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
1243 /* memory allocation flags */
1244 #define NDIS_MEMORY_CONTIGUOUS 0x00000001
1245 #define NDIS_MEMORY_NONCACHED 0x00000002
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
1259 #define OID_TCP_TASK_OFFLOAD 0xFC010201
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
1273 #define deserialized_driver(wnd) (wnd->attributes & NDIS_ATTRIBUTE_DESERIALIZE)
1275 static inline void serialize_lock(struct ndis_device *wnd)
1277 nt_spin_lock(&wnd->nmb->lock);
1280 static inline void serialize_unlock(struct ndis_device *wnd)
1282 nt_spin_unlock(&wnd->nmb->lock);
1285 static inline KIRQL serialize_lock_irql(struct ndis_device *wnd)
1287 if (deserialized_driver(wnd))
1288 return raise_irql(DISPATCH_LEVEL);
1290 return nt_spin_lock_irql(&wnd->nmb->lock, DISPATCH_LEVEL);
1293 static inline void serialize_unlock_irql(struct ndis_device *wnd,
1296 if (deserialized_driver(wnd))
1299 nt_spin_unlock_irql(&wnd->nmb->lock, irql);
1302 static inline void if_serialize_lock(struct ndis_device *wnd)
1304 if (!deserialized_driver(wnd))
1305 nt_spin_lock(&wnd->nmb->lock);
1308 static inline void if_serialize_unlock(struct ndis_device *wnd)
1310 if (!deserialized_driver(wnd))
1311 nt_spin_unlock(&wnd->nmb->lock);