Introduction


Calling mac80211 from interrupts


Warning


Frame format


enum ieee80211_phymode

enum ieee80211_phymode {
MODE_IEEE80211A,
MODE_IEEE80211B,
MODE_IEEE80211G,
NUM_IEEE80211_MODES
};

Constants

MODE_IEEE80211A
5GHz as defined by 802.11a/802.11h
MODE_IEEE80211B
2.4 GHz as defined by 802.11b
MODE_IEEE80211G
2.4 GHz as defined by 802.11g (with OFDM), backwards compatible with 11b mode
NUM_IEEE80211_MODES
internal

Frame format


struct ieee80211_hw_mode - PHY mode definition

struct ieee80211_hw_mode {
    struct list_head list;
    struct ieee80211_channel * channels;
    struct ieee80211_rate * rates;
    enum ieee80211_phymode mode;
    int num_channels;
    int num_rates;
};

Members

list
internal
channels
pointer to array of supported channels
rates
pointer to array of supported bitrates
mode
the PHY mode for this definition
num_channels
number of supported channels
num_rates
number of supported bitrates

Description

This structure describes the capabilities supported by the device in a single PHY mode.


struct ieee80211_tx_queue_params - transmit queue configuration

struct ieee80211_tx_queue_params {
    int aifs;
    int cw_min;
    int cw_max;
    int burst_time;
};

Members

aifs
arbitration interface space [0..255, -1: use default]
cw_min
minimum contention window [will be a value of the form 2^n-1 in the range 1..1023; 0: use default]
cw_max
maximum contention window [like cw_min]
burst_time
maximum burst time in units of 0.1ms, 0 meaning disabled

Description

The information provided in this structure is required for QoS transmit queue configuration.


struct ieee80211_tx_queue_stats_data - transmit queue statistics

struct ieee80211_tx_queue_stats_data {
    unsigned int len;
    unsigned int limit;
    unsigned int count;
};

Members

len
number of packets in queue
limit
queue length limit
count
number of frames sent

Description


enum ieee80211_tx_queue

enum ieee80211_tx_queue {
IEEE80211_TX_QUEUE_DATA0,
IEEE80211_TX_QUEUE_DATA1,
IEEE80211_TX_QUEUE_DATA2,
IEEE80211_TX_QUEUE_DATA3,
IEEE80211_TX_QUEUE_DATA4,
IEEE80211_TX_QUEUE_SVP,
NUM_TX_DATA_QUEUES,
IEEE80211_TX_QUEUE_AFTER_BEACON,
IEEE80211_TX_QUEUE_BEACON
};

Constants

IEEE80211_TX_QUEUE_DATA0
data queue 0
IEEE80211_TX_QUEUE_DATA1
data queue 1
IEEE80211_TX_QUEUE_DATA2
data queue 2
IEEE80211_TX_QUEUE_DATA3
data queue 3
IEEE80211_TX_QUEUE_DATA4
data queue 4
IEEE80211_TX_QUEUE_SVP
??
NUM_TX_DATA_QUEUES
number of data queues
IEEE80211_TX_QUEUE_AFTER_BEACON
transmit queue for frames to be sent after a beacon
IEEE80211_TX_QUEUE_BEACON
transmit queue for beacon frames

Description

These constants are used with some callbacks that take a queue number to set parameters for a queue.


enum mac80211_rx_flags

enum mac80211_rx_flags {
RX_FLAG_MMIC_ERROR,
RX_FLAG_DECRYPTED,
RX_FLAG_RADIOTAP,
RX_FLAG_MMIC_STRIPPED,
RX_FLAG_IV_STRIPPED,
RX_FLAG_FAILED_FCS_CRC,
RX_FLAG_FAILED_PLCP_CRC
};

Constants

RX_FLAG_MMIC_ERROR
Michael MIC error was reported on this frame. Use together with RX_FLAG_MMIC_STRIPPED.
RX_FLAG_DECRYPTED
This frame was decrypted in hardware.
RX_FLAG_RADIOTAP
This frame starts with a radiotap header.
RX_FLAG_MMIC_STRIPPED
the Michael MIC is stripped off this frame, verification has been done by the hardware.
RX_FLAG_IV_STRIPPED
The IV/ICV are stripped from this frame. If this flag is set, the stack cannot do any replay detection hence the driver or hardware will have to do that.
RX_FLAG_FAILED_FCS_CRC
Set this flag if the FCS check failed on the frame.
RX_FLAG_FAILED_PLCP_CRC
Set this flag if the PCLP check failed on the frame.

Description

These flags are used with the flag member of struct ieee80211_rx_status.


struct ieee80211_rx_status - receive status

struct ieee80211_rx_status {
    u64 mactime;
    int freq;
    int channel;
    enum ieee80211_phymode phymode;
    int ssi;
    int signal;
    int noise;
    int antenna;
    int rate;
    int flag;
};

Members

mactime
MAC timestamp as defined by 802.11
freq
frequency the radio was tuned to when receiving this frame, in MHz
channel
channel the radio was tuned to
phymode
active PHY mode
ssi
signal strength when receiving this frame
signal
used as 'qual' in statistics reporting
noise
PHY noise when receiving this frame
antenna
antenna used
rate
data rate
flag
RX_FLAG_*

Description

The low-level driver should provide this information (the subset supported by hardware) to the 802.11 code with each received frame.


enum ieee80211_tx_status_flags

enum ieee80211_tx_status_flags {
IEEE80211_TX_STATUS_TX_FILTERED,
IEEE80211_TX_STATUS_ACK
};

Constants

IEEE80211_TX_STATUS_TX_FILTERED
The frame was not transmitted because the destination STA was in powersave mode.
IEEE80211_TX_STATUS_ACK
Frame was acknowledged

Description

Status flags to indicate various transmit conditions.


struct ieee80211_tx_status - transmit status

struct ieee80211_tx_status {
    struct ieee80211_tx_control control;
    u8 flags;
    bool excessive_retries;
    u8 retry_count;
    int ack_signal;
    int queue_length;
    int queue_number;
};

Members

control
a copy of the struct ieee80211_tx_control passed to the driver in the tx callback.
flags
transmit status flags, defined above
excessive_retries
set to 1 if the frame was retried many times but not acknowledged
retry_count
number of retries
ack_signal
signal strength of the ACK frame
queue_length
?? REMOVE
queue_number
?? REMOVE

Description

As much information as possible should be provided for each transmitted frame with ieee80211_tx_status.


enum ieee80211_conf_flags

enum ieee80211_conf_flags {
IEEE80211_CONF_SHORT_SLOT_TIME,
IEEE80211_CONF_RADIOTAP
};

Constants

IEEE80211_CONF_SHORT_SLOT_TIME
use 802.11g short slot time
IEEE80211_CONF_RADIOTAP
add radiotap header at receive time (if supported)

Description

Flags to define PHY configuration options


struct ieee80211_conf - configuration of the device

struct ieee80211_conf {
    int channel;
    int freq;
    int channel_val;
    enum ieee80211_phymode phymode;
    struct ieee80211_channel * chan;
    struct ieee80211_hw_mode * mode;
    unsigned int regulatory_domain;
    int radio_enabled;
    int beacon_int;
    u32 flags;
    u8 power_level;
    u8 antenna_max;
    u8 antenna_sel_tx;
    u8 antenna_sel_rx;
};

Members

channel
IEEE 802.11 channel number
freq
frequency in MHz
channel_val
hardware specific channel value for the channel
phymode
PHY mode to activate (REMOVE)
chan
channel to switch to, pointer to the channel information
mode
pointer to mode definition
regulatory_domain
??
radio_enabled
when zero, driver is required to switch off the radio. TODO make a flag
beacon_int
beacon interval (TODO make interface config)
flags
configuration flags defined above
power_level
transmit power limit for current regulatory domain in dBm
antenna_max
maximum antenna gain
antenna_sel_tx
transmit antenna selection, 0: default/diversity, 1/2: antenna 0/1
antenna_sel_rx
receive antenna selection, like antenna_sel_tx

Description

This struct indicates how the driver shall configure the hardware.


enum ieee80211_if_types

enum ieee80211_if_types {
IEEE80211_IF_TYPE_AP,
IEEE80211_IF_TYPE_MGMT,
IEEE80211_IF_TYPE_STA,
IEEE80211_IF_TYPE_IBSS,
IEEE80211_IF_TYPE_MNTR,
IEEE80211_IF_TYPE_WDS,
IEEE80211_IF_TYPE_VLAN
};

Constants

IEEE80211_IF_TYPE_AP
interface in AP mode.
IEEE80211_IF_TYPE_MGMT
special interface for communication with hostap daemon. Drivers should never see this type.
IEEE80211_IF_TYPE_STA
interface in STA (client) mode.
IEEE80211_IF_TYPE_IBSS
interface in IBSS (ad-hoc) mode.
IEEE80211_IF_TYPE_MNTR
interface in monitor (rfmon) mode.
IEEE80211_IF_TYPE_WDS
interface in WDS mode.
IEEE80211_IF_TYPE_VLAN
VLAN interface bound to an AP, drivers will never see this type.

Description


struct ieee80211_if_init_conf - initial configuration of an interface

struct ieee80211_if_init_conf {
    int if_id;
    enum ieee80211_if_types type;
    void * mac_addr;
};

Members

if_id
internal interface ID. This number has no particular meaning to drivers and the only allowed usage is to pass it to ieee80211_beacon_get and ieee80211_get_buffered_bc functions. This field is not valid for monitor interfaces (interfaces of IEEE80211_IF_TYPE_MNTR type).
type
one of enum ieee80211_if_types constants. Determines the type of added/removed interface.
mac_addr
pointer to MAC address of the interface. This pointer is valid until the interface is removed (i.e. it cannot be used after remove_interface callback was called for this interface).

Description

This structure is used in add_interface and remove_interface callbacks of struct ieee80211_hw.

When you allow multiple interfaces to be added to your PHY, take care that the hardware can actually handle multiple MAC addresses. However, also take care that when there's no interface left with mac_addr != NULL you remove the MAC address from the device to avoid acknowledging packets in pure monitor mode.

Description

This structure is used in add_interface and remove_interface callbacks of struct ieee80211_hw.

When you allow multiple interfaces to be added to your PHY, take care that the hardware can actually handle multiple MAC addresses. However, also take care that when there's no interface left with mac_addr != NULL you remove the MAC address from the device to avoid acknowledging packets in pure monitor mode.


struct ieee80211_if_conf - configuration of an interface

struct ieee80211_if_conf {
    int type;
    u8 * bssid;
    u8 * ssid;
    size_t ssid_len;
    u8 * generic_elem;
    size_t generic_elem_len;
    struct sk_buff * beacon;
    struct ieee80211_tx_control * beacon_control;
};

Members

type
type of the interface. This is always the same as was specified in struct ieee80211_if_init_conf. The type of an interface never changes during the life of the interface; this field is present only for convenience.
bssid
BSSID of the network we are associated to/creating.
ssid
used (together with ssid_len) by drivers for hardware that generate beacons independently. The pointer is valid only during the config_interface call, so copy the value somewhere if you need it.
ssid_len
length of the ssid field.
generic_elem
used (together with generic_elem_len) by drivers for hardware that generate beacons independently. The pointer is valid only during the config_interface call, so copy the value somewhere if you need it.
generic_elem_len
length of the generic element.
beacon
beacon template. Valid only if host_gen_beacon_template in struct ieee80211_hw is set. The driver is responsible of freeing the sk_buff.
beacon_control
tx_control for the beacon template, this field is only valid when the beacon field was set.

Description

This structure is passed to the config_interface callback of struct ieee80211_hw.

Description

This structure is passed to the config_interface callback of struct ieee80211_hw.

enum ieee80211_key_alg

enum ieee80211_key_alg {
ALG_NONE,
ALG_WEP,
ALG_TKIP,
ALG_CCMP
};

Constants

ALG_NONE
Unset key algorithm, will never be passed to the driver
ALG_WEP
WEP40 or WEP104
ALG_TKIP
TKIP
ALG_CCMP
CCMP (AES)

enum ieee80211_key_flags

enum ieee80211_key_flags {
IEEE80211_KEY_FLAG_WMM_STA,
IEEE80211_KEY_FLAG_GENERATE_IV,
IEEE80211_KEY_FLAG_GENERATE_MMIC
};

Constants

IEEE80211_KEY_FLAG_WMM_STA
Set by mac80211, this flag indicates that the STA this key will be used with could be using QoS.
IEEE80211_KEY_FLAG_GENERATE_IV
This flag should be set by the driver to indicate that it requires IV generation for this particular key.
IEEE80211_KEY_FLAG_GENERATE_MMIC
This flag should be set by the driver for a TKIP key if it requires Michael MIC generation in software.

Description

These flags are used for communication about keys between the driver and mac80211, with the flags parameter of struct ieee80211_key_conf.


struct ieee80211_key_conf - key information

struct ieee80211_key_conf {
    enum ieee80211_key_alg alg;
    u8 hw_key_idx;
    u8 flags;
    s8 keyidx;
    u8 keylen;
    u8 key[0];
};

Members

alg
The key algorithm.
hw_key_idx
To be set by the driver, this is the key index the driver wants to be given when a frame is transmitted and needs to be encrypted in hardware.
flags
key flags, see enum ieee80211_key_flags.
keyidx
the key index (0-3)
keylen
key material length
key[0]
key material

Description

This key information is given by mac80211 to the driver by the set_key callback in struct ieee80211_ops.


enum set_key_cmd

enum set_key_cmd {
SET_KEY,
DISABLE_KEY
};

Constants

SET_KEY
a key is set
DISABLE_KEY
a key must be disabled

Description

Used with the set_key callback in struct ieee80211_ops, this indicates whether a key is being removed or added.


enum ieee80211_hw_flags

enum ieee80211_hw_flags {
IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE,
IEEE80211_HW_RX_INCLUDES_FCS,
IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING,
IEEE80211_HW_MULTICAST_FILTER,
IEEE80211_HW_DEFAULT_REG_DOMAIN_CONFIGURED,
IEEE80211_HW_SUPPORT_HT_MODE
};

Constants

IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE
The device only needs to be supplied with a beacon template. If you need the host to generate each beacon then don't use this flag and call ieee80211_beacon_get when you need the next beacon frame. Note that if you set this flag, you must implement the set_tim callback for powersave mode to work properly. This flag is only relevant for access-point mode.
IEEE80211_HW_RX_INCLUDES_FCS
Indicates that received frames passed to the stack include the FCS at the end.
IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING
Some wireless LAN chipsets buffer broadcast/multicast frames for power saving stations in the hardware/firmware and others rely on the host system for such buffering. This option is used to configure the IEEE 802.11 upper layer to buffer broadcast and multicast frames when there are power saving stations so that the driver can fetch them with ieee80211_get_buffered_bc. Note that not setting this flag works properly only when the IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE is also not set because otherwise the stack will not know when the DTIM beacon was sent.
IEEE80211_HW_MULTICAST_FILTER
Device has multicast filters, i.e. it can filter based on the multicast address. If this flag is clear, then FIF_ALLMULTI will be enabled instead of passing multicast addresses when multicast addresses are added.
IEEE80211_HW_DEFAULT_REG_DOMAIN_CONFIGURED
Channels are already configured to the default regulatory domain specified in the device's EEPROM
IEEE80211_HW_SUPPORT_HT_MODE
The device capable of supporting 11n.

Description

These flags are used to indicate hardware capabilities to the stack. Generally, flags here should have their meaning done in a way that the simplest hardware doesn't need setting any particular flags. There are some exceptions to this rule, however, so you are advised to review these flags carefully.


struct ieee80211_hw - hardware information and state

struct ieee80211_hw {
    struct ieee80211_conf conf;
    struct wiphy * wiphy;
    struct workqueue_struct * workqueue;
    void * priv;
    u32 flags;
    unsigned int extra_tx_headroom;
    int channel_change_time;
    u8 queues;
    s8 max_rssi;
    s8 max_signal;
    s8 max_noise;
};

Members

conf
struct ieee80211_conf, device configuration, don't use.
wiphy
This points to the struct wiphy allocated for this 802.11 PHY. You must fill in the perm_addr and dev members of this structure using SET_IEEE80211_DEV and SET_IEEE80211_PERM_ADDR.
workqueue
single threaded workqueue available for driver use, allocated by mac80211 on registration and flushed on unregistration.
priv
pointer to private area that was allocated for driver use along with this structure.
flags
hardware flags, see enum ieee80211_hw_flags.
extra_tx_headroom
headroom to reserve in each transmit skb for use by the driver (e.g. for transmit headers.)
channel_change_time
time (in microseconds) it takes to change channels.
queues
number of available hardware transmit queues for data packets. WMM/QoS requires at least four.
max_rssi
Maximum value for ssi in RX information, use negative numbers for dBm and 0 to indicate no support.
max_signal
like max_rssi, but for the signal value.
max_noise
like max_rssi, but for the noise value.

Description

This structure contains the configuration and hardware information for an 802.11 PHY.


SET_IEEE80211_DEV - set device for 802.11 hardware

void SET_IEEE80211_DEV (struct ieee80211_hw * hw, struct device * dev)

Arguments

hw
the struct ieee80211_hw to set the device for
dev
the struct device of this 802.11 device

Description


SET_IEEE80211_PERM_ADDR - set the permanenet MAC address for 802.11 hardware

void SET_IEEE80211_PERM_ADDR (struct ieee80211_hw * hw, u8 * addr)

Arguments

hw
the struct ieee80211_hw to set the MAC address for
addr
the address to set

Description


Hardware crypto acceleration


Frame filtering


enum ieee80211_filter_flags

enum ieee80211_filter_flags {
FIF_PROMISC_IN_BSS,
FIF_ALLMULTI,
FIF_FCSFAIL,
FIF_PLCPFAIL,
FIF_BCN_PRBRESP_PROMISC,
FIF_CONTROL,
FIF_OTHER_BSS
};

Constants

FIF_PROMISC_IN_BSS
promiscuous mode within your BSS, think of the BSS as your network segment and then this corresponds to the regular ethernet device promiscuous mode.
FIF_ALLMULTI
pass all multicast frames, this is used if requested by the user or if the hardware is not capable of filtering by multicast address.
FIF_FCSFAIL
pass frames with failed FCS (but you need to set the RX_FLAG_FAILED_FCS_CRC for them)
FIF_PLCPFAIL
pass frames with failed PLCP CRC (but you need to set the RX_FLAG_FAILED_PLCP_CRC for them
FIF_BCN_PRBRESP_PROMISC
This flag is set during scanning to indicate to the hardware that it should not filter beacons or probe responses by BSSID. Filtering them can greatly reduce the amount of processing mac80211 needs to do and the amount of CPU wakeups, so you should honour this flag if possible.
FIF_CONTROL
pass control frames, if PROMISC_IN_BSS is not set then only those addressed to this station
FIF_OTHER_BSS
pass frames destined to other BSSes

Frame filtering

These flags determine what the filter in hardware should be programmed to let through and what should not be passed to the stack. It is always safe to pass more frames than requested, but this has negative impact on power consumption.


enum ieee80211_erp_change_flags

enum ieee80211_erp_change_flags {
IEEE80211_ERP_CHANGE_PROTECTION,
IEEE80211_ERP_CHANGE_PREAMBLE
};

Constants

IEEE80211_ERP_CHANGE_PROTECTION
protection changed
IEEE80211_ERP_CHANGE_PREAMBLE
barker preamble mode changed

Description

These flags are used with the erp_ie_changed callback in struct ieee80211_ops to indicate which parameter(s) changed.


struct ieee80211_ops - callbacks from mac80211 to the driver

struct ieee80211_ops {
    int (*tx) (struct ieee80211_hw *hw, struct sk_buff *skb,struct ieee80211_tx_control *control);
    int (*start) (struct ieee80211_hw *hw);
    void (*stop) (struct ieee80211_hw *hw);
    int (*add_interface) (struct ieee80211_hw *hw,struct ieee80211_if_init_conf *conf);
    void (*remove_interface) (struct ieee80211_hw *hw,struct ieee80211_if_init_conf *conf);
    int (*config) (struct ieee80211_hw *hw, struct ieee80211_conf *conf);
    int (*config_interface) (struct ieee80211_hw *hw,int if_id, struct ieee80211_if_conf *conf);
    void (*configure_filter) (struct ieee80211_hw *hw, int multi_count,unsigned int changed_flags,unsigned int *total_flags);
    int (*set_tim) (struct ieee80211_hw *hw, int aid, int set);
    int (*set_key) (struct ieee80211_hw *hw, enum set_key_cmd cmd,const u8 *local_address, const u8 *address,struct ieee80211_key_conf *key);
    int (*set_ieee8021x) (struct ieee80211_hw *hw, int use_ieee8021x);
    int (*set_port_auth) (struct ieee80211_hw *hw, u8 *addr,int authorized);
    int (*hw_scan) (struct ieee80211_hw *hw, u8 *ssid, size_t len);
    int (*get_stats) (struct ieee80211_hw *hw,struct ieee80211_low_level_stats *stats);
    int (*set_privacy_invoked) (struct ieee80211_hw *hw,int privacy_invoked);
    int (*get_sequence_counter) (struct ieee80211_hw *hw,u8* addr, u8 keyidx, u8 txrx,u32* iv32, u16* iv16);
    int (*set_rts_threshold) (struct ieee80211_hw *hw, u32 value);
    int (*set_frag_threshold) (struct ieee80211_hw *hw, u32 value);
    int (*set_retry_limit) (struct ieee80211_hw *hw,u32 short_retry, u32 long_retr);
    void (*sta_table_notification) (struct ieee80211_hw *hw,int num_sta);
    void (*erp_ie_changed) (struct ieee80211_hw *hw, u8 changes,int cts_protection, int preamble);
    int (*conf_tx) (struct ieee80211_hw *hw, int queue,const struct ieee80211_tx_queue_params *params);
    int (*get_tx_stats) (struct ieee80211_hw *hw,struct ieee80211_tx_queue_stats *stats);
    u64 (*get_tsf) (struct ieee80211_hw *hw);
    void (*reset_tsf) (struct ieee80211_hw *hw);
#ifdef CONFIG_MAC80211_HT
    int (*handle_ba_action) (struct ieee80211_hw *hw,struct ieee80211_mgmt *mgmt);
    int (*conf_ht) (struct ieee80211_hw *hw,struct ieee80211_ht_capability *ht_cap_param,struct ieee80211_ht_additional_info *ht_extra_param);
    void (*get_ht_capab) (struct ieee80211_hw *hw,struct ieee80211_ht_capability *ht_cap_param);
#endif
    int (*beacon_update) (struct ieee80211_hw *hw,struct sk_buff *skb,struct ieee80211_tx_control *control);
    int (*tx_last_beacon) (struct ieee80211_hw *hw);
};

Members

tx
Handler that 802.11 module calls for each transmitted frame. skb contains the buffer starting from the IEEE 802.11 header. The low-level driver should send the frame out based on configuration in the TX control data. Must be implemented and atomic.
start
Called before the first netdevice attached to the hardware is enabled. This should turn on the hardware and must turn on frame reception (for possibly enabled monitor interfaces.) Returns negative error codes, these may be seen in userspace, or zero. When the device is started it should not have a MAC address to avoid acknowledging frames before a non-monitor device is added. Must be implemented.
stop
Called after last netdevice attached to the hardware is disabled. This should turn off the hardware (at least it must turn off frame reception.) May be called right after add_interface if that rejects an interface. Must be implemented.
add_interface
Called when a netdevice attached to the hardware is enabled. Because it is not called for monitor mode devices, open and stop must be implemented. The driver should perform any initialization it needs before the device can be enabled. The initial configuration for the interface is given in the conf parameter. The callback may refuse to add an interface by returning a negative error code (which will be seen in userspace.) Must be implemented.
remove_interface
Notifies a driver that an interface is going down. The stop callback is called after this if it is the last interface and no monitor interfaces are present. When all interfaces are removed, the MAC address in the hardware must be cleared so the device no longer acknowledges packets, the mac_addr member of the conf structure is, however, set to the MAC address of the device going away. Hence, this callback must be implemented.
config
Handler for configuration requests. IEEE 802.11 code calls this function to change hardware configuration, e.g., channel.
config_interface
Handler for configuration requests related to interfaces (e.g. BSSID changes.)
configure_filter
Configure the device's RX filter. See the section "Frame filtering" for more information. This callback must be implemented and atomic (due to running under the tx lock.)
set_tim
Set TIM bit. If the hardware/firmware takes care of beacon generation (that is, IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE is set) mac80211 calls this function when a TIM bit must be set or cleared for a given AID. Must be atomic.
set_key
See the section "Hardware crypto acceleration" This callback can sleep, and is only called between add_interface and remove_interface calls, i.e. while the interface with the given local_address is enabled.
set_ieee8021x
Enable/disable IEEE 802.1X. This item requests wlan card to pass unencrypted EAPOL-Key frames even when encryption is configured. If the wlan card does not require such a configuration, this function pointer can be set to NULL.
set_port_auth
Set port authorization state (IEEE 802.1X PAE) to be authorized (authorized=1) or unauthorized (=0). This function can be used if the wlan hardware or low-level driver implements PAE. mac80211 will filter frames based on authorization state in any case, so this function pointer can be NULL if low-level driver does not require event notification about port state changes.
hw_scan
Ask the hardware to service the scan request, no need to start the scan state machine in stack.
get_stats
return low-level statistics
set_privacy_invoked
For devices that generate their own beacons and probe response or association responses this updates the state of privacy_invoked returns 0 for success or an error number.
get_sequence_counter
For devices that have internal sequence counters this callback allows mac80211 to access the current value of a counter. This callback seems not well-defined, tell us if you need it.
set_rts_threshold
Configuration of RTS threshold (if device needs it)
set_frag_threshold
Configuration of fragmentation threshold. Assign this if the device does fragmentation by itself; if this method is assigned then the stack will not do fragmentation.
set_retry_limit
Configuration of retry limits (if device needs it)
sta_table_notification
Number of STAs in STA table notification. Must be atomic.
erp_ie_changed
Handle ERP IE change notifications. Must be atomic.
conf_tx
Configure TX queue parameters (EDCF (aifs, cw_min, cw_max), bursting) for a hardware TX queue. The queue parameter uses the IEEE80211_TX_QUEUE_* constants. Must be atomic.
get_tx_stats
Get statistics of the current TX queue status. This is used to get number of currently queued packets (queue length), maximum queue size (limit), and total number of packets sent using each TX queue (count). This information is used for WMM to find out which TX queues have room for more packets and by hostapd to provide statistics about the current queueing state to external programs.
get_tsf
Get the current TSF timer value from firmware/hardware. Currently, this is only used for IBSS mode debugging and, as such, is not a required function. Must be atomic.
reset_tsf
Reset the TSF timer and allow firmware/hardware to synchronize with other STAs in the IBSS. This is only used in IBSS mode. This function is optional if the firmware/hardware takes full care of TSF synchronization.
handle_ba_action
Call low level driver with 11n Block Ack action
conf_ht
Configure HT parameters.
get_ht_capab
Get HT capabilities from the device
beacon_update
Setup beacon data for IBSS beacons. Unlike access point, IBSS uses a fixed beacon frame which is configured using this function. This handler is required only for IBSS mode.
tx_last_beacon
Determine whether the last IBSS beacon was sent by us. This is needed only for IBSS mode and the result of this function is used to determine whether to reply to Probe Requests.

Description

This structure contains various callbacks that the driver may handle or, in some cases, must handle, for example to configure the hardware to a new channel or to transmit a frame.


ieee80211_alloc_hw - Allocate a new hardware device

struct ieee80211_hw * ieee80211_alloc_hw (size_t priv_data_len, const struct ieee80211_ops * ops)

Arguments

priv_data_len
length of private data
ops
callbacks for this device

Description

This must be called once for each hardware device. The returned pointer must be used to refer to this device when calling other functions. mac80211 allocates a private data area for the driver pointed to by priv in struct ieee80211_hw, the size of this area is given as priv_data_len.


ieee80211_register_hw - Register hardware device

int ieee80211_register_hw (struct ieee80211_hw * hw)

Arguments

hw
the device to register as returned by ieee80211_alloc_hw

Description

You must call this function before any other functions except ieee80211_register_hwmode.


ieee80211_get_tx_led_name - get name of TX LED

char * ieee80211_get_tx_led_name (struct ieee80211_hw * hw)

Arguments

hw
the hardware to get the LED trigger name for

Description

mac80211 creates a transmit LED trigger for each wireless hardware that can be used to drive LEDs if your driver registers a LED device. This function returns the name (or NULL if not configured for LEDs) of the trigger so you can automatically link the LED device.


ieee80211_get_rx_led_name - get name of RX LED

char * ieee80211_get_rx_led_name (struct ieee80211_hw * hw)

Arguments

hw
the hardware to get the LED trigger name for

Description

mac80211 creates a receive LED trigger for each wireless hardware that can be used to drive LEDs if your driver registers a LED device. This function returns the name (or NULL if not configured for LEDs) of the trigger so you can automatically link the LED device.


ieee80211_unregister_hw - Unregister a hardware device

void ieee80211_unregister_hw (struct ieee80211_hw * hw)

Arguments

hw
the hardware to unregister

Description

This function instructs mac80211 to free allocated resources and unregister netdevices from the networking subsystem.


ieee80211_free_hw - free hardware descriptor

void ieee80211_free_hw (struct ieee80211_hw * hw)

Arguments

hw
the hardware to free

Description

This function frees everything that was allocated, including the private data for the driver. You must call ieee80211_unregister_hw before calling this function


ieee80211_rx - receive frame

void ieee80211_rx (struct ieee80211_hw * hw, struct sk_buff * skb, struct ieee80211_rx_status * status)

Arguments

hw
the hardware this frame came in on
skb
the buffer to receive, owned by mac80211 after this call
status
status of this frame; the status pointer need not be valid after this function returns

Description

Use this function to hand received frames to mac80211. The receive buffer in skb must start with an IEEE 802.11 header or a radiotap header if RX_FLAG_RADIOTAP is set in the status flags.

This function may not be called in IRQ context.


ieee80211_rx_irqsafe - receive frame

void ieee80211_rx_irqsafe (struct ieee80211_hw * hw, struct sk_buff * skb, struct ieee80211_rx_status * status)

Arguments

hw
the hardware this frame came in on
skb
the buffer to receive, owned by mac80211 after this call
status
status of this frame; the status pointer need not be valid after this function returns and is not freed by mac80211, it is recommended that it points to a stack area

Description

Like ieee80211_rx but can be called in IRQ context (internally defers to a workqueue.)


ieee80211_tx_status - transmit status callback

void ieee80211_tx_status (struct ieee80211_hw * hw, struct sk_buff * skb, struct ieee80211_tx_status * status)

Arguments

hw
the hardware the frame was transmitted by
skb
the frame that was transmitted, owned by mac80211 after this call
status
status information for this frame; the status pointer need not be valid after this function returns and is not freed by mac80211, it is recommended that it points to a stack area

Description

Call this function for all transmitted frames after they have been transmitted. It is permissible to not call this function for multicast frames but this can affect statistics.


ieee80211_beacon_get - beacon generation function

struct sk_buff * ieee80211_beacon_get (struct ieee80211_hw * hw, int if_id, struct ieee80211_tx_control * control)

Arguments

hw
pointer obtained from ieee80211_alloc_hw.
if_id
interface ID from struct ieee80211_if_init_conf.
control
will be filled with information needed to send this beacon.

Description

If the beacon frames are generated by the host system (i.e., not in hardware/firmware), the low-level driver uses this function to receive the next beacon frame from the 802.11 code. The low-level is responsible for calling this function before beacon data is needed (e.g., based on hardware interrupt). Returned skb is used only once and low-level driver is responsible of freeing it.

ieee80211_rts_get - RTS frame generation function

void ieee80211_rts_get (struct ieee80211_hw * hw, int if_id, const void * frame, size_t frame_len, const struct ieee80211_tx_control * frame_txctl, struct ieee80211_rts * rts)

Arguments

hw
pointer obtained from ieee80211_alloc_hw.
if_id
interface ID from struct ieee80211_if_init_conf.
frame
pointer to the frame that is going to be protected by the RTS.
frame_len
the frame length (in octets).
frame_txctl
struct ieee80211_tx_control of the frame.
rts
The buffer where to store the RTS frame.

Description

If the RTS frames are generated by the host system (i.e., not in hardware/firmware), the low-level driver uses this function to receive the next RTS frame from the 802.11 code. The low-level is responsible for calling this function before and RTS frame is needed.

ieee80211_rts_duration - Get the duration field for an RTS frame

__le16 ieee80211_rts_duration (struct ieee80211_hw * hw, int if_id, size_t frame_len, const struct ieee80211_tx_control * frame_txctl)

Arguments

hw
pointer obtained from ieee80211_alloc_hw.
if_id
interface ID from struct ieee80211_if_init_conf.
frame_len
the length of the frame that is going to be protected by the RTS.
frame_txctl
struct ieee80211_tx_control of the frame.

Description

If the RTS is generated in firmware, but the host system must provide the duration field, the low-level driver uses this function to receive the duration field value in little-endian byteorder.

ieee80211_ctstoself_get - CTS-to-self frame generation function

void ieee80211_ctstoself_get (struct ieee80211_hw * hw, int if_id, const void * frame, size_t frame_len, const struct ieee80211_tx_control * frame_txctl, struct ieee80211_cts * cts)

Arguments

hw
pointer obtained from ieee80211_alloc_hw.
if_id
interface ID from struct ieee80211_if_init_conf.
frame
pointer to the frame that is going to be protected by the CTS-to-self.
frame_len
the frame length (in octets).
frame_txctl
struct ieee80211_tx_control of the frame.
cts
The buffer where to store the CTS-to-self frame.

Description

If the CTS-to-self frames are generated by the host system (i.e., not in hardware/firmware), the low-level driver uses this function to receive the next CTS-to-self frame from the 802.11 code. The low-level is responsible for calling this function before and CTS-to-self frame is needed.

ieee80211_ctstoself_duration - Get the duration field for a CTS-to-self frame

__le16 ieee80211_ctstoself_duration (struct ieee80211_hw * hw, int if_id, size_t frame_len, const struct ieee80211_tx_control * frame_txctl)

Arguments

hw
pointer obtained from ieee80211_alloc_hw.
if_id
interface ID from struct ieee80211_if_init_conf.
frame_len
the length of the frame that is going to be protected by the CTS-to-self.
frame_txctl
struct ieee80211_tx_control of the frame.

Description

If the CTS-to-self is generated in firmware, but the host system must provide the duration field, the low-level driver uses this function to receive the duration field value in little-endian byteorder.

ieee80211_generic_frame_duration - Calculate the duration field for a frame

__le16 ieee80211_generic_frame_duration (struct ieee80211_hw * hw, int if_id, size_t frame_len, int rate)

Arguments

hw
pointer obtained from ieee80211_alloc_hw.
if_id
interface ID from struct ieee80211_if_init_conf.
frame_len
the length of the frame.
rate
the rate (in 100kbps) at which the frame is going to be transmitted.

Description

Calculate the duration field of some generic frame, given its length and transmission rate (in 100kbps).

ieee80211_get_buffered_bc - accessing buffered broadcast and multicast frames

struct sk_buff * ieee80211_get_buffered_bc (struct ieee80211_hw * hw, int if_id, struct ieee80211_tx_control * control)

Arguments

hw
pointer as obtained from ieee80211_alloc_hw.
if_id
interface ID from struct ieee80211_if_init_conf.
control
will be filled with information needed to send returned frame.

Description

Function for accessing buffered broadcast and multicast frames. If hardware/firmware does not implement buffering of broadcast/multicast frames when power saving is used, 802.11 code buffers them in the host memory. The low-level driver uses this function to fetch next buffered frame. In most cases, this is used when generating beacon frame. This function returns a pointer to the next buffered skb or NULL if no more buffered frames are available.

Note

buffered frames are returned only after DTIM beacon frame was generated with ieee80211_beacon_get and the low-level driver must thus call ieee80211_beacon_get first. ieee80211_get_buffered_bc returns NULL if the previous generated beacon was not DTIM, so the low-level driver does not need to check for DTIM beacons separately and should be able to use common code for all beacons.

ieee80211_get_hdrlen_from_skb - get header length from data

int ieee80211_get_hdrlen_from_skb (const struct sk_buff * skb)

Arguments

skb
the frame

Description

Given an skb with a raw 802.11 header at the data pointer this function returns the 802.11 header length in bytes (not including encryption headers). If the data in the sk_buff is too short to contain a valid 802.11 header the function returns 0.


ieee80211_get_hdrlen - get header length from frame control

int ieee80211_get_hdrlen (u16 fc)

Arguments

fc
the frame control field (in CPU endianness)

Description

This function returns the 802.11 header length in bytes (not including encryption headers.)


ieee80211_wake_queue - wake specific queue

void ieee80211_wake_queue (struct ieee80211_hw * hw, int queue)

Arguments

hw
pointer as obtained from ieee80211_alloc_hw.
queue
queue number (counted from zero).

Description

Drivers should use this function instead of netif_wake_queue.

ieee80211_stop_queue - stop specific queue

void ieee80211_stop_queue (struct ieee80211_hw * hw, int queue)

Arguments

hw
pointer as obtained from ieee80211_alloc_hw.
queue
queue number (counted from zero).

Description

Drivers should use this function instead of netif_stop_queue.

ieee80211_start_queues - start all queues

void ieee80211_start_queues (struct ieee80211_hw * hw)

Arguments

hw
pointer to as obtained from ieee80211_alloc_hw.

Description

Drivers should use this function instead of netif_start_queue.

ieee80211_stop_queues - stop all queues

void ieee80211_stop_queues (struct ieee80211_hw * hw)

Arguments

hw
pointer as obtained from ieee80211_alloc_hw.

Description

Drivers should use this function instead of netif_stop_queue.

ieee80211_wake_queues - wake all queues

void ieee80211_wake_queues (struct ieee80211_hw * hw)

Arguments

hw
pointer as obtained from ieee80211_alloc_hw.

Description

Drivers should use this function instead of netif_wake_queue.

ieee80211_get_mc_list_item - iteration over items in multicast list

struct dev_mc_list * ieee80211_get_mc_list_item (struct ieee80211_hw * hw, struct dev_mc_list * prev, void ** ptr)

Arguments

hw
pointer as obtained from ieee80211_alloc_hw.
prev
value returned by previous call to ieee80211_get_mc_list_item or NULL to start a new iteration.
ptr
pointer to buffer of void * type for internal usage of ieee80211_get_mc_list_item.

Description

Iterates over items in multicast list of given device. To get the first item, pass NULL in prev and in *ptr. In subsequent calls, pass the value returned by previous call in prev. Don't alter *ptr during iteration. When there are no more items, NULL is returned.

ieee80211_scan_completed - completed hardware scan

void ieee80211_scan_completed (struct ieee80211_hw * hw)

Arguments

hw
the hardware that finished the scan

Description

When hardware scan offload is used (i.e. the hw_scan callback is assigned) this function needs to be called by the driver to notify mac80211 that the scan finished.