The 802.11 subsystems – for kernel developers Explaining wireless 802.11 networking in the Linux kernel 2007-2009 Johannes Berg Johannes Berg
johannes@sipsolutions.net
This documentation is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. This documentation is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this documentation; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA For more details see the file COPYING in the source distribution of Linux. These books attempt to give a description of the various subsystems that play a role in 802.11 wireless networking in Linux. Since these books are for kernel developers they attempts to document the structures and functions used in the kernel as well as giving a higher-level overview. The reader is expected to be familiar with the 802.11 standard as published by the IEEE in 802.11-2007 (or possibly later versions). References to this standard will be given as "802.11-2007 8.1.5".
The cfg80211 subsystem cfg80211 is the configuration API for 802.11 devices in Linux. It bridges userspace and drivers, and offers some utility functionality associated with 802.11. cfg80211 must, directly or indirectly via mac80211, be used by all modern wireless drivers in Linux, so that they offer a consistent API through nl80211. For backward compatibility, cfg80211 also offers wireless extensions to userspace, but hides them from drivers completely. Additionally, cfg80211 contains code to help enforce regulatory spectrum use restrictions. Device registration In order for a driver to use cfg80211, it must register the hardware device with cfg80211. This happens through a number of hardware capability structs described below. The fundamental structure for each device is the 'wiphy', of which each instance describes a physical wireless device connected to the system. Each such wiphy can have zero, one, or many virtual interfaces associated with it, which need to be identified as such by pointing the network interface's ieee80211_ptr pointer to a struct wireless_dev which further describes the wireless part of the interface, normally this struct is embedded in the network interface's private data area. Drivers can optionally allow creating or destroying virtual interfaces on the fly, but without at least one or the ability to create some the wireless device isn't useful. Each wiphy structure contains device capability information, and also has a pointer to the various operations the driver offers. The definitions and structures here describe these capabilities in detail. LINUX Kernel Hackers Manual July 2017 enum ieee80211_band 9 4.1.27 enum ieee80211_band supported frequency bands Synopsis enum ieee80211_band { IEEE80211_BAND_2GHZ, IEEE80211_BAND_5GHZ, IEEE80211_BAND_60GHZ, IEEE80211_NUM_BANDS }; Constants IEEE80211_BAND_2GHZ 2.4GHz ISM band IEEE80211_BAND_5GHZ around 5GHz band (4.9-5.7) IEEE80211_BAND_60GHZ around 60 GHz band (58.32 - 64.80 GHz) IEEE80211_NUM_BANDS number of defined bands Device registration The bands are assigned this way because the supported bitrates differ in these bands. LINUX Kernel Hackers Manual July 2017 enum ieee80211_channel_flags 9 4.1.27 enum ieee80211_channel_flags channel flags Synopsis enum ieee80211_channel_flags { IEEE80211_CHAN_DISABLED, IEEE80211_CHAN_NO_IR, IEEE80211_CHAN_RADAR, IEEE80211_CHAN_NO_HT40PLUS, IEEE80211_CHAN_NO_HT40MINUS, IEEE80211_CHAN_NO_OFDM, IEEE80211_CHAN_NO_80MHZ, IEEE80211_CHAN_NO_160MHZ, IEEE80211_CHAN_INDOOR_ONLY, IEEE80211_CHAN_GO_CONCURRENT, IEEE80211_CHAN_NO_20MHZ, IEEE80211_CHAN_NO_10MHZ }; Constants IEEE80211_CHAN_DISABLED This channel is disabled. IEEE80211_CHAN_NO_IR do not initiate radiation, this includes sending probe requests or beaconing. IEEE80211_CHAN_RADAR Radar detection is required on this channel. IEEE80211_CHAN_NO_HT40PLUS extension channel above this channel is not permitted. IEEE80211_CHAN_NO_HT40MINUS extension channel below this channel is not permitted. IEEE80211_CHAN_NO_OFDM OFDM is not allowed on this channel. IEEE80211_CHAN_NO_80MHZ If the driver supports 80 MHz on the band, this flag indicates that an 80 MHz channel cannot use this channel as the control or any of the secondary channels. This may be due to the driver or due to regulatory bandwidth restrictions. IEEE80211_CHAN_NO_160MHZ If the driver supports 160 MHz on the band, this flag indicates that an 160 MHz channel cannot use this channel as the control or any of the secondary channels. This may be due to the driver or due to regulatory bandwidth restrictions. IEEE80211_CHAN_INDOOR_ONLY see NL80211_FREQUENCY_ATTR_INDOOR_ONLY IEEE80211_CHAN_GO_CONCURRENT see NL80211_FREQUENCY_ATTR_GO_CONCURRENT IEEE80211_CHAN_NO_20MHZ 20 MHz bandwidth is not permitted on this channel. IEEE80211_CHAN_NO_10MHZ 10 MHz bandwidth is not permitted on this channel. Description Channel flags set by the regulatory control code. LINUX Kernel Hackers Manual July 2017 struct ieee80211_channel 9 4.1.27 struct ieee80211_channel channel definition Synopsis struct ieee80211_channel { enum ieee80211_band band; u16 center_freq; u16 hw_value; u32 flags; int max_antenna_gain; int max_power; int max_reg_power; bool beacon_found; u32 orig_flags; int orig_mag; int orig_mpwr; enum nl80211_dfs_state dfs_state; unsigned long dfs_state_entered; unsigned int dfs_cac_ms; }; Members band band this channel belongs to. center_freq center frequency in MHz hw_value hardware-specific value for the channel flags channel flags from enum ieee80211_channel_flags. max_antenna_gain maximum antenna gain in dBi max_power maximum transmission power (in dBm) max_reg_power maximum regulatory transmission power (in dBm) beacon_found helper to regulatory code to indicate when a beacon has been found on this channel. Use regulatory_hint_found_beacon to enable this, this is useful only on 5 GHz band. orig_flags channel flags at registration time, used by regulatory code to support devices with additional restrictions orig_mag internal use orig_mpwr internal use dfs_state current state of this channel. Only relevant if radar is required on this channel. dfs_state_entered timestamp (jiffies) when the dfs state was entered. dfs_cac_ms DFS CAC time in milliseconds, this is valid for DFS channels. Description This structure describes a single channel for use with cfg80211. LINUX Kernel Hackers Manual July 2017 enum ieee80211_rate_flags 9 4.1.27 enum ieee80211_rate_flags rate flags Synopsis enum ieee80211_rate_flags { IEEE80211_RATE_SHORT_PREAMBLE, IEEE80211_RATE_MANDATORY_A, IEEE80211_RATE_MANDATORY_B, IEEE80211_RATE_MANDATORY_G, IEEE80211_RATE_ERP_G, IEEE80211_RATE_SUPPORTS_5MHZ, IEEE80211_RATE_SUPPORTS_10MHZ }; Constants IEEE80211_RATE_SHORT_PREAMBLE Hardware can send with short preamble on this bitrate; only relevant in 2.4GHz band and with CCK rates. IEEE80211_RATE_MANDATORY_A This bitrate is a mandatory rate when used with 802.11a (on the 5 GHz band); filled by the core code when registering the wiphy. IEEE80211_RATE_MANDATORY_B This bitrate is a mandatory rate when used with 802.11b (on the 2.4 GHz band); filled by the core code when registering the wiphy. IEEE80211_RATE_MANDATORY_G This bitrate is a mandatory rate when used with 802.11g (on the 2.4 GHz band); filled by the core code when registering the wiphy. IEEE80211_RATE_ERP_G This is an ERP rate in 802.11g mode. IEEE80211_RATE_SUPPORTS_5MHZ Rate can be used in 5 MHz mode IEEE80211_RATE_SUPPORTS_10MHZ Rate can be used in 10 MHz mode Description Hardware/specification flags for rates. These are structured in a way that allows using the same bitrate structure for different bands/PHY modes. LINUX Kernel Hackers Manual July 2017 struct ieee80211_rate 9 4.1.27 struct ieee80211_rate bitrate definition Synopsis struct ieee80211_rate { u32 flags; u16 bitrate; u16 hw_value; u16 hw_value_short; }; Members flags rate-specific flags bitrate bitrate in units of 100 Kbps hw_value driver/hardware value for this rate hw_value_short driver/hardware value for this rate when short preamble is used Description This structure describes a bitrate that an 802.11 PHY can operate with. The two values hw_value and hw_value_short are only for driver use when pointers to this structure are passed around. LINUX Kernel Hackers Manual July 2017 struct ieee80211_sta_ht_cap 9 4.1.27 struct ieee80211_sta_ht_cap STA's HT capabilities Synopsis struct ieee80211_sta_ht_cap { u16 cap; bool ht_supported; u8 ampdu_factor; u8 ampdu_density; struct ieee80211_mcs_info mcs; }; Members cap HT capabilities map as described in 802.11n spec ht_supported is HT supported by the STA ampdu_factor Maximum A-MPDU length factor ampdu_density Minimum A-MPDU spacing mcs Supported MCS rates Description This structure describes most essential parameters needed to describe 802.11n HT capabilities for an STA. LINUX Kernel Hackers Manual July 2017 struct ieee80211_supported_band 9 4.1.27 struct ieee80211_supported_band frequency band definition Synopsis struct ieee80211_supported_band { struct ieee80211_channel * channels; struct ieee80211_rate * bitrates; enum ieee80211_band band; int n_channels; int n_bitrates; struct ieee80211_sta_ht_cap ht_cap; struct ieee80211_sta_vht_cap vht_cap; }; Members channels Array of channels the hardware can operate in in this band. bitrates Array of bitrates the hardware can operate with in this band. Must be sorted to give a valid supported rates IE, i.e. CCK rates first, then OFDM. band the band this structure represents n_channels Number of channels in channels n_bitrates Number of bitrates in bitrates ht_cap HT capabilities in this band vht_cap VHT capabilities in this band Description This structure describes a frequency band a wiphy is able to operate in. LINUX Kernel Hackers Manual July 2017 enum cfg80211_signal_type 9 4.1.27 enum cfg80211_signal_type signal type Synopsis enum cfg80211_signal_type { CFG80211_SIGNAL_TYPE_NONE, CFG80211_SIGNAL_TYPE_MBM, CFG80211_SIGNAL_TYPE_UNSPEC }; Constants CFG80211_SIGNAL_TYPE_NONE no signal strength information available CFG80211_SIGNAL_TYPE_MBM signal strength in mBm (100*dBm) CFG80211_SIGNAL_TYPE_UNSPEC signal strength, increasing from 0 through 100 LINUX Kernel Hackers Manual July 2017 enum wiphy_params_flags 9 4.1.27 enum wiphy_params_flags set_wiphy_params bitfield values Synopsis enum wiphy_params_flags { WIPHY_PARAM_RETRY_SHORT, WIPHY_PARAM_RETRY_LONG, WIPHY_PARAM_FRAG_THRESHOLD, WIPHY_PARAM_RTS_THRESHOLD, WIPHY_PARAM_COVERAGE_CLASS, WIPHY_PARAM_DYN_ACK }; Constants WIPHY_PARAM_RETRY_SHORT wiphy->retry_short has changed WIPHY_PARAM_RETRY_LONG wiphy->retry_long has changed WIPHY_PARAM_FRAG_THRESHOLD wiphy->frag_threshold has changed WIPHY_PARAM_RTS_THRESHOLD wiphy->rts_threshold has changed WIPHY_PARAM_COVERAGE_CLASS coverage class changed WIPHY_PARAM_DYN_ACK dynack has been enabled LINUX Kernel Hackers Manual July 2017 enum wiphy_flags 9 4.1.27 enum wiphy_flags wiphy capability flags Synopsis enum wiphy_flags { WIPHY_FLAG_NETNS_OK, WIPHY_FLAG_PS_ON_BY_DEFAULT, WIPHY_FLAG_4ADDR_AP, WIPHY_FLAG_4ADDR_STATION, WIPHY_FLAG_CONTROL_PORT_PROTOCOL, WIPHY_FLAG_IBSS_RSN, WIPHY_FLAG_MESH_AUTH, WIPHY_FLAG_SUPPORTS_SCHED_SCAN, WIPHY_FLAG_SUPPORTS_FW_ROAM, WIPHY_FLAG_AP_UAPSD, WIPHY_FLAG_SUPPORTS_TDLS, WIPHY_FLAG_TDLS_EXTERNAL_SETUP, WIPHY_FLAG_HAVE_AP_SME, WIPHY_FLAG_REPORTS_OBSS, WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD, WIPHY_FLAG_OFFCHAN_TX, WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL, WIPHY_FLAG_SUPPORTS_5_10_MHZ, WIPHY_FLAG_HAS_CHANNEL_SWITCH }; Constants WIPHY_FLAG_NETNS_OK if not set, do not allow changing the netns of this wiphy at all WIPHY_FLAG_PS_ON_BY_DEFAULT if set to true, powersave will be enabled by default -- this flag will be set depending on the kernel's default on wiphy_new, but can be changed by the driver if it has a good reason to override the default WIPHY_FLAG_4ADDR_AP supports 4addr mode even on AP (with a single station on a VLAN interface) WIPHY_FLAG_4ADDR_STATION supports 4addr mode even as a station WIPHY_FLAG_CONTROL_PORT_PROTOCOL This device supports setting the control port protocol ethertype. The device also honours the control_port_no_encrypt flag. WIPHY_FLAG_IBSS_RSN The device supports IBSS RSN. WIPHY_FLAG_MESH_AUTH The device supports mesh authentication by routing auth frames to userspace. See NL80211_MESH_SETUP_USERSPACE_AUTH. WIPHY_FLAG_SUPPORTS_SCHED_SCAN The device supports scheduled scans. WIPHY_FLAG_SUPPORTS_FW_ROAM The device supports roaming feature in the firmware. WIPHY_FLAG_AP_UAPSD The device supports uapsd on AP. WIPHY_FLAG_SUPPORTS_TDLS The device supports TDLS (802.11z) operation. WIPHY_FLAG_TDLS_EXTERNAL_SETUP The device does not handle TDLS (802.11z) link setup/discovery operations internally. Setup, discovery and teardown packets should be sent through the NL80211_CMD_TDLS_MGMT command. When this flag is not set, NL80211_CMD_TDLS_OPER should be used for asking the driver/firmware to perform a TDLS operation. WIPHY_FLAG_HAVE_AP_SME device integrates AP SME WIPHY_FLAG_REPORTS_OBSS the device will report beacons from other BSSes when there are virtual interfaces in AP mode by calling cfg80211_report_obss_beacon. WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD When operating as an AP, the device responds to probe-requests in hardware. WIPHY_FLAG_OFFCHAN_TX Device supports direct off-channel TX. WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL Device supports remain-on-channel call. WIPHY_FLAG_SUPPORTS_5_10_MHZ Device supports 5 MHz and 10 MHz channels. WIPHY_FLAG_HAS_CHANNEL_SWITCH Device supports channel switch in beaconing mode (AP, IBSS, Mesh, ...). LINUX Kernel Hackers Manual July 2017 struct wiphy 9 4.1.27 struct wiphy wireless hardware description Synopsis struct wiphy { u8 perm_addr[ETH_ALEN]; u8 addr_mask[ETH_ALEN]; struct mac_address * addresses; const struct ieee80211_txrx_stypes * mgmt_stypes; const struct ieee80211_iface_combination * iface_combinations; int n_iface_combinations; u16 software_iftypes; u16 n_addresses; u16 interface_modes; u16 max_acl_mac_addrs; u32 flags; u32 regulatory_flags; u32 features; u8 ext_features[DIV_ROUND_UP(NUM_NL80211_EXT_FEATURES# 8)]; u32 ap_sme_capa; enum cfg80211_signal_type signal_type; int bss_priv_size; u8 max_scan_ssids; u8 max_sched_scan_ssids; u8 max_match_sets; u16 max_scan_ie_len; u16 max_sched_scan_ie_len; int n_cipher_suites; const u32 * cipher_suites; u8 retry_short; u8 retry_long; u32 frag_threshold; u32 rts_threshold; u8 coverage_class; char fw_version[ETHTOOL_FWVERS_LEN]; u32 hw_version; #ifdef CONFIG_PM const struct wiphy_wowlan_support * wowlan; struct cfg80211_wowlan * wowlan_config; #endif u16 max_remain_on_channel_duration; u8 max_num_pmkids; u32 available_antennas_tx; u32 available_antennas_rx; u32 probe_resp_offload; const u8 * extended_capabilities; const u8 * extended_capabilities_mask; u8 extended_capabilities_len; const void * privid; struct ieee80211_supported_band * bands[IEEE80211_NUM_BANDS]; void (* reg_notifier) (struct wiphy *wiphy,struct regulatory_request *request); const struct ieee80211_regdomain __rcu * regd; struct device dev; bool registered; struct dentry * debugfsdir; const struct ieee80211_ht_cap * ht_capa_mod_mask; const struct ieee80211_vht_cap * vht_capa_mod_mask; possible_net_t _net; #ifdef CONFIG_CFG80211_WEXT const struct iw_handler_def * wext; #endif const struct wiphy_coalesce_support * coalesce; const struct wiphy_vendor_command * vendor_commands; const struct nl80211_vendor_cmd_info * vendor_events; int n_vendor_commands; int n_vendor_events; u16 max_ap_assoc_sta; u8 max_num_csa_counters; u8 max_adj_channel_rssi_comp; char priv[0]; }; Members perm_addr[ETH_ALEN] permanent MAC address of this device addr_mask[ETH_ALEN] If the device supports multiple MAC addresses by masking, set this to a mask with variable bits set to 1, e.g. if the last four bits are variable then set it to 00-00-00-00-00-0f. The actual variable bits shall be determined by the interfaces added, with interfaces not matching the mask being rejected to be brought up. addresses If the device has more than one address, set this pointer to a list of addresses (6 bytes each). The first one will be used by default for perm_addr. In this case, the mask should be set to all-zeroes. In this case it is assumed that the device can handle the same number of arbitrary MAC addresses. mgmt_stypes bitmasks of frame subtypes that can be subscribed to or transmitted through nl80211, points to an array indexed by interface type iface_combinations Valid interface combinations array, should not list single interface types. n_iface_combinations number of entries in iface_combinations array. software_iftypes bitmask of software interface types, these are not subject to any restrictions since they are purely managed in SW. n_addresses number of addresses in addresses. interface_modes bitmask of interfaces types valid for this wiphy, must be set by driver max_acl_mac_addrs Maximum number of MAC addresses that the device supports for ACL. flags wiphy flags, see enum wiphy_flags regulatory_flags wiphy regulatory flags, see enum ieee80211_regulatory_flags features features advertised to nl80211, see enum nl80211_feature_flags. ext_features[DIV_ROUND_UP(NUM_NL80211_EXT_FEATURES# 8)] extended features advertised to nl80211, see enum nl80211_ext_feature_index. ap_sme_capa AP SME capabilities, flags from enum nl80211_ap_sme_features. signal_type signal type reported in struct cfg80211_bss. bss_priv_size each BSS struct has private data allocated with it, this variable determines its size max_scan_ssids maximum number of SSIDs the device can scan for in any given scan max_sched_scan_ssids maximum number of SSIDs the device can scan for in any given scheduled scan max_match_sets maximum number of match sets the device can handle when performing a scheduled scan, 0 if filtering is not supported. max_scan_ie_len maximum length of user-controlled IEs device can add to probe request frames transmitted during a scan, must not include fixed IEs like supported rates max_sched_scan_ie_len same as max_scan_ie_len, but for scheduled scans n_cipher_suites number of supported cipher suites cipher_suites supported cipher suites retry_short Retry limit for short frames (dot11ShortRetryLimit) retry_long Retry limit for long frames (dot11LongRetryLimit) frag_threshold Fragmentation threshold (dot11FragmentationThreshold); -1 = fragmentation disabled, only odd values >= 256 used rts_threshold RTS threshold (dot11RTSThreshold); -1 = RTS/CTS disabled coverage_class current coverage class fw_version[ETHTOOL_FWVERS_LEN] firmware version for ethtool reporting hw_version hardware version for ethtool reporting wowlan WoWLAN support information wowlan_config current WoWLAN configuration; this should usually not be used since access to it is necessarily racy, use the parameter passed to the suspend operation instead. max_remain_on_channel_duration Maximum time a remain-on-channel operation may request, if implemented. max_num_pmkids maximum number of PMKIDs supported by device available_antennas_tx bitmap of antennas which are available to be configured as TX antennas. Antenna configuration commands will be rejected unless this or available_antennas_rx is set. available_antennas_rx bitmap of antennas which are available to be configured as RX antennas. Antenna configuration commands will be rejected unless this or available_antennas_tx is set. probe_resp_offload Bitmap of supported protocols for probe response offloading. See enum nl80211_probe_resp_offload_support_attr. Only valid when the wiphy flag WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD is set. extended_capabilities extended capabilities supported by the driver, additional capabilities might be supported by userspace; these are the 802.11 extended capabilities (Extended Capabilities element) and are in the same format as in the information element. See 802.11-2012 8.4.2.29 for the defined fields. extended_capabilities_mask mask of the valid values extended_capabilities_len length of the extended capabilities privid a pointer that drivers can use to identify if an arbitrary wiphy is theirs, e.g. in global notifiers bands[IEEE80211_NUM_BANDS] information about bands/channels supported by this device reg_notifier the driver's regulatory notification callback, note that if your driver uses wiphy_apply_custom_regulatory the reg_notifier's request can be passed as NULL regd the driver's regulatory domain, if one was requested via the regulatory_hint API. This can be used by the driver on the reg_notifier if it chooses to ignore future regulatory domain changes caused by other drivers. dev (virtual) struct device for this wiphy registered helps synchronize suspend/resume with wiphy unregister debugfsdir debugfs directory used for this wiphy, will be renamed automatically on wiphy renames ht_capa_mod_mask Specify what ht_cap values can be over-ridden. If null, then none can be over-ridden. vht_capa_mod_mask Specify what VHT capabilities can be over-ridden. If null, then none can be over-ridden. _net the network namespace this wiphy currently lives in wext wireless extension handlers coalesce packet coalescing support information vendor_commands array of vendor commands supported by the hardware vendor_events array of vendor events supported by the hardware n_vendor_commands number of vendor commands n_vendor_events number of vendor events max_ap_assoc_sta maximum number of associated stations supported in AP mode (including P2P GO) or 0 to indicate no such limit is advertised. The driver is allowed to advertise a theoretical limit that it can reach in some cases, but may not always reach. max_num_csa_counters Number of supported csa_counters in beacons and probe responses. This value should be set if the driver wishes to limit the number of csa counters. Default (0) means infinite. max_adj_channel_rssi_comp max offset of between the channel on which the frame was sent and the channel on which the frame was heard for which the reported rssi is still valid. If a driver is able to compensate the low rssi when a frame is heard on different channel, then it should set this variable to the maximal offset for which it can compensate. This value should be set in MHz. priv[0] driver private data (sized according to wiphy_new parameter) LINUX Kernel Hackers Manual July 2017 struct wireless_dev 9 4.1.27 struct wireless_dev wireless device state Synopsis struct wireless_dev { struct wiphy * wiphy; enum nl80211_iftype iftype; struct list_head list; struct net_device * netdev; u32 identifier; struct list_head mgmt_registrations; spinlock_t mgmt_registrations_lock; struct mutex mtx; bool use_4addr; bool p2p_started; u8 address[ETH_ALEN]; u8 ssid[IEEE80211_MAX_SSID_LEN]; u8 ssid_len; u8 mesh_id_len; u8 mesh_id_up_len; struct cfg80211_conn * conn; struct cfg80211_cached_keys * connect_keys; struct list_head event_list; spinlock_t event_lock; struct cfg80211_internal_bss * current_bss; struct cfg80211_chan_def preset_chandef; struct cfg80211_chan_def chandef; bool ibss_fixed; bool ibss_dfs_possible; bool ps; int ps_timeout; int beacon_interval; u32 ap_unexpected_nlportid; bool cac_started; unsigned long cac_start_time; unsigned int cac_time_ms; u32 owner_nlportid; #ifdef CONFIG_CFG80211_WEXT struct wext; #endif }; Members wiphy pointer to hardware description iftype interface type list (private) Used to collect the interfaces netdev (private) Used to reference back to the netdev, may be NULL identifier (private) Identifier used in nl80211 to identify this wireless device if it has no netdev mgmt_registrations list of registrations for management frames mgmt_registrations_lock lock for the list mtx mutex used to lock data in this struct, may be used by drivers and some API functions require it held use_4addr indicates 4addr mode is used on this interface, must be set by driver (if supported) on add_interface BEFORE registering the netdev and may otherwise be used by driver read-only, will be update by cfg80211 on change_interface p2p_started true if this is a P2P Device that has been started address[ETH_ALEN] The address for this device, valid only if netdev is NULL ssid[IEEE80211_MAX_SSID_LEN] (private) Used by the internal configuration code ssid_len (private) Used by the internal configuration code mesh_id_len (private) Used by the internal configuration code mesh_id_up_len (private) Used by the internal configuration code conn (private) cfg80211 software SME connection state machine data connect_keys (private) keys to set after connection is established event_list (private) list for internal event processing event_lock (private) lock for event list current_bss (private) Used by the internal configuration code preset_chandef (private) Used by the internal configuration code to track the channel to be used for AP later chandef (private) Used by the internal configuration code to track the user-set channel definition. ibss_fixed (private) IBSS is using fixed BSSID ibss_dfs_possible (private) IBSS may change to a DFS channel ps powersave mode is enabled ps_timeout dynamic powersave timeout beacon_interval beacon interval used on this device for transmitting beacons, 0 when not valid ap_unexpected_nlportid (private) netlink port ID of application registered for unexpected class 3 frames (AP mode) cac_started true if DFS channel availability check has been started cac_start_time timestamp (jiffies) when the dfs state was entered. cac_time_ms CAC time in ms owner_nlportid (private) owner socket port ID wext (private) Used by the internal wireless extensions compat code Description For netdevs, this structure must be allocated by the driver that uses the ieee80211_ptr field in struct net_device (this is intentional so it can be allocated along with the netdev.) It need not be registered then as netdev registration will be intercepted by cfg80211 to see the new wireless device. For non-netdev uses, it must also be allocated by the driver in response to the cfg80211 callbacks that require it, as there's no netdev registration in that case it may not be allocated outside of callback operations that return it. LINUX Kernel Hackers Manual July 2017 wiphy_new 9 4.1.27 wiphy_new create a new wiphy for use with cfg80211 Synopsis struct wiphy * wiphy_new const struct cfg80211_ops * ops int sizeof_priv Arguments ops The configuration operations for this device sizeof_priv The size of the private area to allocate Description Create a new wiphy and associate the given operations with it. sizeof_priv bytes are allocated for private use. Return A pointer to the new wiphy. This pointer must be assigned to each netdev's ieee80211_ptr for proper operation. LINUX Kernel Hackers Manual July 2017 wiphy_register 9 4.1.27 wiphy_register register a wiphy with cfg80211 Synopsis int wiphy_register struct wiphy * wiphy Arguments wiphy The wiphy to register. Return A non-negative wiphy index or a negative error code. LINUX Kernel Hackers Manual July 2017 wiphy_unregister 9 4.1.27 wiphy_unregister deregister a wiphy from cfg80211 Synopsis void wiphy_unregister struct wiphy * wiphy Arguments wiphy The wiphy to unregister. Description After this call, no more requests can be made with this priv pointer, but the call may sleep to wait for an outstanding request that is being handled. LINUX Kernel Hackers Manual July 2017 wiphy_free 9 4.1.27 wiphy_free free wiphy Synopsis void wiphy_free struct wiphy * wiphy Arguments wiphy The wiphy to free LINUX Kernel Hackers Manual July 2017 wiphy_name 9 4.1.27 wiphy_name get wiphy name Synopsis const char * wiphy_name const struct wiphy * wiphy Arguments wiphy The wiphy whose name to return Return The name of wiphy. LINUX Kernel Hackers Manual July 2017 wiphy_dev 9 4.1.27 wiphy_dev get wiphy dev pointer Synopsis struct device * wiphy_dev struct wiphy * wiphy Arguments wiphy The wiphy whose device struct to look up Return The dev of wiphy. LINUX Kernel Hackers Manual July 2017 wiphy_priv 9 4.1.27 wiphy_priv return priv from wiphy Synopsis void * wiphy_priv struct wiphy * wiphy Arguments wiphy the wiphy whose priv pointer to return Return The priv of wiphy. LINUX Kernel Hackers Manual July 2017 priv_to_wiphy 9 4.1.27 priv_to_wiphy return the wiphy containing the priv Synopsis struct wiphy * priv_to_wiphy void * priv Arguments priv a pointer previously returned by wiphy_priv Return The wiphy of priv. LINUX Kernel Hackers Manual July 2017 set_wiphy_dev 9 4.1.27 set_wiphy_dev set device pointer for wiphy Synopsis void set_wiphy_dev struct wiphy * wiphy struct device * dev Arguments wiphy The wiphy whose device to bind dev The device to parent it to LINUX Kernel Hackers Manual July 2017 wdev_priv 9 4.1.27 wdev_priv return wiphy priv from wireless_dev Synopsis void * wdev_priv struct wireless_dev * wdev Arguments wdev The wireless device whose wiphy's priv pointer to return Return The wiphy priv of wdev. LINUX Kernel Hackers Manual July 2017 struct ieee80211_iface_limit 9 4.1.27 struct ieee80211_iface_limit limit on certain interface types Synopsis struct ieee80211_iface_limit { u16 max; u16 types; }; Members max maximum number of interfaces of these types types interface types (bits) LINUX Kernel Hackers Manual July 2017 struct ieee80211_iface_combination 9 4.1.27 struct ieee80211_iface_combination possible interface combination Synopsis struct ieee80211_iface_combination { const struct ieee80211_iface_limit * limits; u32 num_different_channels; u16 max_interfaces; u8 n_limits; bool beacon_int_infra_match; u8 radar_detect_widths; u8 radar_detect_regions; }; Members limits limits for the given interface types num_different_channels can use up to this many different channels max_interfaces maximum number of interfaces in total allowed in this group n_limits number of limitations beacon_int_infra_match In this combination, the beacon intervals between infrastructure and AP types must match. This is required only in special cases. radar_detect_widths bitmap of channel widths supported for radar detection radar_detect_regions bitmap of regions supported for radar detection Description With this structure the driver can describe which interface combinations it supports concurrently. Examples 1. Allow #STA <= 1, #AP <= 1, matching BI, channels = 1, 2 total: struct ieee80211_iface_limit limits1[] = { { .max = 1, .types = BIT(NL80211_IFTYPE_STATION), }, { .max = 1, .types = BIT(NL80211_IFTYPE_AP}, }, }; struct ieee80211_iface_combination combination1 = { .limits = limits1, .n_limits = ARRAY_SIZE(limits1), .max_interfaces = 2, .beacon_int_infra_match = true, }; 2. Allow #{AP, P2P-GO} <= 8, channels = 1, 8 total: struct ieee80211_iface_limit limits2[] = { { .max = 8, .types = BIT(NL80211_IFTYPE_AP) | BIT(NL80211_IFTYPE_P2P_GO), }, }; struct ieee80211_iface_combination combination2 = { .limits = limits2, .n_limits = ARRAY_SIZE(limits2), .max_interfaces = 8, .num_different_channels = 1, }; 3. Allow #STA <= 1, #{P2P-client,P2P-GO} <= 3 on two channels, 4 total. This allows for an infrastructure connection and three P2P connections. struct ieee80211_iface_limit limits3[] = { { .max = 1, .types = BIT(NL80211_IFTYPE_STATION), }, { .max = 3, .types = BIT(NL80211_IFTYPE_P2P_GO) | BIT(NL80211_IFTYPE_P2P_CLIENT), }, }; struct ieee80211_iface_combination combination3 = { .limits = limits3, .n_limits = ARRAY_SIZE(limits3), .max_interfaces = 4, .num_different_channels = 2, }; LINUX Kernel Hackers Manual July 2017 cfg80211_check_combinations 9 4.1.27 cfg80211_check_combinations check interface combinations Synopsis int cfg80211_check_combinations struct wiphy * wiphy const int num_different_channels const u8 radar_detect const int iftype_num[NUM_NL80211_IFTYPES] Arguments wiphy the wiphy num_different_channels the number of different channels we want to use for verification radar_detect a bitmap where each bit corresponds to a channel width where radar detection is needed, as in the definition of struct ieee80211_iface_combination.radar_detect_widths iftype_num[NUM_NL80211_IFTYPES] array with the numbers of interfaces of each interface type. The index is the interface type as specified in enum nl80211_iftype. Description This function can be called by the driver to check whether a combination of interfaces and their types are allowed according to the interface combinations. Actions and configuration Each wireless device and each virtual interface offer a set of configuration operations and other actions that are invoked by userspace. Each of these actions is described in the operations structure, and the parameters these operations use are described separately. Additionally, some operations are asynchronous and expect to get status information via some functions that drivers need to call. Scanning and BSS list handling with its associated functionality is described in a separate chapter. LINUX Kernel Hackers Manual July 2017 struct cfg80211_ops 9 4.1.27 struct cfg80211_ops backend description for wireless configuration Synopsis struct cfg80211_ops { int (* suspend) (struct wiphy *wiphy, struct cfg80211_wowlan *wow); int (* resume) (struct wiphy *wiphy); void (* set_wakeup) (struct wiphy *wiphy, bool enabled); struct wireless_dev * (* add_virtual_intf) (struct wiphy *wiphy,const char *name,unsigned char name_assign_type,enum nl80211_iftype type,u32 *flags,struct vif_params *params); int (* del_virtual_intf) (struct wiphy *wiphy,struct wireless_dev *wdev); int (* change_virtual_intf) (struct wiphy *wiphy,struct net_device *dev,enum nl80211_iftype type, u32 *flags,struct vif_params *params); int (* add_key) (struct wiphy *wiphy, struct net_device *netdev,u8 key_index, bool pairwise, const u8 *mac_addr,struct key_params *params); int (* get_key) (struct wiphy *wiphy, struct net_device *netdev,u8 key_index, bool pairwise, const u8 *mac_addr,void *cookie,void (*callback); int (* del_key) (struct wiphy *wiphy, struct net_device *netdev,u8 key_index, bool pairwise, const u8 *mac_addr); int (* set_default_key) (struct wiphy *wiphy,struct net_device *netdev,u8 key_index, bool unicast, bool multicast); int (* set_default_mgmt_key) (struct wiphy *wiphy,struct net_device *netdev,u8 key_index); int (* start_ap) (struct wiphy *wiphy, struct net_device *dev,struct cfg80211_ap_settings *settings); int (* change_beacon) (struct wiphy *wiphy, struct net_device *dev,struct cfg80211_beacon_data *info); int (* stop_ap) (struct wiphy *wiphy, struct net_device *dev); int (* add_station) (struct wiphy *wiphy, struct net_device *dev,const u8 *mac,struct station_parameters *params); int (* del_station) (struct wiphy *wiphy, struct net_device *dev,struct station_del_parameters *params); int (* change_station) (struct wiphy *wiphy, struct net_device *dev,const u8 *mac,struct station_parameters *params); int (* get_station) (struct wiphy *wiphy, struct net_device *dev,const u8 *mac, struct station_info *sinfo); int (* dump_station) (struct wiphy *wiphy, struct net_device *dev,int idx, u8 *mac, struct station_info *sinfo); int (* add_mpath) (struct wiphy *wiphy, struct net_device *dev,const u8 *dst, const u8 *next_hop); int (* del_mpath) (struct wiphy *wiphy, struct net_device *dev,const u8 *dst); int (* change_mpath) (struct wiphy *wiphy, struct net_device *dev,const u8 *dst, const u8 *next_hop); int (* get_mpath) (struct wiphy *wiphy, struct net_device *dev,u8 *dst, u8 *next_hop, struct mpath_info *pinfo); int (* dump_mpath) (struct wiphy *wiphy, struct net_device *dev,int idx, u8 *dst, u8 *next_hop,struct mpath_info *pinfo); int (* get_mpp) (struct wiphy *wiphy, struct net_device *dev,u8 *dst, u8 *mpp, struct mpath_info *pinfo); int (* dump_mpp) (struct wiphy *wiphy, struct net_device *dev,int idx, u8 *dst, u8 *mpp,struct mpath_info *pinfo); int (* get_mesh_config) (struct wiphy *wiphy,struct net_device *dev,struct mesh_config *conf); int (* update_mesh_config) (struct wiphy *wiphy,struct net_device *dev, u32 mask,const struct mesh_config *nconf); int (* join_mesh) (struct wiphy *wiphy, struct net_device *dev,const struct mesh_config *conf,const struct mesh_setup *setup); int (* leave_mesh) (struct wiphy *wiphy, struct net_device *dev); int (* join_ocb) (struct wiphy *wiphy, struct net_device *dev,struct ocb_setup *setup); int (* leave_ocb) (struct wiphy *wiphy, struct net_device *dev); int (* change_bss) (struct wiphy *wiphy, struct net_device *dev,struct bss_parameters *params); int (* set_txq_params) (struct wiphy *wiphy, struct net_device *dev,struct ieee80211_txq_params *params); int (* libertas_set_mesh_channel) (struct wiphy *wiphy,struct net_device *dev,struct ieee80211_channel *chan); int (* set_monitor_channel) (struct wiphy *wiphy,struct cfg80211_chan_def *chandef); int (* scan) (struct wiphy *wiphy,struct cfg80211_scan_request *request); int (* auth) (struct wiphy *wiphy, struct net_device *dev,struct cfg80211_auth_request *req); int (* assoc) (struct wiphy *wiphy, struct net_device *dev,struct cfg80211_assoc_request *req); int (* deauth) (struct wiphy *wiphy, struct net_device *dev,struct cfg80211_deauth_request *req); int (* disassoc) (struct wiphy *wiphy, struct net_device *dev,struct cfg80211_disassoc_request *req); int (* connect) (struct wiphy *wiphy, struct net_device *dev,struct cfg80211_connect_params *sme); int (* disconnect) (struct wiphy *wiphy, struct net_device *dev,u16 reason_code); int (* join_ibss) (struct wiphy *wiphy, struct net_device *dev,struct cfg80211_ibss_params *params); int (* leave_ibss) (struct wiphy *wiphy, struct net_device *dev); int (* set_mcast_rate) (struct wiphy *wiphy, struct net_device *dev,int rate[IEEE80211_NUM_BANDS]); int (* set_wiphy_params) (struct wiphy *wiphy, u32 changed); int (* set_tx_power) (struct wiphy *wiphy, struct wireless_dev *wdev,enum nl80211_tx_power_setting type, int mbm); int (* get_tx_power) (struct wiphy *wiphy, struct wireless_dev *wdev,int *dbm); int (* set_wds_peer) (struct wiphy *wiphy, struct net_device *dev,const u8 *addr); void (* rfkill_poll) (struct wiphy *wiphy); #ifdef CONFIG_NL80211_TESTMODE int (* testmode_cmd) (struct wiphy *wiphy, struct wireless_dev *wdev,void *data, int len); int (* testmode_dump) (struct wiphy *wiphy, struct sk_buff *skb,struct netlink_callback *cb,void *data, int len); #endif int (* set_bitrate_mask) (struct wiphy *wiphy,struct net_device *dev,const u8 *peer,const struct cfg80211_bitrate_mask *mask); int (* dump_survey) (struct wiphy *wiphy, struct net_device *netdev,int idx, struct survey_info *info); int (* set_pmksa) (struct wiphy *wiphy, struct net_device *netdev,struct cfg80211_pmksa *pmksa); int (* del_pmksa) (struct wiphy *wiphy, struct net_device *netdev,struct cfg80211_pmksa *pmksa); int (* flush_pmksa) (struct wiphy *wiphy, struct net_device *netdev); int (* remain_on_channel) (struct wiphy *wiphy,struct wireless_dev *wdev,struct ieee80211_channel *chan,unsigned int duration,u64 *cookie); int (* cancel_remain_on_channel) (struct wiphy *wiphy,struct wireless_dev *wdev,u64 cookie); int (* mgmt_tx) (struct wiphy *wiphy, struct wireless_dev *wdev,struct cfg80211_mgmt_tx_params *params,u64 *cookie); int (* mgmt_tx_cancel_wait) (struct wiphy *wiphy,struct wireless_dev *wdev,u64 cookie); int (* set_power_mgmt) (struct wiphy *wiphy, struct net_device *dev,bool enabled, int timeout); int (* set_cqm_rssi_config) (struct wiphy *wiphy,struct net_device *dev,s32 rssi_thold, u32 rssi_hyst); int (* set_cqm_txe_config) (struct wiphy *wiphy,struct net_device *dev,u32 rate, u32 pkts, u32 intvl); void (* mgmt_frame_register) (struct wiphy *wiphy,struct wireless_dev *wdev,u16 frame_type, bool reg); int (* set_antenna) (struct wiphy *wiphy, u32 tx_ant, u32 rx_ant); int (* get_antenna) (struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant); int (* sched_scan_start) (struct wiphy *wiphy,struct net_device *dev,struct cfg80211_sched_scan_request *request); int (* sched_scan_stop) (struct wiphy *wiphy, struct net_device *dev); int (* set_rekey_data) (struct wiphy *wiphy, struct net_device *dev,struct cfg80211_gtk_rekey_data *data); int (* tdls_mgmt) (struct wiphy *wiphy, struct net_device *dev,const u8 *peer, u8 action_code, u8 dialog_token,u16 status_code, u32 peer_capability,bool initiator, const u8 *buf, size_t len); int (* tdls_oper) (struct wiphy *wiphy, struct net_device *dev,const u8 *peer, enum nl80211_tdls_operation oper); int (* probe_client) (struct wiphy *wiphy, struct net_device *dev,const u8 *peer, u64 *cookie); int (* set_noack_map) (struct wiphy *wiphy,struct net_device *dev,u16 noack_map); int (* get_channel) (struct wiphy *wiphy,struct wireless_dev *wdev,struct cfg80211_chan_def *chandef); int (* start_p2p_device) (struct wiphy *wiphy,struct wireless_dev *wdev); void (* stop_p2p_device) (struct wiphy *wiphy,struct wireless_dev *wdev); int (* set_mac_acl) (struct wiphy *wiphy, struct net_device *dev,const struct cfg80211_acl_data *params); int (* start_radar_detection) (struct wiphy *wiphy,struct net_device *dev,struct cfg80211_chan_def *chandef,u32 cac_time_ms); int (* update_ft_ies) (struct wiphy *wiphy, struct net_device *dev,struct cfg80211_update_ft_ies_params *ftie); int (* crit_proto_start) (struct wiphy *wiphy,struct wireless_dev *wdev,enum nl80211_crit_proto_id protocol,u16 duration); void (* crit_proto_stop) (struct wiphy *wiphy,struct wireless_dev *wdev); int (* set_coalesce) (struct wiphy *wiphy,struct cfg80211_coalesce *coalesce); int (* channel_switch) (struct wiphy *wiphy,struct net_device *dev,struct cfg80211_csa_settings *params); int (* set_qos_map) (struct wiphy *wiphy,struct net_device *dev,struct cfg80211_qos_map *qos_map); int (* set_ap_chanwidth) (struct wiphy *wiphy, struct net_device *dev,struct cfg80211_chan_def *chandef); int (* add_tx_ts) (struct wiphy *wiphy, struct net_device *dev,u8 tsid, const u8 *peer, u8 user_prio,u16 admitted_time); int (* del_tx_ts) (struct wiphy *wiphy, struct net_device *dev,u8 tsid, const u8 *peer); int (* tdls_channel_switch) (struct wiphy *wiphy,struct net_device *dev,const u8 *addr, u8 oper_class,struct cfg80211_chan_def *chandef); void (* tdls_cancel_channel_switch) (struct wiphy *wiphy,struct net_device *dev,const u8 *addr); }; Members suspend wiphy device needs to be suspended. The variable wow will be NULL or contain the enabled Wake-on-Wireless triggers that are configured for the device. resume wiphy device needs to be resumed set_wakeup Called when WoWLAN is enabled/disabled, use this callback to call device_set_wakeup_enable to enable/disable wakeup from the device. add_virtual_intf create a new virtual interface with the given name, must set the struct wireless_dev's iftype. Beware: You must create the new netdev in the wiphy's network namespace! Returns the struct wireless_dev, or an ERR_PTR. For P2P device wdevs, the driver must also set the address member in the wdev. del_virtual_intf remove the virtual interface change_virtual_intf change type/configuration of virtual interface, keep the struct wireless_dev's iftype updated. add_key add a key with the given parameters. mac_addr will be NULL when adding a group key. get_key get information about the key with the given parameters. mac_addr will be NULL when requesting information for a group key. All pointers given to the callback function need not be valid after it returns. This function should return an error if it is not possible to retrieve the key, -ENOENT if it doesn't exist. del_key remove a key given the mac_addr (NULL for a group key) and key_index, return -ENOENT if the key doesn't exist. set_default_key set the default key on an interface set_default_mgmt_key set the default management frame key on an interface start_ap Start acting in AP mode defined by the parameters. change_beacon Change the beacon parameters for an access point mode interface. This should reject the call when AP mode wasn't started. stop_ap Stop being an AP, including stopping beaconing. add_station Add a new station. del_station Remove a station change_station Modify a given station. Note that flags changes are not much validated in cfg80211, in particular the auth/assoc/authorized flags might come to the driver in invalid combinations -- make sure to check them, also against the existing state! Drivers must call cfg80211_check_station_change to validate the information. get_station get station information for the station identified by mac dump_station dump station callback -- resume dump at index idx add_mpath add a fixed mesh path del_mpath delete a given mesh path change_mpath change a given mesh path get_mpath get a mesh path for the given parameters dump_mpath dump mesh path callback -- resume dump at index idx get_mpp get a mesh proxy path for the given parameters dump_mpp dump mesh proxy path callback -- resume dump at index idx get_mesh_config Get the current mesh configuration update_mesh_config Update mesh parameters on a running mesh. The mask is a bitfield which tells us which parameters to set, and which to leave alone. join_mesh join the mesh network with the specified parameters (invoked with the wireless_dev mutex held) leave_mesh leave the current mesh network (invoked with the wireless_dev mutex held) join_ocb join the OCB network with the specified parameters (invoked with the wireless_dev mutex held) leave_ocb leave the current OCB network (invoked with the wireless_dev mutex held) change_bss Modify parameters for a given BSS. set_txq_params Set TX queue parameters libertas_set_mesh_channel Only for backward compatibility for libertas, as it doesn't implement join_mesh and needs to set the channel to join the mesh instead. set_monitor_channel Set the monitor mode channel for the device. If other interfaces are active this callback should reject the configuration. If no interfaces are active or the device is down, the channel should be stored for when a monitor interface becomes active. scan Request to do a scan. If returning zero, the scan request is given the driver, and will be valid until passed to cfg80211_scan_done. For scan results, call cfg80211_inform_bss; you can call this outside the scan/scan_done bracket too. auth Request to authenticate with the specified peer (invoked with the wireless_dev mutex held) assoc Request to (re)associate with the specified peer (invoked with the wireless_dev mutex held) deauth Request to deauthenticate from the specified peer (invoked with the wireless_dev mutex held) disassoc Request to disassociate from the specified peer (invoked with the wireless_dev mutex held) connect Connect to the ESS with the specified parameters. When connected, call cfg80211_connect_result with status code WLAN_STATUS_SUCCESS. If the connection fails for some reason, call cfg80211_connect_result with the status from the AP. (invoked with the wireless_dev mutex held) disconnect Disconnect from the BSS/ESS. (invoked with the wireless_dev mutex held) join_ibss Join the specified IBSS (or create if necessary). Once done, call cfg80211_ibss_joined, also call that function when changing BSSID due to a merge. (invoked with the wireless_dev mutex held) leave_ibss Leave the IBSS. (invoked with the wireless_dev mutex held) set_mcast_rate Set the specified multicast rate (only if vif is in ADHOC or MESH mode) set_wiphy_params Notify that wiphy parameters have changed; changed bitfield (see enum wiphy_params_flags) describes which values have changed. The actual parameter values are available in struct wiphy. If returning an error, no value should be changed. set_tx_power set the transmit power according to the parameters, the power passed is in mBm, to get dBm use MBM_TO_DBM. The wdev may be NULL if power was set for the wiphy, and will always be NULL unless the driver supports per-vif TX power (as advertised by the nl80211 feature flag.) get_tx_power store the current TX power into the dbm variable; return 0 if successful set_wds_peer set the WDS peer for a WDS interface rfkill_poll polls the hw rfkill line, use cfg80211 reporting functions to adjust rfkill hw state testmode_cmd run a test mode command; wdev may be NULL testmode_dump Implement a test mode dump. The cb->args[2] and up may be used by the function, but 0 and 1 must not be touched. Additionally, return error codes other than -ENOBUFS and -ENOENT will terminate the dump and return to userspace with an error, so be careful. If any data was passed in from userspace then the data/len arguments will be present and point to the data contained in NL80211_ATTR_TESTDATA. set_bitrate_mask set the bitrate mask configuration dump_survey get site survey information. set_pmksa Cache a PMKID for a BSSID. This is mostly useful for fullmac devices running firmwares capable of generating the (re) association RSN IE. It allows for faster roaming between WPA2 BSSIDs. del_pmksa Delete a cached PMKID. flush_pmksa Flush all cached PMKIDs. remain_on_channel Request the driver to remain awake on the specified channel for the specified duration to complete an off-channel operation (e.g., public action frame exchange). When the driver is ready on the requested channel, it must indicate this with an event notification by calling cfg80211_ready_on_channel. cancel_remain_on_channel Cancel an on-going remain-on-channel operation. This allows the operation to be terminated prior to timeout based on the duration value. mgmt_tx Transmit a management frame. mgmt_tx_cancel_wait Cancel the wait time from transmitting a management frame on another channel set_power_mgmt Configure WLAN power management. A timeout value of -1 allows the driver to adjust the dynamic ps timeout value. set_cqm_rssi_config Configure connection quality monitor RSSI threshold. set_cqm_txe_config Configure connection quality monitor TX error thresholds. mgmt_frame_register Notify driver that a management frame type was registered. Note that this callback may not sleep, and cannot run concurrently with itself. set_antenna Set antenna configuration (tx_ant, rx_ant) on the device. Parameters are bitmaps of allowed antennas to use for TX/RX. Drivers may reject TX/RX mask combinations they cannot support by returning -EINVAL (also see nl80211.h NL80211_ATTR_WIPHY_ANTENNA_TX). get_antenna Get current antenna configuration from device (tx_ant, rx_ant). sched_scan_start Tell the driver to start a scheduled scan. sched_scan_stop Tell the driver to stop an ongoing scheduled scan. This call must stop the scheduled scan and be ready for starting a new one before it returns, i.e. sched_scan_start may be called immediately after that again and should not fail in that case. The driver should not call cfg80211_sched_scan_stopped for a requested stop (when this method returns 0.) set_rekey_data give the data necessary for GTK rekeying to the driver tdls_mgmt Transmit a TDLS management frame. tdls_oper Perform a high-level TDLS operation (e.g. TDLS link setup). probe_client probe an associated client, must return a cookie that it later passes to cfg80211_probe_status. set_noack_map Set the NoAck Map for the TIDs. get_channel Get the current operating channel for the virtual interface. For monitor interfaces, it should return NULL unless there's a single current monitoring channel. start_p2p_device Start the given P2P device. stop_p2p_device Stop the given P2P device. set_mac_acl Sets MAC address control list in AP and P2P GO mode. Parameters include ACL policy, an array of MAC address of stations and the number of MAC addresses. If there is already a list in driver this new list replaces the existing one. Driver has to clear its ACL when number of MAC addresses entries is passed as 0. Drivers which advertise the support for MAC based ACL have to implement this callback. start_radar_detection Start radar detection in the driver. update_ft_ies Provide updated Fast BSS Transition information to the driver. If the SME is in the driver/firmware, this information can be used in building Authentication and Reassociation Request frames. crit_proto_start Indicates a critical protocol needs more link reliability for a given duration (milliseconds). The protocol is provided so the driver can take the most appropriate actions. crit_proto_stop Indicates critical protocol no longer needs increased link reliability. This operation can not fail. set_coalesce Set coalesce parameters. channel_switch initiate channel-switch procedure (with CSA). Driver is responsible for veryfing if the switch is possible. Since this is inherently tricky driver may decide to disconnect an interface later with cfg80211_stop_iface. This doesn't mean driver can accept everything. It should do it's best to verify requests and reject them as soon as possible. set_qos_map Set QoS mapping information to the driver set_ap_chanwidth Set the AP (including P2P GO) mode channel width for the given interface This is used e.g. for dynamic HT 20/40 MHz channel width changes during the lifetime of the BSS. add_tx_ts validate (if admitted_time is 0) or add a TX TS to the device with the given parameters; action frame exchange has been handled by userspace so this just has to modify the TX path to take the TS into account. If the admitted time is 0 just validate the parameters to make sure the session can be created at all; it is valid to just always return success for that but that may result in inefficient behaviour (handshake with the peer followed by immediate teardown when the addition is later rejected) del_tx_ts remove an existing TX TS tdls_channel_switch Start channel-switching with a TDLS peer. The driver is responsible for continually initiating channel-switching operations and returning to the base channel for communication with the AP. tdls_cancel_channel_switch Stop channel-switching with a TDLS peer. Both peers must be on the base channel when the call completes. Description This struct is registered by fullmac card drivers and/or wireless stacks in order to handle configuration requests on their interfaces. All callbacks except where otherwise noted should return 0 on success or a negative error code. All operations are currently invoked under rtnl for consistency with the wireless extensions but this is subject to reevaluation as soon as this code is used more widely and we have a first user without wext. LINUX Kernel Hackers Manual July 2017 struct vif_params 9 4.1.27 struct vif_params describes virtual interface parameters Synopsis struct vif_params { int use_4addr; u8 macaddr[ETH_ALEN]; }; Members use_4addr use 4-address frames macaddr[ETH_ALEN] address to use for this virtual interface. If this parameter is set to zero address the driver may determine the address as needed. This feature is only fully supported by drivers that enable the NL80211_FEATURE_MAC_ON_CREATE flag. Others may support creating * only p2p devices with specified MAC. LINUX Kernel Hackers Manual July 2017 struct key_params 9 4.1.27 struct key_params key information Synopsis struct key_params { const u8 * key; const u8 * seq; int key_len; int seq_len; u32 cipher; }; Members key key material seq sequence counter (IV/PN) for TKIP and CCMP keys, only used with the get_key callback, must be in little endian, length given by seq_len. key_len length of key material seq_len length of seq. cipher cipher suite selector Description Information about a key LINUX Kernel Hackers Manual July 2017 enum survey_info_flags 9 4.1.27 enum survey_info_flags survey information flags Synopsis enum survey_info_flags { SURVEY_INFO_NOISE_DBM, SURVEY_INFO_IN_USE, SURVEY_INFO_TIME, SURVEY_INFO_TIME_BUSY, SURVEY_INFO_TIME_EXT_BUSY, SURVEY_INFO_TIME_RX, SURVEY_INFO_TIME_TX, SURVEY_INFO_TIME_SCAN }; Constants SURVEY_INFO_NOISE_DBM noise (in dBm) was filled in SURVEY_INFO_IN_USE channel is currently being used SURVEY_INFO_TIME active time (in ms) was filled in SURVEY_INFO_TIME_BUSY busy time was filled in SURVEY_INFO_TIME_EXT_BUSY extension channel busy time was filled in SURVEY_INFO_TIME_RX receive time was filled in SURVEY_INFO_TIME_TX transmit time was filled in SURVEY_INFO_TIME_SCAN scan time was filled in Description Used by the driver to indicate which info in struct survey_info it has filled in during the get_survey. LINUX Kernel Hackers Manual July 2017 struct survey_info 9 4.1.27 struct survey_info channel survey response Synopsis struct survey_info { struct ieee80211_channel * channel; u64 time; u64 time_busy; u64 time_ext_busy; u64 time_rx; u64 time_tx; u64 time_scan; u32 filled; s8 noise; }; Members channel the channel this survey record reports, may be NULL for a single record to report global statistics time amount of time in ms the radio was turn on (on the channel) time_busy amount of time the primary channel was sensed busy time_ext_busy amount of time the extension channel was sensed busy time_rx amount of time the radio spent receiving data time_tx amount of time the radio spent transmitting data time_scan amount of time the radio spent for scanning filled bitflag of flags from enum survey_info_flags noise channel noise in dBm. This and all following fields are optional Description Used by dump_survey to report back per-channel survey information. This structure can later be expanded with things like channel duty cycle etc. LINUX Kernel Hackers Manual July 2017 struct cfg80211_beacon_data 9 4.1.27 struct cfg80211_beacon_data beacon data Synopsis struct cfg80211_beacon_data { const u8 * head; const u8 * tail; const u8 * beacon_ies; const u8 * proberesp_ies; const u8 * assocresp_ies; const u8 * probe_resp; size_t head_len; size_t tail_len; size_t beacon_ies_len; size_t proberesp_ies_len; size_t assocresp_ies_len; size_t probe_resp_len; }; Members head head portion of beacon (before TIM IE) or NULL if not changed tail tail portion of beacon (after TIM IE) or NULL if not changed beacon_ies extra information element(s) to add into Beacon frames or NULL proberesp_ies extra information element(s) to add into Probe Response frames or NULL assocresp_ies extra information element(s) to add into (Re)Association Response frames or NULL probe_resp probe response template (AP mode only) head_len length of head tail_len length of tail beacon_ies_len length of beacon_ies in octets proberesp_ies_len length of proberesp_ies in octets assocresp_ies_len length of assocresp_ies in octets probe_resp_len length of probe response template (probe_resp) LINUX Kernel Hackers Manual July 2017 struct cfg80211_ap_settings 9 4.1.27 struct cfg80211_ap_settings AP configuration Synopsis struct cfg80211_ap_settings { struct cfg80211_chan_def chandef; struct cfg80211_beacon_data beacon; int beacon_interval; int dtim_period; const u8 * ssid; size_t ssid_len; enum nl80211_hidden_ssid hidden_ssid; struct cfg80211_crypto_settings crypto; bool privacy; enum nl80211_auth_type auth_type; enum nl80211_smps_mode smps_mode; int inactivity_timeout; u8 p2p_ctwindow; bool p2p_opp_ps; const struct cfg80211_acl_data * acl; }; Members chandef defines the channel to use beacon beacon data beacon_interval beacon interval dtim_period DTIM period ssid SSID to be used in the BSS (note: may be NULL if not provided from user space) ssid_len length of ssid hidden_ssid whether to hide the SSID in Beacon/Probe Response frames crypto crypto settings privacy the BSS uses privacy auth_type Authentication type (algorithm) smps_mode SMPS mode inactivity_timeout time in seconds to determine station's inactivity. p2p_ctwindow P2P CT Window p2p_opp_ps P2P opportunistic PS acl ACL configuration used by the drivers which has support for MAC address based access control Description Used to configure an AP interface. LINUX Kernel Hackers Manual July 2017 struct station_parameters 9 4.1.27 struct station_parameters station parameters Synopsis struct station_parameters { const u8 * supported_rates; struct net_device * vlan; u32 sta_flags_mask; u32 sta_flags_set; u32 sta_modify_mask; int listen_interval; u16 aid; u8 supported_rates_len; u8 plink_action; u8 plink_state; const struct ieee80211_ht_cap * ht_capa; const struct ieee80211_vht_cap * vht_capa; u8 uapsd_queues; u8 max_sp; enum nl80211_mesh_power_mode local_pm; u16 capability; const u8 * ext_capab; u8 ext_capab_len; const u8 * supported_channels; u8 supported_channels_len; const u8 * supported_oper_classes; u8 supported_oper_classes_len; u8 opmode_notif; bool opmode_notif_used; }; Members supported_rates supported rates in IEEE 802.11 format (or NULL for no change) vlan vlan interface station should belong to sta_flags_mask station flags that changed (bitmask of BIT(NL80211_STA_FLAG_...)) sta_flags_set station flags values (bitmask of BIT(NL80211_STA_FLAG_...)) sta_modify_mask bitmap indicating which parameters changed (for those that don't have a natural no change value), see enum station_parameters_apply_mask listen_interval listen interval or -1 for no change aid AID or zero for no change supported_rates_len number of supported rates plink_action plink action to take plink_state set the peer link state for a station ht_capa HT capabilities of station vht_capa VHT capabilities of station uapsd_queues bitmap of queues configured for uapsd. same format as the AC bitmap in the QoS info field max_sp max Service Period. same format as the MAX_SP in the QoS info field (but already shifted down) local_pm local link-specific mesh power save mode (no change when set to unknown) capability station capability ext_capab extended capabilities of the station ext_capab_len number of extended capabilities supported_channels supported channels in IEEE 802.11 format supported_channels_len number of supported channels supported_oper_classes supported oper classes in IEEE 802.11 format supported_oper_classes_len number of supported operating classes opmode_notif operating mode field from Operating Mode Notification opmode_notif_used information if operating mode field is used Description Used to change and create a new station. LINUX Kernel Hackers Manual July 2017 enum rate_info_flags 9 4.1.27 enum rate_info_flags bitrate info flags Synopsis enum rate_info_flags { RATE_INFO_FLAGS_MCS, RATE_INFO_FLAGS_VHT_MCS, RATE_INFO_FLAGS_SHORT_GI, RATE_INFO_FLAGS_60G }; Constants RATE_INFO_FLAGS_MCS mcs field filled with HT MCS RATE_INFO_FLAGS_VHT_MCS mcs field filled with VHT MCS RATE_INFO_FLAGS_SHORT_GI 400ns guard interval RATE_INFO_FLAGS_60G 60GHz MCS Description Used by the driver to indicate the specific rate transmission type for 802.11n transmissions. LINUX Kernel Hackers Manual July 2017 struct rate_info 9 4.1.27 struct rate_info bitrate information Synopsis struct rate_info { u8 flags; u8 mcs; u16 legacy; u8 nss; u8 bw; }; Members flags bitflag of flags from enum rate_info_flags mcs mcs index if struct describes a 802.11n bitrate legacy bitrate in 100kbit/s for 802.11abg nss number of streams (VHT only) bw bandwidth (from enum rate_info_bw) Description Information about a receiving or transmitting bitrate LINUX Kernel Hackers Manual July 2017 struct station_info 9 4.1.27 struct station_info station information Synopsis struct station_info { u32 filled; u32 connected_time; u32 inactive_time; u64 rx_bytes; u64 tx_bytes; u16 llid; u16 plid; u8 plink_state; s8 signal; s8 signal_avg; u8 chains; s8 chain_signal[IEEE80211_MAX_CHAINS]; s8 chain_signal_avg[IEEE80211_MAX_CHAINS]; struct rate_info txrate; struct rate_info rxrate; u32 rx_packets; u32 tx_packets; u32 tx_retries; u32 tx_failed; u32 rx_dropped_misc; struct sta_bss_parameters bss_param; struct nl80211_sta_flag_update sta_flags; int generation; const u8 * assoc_req_ies; size_t assoc_req_ies_len; u32 beacon_loss_count; s64 t_offset; enum nl80211_mesh_power_mode local_pm; enum nl80211_mesh_power_mode peer_pm; enum nl80211_mesh_power_mode nonpeer_pm; u32 expected_throughput; u64 rx_beacon; u8 rx_beacon_signal_avg; struct cfg80211_tid_stats pertid[IEEE80211_NUM_TIDS + 1]; }; Members filled bitflag of flags using the bits of enum nl80211_sta_info to indicate the relevant values in this struct for them connected_time time(in secs) since a station is last connected inactive_time time since last station activity (tx/rx) in milliseconds rx_bytes bytes (size of MPDUs) received from this station tx_bytes bytes (size of MPDUs) transmitted to this station llid mesh local link id plid mesh peer link id plink_state mesh peer link state signal The signal strength, type depends on the wiphy's signal_type. For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_. signal_avg Average signal strength, type depends on the wiphy's signal_type. For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_. chains bitmask for filled values in chain_signal, chain_signal_avg chain_signal[IEEE80211_MAX_CHAINS] per-chain signal strength of last received packet in dBm chain_signal_avg[IEEE80211_MAX_CHAINS] per-chain signal strength average in dBm txrate current unicast bitrate from this station rxrate current unicast bitrate to this station rx_packets packets (MSDUs & MMPDUs) received from this station tx_packets packets (MSDUs & MMPDUs) transmitted to this station tx_retries cumulative retry counts (MPDUs) tx_failed number of failed transmissions (MPDUs) (retries exceeded, no ACK) rx_dropped_misc Dropped for un-specified reason. bss_param current BSS parameters sta_flags station flags mask & values generation generation number for nl80211 dumps. This number should increase every time the list of stations changes, i.e. when a station is added or removed, so that userspace can tell whether it got a consistent snapshot. assoc_req_ies IEs from (Re)Association Request. This is used only when in AP mode with drivers that do not use user space MLME/SME implementation. The information is provided for the cfg80211_new_sta calls to notify user space of the IEs. assoc_req_ies_len Length of assoc_req_ies buffer in octets. beacon_loss_count Number of times beacon loss event has triggered. t_offset Time offset of the station relative to this host. local_pm local mesh STA power save mode peer_pm peer mesh STA power save mode nonpeer_pm non-peer mesh STA power save mode expected_throughput expected throughput in kbps (including 802.11 headers) towards this station. rx_beacon number of beacons received from this peer rx_beacon_signal_avg signal strength average (in dBm) for beacons received from this peer pertid[IEEE80211_NUM_TIDS + 1] per-TID statistics, see struct cfg80211_tid_stats, using the last (IEEE80211_NUM_TIDS) index for MSDUs not encapsulated in QoS-MPDUs. Description Station information filled by driver for get_station and dump_station. LINUX Kernel Hackers Manual July 2017 enum monitor_flags 9 4.1.27 enum monitor_flags monitor flags Synopsis enum monitor_flags { MONITOR_FLAG_FCSFAIL, MONITOR_FLAG_PLCPFAIL, MONITOR_FLAG_CONTROL, MONITOR_FLAG_OTHER_BSS, MONITOR_FLAG_COOK_FRAMES, MONITOR_FLAG_ACTIVE }; Constants MONITOR_FLAG_FCSFAIL pass frames with bad FCS MONITOR_FLAG_PLCPFAIL pass frames with bad PLCP MONITOR_FLAG_CONTROL pass control frames MONITOR_FLAG_OTHER_BSS disable BSSID filtering MONITOR_FLAG_COOK_FRAMES report frames after processing MONITOR_FLAG_ACTIVE active monitor, ACKs frames on its MAC address Description Monitor interface configuration flags. Note that these must be the bits according to the nl80211 flags. LINUX Kernel Hackers Manual July 2017 enum mpath_info_flags 9 4.1.27 enum mpath_info_flags mesh path information flags Synopsis enum mpath_info_flags { MPATH_INFO_FRAME_QLEN, MPATH_INFO_SN, MPATH_INFO_METRIC, MPATH_INFO_EXPTIME, MPATH_INFO_DISCOVERY_TIMEOUT, MPATH_INFO_DISCOVERY_RETRIES, MPATH_INFO_FLAGS }; Constants MPATH_INFO_FRAME_QLEN frame_qlen filled MPATH_INFO_SN sn filled MPATH_INFO_METRIC metric filled MPATH_INFO_EXPTIME exptime filled MPATH_INFO_DISCOVERY_TIMEOUT discovery_timeout filled MPATH_INFO_DISCOVERY_RETRIES discovery_retries filled MPATH_INFO_FLAGS flags filled Description Used by the driver to indicate which info in struct mpath_info it has filled in during get_station or dump_station. LINUX Kernel Hackers Manual July 2017 struct mpath_info 9 4.1.27 struct mpath_info mesh path information Synopsis struct mpath_info { u32 filled; u32 frame_qlen; u32 sn; u32 metric; u32 exptime; u32 discovery_timeout; u8 discovery_retries; u8 flags; int generation; }; Members filled bitfield of flags from enum mpath_info_flags frame_qlen number of queued frames for this destination sn target sequence number metric metric (cost) of this mesh path exptime expiration time for the mesh path from now, in msecs discovery_timeout total mesh path discovery timeout, in msecs discovery_retries mesh path discovery retries flags mesh path flags generation generation number for nl80211 dumps. This number should increase every time the list of mesh paths changes, i.e. when a station is added or removed, so that userspace can tell whether it got a consistent snapshot. Description Mesh path information filled by driver for get_mpath and dump_mpath. LINUX Kernel Hackers Manual July 2017 struct bss_parameters 9 4.1.27 struct bss_parameters BSS parameters Synopsis struct bss_parameters { int use_cts_prot; int use_short_preamble; int use_short_slot_time; const u8 * basic_rates; u8 basic_rates_len; int ap_isolate; int ht_opmode; s8 p2p_ctwindow; s8 p2p_opp_ps; }; Members use_cts_prot Whether to use CTS protection (0 = no, 1 = yes, -1 = do not change) use_short_preamble Whether the use of short preambles is allowed (0 = no, 1 = yes, -1 = do not change) use_short_slot_time Whether the use of short slot time is allowed (0 = no, 1 = yes, -1 = do not change) basic_rates basic rates in IEEE 802.11 format (or NULL for no change) basic_rates_len number of basic rates ap_isolate do not forward packets between connected stations ht_opmode HT Operation mode (u16 = opmode, -1 = do not change) p2p_ctwindow P2P CT Window (-1 = no change) p2p_opp_ps P2P opportunistic PS (-1 = no change) Description Used to change BSS parameters (mainly for AP mode). LINUX Kernel Hackers Manual July 2017 struct ieee80211_txq_params 9 4.1.27 struct ieee80211_txq_params TX queue parameters Synopsis struct ieee80211_txq_params { enum nl80211_ac ac; u16 txop; u16 cwmin; u16 cwmax; u8 aifs; }; Members ac AC identifier txop Maximum burst time in units of 32 usecs, 0 meaning disabled cwmin Minimum contention window [a value of the form 2^n-1 in the range 1..32767] cwmax Maximum contention window [a value of the form 2^n-1 in the range 1..32767] aifs Arbitration interframe space [0..255] LINUX Kernel Hackers Manual July 2017 struct cfg80211_crypto_settings 9 4.1.27 struct cfg80211_crypto_settings Crypto settings Synopsis struct cfg80211_crypto_settings { u32 wpa_versions; u32 cipher_group; int n_ciphers_pairwise; u32 ciphers_pairwise[NL80211_MAX_NR_CIPHER_SUITES]; int n_akm_suites; u32 akm_suites[NL80211_MAX_NR_AKM_SUITES]; bool control_port; __be16 control_port_ethertype; bool control_port_no_encrypt; }; Members wpa_versions indicates which, if any, WPA versions are enabled (from enum nl80211_wpa_versions) cipher_group group key cipher suite (or 0 if unset) n_ciphers_pairwise number of AP supported unicast ciphers ciphers_pairwise[NL80211_MAX_NR_CIPHER_SUITES] unicast key cipher suites n_akm_suites number of AKM suites akm_suites[NL80211_MAX_NR_AKM_SUITES] AKM suites control_port Whether user space controls IEEE 802.1X port, i.e., sets/clears NL80211_STA_FLAG_AUTHORIZED. If true, the driver is required to assume that the port is unauthorized until authorized by user space. Otherwise, port is marked authorized by default. control_port_ethertype the control port protocol that should be allowed through even on unauthorized ports control_port_no_encrypt TRUE to prevent encryption of control port protocol frames. LINUX Kernel Hackers Manual July 2017 struct cfg80211_auth_request 9 4.1.27 struct cfg80211_auth_request Authentication request data Synopsis struct cfg80211_auth_request { struct cfg80211_bss * bss; const u8 * ie; size_t ie_len; enum nl80211_auth_type auth_type; const u8 * key; u8 key_len; u8 key_idx; const u8 * sae_data; size_t sae_data_len; }; Members bss The BSS to authenticate with, the callee must obtain a reference to it if it needs to keep it. ie Extra IEs to add to Authentication frame or NULL ie_len Length of ie buffer in octets auth_type Authentication type (algorithm) key WEP key for shared key authentication key_len length of WEP key for shared key authentication key_idx index of WEP key for shared key authentication sae_data Non-IE data to use with SAE or NULL. This starts with Authentication transaction sequence number field. sae_data_len Length of sae_data buffer in octets Description This structure provides information needed to complete IEEE 802.11 authentication. LINUX Kernel Hackers Manual July 2017 struct cfg80211_assoc_request 9 4.1.27 struct cfg80211_assoc_request (Re)Association request data Synopsis struct cfg80211_assoc_request { struct cfg80211_bss * bss; const u8 * ie; const u8 * prev_bssid; size_t ie_len; struct cfg80211_crypto_settings crypto; bool use_mfp; u32 flags; struct ieee80211_ht_cap ht_capa; struct ieee80211_ht_cap ht_capa_mask; struct ieee80211_vht_cap vht_capa; struct ieee80211_vht_cap vht_capa_mask; }; Members bss The BSS to associate with. If the call is successful the driver is given a reference that it must give back to cfg80211_send_rx_assoc or to cfg80211_assoc_timeout. To ensure proper refcounting, new association requests while already associating must be rejected. ie Extra IEs to add to (Re)Association Request frame or NULL prev_bssid previous BSSID, if not NULL use reassociate frame ie_len Length of ie buffer in octets crypto crypto settings use_mfp Use management frame protection (IEEE 802.11w) in this association flags See enum cfg80211_assoc_req_flags ht_capa HT Capabilities over-rides. Values set in ht_capa_mask will be used in ht_capa. Un-supported values will be ignored. ht_capa_mask The bits of ht_capa which are to be used. vht_capa VHT capability override vht_capa_mask VHT capability mask indicating which fields to use Description This structure provides information needed to complete IEEE 802.11 (re)association. LINUX Kernel Hackers Manual July 2017 struct cfg80211_deauth_request 9 4.1.27 struct cfg80211_deauth_request Deauthentication request data Synopsis struct cfg80211_deauth_request { const u8 * bssid; const u8 * ie; size_t ie_len; u16 reason_code; bool local_state_change; }; Members bssid the BSSID of the BSS to deauthenticate from ie Extra IEs to add to Deauthentication frame or NULL ie_len Length of ie buffer in octets reason_code The reason code for the deauthentication local_state_change if set, change local state only and do not set a deauth frame Description This structure provides information needed to complete IEEE 802.11 deauthentication. LINUX Kernel Hackers Manual July 2017 struct cfg80211_disassoc_request 9 4.1.27 struct cfg80211_disassoc_request Disassociation request data Synopsis struct cfg80211_disassoc_request { struct cfg80211_bss * bss; const u8 * ie; size_t ie_len; u16 reason_code; bool local_state_change; }; Members bss the BSS to disassociate from ie Extra IEs to add to Disassociation frame or NULL ie_len Length of ie buffer in octets reason_code The reason code for the disassociation local_state_change This is a request for a local state only, i.e., no Disassociation frame is to be transmitted. Description This structure provides information needed to complete IEEE 802.11 disassocation. LINUX Kernel Hackers Manual July 2017 struct cfg80211_ibss_params 9 4.1.27 struct cfg80211_ibss_params IBSS parameters Synopsis struct cfg80211_ibss_params { const u8 * ssid; const u8 * bssid; struct cfg80211_chan_def chandef; const u8 * ie; u8 ssid_len; u8 ie_len; u16 beacon_interval; u32 basic_rates; bool channel_fixed; bool privacy; bool control_port; bool userspace_handles_dfs; int mcast_rate[IEEE80211_NUM_BANDS]; struct ieee80211_ht_cap ht_capa; struct ieee80211_ht_cap ht_capa_mask; }; Members ssid The SSID, will always be non-null. bssid Fixed BSSID requested, maybe be NULL, if set do not search for IBSSs with a different BSSID. chandef defines the channel to use if no other IBSS to join can be found ie information element(s) to include in the beacon ssid_len The length of the SSID, will always be non-zero. ie_len length of that beacon_interval beacon interval to use basic_rates bitmap of basic rates to use when creating the IBSS channel_fixed The channel should be fixed -- do not search for IBSSs to join on other channels. privacy this is a protected network, keys will be configured after joining control_port whether user space controls IEEE 802.1X port, i.e., sets/clears NL80211_STA_FLAG_AUTHORIZED. If true, the driver is required to assume that the port is unauthorized until authorized by user space. Otherwise, port is marked authorized by default. userspace_handles_dfs whether user space controls DFS operation, i.e. changes the channel when a radar is detected. This is required to operate on DFS channels. mcast_rate[IEEE80211_NUM_BANDS] per-band multicast rate index + 1 (0: disabled) ht_capa HT Capabilities over-rides. Values set in ht_capa_mask will be used in ht_capa. Un-supported values will be ignored. ht_capa_mask The bits of ht_capa which are to be used. Description This structure defines the IBSS parameters for the join_ibss method. LINUX Kernel Hackers Manual July 2017 struct cfg80211_connect_params 9 4.1.27 struct cfg80211_connect_params Connection parameters Synopsis struct cfg80211_connect_params { struct ieee80211_channel * channel; struct ieee80211_channel * channel_hint; const u8 * bssid; const u8 * bssid_hint; const u8 * ssid; size_t ssid_len; enum nl80211_auth_type auth_type; const u8 * ie; size_t ie_len; bool privacy; enum nl80211_mfp mfp; struct cfg80211_crypto_settings crypto; const u8 * key; u8 key_len; u8 key_idx; u32 flags; int bg_scan_period; struct ieee80211_ht_cap ht_capa; struct ieee80211_ht_cap ht_capa_mask; struct ieee80211_vht_cap vht_capa; struct ieee80211_vht_cap vht_capa_mask; }; Members channel The channel to use or NULL if not specified (auto-select based on scan results) channel_hint The channel of the recommended BSS for initial connection or NULL if not specified bssid The AP BSSID or NULL if not specified (auto-select based on scan results) bssid_hint The recommended AP BSSID for initial connection to the BSS or NULL if not specified. Unlike the bssid parameter, the driver is allowed to ignore this bssid_hint if it has knowledge of a better BSS to use. ssid SSID ssid_len Length of ssid in octets auth_type Authentication type (algorithm) ie IEs for association request ie_len Length of assoc_ie in octets privacy indicates whether privacy-enabled APs should be used mfp indicate whether management frame protection is used crypto crypto settings key WEP key for shared key authentication key_len length of WEP key for shared key authentication key_idx index of WEP key for shared key authentication flags See enum cfg80211_assoc_req_flags bg_scan_period Background scan period in seconds or -1 to indicate that default value is to be used. ht_capa HT Capabilities over-rides. Values set in ht_capa_mask will be used in ht_capa. Un-supported values will be ignored. ht_capa_mask The bits of ht_capa which are to be used. vht_capa VHT Capability overrides vht_capa_mask The bits of vht_capa which are to be used. Description This structure provides information needed to complete IEEE 802.11 authentication and association. LINUX Kernel Hackers Manual July 2017 struct cfg80211_pmksa 9 4.1.27 struct cfg80211_pmksa PMK Security Association Synopsis struct cfg80211_pmksa { const u8 * bssid; const u8 * pmkid; }; Members bssid The AP's BSSID. pmkid The PMK material itself. Description This structure is passed to the set/del_pmksa method for PMKSA caching. LINUX Kernel Hackers Manual July 2017 cfg80211_rx_mlme_mgmt 9 4.1.27 cfg80211_rx_mlme_mgmt notification of processed MLME management frame Synopsis void cfg80211_rx_mlme_mgmt struct net_device * dev const u8 * buf size_t len Arguments dev network device buf authentication frame (header + body) len length of the frame data Description This function is called whenever an authentication, disassociation or deauthentication frame has been received and processed in station mode. After being asked to authenticate via cfg80211_ops :auth the driver must call either this function or cfg80211_auth_timeout. After being asked to associate via cfg80211_ops :assoc the driver must call either this function or cfg80211_auth_timeout. While connected, the driver must calls this for received and processed disassociation and deauthentication frames. If the frame couldn't be used because it was unprotected, the driver must call the function cfg80211_rx_unprot_mlme_mgmt instead. This function may sleep. The caller must hold the corresponding wdev's mutex. LINUX Kernel Hackers Manual July 2017 cfg80211_auth_timeout 9 4.1.27 cfg80211_auth_timeout notification of timed out authentication Synopsis void cfg80211_auth_timeout struct net_device * dev const u8 * addr Arguments dev network device addr The MAC address of the device with which the authentication timed out Description This function may sleep. The caller must hold the corresponding wdev's mutex. LINUX Kernel Hackers Manual July 2017 cfg80211_rx_assoc_resp 9 4.1.27 cfg80211_rx_assoc_resp notification of processed association response Synopsis void cfg80211_rx_assoc_resp struct net_device * dev struct cfg80211_bss * bss const u8 * buf size_t len int uapsd_queues Arguments dev network device bss the BSS that association was requested with, ownership of the pointer moves to cfg80211 in this call buf authentication frame (header + body) len length of the frame data uapsd_queues bitmap of ACs configured to uapsd. -1 if n/a. After being asked to associate via cfg80211_ops :assoc the driver must call either this function or cfg80211_auth_timeout. This function may sleep. The caller must hold the corresponding wdev's mutex. LINUX Kernel Hackers Manual July 2017 cfg80211_assoc_timeout 9 4.1.27 cfg80211_assoc_timeout notification of timed out association Synopsis void cfg80211_assoc_timeout struct net_device * dev struct cfg80211_bss * bss Arguments dev network device bss The BSS entry with which association timed out. Description This function may sleep. The caller must hold the corresponding wdev's mutex. LINUX Kernel Hackers Manual July 2017 cfg80211_tx_mlme_mgmt 9 4.1.27 cfg80211_tx_mlme_mgmt notification of transmitted deauth/disassoc frame Synopsis void cfg80211_tx_mlme_mgmt struct net_device * dev const u8 * buf size_t len Arguments dev network device buf 802.11 frame (header + body) len length of the frame data Description This function is called whenever deauthentication has been processed in station mode. This includes both received deauthentication frames and locally generated ones. This function may sleep. The caller must hold the corresponding wdev's mutex. LINUX Kernel Hackers Manual July 2017 cfg80211_ibss_joined 9 4.1.27 cfg80211_ibss_joined notify cfg80211 that device joined an IBSS Synopsis void cfg80211_ibss_joined struct net_device * dev const u8 * bssid struct ieee80211_channel * channel gfp_t gfp Arguments dev network device bssid the BSSID of the IBSS joined channel the channel of the IBSS joined gfp allocation flags Description This function notifies cfg80211 that the device joined an IBSS or switched to a different BSSID. Before this function can be called, either a beacon has to have been received from the IBSS, or one of the cfg80211_inform_bss{,_frame} functions must have been called with the locally generated beacon -- this guarantees that there is always a scan result for this IBSS. cfg80211 will handle the rest. LINUX Kernel Hackers Manual July 2017 cfg80211_connect_result 9 4.1.27 cfg80211_connect_result notify cfg80211 of connection result Synopsis void cfg80211_connect_result struct net_device * dev const u8 * bssid const u8 * req_ie size_t req_ie_len const u8 * resp_ie size_t resp_ie_len u16 status gfp_t gfp Arguments dev network device bssid the BSSID of the AP req_ie association request IEs (maybe be NULL) req_ie_len association request IEs length resp_ie association response IEs (may be NULL) resp_ie_len assoc response IEs length status status code, 0 for successful connection, use WLAN_STATUS_UNSPECIFIED_FAILURE if your device cannot give you the real status code for failures. gfp allocation flags Description It should be called by the underlying driver whenever connect has succeeded. LINUX Kernel Hackers Manual July 2017 cfg80211_roamed 9 4.1.27 cfg80211_roamed notify cfg80211 of roaming Synopsis void cfg80211_roamed struct net_device * dev struct ieee80211_channel * channel const u8 * bssid const u8 * req_ie size_t req_ie_len const u8 * resp_ie size_t resp_ie_len gfp_t gfp Arguments dev network device channel the channel of the new AP bssid the BSSID of the new AP req_ie association request IEs (maybe be NULL) req_ie_len association request IEs length resp_ie association response IEs (may be NULL) resp_ie_len assoc response IEs length gfp allocation flags Description It should be called by the underlying driver whenever it roamed from one AP to another while connected. LINUX Kernel Hackers Manual July 2017 cfg80211_disconnected 9 4.1.27 cfg80211_disconnected notify cfg80211 that connection was dropped Synopsis void cfg80211_disconnected struct net_device * dev u16 reason const u8 * ie size_t ie_len gfp_t gfp Arguments dev network device reason reason code for the disconnection, set it to 0 if unknown ie information elements of the deauth/disassoc frame (may be NULL) ie_len length of IEs gfp allocation flags Description After it calls this function, the driver should enter an idle state and not try to connect to any AP any more. LINUX Kernel Hackers Manual July 2017 cfg80211_ready_on_channel 9 4.1.27 cfg80211_ready_on_channel notification of remain_on_channel start Synopsis void cfg80211_ready_on_channel struct wireless_dev * wdev u64 cookie struct ieee80211_channel * chan unsigned int duration gfp_t gfp Arguments wdev wireless device cookie the request cookie chan The current channel (from remain_on_channel request) duration Duration in milliseconds that the driver intents to remain on the channel gfp allocation flags LINUX Kernel Hackers Manual July 2017 cfg80211_remain_on_channel_expired 9 4.1.27 cfg80211_remain_on_channel_expired remain_on_channel duration expired Synopsis void cfg80211_remain_on_channel_expired struct wireless_dev * wdev u64 cookie struct ieee80211_channel * chan gfp_t gfp Arguments wdev wireless device cookie the request cookie chan The current channel (from remain_on_channel request) gfp allocation flags LINUX Kernel Hackers Manual July 2017 cfg80211_new_sta 9 4.1.27 cfg80211_new_sta notify userspace about station Synopsis void cfg80211_new_sta struct net_device * dev const u8 * mac_addr struct station_info * sinfo gfp_t gfp Arguments dev the netdev mac_addr the station's address sinfo the station information gfp allocation flags LINUX Kernel Hackers Manual July 2017 cfg80211_rx_mgmt 9 4.1.27 cfg80211_rx_mgmt notification of received, unprocessed management frame Synopsis bool cfg80211_rx_mgmt struct wireless_dev * wdev int freq int sig_dbm const u8 * buf size_t len u32 flags Arguments wdev wireless device receiving the frame freq Frequency on which the frame was received in MHz sig_dbm signal strength in mBm, or 0 if unknown buf Management frame (header + body) len length of the frame data flags flags, as defined in enum nl80211_rxmgmt_flags Description This function is called whenever an Action frame is received for a station mode interface, but is not processed in kernel. Return true if a user space application has registered for this frame. For action frames, that makes it responsible for rejecting unrecognized action frames; false otherwise, in which case for action frames the driver is responsible for rejecting the frame. LINUX Kernel Hackers Manual July 2017 cfg80211_mgmt_tx_status 9 4.1.27 cfg80211_mgmt_tx_status notification of TX status for management frame Synopsis void cfg80211_mgmt_tx_status struct wireless_dev * wdev u64 cookie const u8 * buf size_t len bool ack gfp_t gfp Arguments wdev wireless device receiving the frame cookie Cookie returned by cfg80211_ops::mgmt_tx buf Management frame (header + body) len length of the frame data ack Whether frame was acknowledged gfp context flags Description This function is called whenever a management frame was requested to be transmitted with cfg80211_ops :mgmt_tx to report the TX status of the transmission attempt. LINUX Kernel Hackers Manual July 2017 cfg80211_cqm_rssi_notify 9 4.1.27 cfg80211_cqm_rssi_notify connection quality monitoring rssi event Synopsis void cfg80211_cqm_rssi_notify struct net_device * dev enum nl80211_cqm_rssi_threshold_event rssi_event gfp_t gfp Arguments dev network device rssi_event the triggered RSSI event gfp context flags Description This function is called when a configured connection quality monitoring rssi threshold reached event occurs. LINUX Kernel Hackers Manual July 2017 cfg80211_cqm_pktloss_notify 9 4.1.27 cfg80211_cqm_pktloss_notify notify userspace about packetloss to peer Synopsis void cfg80211_cqm_pktloss_notify struct net_device * dev const u8 * peer u32 num_packets gfp_t gfp Arguments dev network device peer peer's MAC address num_packets how many packets were lost -- should be a fixed threshold but probably no less than maybe 50, or maybe a throughput dependent threshold (to account for temporary interference) gfp context flags LINUX Kernel Hackers Manual July 2017 cfg80211_michael_mic_failure 9 4.1.27 cfg80211_michael_mic_failure notification of Michael MIC failure (TKIP) Synopsis void cfg80211_michael_mic_failure struct net_device * dev const u8 * addr enum nl80211_key_type key_type int key_id const u8 * tsc gfp_t gfp Arguments dev network device addr The source MAC address of the frame key_type The key type that the received frame used key_id Key identifier (0..3). Can be -1 if missing. tsc The TSC value of the frame that generated the MIC failure (6 octets) gfp allocation flags Description This function is called whenever the local MAC detects a MIC failure in a received frame. This matches with MLME-MICHAELMICFAILURE.indication primitive. Scanning and BSS list handling The scanning process itself is fairly simple, but cfg80211 offers quite a bit of helper functionality. To start a scan, the scan operation will be invoked with a scan definition. This scan definition contains the channels to scan, and the SSIDs to send probe requests for (including the wildcard, if desired). A passive scan is indicated by having no SSIDs to probe. Additionally, a scan request may contain extra information elements that should be added to the probe request. The IEs are guaranteed to be well-formed, and will not exceed the maximum length the driver advertised in the wiphy structure. When scanning finds a BSS, cfg80211 needs to be notified of that, because it is responsible for maintaining the BSS list; the driver should not maintain a list itself. For this notification, various functions exist. Since drivers do not maintain a BSS list, there are also a number of functions to search for a BSS and obtain information about it from the BSS structure cfg80211 maintains. The BSS list is also made available to userspace. LINUX Kernel Hackers Manual July 2017 struct cfg80211_ssid 9 4.1.27 struct cfg80211_ssid SSID description Synopsis struct cfg80211_ssid { u8 ssid[IEEE80211_MAX_SSID_LEN]; u8 ssid_len; }; Members ssid[IEEE80211_MAX_SSID_LEN] the SSID ssid_len length of the ssid LINUX Kernel Hackers Manual July 2017 struct cfg80211_scan_request 9 4.1.27 struct cfg80211_scan_request scan request description Synopsis struct cfg80211_scan_request { struct cfg80211_ssid * ssids; int n_ssids; u32 n_channels; enum nl80211_bss_scan_width scan_width; const u8 * ie; size_t ie_len; u32 flags; u32 rates[IEEE80211_NUM_BANDS]; struct wireless_dev * wdev; u8 mac_addr[ETH_ALEN]; u8 mac_addr_mask[ETH_ALEN]; struct wiphy * wiphy; unsigned long scan_start; bool aborted; bool notified; bool no_cck; struct ieee80211_channel * channels[0]; }; Members ssids SSIDs to scan for (active scan only) n_ssids number of SSIDs n_channels total number of channels to scan scan_width channel width for scanning ie optional information element(s) to add into Probe Request or NULL ie_len length of ie in octets flags bit field of flags controlling operation rates[IEEE80211_NUM_BANDS] bitmap of rates to advertise for each band wdev the wireless device to scan for mac_addr[ETH_ALEN] MAC address used with randomisation mac_addr_mask[ETH_ALEN] MAC address mask used with randomisation, bits that are 0 in the mask should be randomised, bits that are 1 should be taken from the mac_addr wiphy the wiphy this was for scan_start time (in jiffies) when the scan started aborted (internal) scan request was notified as aborted notified (internal) scan request was notified as done or aborted no_cck used to send probe requests at non CCK rate in 2GHz band channels[0] channels to scan on. LINUX Kernel Hackers Manual July 2017 cfg80211_scan_done 9 4.1.27 cfg80211_scan_done notify that scan finished Synopsis void cfg80211_scan_done struct cfg80211_scan_request * request bool aborted Arguments request the corresponding scan request aborted set to true if the scan was aborted for any reason, userspace will be notified of that LINUX Kernel Hackers Manual July 2017 struct cfg80211_bss 9 4.1.27 struct cfg80211_bss BSS description Synopsis struct cfg80211_bss { struct ieee80211_channel * channel; enum nl80211_bss_scan_width scan_width; const struct cfg80211_bss_ies __rcu * ies; const struct cfg80211_bss_ies __rcu * beacon_ies; const struct cfg80211_bss_ies __rcu * proberesp_ies; struct cfg80211_bss * hidden_beacon_bss; s32 signal; u16 beacon_interval; u16 capability; u8 bssid[ETH_ALEN]; u8 priv[0]; }; Members channel channel this BSS is on scan_width width of the control channel ies the information elements (Note that there is no guarantee that these are well-formed!); this is a pointer to either the beacon_ies or proberesp_ies depending on whether Probe Response frame has been received. It is always non-NULL. beacon_ies the information elements from the last Beacon frame (implementation note: if hidden_beacon_bss is set this struct doesn't own the beacon_ies, but they're just pointers to the ones from the hidden_beacon_bss struct) proberesp_ies the information elements from the last Probe Response frame hidden_beacon_bss in case this BSS struct represents a probe response from a BSS that hides the SSID in its beacon, this points to the BSS struct that holds the beacon data. beacon_ies is still valid, of course, and points to the same data as hidden_beacon_bss->beacon_ies in that case. signal signal strength value (type depends on the wiphy's signal_type) beacon_interval the beacon interval as from the frame capability the capability field in host byte order bssid[ETH_ALEN] BSSID of the BSS priv[0] private area for driver use, has at least wiphy->bss_priv_size bytes Description This structure describes a BSS (which may also be a mesh network) for use in scan results and similar. LINUX Kernel Hackers Manual July 2017 cfg80211_inform_bss_width_frame 9 4.1.27 cfg80211_inform_bss_width_frame inform cfg80211 of a received BSS frame Synopsis struct cfg80211_bss * cfg80211_inform_bss_width_frame struct wiphy * wiphy struct ieee80211_channel * rx_channel enum nl80211_bss_scan_width scan_width struct ieee80211_mgmt * mgmt size_t len s32 signal gfp_t gfp Arguments wiphy the wiphy reporting the BSS rx_channel The channel the frame was received on scan_width width of the control channel mgmt the management frame (probe response or beacon) len length of the management frame signal the signal strength, type depends on the wiphy's signal_type gfp context flags Description This informs cfg80211 that BSS information was found and the BSS should be updated/added. Return A referenced struct, must be released with cfg80211_put_bss! Or NULL on error. LINUX Kernel Hackers Manual July 2017 cfg80211_inform_bss_width 9 4.1.27 cfg80211_inform_bss_width inform cfg80211 of a new BSS Synopsis struct cfg80211_bss * cfg80211_inform_bss_width struct wiphy * wiphy struct ieee80211_channel * rx_channel enum nl80211_bss_scan_width scan_width enum cfg80211_bss_frame_type ftype const u8 * bssid u64 tsf u16 capability u16 beacon_interval const u8 * ie size_t ielen s32 signal gfp_t gfp Arguments wiphy the wiphy reporting the BSS rx_channel The channel the frame was received on scan_width width of the control channel ftype frame type (if known) bssid the BSSID of the BSS tsf the TSF sent by the peer in the beacon/probe response (or 0) capability the capability field sent by the peer beacon_interval the beacon interval announced by the peer ie additional IEs sent by the peer ielen length of the additional IEs signal the signal strength, type depends on the wiphy's signal_type gfp context flags Description This informs cfg80211 that BSS information was found and the BSS should be updated/added. Return A referenced struct, must be released with cfg80211_put_bss! Or NULL on error. LINUX Kernel Hackers Manual July 2017 cfg80211_unlink_bss 9 4.1.27 cfg80211_unlink_bss unlink BSS from internal data structures Synopsis void cfg80211_unlink_bss struct wiphy * wiphy struct cfg80211_bss * bss Arguments wiphy the wiphy bss the bss to remove Description This function removes the given BSS from the internal data structures thereby making it no longer show up in scan results etc. Use this function when you detect a BSS is gone. Normally BSSes will also time out, so it is not necessary to use this function at all. LINUX Kernel Hackers Manual July 2017 cfg80211_find_ie 9 4.1.27 cfg80211_find_ie find information element in data Synopsis const u8 * cfg80211_find_ie u8 eid const u8 * ies int len Arguments eid element ID ies data consisting of IEs len length of data Return NULL if the element ID could not be found or if the element is invalid (claims to be longer than the given data), or a pointer to the first byte of the requested element, that is the byte containing the element ID. Note There are no checks on the element length other than having to fit into the given data. LINUX Kernel Hackers Manual July 2017 ieee80211_bss_get_ie 9 4.1.27 ieee80211_bss_get_ie find IE with given ID Synopsis const u8 * ieee80211_bss_get_ie struct cfg80211_bss * bss u8 ie Arguments bss the bss to search ie the IE ID Description Note that the return value is an RCU-protected pointer, so rcu_read_lock must be held when calling this function. Return NULL if not found. Utility functions cfg80211 offers a number of utility functions that can be useful. LINUX Kernel Hackers Manual July 2017 ieee80211_channel_to_frequency 9 4.1.27 ieee80211_channel_to_frequency convert channel number to frequency Synopsis int ieee80211_channel_to_frequency int chan enum ieee80211_band band Arguments chan channel number band band, necessary due to channel number overlap Return The corresponding frequency (in MHz), or 0 if the conversion failed. LINUX Kernel Hackers Manual July 2017 ieee80211_frequency_to_channel 9 4.1.27 ieee80211_frequency_to_channel convert frequency to channel number Synopsis int ieee80211_frequency_to_channel int freq Arguments freq center frequency Return The corresponding channel, or 0 if the conversion failed. LINUX Kernel Hackers Manual July 2017 ieee80211_get_channel 9 4.1.27 ieee80211_get_channel get channel struct from wiphy for specified frequency Synopsis struct ieee80211_channel * ieee80211_get_channel struct wiphy * wiphy int freq Arguments wiphy the struct wiphy to get the channel for freq the center frequency of the channel Return The channel struct from wiphy at freq. LINUX Kernel Hackers Manual July 2017 ieee80211_get_response_rate 9 4.1.27 ieee80211_get_response_rate get basic rate for a given rate Synopsis struct ieee80211_rate * ieee80211_get_response_rate struct ieee80211_supported_band * sband u32 basic_rates int bitrate Arguments sband the band to look for rates in basic_rates bitmap of basic rates bitrate the bitrate for which to find the basic rate Return The basic rate corresponding to a given bitrate, that is the next lower bitrate contained in the basic rate map, which is, for this function, given as a bitmap of indices of rates in the band's bitrate table. LINUX Kernel Hackers Manual July 2017 ieee80211_hdrlen 9 4.1.27 ieee80211_hdrlen get header length in bytes from frame control Synopsis unsigned int __attribute_const__ ieee80211_hdrlen __le16 fc Arguments fc frame control field in little-endian format Return The header length in bytes. LINUX Kernel Hackers Manual July 2017 ieee80211_get_hdrlen_from_skb 9 4.1.27 ieee80211_get_hdrlen_from_skb get header length from data Synopsis unsigned 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. Return The 802.11 header length in bytes (not including encryption headers). Or 0 if the data in the sk_buff is too short to contain a valid 802.11 header. LINUX Kernel Hackers Manual July 2017 struct ieee80211_radiotap_iterator 9 4.1.27 struct ieee80211_radiotap_iterator tracks walk thru present radiotap args Synopsis struct ieee80211_radiotap_iterator { struct ieee80211_radiotap_header * _rtheader; const struct ieee80211_radiotap_vendor_namespaces * _vns; const struct ieee80211_radiotap_namespace * current_namespace; unsigned char * _arg; unsigned char * _next_ns_data; __le32 * _next_bitmap; unsigned char * this_arg; int this_arg_index; int this_arg_size; int is_radiotap_ns; int _max_length; int _arg_index; uint32_t _bitmap_shifter; int _reset_on_ext; }; Members _rtheader pointer to the radiotap header we are walking through _vns vendor namespace definitions current_namespace pointer to the current namespace definition (or internally NULL if the current namespace is unknown) _arg next argument pointer _next_ns_data beginning of the next namespace's data _next_bitmap internal pointer to next present u32 this_arg pointer to current radiotap arg; it is valid after each call to ieee80211_radiotap_iterator_next but also after ieee80211_radiotap_iterator_init where it will point to the beginning of the actual data portion this_arg_index index of current arg, valid after each successful call to ieee80211_radiotap_iterator_next this_arg_size length of the current arg, for convenience is_radiotap_ns indicates whether the current namespace is the default radiotap namespace or not _max_length length of radiotap header in cpu byte ordering _arg_index next argument index _bitmap_shifter internal shifter for curr u32 bitmap, b0 set == arg present _reset_on_ext internal; reset the arg index to 0 when going to the next bitmap word Description Describes the radiotap parser state. Fields prefixed with an underscore must not be used by users of the parser, only by the parser internally. Data path helpers In addition to generic utilities, cfg80211 also offers functions that help implement the data path for devices that do not do the 802.11/802.3 conversion on the device. LINUX Kernel Hackers Manual July 2017 ieee80211_data_to_8023 9 4.1.27 ieee80211_data_to_8023 convert an 802.11 data frame to 802.3 Synopsis int ieee80211_data_to_8023 struct sk_buff * skb const u8 * addr enum nl80211_iftype iftype Arguments skb the 802.11 data frame addr the device MAC address iftype the virtual interface type Return 0 on success. Non-zero on error. LINUX Kernel Hackers Manual July 2017 ieee80211_data_from_8023 9 4.1.27 ieee80211_data_from_8023 convert an 802.3 frame to 802.11 Synopsis int ieee80211_data_from_8023 struct sk_buff * skb const u8 * addr enum nl80211_iftype iftype const u8 * bssid bool qos Arguments skb the 802.3 frame addr the device MAC address iftype the virtual interface type bssid the network bssid (used only for iftype STATION and ADHOC) qos build 802.11 QoS data frame Return 0 on success, or a negative error code. LINUX Kernel Hackers Manual July 2017 ieee80211_amsdu_to_8023s 9 4.1.27 ieee80211_amsdu_to_8023s decode an IEEE 802.11n A-MSDU frame Synopsis void ieee80211_amsdu_to_8023s struct sk_buff * skb struct sk_buff_head * list const u8 * addr enum nl80211_iftype iftype const unsigned int extra_headroom bool has_80211_header Arguments skb The input IEEE 802.11n A-MSDU frame. list The output list of 802.3 frames. It must be allocated and initialized by by the caller. addr The device MAC address. iftype The device interface type. extra_headroom The hardware extra headroom for SKBs in the list. has_80211_header Set it true if SKB is with IEEE 802.11 header. Description Decode an IEEE 802.11n A-MSDU frame and convert it to a list of 802.3 frames. The list will be empty if the decode fails. The skb is consumed after the function returns. LINUX Kernel Hackers Manual July 2017 cfg80211_classify8021d 9 4.1.27 cfg80211_classify8021d determine the 802.1p/1d tag for a data frame Synopsis unsigned int cfg80211_classify8021d struct sk_buff * skb struct cfg80211_qos_map * qos_map Arguments skb the data frame qos_map Interworking QoS mapping or NULL if not in use Return The 802.1p/1d tag. Regulatory enforcement infrastructure TODO LINUX Kernel Hackers Manual July 2017 regulatory_hint 9 4.1.27 regulatory_hint driver hint to the wireless core a regulatory domain Synopsis int regulatory_hint struct wiphy * wiphy const char * alpha2 Arguments wiphy the wireless device giving the hint (used only for reporting conflicts) alpha2 the ISO/IEC 3166 alpha2 the driver claims its regulatory domain should be in. If rd is set this should be NULL. Note that if you set this to NULL you should still set rd->alpha2 to some accepted alpha2. Description Wireless drivers can use this function to hint to the wireless core what it believes should be the current regulatory domain by giving it an ISO/IEC 3166 alpha2 country code it knows its regulatory domain should be in or by providing a completely build regulatory domain. If the driver provides an ISO/IEC 3166 alpha2 userspace will be queried for a regulatory domain structure for the respective country. The wiphy must have been registered to cfg80211 prior to this call. For cfg80211 drivers this means you must first use wiphy_register, for mac80211 drivers you must first use ieee80211_register_hw. Drivers should check the return value, its possible you can get an -ENOMEM. Return 0 on success. -ENOMEM. LINUX Kernel Hackers Manual July 2017 wiphy_apply_custom_regulatory 9 4.1.27 wiphy_apply_custom_regulatory apply a custom driver regulatory domain Synopsis void wiphy_apply_custom_regulatory struct wiphy * wiphy const struct ieee80211_regdomain * regd Arguments wiphy the wireless device we want to process the regulatory domain on regd the custom regulatory domain to use for this wiphy Description Drivers can sometimes have custom regulatory domains which do not apply to a specific country. Drivers can use this to apply such custom regulatory domains. This routine must be called prior to wiphy registration. The custom regulatory domain will be trusted completely and as such previous default channel settings will be disregarded. If no rule is found for a channel on the regulatory domain the channel will be disabled. Drivers using this for a wiphy should also set the wiphy flag REGULATORY_CUSTOM_REG or cfg80211 will set it for the wiphy that called this helper. LINUX Kernel Hackers Manual July 2017 freq_reg_info 9 4.1.27 freq_reg_info get regulatory information for the given frequency Synopsis const struct ieee80211_reg_rule * freq_reg_info struct wiphy * wiphy u32 center_freq Arguments wiphy the wiphy for which we want to process this rule for center_freq Frequency in KHz for which we want regulatory information for Description Use this function to get the regulatory rule for a specific frequency on a given wireless device. If the device has a specific regulatory domain it wants to follow we respect that unless a country IE has been received and processed already. Return A valid pointer, or, when an error occurs, for example if no rule can be found, the return value is encoded using ERR_PTR. Use IS_ERR to check and PTR_ERR to obtain the numeric return value. The numeric return value will be -ERANGE if we determine the given center_freq does not even have a regulatory rule for a frequency range in the center_freq's band. See freq_in_rule_band for our current definition of a band -- this is purely subjective and right now it's 802.11 specific. RFkill integration RFkill integration in cfg80211 is almost invisible to drivers, as cfg80211 automatically registers an rfkill instance for each wireless device it knows about. Soft kill is also translated into disconnecting and turning all interfaces off, drivers are expected to turn off the device when all interfaces are down. However, devices may have a hard RFkill line, in which case they also need to interact with the rfkill subsystem, via cfg80211. They can do this with a few helper functions documented here. LINUX Kernel Hackers Manual July 2017 wiphy_rfkill_set_hw_state 9 4.1.27 wiphy_rfkill_set_hw_state notify cfg80211 about hw block state Synopsis void wiphy_rfkill_set_hw_state struct wiphy * wiphy bool blocked Arguments wiphy the wiphy blocked block status LINUX Kernel Hackers Manual July 2017 wiphy_rfkill_start_polling 9 4.1.27 wiphy_rfkill_start_polling start polling rfkill Synopsis void wiphy_rfkill_start_polling struct wiphy * wiphy Arguments wiphy the wiphy LINUX Kernel Hackers Manual July 2017 wiphy_rfkill_stop_polling 9 4.1.27 wiphy_rfkill_stop_polling stop polling rfkill Synopsis void wiphy_rfkill_stop_polling struct wiphy * wiphy Arguments wiphy the wiphy Test mode Test mode is a set of utility functions to allow drivers to interact with driver-specific tools to aid, for instance, factory programming. This chapter describes how drivers interact with it, for more information see the nl80211 book's chapter on it. LINUX Kernel Hackers Manual July 2017 cfg80211_testmode_alloc_reply_skb 9 4.1.27 cfg80211_testmode_alloc_reply_skb allocate testmode reply Synopsis struct sk_buff * cfg80211_testmode_alloc_reply_skb struct wiphy * wiphy int approxlen Arguments wiphy the wiphy approxlen an upper bound of the length of the data that will be put into the skb Description This function allocates and pre-fills an skb for a reply to the testmode command. Since it is intended for a reply, calling it outside of the testmode_cmd operation is invalid. The returned skb is pre-filled with the wiphy index and set up in a way that any data that is put into the skb (with skb_put, nla_put or similar) will end up being within the NL80211_ATTR_TESTDATA attribute, so all that needs to be done with the skb is adding data for the corresponding userspace tool which can then read that data out of the testdata attribute. You must not modify the skb in any other way. When done, call cfg80211_testmode_reply with the skb and return its error code as the result of the testmode_cmd operation. Return An allocated and pre-filled skb. NULL if any errors happen. LINUX Kernel Hackers Manual July 2017 cfg80211_testmode_reply 9 4.1.27 cfg80211_testmode_reply send the reply skb Synopsis int cfg80211_testmode_reply struct sk_buff * skb Arguments skb The skb, must have been allocated with cfg80211_testmode_alloc_reply_skb Description Since calling this function will usually be the last thing before returning from the testmode_cmd you should return the error code. Note that this function consumes the skb regardless of the return value. Return An error code or 0 on success. LINUX Kernel Hackers Manual July 2017 cfg80211_testmode_alloc_event_skb 9 4.1.27 cfg80211_testmode_alloc_event_skb allocate testmode event Synopsis struct sk_buff * cfg80211_testmode_alloc_event_skb struct wiphy * wiphy int approxlen gfp_t gfp Arguments wiphy the wiphy approxlen an upper bound of the length of the data that will be put into the skb gfp allocation flags Description This function allocates and pre-fills an skb for an event on the testmode multicast group. The returned skb is set up in the same way as with cfg80211_testmode_alloc_reply_skb but prepared for an event. As there, you should simply add data to it that will then end up in the NL80211_ATTR_TESTDATA attribute. Again, you must not modify the skb in any other way. When done filling the skb, call cfg80211_testmode_event with the skb to send the event. Return An allocated and pre-filled skb. NULL if any errors happen. LINUX Kernel Hackers Manual July 2017 cfg80211_testmode_event 9 4.1.27 cfg80211_testmode_event send the event Synopsis void cfg80211_testmode_event struct sk_buff * skb gfp_t gfp Arguments skb The skb, must have been allocated with cfg80211_testmode_alloc_event_skb gfp allocation flags Description This function sends the given skb, which must have been allocated by cfg80211_testmode_alloc_event_skb, as an event. It always consumes it. The mac80211 subsystem mac80211 is the Linux stack for 802.11 hardware that implements only partial functionality in hard- or firmware. This document defines the interface between mac80211 and low-level hardware drivers. If you're reading this document and not the header file itself, it will be incomplete because not all documentation has been converted yet. The basic mac80211 driver interface You should read and understand the information contained within this part of the book while implementing a driver. In some chapters, advanced usage is noted, that may be skipped at first. This part of the book only covers station and monitor mode functionality, additional information required to implement the other modes is covered in the second part of the book. Basic hardware handling TBD This chapter shall contain information on getting a hw struct allocated and registered with mac80211. Since it is required to allocate rates/modes before registering a hw struct, this chapter shall also contain information on setting up the rate/mode structs. Additionally, some discussion about the callbacks and the general programming model should be in here, including the definition of ieee80211_ops which will be referred to a lot. Finally, a discussion of hardware capabilities should be done with references to other parts of the book. LINUX Kernel Hackers Manual July 2017 struct ieee80211_hw 9 4.1.27 struct ieee80211_hw hardware information and state Synopsis struct ieee80211_hw { struct ieee80211_conf conf; struct wiphy * wiphy; const char * rate_control_algorithm; void * priv; u32 flags; unsigned int extra_tx_headroom; unsigned int extra_beacon_tailroom; int vif_data_size; int sta_data_size; int chanctx_data_size; int txq_data_size; u16 queues; u16 max_listen_interval; s8 max_signal; u8 max_rates; u8 max_report_rates; u8 max_rate_tries; u8 max_rx_aggregation_subframes; u8 max_tx_aggregation_subframes; u8 offchannel_tx_hw_queue; u8 radiotap_mcs_details; u16 radiotap_vht_details; netdev_features_t netdev_features; u8 uapsd_queues; u8 uapsd_max_sp_len; u8 n_cipher_schemes; const struct ieee80211_cipher_scheme * cipher_schemes; int txq_ac_max_pending; }; 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. Additionally, all supported bands (with channels, bitrates) are registered here. rate_control_algorithm rate control algorithm for this hardware. If unset (NULL), the default algorithm will be used. Must be set before calling ieee80211_register_hw. 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.) extra_beacon_tailroom tailroom to reserve in each beacon tx skb. Can be used by drivers to add extra IEs. vif_data_size size (in bytes) of the drv_priv data area within struct ieee80211_vif. sta_data_size size (in bytes) of the drv_priv data area within struct ieee80211_sta. chanctx_data_size size (in bytes) of the drv_priv data area within struct ieee80211_chanctx_conf. txq_data_size size (in bytes) of the drv_priv data area within struct ieee80211_txq. queues number of available hardware transmit queues for data packets. WMM/QoS requires at least four, these queues need to have configurable access parameters. max_listen_interval max listen interval in units of beacon interval that HW supports max_signal Maximum value for signal (rssi) in RX information, used only when IEEE80211_HW_SIGNAL_UNSPEC or IEEE80211_HW_SIGNAL_DB max_rates maximum number of alternate rate retry stages the hw can handle. max_report_rates maximum number of alternate rate retry stages the hw can report back. max_rate_tries maximum number of tries for each stage max_rx_aggregation_subframes maximum buffer size (number of sub-frames) to be used for A-MPDU block ack receiver aggregation. This is only relevant if the device has restrictions on the number of subframes, if it relies on mac80211 to do reordering it shouldn't be set. max_tx_aggregation_subframes maximum number of subframes in an aggregate an HT driver will transmit, used by the peer as a hint to size its reorder buffer. offchannel_tx_hw_queue HW queue ID to use for offchannel TX (if IEEE80211_HW_QUEUE_CONTROL is set) radiotap_mcs_details lists which MCS information can the HW reports, by default it is set to _MCS, _GI and _BW but doesn't include _FMT. Use IEEE80211_RADIOTAP_MCS_HAVE_* values, only adding _BW is supported today. radiotap_vht_details lists which VHT MCS information the HW reports, the default is _GI | _BANDWIDTH. Use the IEEE80211_RADIOTAP_VHT_KNOWN_* values. netdev_features netdev features to be set in each netdev created from this HW. Note only HW checksum features are currently compatible with mac80211. Other feature bits will be rejected. uapsd_queues This bitmap is included in (re)association frame to indicate for each access category if it is uAPSD trigger-enabled and delivery- enabled. Use IEEE80211_WMM_IE_STA_QOSINFO_AC_* to set this bitmap. Each bit corresponds to different AC. Value '1' in specific bit means that corresponding AC is both trigger- and delivery-enabled. '0' means neither enabled. uapsd_max_sp_len maximum number of total buffered frames the WMM AP may deliver to a WMM STA during any Service Period triggered by the WMM STA. Use IEEE80211_WMM_IE_STA_QOSINFO_SP_* for correct values. n_cipher_schemes a size of an array of cipher schemes definitions. cipher_schemes a pointer to an array of cipher scheme definitions supported by HW. txq_ac_max_pending maximum number of frames per AC pending in all txq entries for a vif. Description This structure contains the configuration and hardware information for an 802.11 PHY. LINUX Kernel Hackers Manual July 2017 enum ieee80211_hw_flags 9 4.1.27 enum ieee80211_hw_flags hardware flags Synopsis enum ieee80211_hw_flags { IEEE80211_HW_HAS_RATE_CONTROL, IEEE80211_HW_RX_INCLUDES_FCS, IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING, IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE, IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE, IEEE80211_HW_SIGNAL_UNSPEC, IEEE80211_HW_SIGNAL_DBM, IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC, IEEE80211_HW_SPECTRUM_MGMT, IEEE80211_HW_AMPDU_AGGREGATION, IEEE80211_HW_SUPPORTS_PS, IEEE80211_HW_PS_NULLFUNC_STACK, IEEE80211_HW_SUPPORTS_DYNAMIC_PS, IEEE80211_HW_MFP_CAPABLE, IEEE80211_HW_WANT_MONITOR_VIF, IEEE80211_HW_NO_AUTO_VIF, IEEE80211_HW_SW_CRYPTO_CONTROL, IEEE80211_HW_REPORTS_TX_ACK_STATUS, IEEE80211_HW_CONNECTION_MONITOR, IEEE80211_HW_QUEUE_CONTROL, IEEE80211_HW_SUPPORTS_PER_STA_GTK, IEEE80211_HW_AP_LINK_PS, IEEE80211_HW_TX_AMPDU_SETUP_IN_HW, IEEE80211_HW_SUPPORTS_RC_TABLE, IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF, IEEE80211_HW_TIMING_BEACON_ONLY, IEEE80211_HW_SUPPORTS_HT_CCK_RATES, IEEE80211_HW_CHANCTX_STA_CSA, IEEE80211_HW_SUPPORTS_CLONED_SKBS, IEEE80211_SINGLE_HW_SCAN_ON_ALL_BANDS }; Constants IEEE80211_HW_HAS_RATE_CONTROL The hardware or firmware includes rate control, and cannot be controlled by the stack. As such, no rate control algorithm should be instantiated, and the TX rate reported to userspace will be taken from the TX status instead of the rate control algorithm. Note that this requires that the driver implement a number of callbacks so it has the correct information, it needs to have the set_rts_threshold callback and must look at the BSS config use_cts_prot for G/N protection, use_short_slot for slot timing in 2.4 GHz and use_short_preamble for preambles for CCK frames. 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. IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE Hardware is not capable of short slot operation on the 2.4 GHz band. IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE Hardware is not capable of receiving frames with short preamble on the 2.4 GHz band. IEEE80211_HW_SIGNAL_UNSPEC Hardware can provide signal values but we don't know its units. We expect values between 0 and max_signal. If possible please provide dB or dBm instead. IEEE80211_HW_SIGNAL_DBM Hardware gives signal values in dBm, decibel difference from one milliwatt. This is the preferred method since it is standardized between different devices. max_signal does not need to be set. IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC This device needs to get data from beacon before association (i.e. dtim_period). IEEE80211_HW_SPECTRUM_MGMT Hardware supports spectrum management defined in 802.11h Measurement, Channel Switch, Quieting, TPC IEEE80211_HW_AMPDU_AGGREGATION Hardware supports 11n A-MPDU aggregation. IEEE80211_HW_SUPPORTS_PS Hardware has power save support (i.e. can go to sleep). IEEE80211_HW_PS_NULLFUNC_STACK Hardware requires nullfunc frame handling in stack, implies stack support for dynamic PS. IEEE80211_HW_SUPPORTS_DYNAMIC_PS Hardware has support for dynamic PS. IEEE80211_HW_MFP_CAPABLE Hardware supports management frame protection (MFP, IEEE 802.11w). IEEE80211_HW_WANT_MONITOR_VIF The driver would like to be informed of a virtual monitor interface when monitor interfaces are the only active interfaces. IEEE80211_HW_NO_AUTO_VIF The driver would like for no wlanX to be created. It is expected user-space will create vifs as desired (and thus have them named as desired). IEEE80211_HW_SW_CRYPTO_CONTROL The driver wants to control which of the crypto algorithms can be done in software - so don't automatically try to fall back to it if hardware crypto fails, but do so only if the driver returns 1. This also forces the driver to advertise its supported cipher suites. IEEE80211_HW_REPORTS_TX_ACK_STATUS Hardware can provide ack status reports of Tx frames to the stack. IEEE80211_HW_CONNECTION_MONITOR The hardware performs its own connection monitoring, including periodic keep-alives to the AP and probing the AP on beacon loss. IEEE80211_HW_QUEUE_CONTROL The driver wants to control per-interface queue mapping in order to use different queues (not just one per AC) for different virtual interfaces. See the doc section on HW queue control for more details. IEEE80211_HW_SUPPORTS_PER_STA_GTK The device's crypto engine supports per-station GTKs as used by IBSS RSN or during fast transition. If the device doesn't support per-station GTKs, but can be asked not to decrypt group addressed frames, then IBSS RSN support is still possible but software crypto will be used. Advertise the wiphy flag only in that case. IEEE80211_HW_AP_LINK_PS When operating in AP mode the device autonomously manages the PS status of connected stations. When this flag is set mac80211 will not trigger PS mode for connected stations based on the PM bit of incoming frames. Use ieee80211_start_ps/ieee8021_end_ps to manually configure the PS mode of connected stations. IEEE80211_HW_TX_AMPDU_SETUP_IN_HW The device handles TX A-MPDU session setup strictly in HW. mac80211 should not attempt to do this in software. IEEE80211_HW_SUPPORTS_RC_TABLE The driver supports using a rate selection table provided by the rate control algorithm. IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF Use the P2P Device address for any P2P Interface. This will be honoured even if more than one interface is supported. IEEE80211_HW_TIMING_BEACON_ONLY Use sync timing from beacon frames only, to allow getting TBTT of a DTIM beacon. IEEE80211_HW_SUPPORTS_HT_CCK_RATES Hardware supports mixing HT/CCK rates and can cope with CCK rates in an aggregation session (e.g. by not using aggregation for such frames.) IEEE80211_HW_CHANCTX_STA_CSA Support 802.11h based channel-switch (CSA) for a single active channel while using channel contexts. When support is not enabled the default action is to disconnect when getting the CSA frame. IEEE80211_HW_SUPPORTS_CLONED_SKBS The driver will never modify the payload or tailroom of TX skbs without copying them first. IEEE80211_SINGLE_HW_SCAN_ON_ALL_BANDS The HW supports scanning on all bands in one command, mac80211 doesn't have to run separate scans per band. 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. LINUX Kernel Hackers Manual July 2017 SET_IEEE80211_DEV 9 4.1.27 SET_IEEE80211_DEV set device for 802.11 hardware Synopsis 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 LINUX Kernel Hackers Manual July 2017 SET_IEEE80211_PERM_ADDR 9 4.1.27 SET_IEEE80211_PERM_ADDR set the permanent MAC address for 802.11 hardware Synopsis 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 LINUX Kernel Hackers Manual July 2017 struct ieee80211_ops 9 4.1.27 struct ieee80211_ops callbacks from mac80211 to the driver Synopsis struct ieee80211_ops { void (* tx) (struct ieee80211_hw *hw,struct ieee80211_tx_control *control,struct sk_buff *skb); int (* start) (struct ieee80211_hw *hw); void (* stop) (struct ieee80211_hw *hw); #ifdef CONFIG_PM int (* suspend) (struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan); int (* resume) (struct ieee80211_hw *hw); void (* set_wakeup) (struct ieee80211_hw *hw, bool enabled); #endif int (* add_interface) (struct ieee80211_hw *hw,struct ieee80211_vif *vif); int (* change_interface) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,enum nl80211_iftype new_type, bool p2p); void (* remove_interface) (struct ieee80211_hw *hw,struct ieee80211_vif *vif); int (* config) (struct ieee80211_hw *hw, u32 changed); void (* bss_info_changed) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ieee80211_bss_conf *info,u32 changed); int (* start_ap) (struct ieee80211_hw *hw, struct ieee80211_vif *vif); void (* stop_ap) (struct ieee80211_hw *hw, struct ieee80211_vif *vif); u64 (* prepare_multicast) (struct ieee80211_hw *hw,struct netdev_hw_addr_list *mc_list); void (* configure_filter) (struct ieee80211_hw *hw,unsigned int changed_flags,unsigned int *total_flags,u64 multicast); int (* set_tim) (struct ieee80211_hw *hw, struct ieee80211_sta *sta,bool set); int (* set_key) (struct ieee80211_hw *hw, enum set_key_cmd cmd,struct ieee80211_vif *vif, struct ieee80211_sta *sta,struct ieee80211_key_conf *key); void (* update_tkip_key) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ieee80211_key_conf *conf,struct ieee80211_sta *sta,u32 iv32, u16 *phase1key); void (* set_rekey_data) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct cfg80211_gtk_rekey_data *data); void (* set_default_unicast_key) (struct ieee80211_hw *hw,struct ieee80211_vif *vif, int idx); int (* hw_scan) (struct ieee80211_hw *hw, struct ieee80211_vif *vif,struct ieee80211_scan_request *req); void (* cancel_hw_scan) (struct ieee80211_hw *hw,struct ieee80211_vif *vif); int (* sched_scan_start) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct cfg80211_sched_scan_request *req,struct ieee80211_scan_ies *ies); int (* sched_scan_stop) (struct ieee80211_hw *hw,struct ieee80211_vif *vif); void (* sw_scan_start) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,const u8 *mac_addr); void (* sw_scan_complete) (struct ieee80211_hw *hw,struct ieee80211_vif *vif); int (* get_stats) (struct ieee80211_hw *hw,struct ieee80211_low_level_stats *stats); void (* get_tkip_seq) (struct ieee80211_hw *hw, u8 hw_key_idx,u32 *iv32, u16 *iv16); int (* set_frag_threshold) (struct ieee80211_hw *hw, u32 value); int (* set_rts_threshold) (struct ieee80211_hw *hw, u32 value); int (* sta_add) (struct ieee80211_hw *hw, struct ieee80211_vif *vif,struct ieee80211_sta *sta); int (* sta_remove) (struct ieee80211_hw *hw, struct ieee80211_vif *vif,struct ieee80211_sta *sta); #ifdef CONFIG_MAC80211_DEBUGFS void (* sta_add_debugfs) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ieee80211_sta *sta,struct dentry *dir); void (* sta_remove_debugfs) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ieee80211_sta *sta,struct dentry *dir); #endif void (* sta_notify) (struct ieee80211_hw *hw, struct ieee80211_vif *vif,enum sta_notify_cmd, struct ieee80211_sta *sta); int (* sta_state) (struct ieee80211_hw *hw, struct ieee80211_vif *vif,struct ieee80211_sta *sta,enum ieee80211_sta_state old_state,enum ieee80211_sta_state new_state); void (* sta_pre_rcu_remove) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ieee80211_sta *sta); void (* sta_rc_update) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ieee80211_sta *sta,u32 changed); void (* sta_rate_tbl_update) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ieee80211_sta *sta); void (* sta_statistics) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ieee80211_sta *sta,struct station_info *sinfo); int (* conf_tx) (struct ieee80211_hw *hw,struct ieee80211_vif *vif, u16 ac,const struct ieee80211_tx_queue_params *params); u64 (* get_tsf) (struct ieee80211_hw *hw, struct ieee80211_vif *vif); void (* set_tsf) (struct ieee80211_hw *hw, struct ieee80211_vif *vif,u64 tsf); void (* reset_tsf) (struct ieee80211_hw *hw, struct ieee80211_vif *vif); int (* tx_last_beacon) (struct ieee80211_hw *hw); int (* ampdu_action) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,enum ieee80211_ampdu_mlme_action action,struct ieee80211_sta *sta, u16 tid, u16 *ssn,u8 buf_size); int (* get_survey) (struct ieee80211_hw *hw, int idx,struct survey_info *survey); void (* rfkill_poll) (struct ieee80211_hw *hw); void (* set_coverage_class) (struct ieee80211_hw *hw, s16 coverage_class); #ifdef CONFIG_NL80211_TESTMODE int (* testmode_cmd) (struct ieee80211_hw *hw, struct ieee80211_vif *vif,void *data, int len); int (* testmode_dump) (struct ieee80211_hw *hw, struct sk_buff *skb,struct netlink_callback *cb,void *data, int len); #endif void (* flush) (struct ieee80211_hw *hw, struct ieee80211_vif *vif,u32 queues, bool drop); void (* channel_switch) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ieee80211_channel_switch *ch_switch); int (* set_antenna) (struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant); int (* get_antenna) (struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant); int (* remain_on_channel) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ieee80211_channel *chan,int duration,enum ieee80211_roc_type type); int (* cancel_remain_on_channel) (struct ieee80211_hw *hw); int (* set_ringparam) (struct ieee80211_hw *hw, u32 tx, u32 rx); void (* get_ringparam) (struct ieee80211_hw *hw,u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max); bool (* tx_frames_pending) (struct ieee80211_hw *hw); int (* set_bitrate_mask) (struct ieee80211_hw *hw, struct ieee80211_vif *vif,const struct cfg80211_bitrate_mask *mask); void (* event_callback) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,const struct ieee80211_event *event); void (* allow_buffered_frames) (struct ieee80211_hw *hw,struct ieee80211_sta *sta,u16 tids, int num_frames,enum ieee80211_frame_release_type reason,bool more_data); void (* release_buffered_frames) (struct ieee80211_hw *hw,struct ieee80211_sta *sta,u16 tids, int num_frames,enum ieee80211_frame_release_type reason,bool more_data); int (* get_et_sset_count) (struct ieee80211_hw *hw,struct ieee80211_vif *vif, int sset); void (* get_et_stats) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ethtool_stats *stats, u64 *data); void (* get_et_strings) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,u32 sset, u8 *data); void (* mgd_prepare_tx) (struct ieee80211_hw *hw,struct ieee80211_vif *vif); void (* mgd_protect_tdls_discover) (struct ieee80211_hw *hw,struct ieee80211_vif *vif); int (* add_chanctx) (struct ieee80211_hw *hw,struct ieee80211_chanctx_conf *ctx); void (* remove_chanctx) (struct ieee80211_hw *hw,struct ieee80211_chanctx_conf *ctx); void (* change_chanctx) (struct ieee80211_hw *hw,struct ieee80211_chanctx_conf *ctx,u32 changed); int (* assign_vif_chanctx) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ieee80211_chanctx_conf *ctx); void (* unassign_vif_chanctx) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ieee80211_chanctx_conf *ctx); int (* switch_vif_chanctx) (struct ieee80211_hw *hw,struct ieee80211_vif_chanctx_switch *vifs,int n_vifs,enum ieee80211_chanctx_switch_mode mode); void (* reconfig_complete) (struct ieee80211_hw *hw,enum ieee80211_reconfig_type reconfig_type); #if IS_ENABLED(CONFIG_IPV6) void (* ipv6_addr_change) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct inet6_dev *idev); #endif void (* channel_switch_beacon) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct cfg80211_chan_def *chandef); int (* pre_channel_switch) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ieee80211_channel_switch *ch_switch); int (* post_channel_switch) (struct ieee80211_hw *hw,struct ieee80211_vif *vif); int (* join_ibss) (struct ieee80211_hw *hw, struct ieee80211_vif *vif); void (* leave_ibss) (struct ieee80211_hw *hw, struct ieee80211_vif *vif); u32 (* get_expected_throughput) (struct ieee80211_sta *sta); int (* get_txpower) (struct ieee80211_hw *hw, struct ieee80211_vif *vif,int *dbm); int (* tdls_channel_switch) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ieee80211_sta *sta, u8 oper_class,struct cfg80211_chan_def *chandef,struct sk_buff *tmpl_skb, u32 ch_sw_tm_ie); void (* tdls_cancel_channel_switch) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ieee80211_sta *sta); void (* tdls_recv_channel_switch) (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ieee80211_tdls_ch_sw_params *params); void (* wake_tx_queue) (struct ieee80211_hw *hw,struct ieee80211_txq *txq); }; 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. This handler should, preferably, never fail and stop queues appropriately. Must be 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 and can sleep. 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. If you added any work onto the mac80211 workqueue you should ensure to cancel it on this callback. Must be implemented and can sleep. suspend Suspend the device; mac80211 itself will quiesce before and stop transmitting and doing any other configuration, and then ask the device to suspend. This is only invoked when WoWLAN is configured, otherwise the device is deconfigured completely and reconfigured at resume time. The driver may also impose special conditions under which it wants to use the normal suspend (deconfigure), say if it only supports WoWLAN when the device is associated. In this case, it must return 1 from this function. resume If WoWLAN was configured, this indicates that mac80211 is now resuming its operation, after this the device must be fully functional again. If this returns an error, the only way out is to also unregister the device. If it returns 1, then mac80211 will also go through the regular complete restart on resume. set_wakeup Enable or disable wakeup when WoWLAN configuration is modified. The reason is that device_set_wakeup_enable is supposed to be called when the configuration changes, not only in suspend. add_interface Called when a netdevice attached to the hardware is enabled. Because it is not called for monitor mode devices, start 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 and can sleep. change_interface Called when a netdevice changes type. This callback is optional, but only if it is supported can interface types be switched while the interface is UP. The callback may sleep. Note that while an interface is being switched, it will not be found by the interface iteration callbacks. 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. It can sleep. config Handler for configuration requests. IEEE 802.11 code calls this function to change hardware configuration, e.g., channel. This function should never fail but returns a negative error code if it does. The callback can sleep. bss_info_changed Handler for configuration requests related to BSS parameters that may vary during BSS's lifespan, and may affect low level driver (e.g. assoc/disassoc status, erp parameters). This function should not be used if no BSS has been set, unless for association indication. The changed parameter indicates which of the bss parameters has changed when a call is made. The callback can sleep. start_ap Start operation on the AP interface, this is called after all the information in bss_conf is set and beacon can be retrieved. A channel context is bound before this is called. Note that if the driver uses software scan or ROC, this (and stop_ap) isn't called when the AP is just paused for scanning/ROC, which is indicated by the beacon being disabled/enabled via bss_info_changed. stop_ap Stop operation on the AP interface. prepare_multicast Prepare for multicast filter configuration. This callback is optional, and its return value is passed to configure_filter. This callback must be atomic. configure_filter Configure the device's RX filter. See the section Frame filtering for more information. This callback must be implemented and can sleep. set_tim Set TIM bit. mac80211 calls this function when a TIM bit must be set or cleared for a given STA. Must be atomic. set_key See the section Hardware crypto acceleration This callback is only called between add_interface and remove_interface calls, i.e. while the given virtual interface is enabled. Returns a negative error code if the key can't be added. The callback can sleep. update_tkip_key See the section Hardware crypto acceleration This callback will be called in the context of Rx. Called for drivers which set IEEE80211_KEY_FLAG_TKIP_REQ_RX_P1_KEY. The callback must be atomic. set_rekey_data If the device supports GTK rekeying, for example while the host is suspended, it can assign this callback to retrieve the data necessary to do GTK rekeying, this is the KEK, KCK and replay counter. After rekeying was done it should (for example during resume) notify userspace of the new replay counter using ieee80211_gtk_rekey_notify. set_default_unicast_key Set the default (unicast) key index, useful for WEP when the device sends data packets autonomously, e.g. for ARP offloading. The index can be 0-3, or -1 for unsetting it. hw_scan Ask the hardware to service the scan request, no need to start the scan state machine in stack. The scan must honour the channel configuration done by the regulatory agent in the wiphy's registered bands. The hardware (or the driver) needs to make sure that power save is disabled. The req ie/ie_len members are rewritten by mac80211 to contain the entire IEs after the SSID, so that drivers need not look at these at all but just send them after the SSID -- mac80211 includes the (extended) supported rates and HT information (where applicable). When the scan finishes, ieee80211_scan_completed must be called; note that it also must be called when the scan cannot finish due to any error unless this callback returned a negative error code. The callback can sleep. cancel_hw_scan Ask the low-level tp cancel the active hw scan. The driver should ask the hardware to cancel the scan (if possible), but the scan will be completed only after the driver will call ieee80211_scan_completed. This callback is needed for wowlan, to prevent enqueueing a new scan_work after the low-level driver was already suspended. The callback can sleep. sched_scan_start Ask the hardware to start scanning repeatedly at specific intervals. The driver must call the ieee80211_sched_scan_results function whenever it finds results. This process will continue until sched_scan_stop is called. sched_scan_stop Tell the hardware to stop an ongoing scheduled scan. In this case, ieee80211_sched_scan_stopped must not be called. sw_scan_start Notifier function that is called just before a software scan is started. Can be NULL, if the driver doesn't need this notification. The mac_addr parameter allows supporting NL80211_SCAN_FLAG_RANDOM_ADDR, the driver may set the NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR flag if it can use this parameter. The callback can sleep. sw_scan_complete Notifier function that is called just after a software scan finished. Can be NULL, if the driver doesn't need this notification. The callback can sleep. get_stats Return low-level statistics. Returns zero if statistics are available. The callback can sleep. get_tkip_seq If your device implements TKIP encryption in hardware this callback should be provided to read the TKIP transmit IVs (both IV32 and IV16) for the given key from hardware. The callback must be atomic. set_frag_threshold Configuration of fragmentation threshold. Assign this if the device does fragmentation by itself; if this callback is implemented then the stack will not do fragmentation. The callback can sleep. set_rts_threshold Configuration of RTS threshold (if device needs it) The callback can sleep. sta_add Notifies low level driver about addition of an associated station, AP, IBSS/WDS/mesh peer etc. This callback can sleep. sta_remove Notifies low level driver about removal of an associated station, AP, IBSS/WDS/mesh peer etc. Note that after the callback returns it isn't safe to use the pointer, not even RCU protected; no RCU grace period is guaranteed between returning here and freeing the station. See sta_pre_rcu_remove if needed. This callback can sleep. sta_add_debugfs Drivers can use this callback to add debugfs files when a station is added to mac80211's station list. This callback and sta_remove_debugfs should be within a CONFIG_MAC80211_DEBUGFS conditional. This callback can sleep. sta_remove_debugfs Remove the debugfs files which were added using sta_add_debugfs. This callback can sleep. sta_notify Notifies low level driver about power state transition of an associated station, AP, IBSS/WDS/mesh peer etc. For a VIF operating in AP mode, this callback will not be called when the flag IEEE80211_HW_AP_LINK_PS is set. Must be atomic. sta_state Notifies low level driver about state transition of a station (which can be the AP, a client, IBSS/WDS/mesh peer etc.) This callback is mutually exclusive with sta_add/sta_remove. It must not fail for down transitions but may fail for transitions up the list of states. Also note that after the callback returns it isn't safe to use the pointer, not even RCU protected - no RCU grace period is guaranteed between returning here and freeing the station. See sta_pre_rcu_remove if needed. The callback can sleep. sta_pre_rcu_remove Notify driver about station removal before RCU synchronisation. This is useful if a driver needs to have station pointers protected using RCU, it can then use this call to clear the pointers instead of waiting for an RCU grace period to elapse in sta_state. The callback can sleep. sta_rc_update Notifies the driver of changes to the bitrates that can be used to transmit to the station. The changes are advertised with bits from enum ieee80211_rate_control_changed and the values are reflected in the station data. This callback should only be used when the driver uses hardware rate control (IEEE80211_HW_HAS_RATE_CONTROL) since otherwise the rate control algorithm is notified directly. Must be atomic. sta_rate_tbl_update Notifies the driver that the rate table changed. This is only used if the configured rate control algorithm actually uses the new rate table API, and is therefore optional. Must be atomic. sta_statistics Get statistics for this station. For example with beacon filtering, the statistics kept by mac80211 might not be accurate, so let the driver pre-fill the statistics. The driver can fill most of the values (indicating which by setting the filled bitmap), but not all of them make sense - see the source for which ones are possible. Statistics that the driver doesn't fill will be filled by mac80211. The callback can sleep. conf_tx Configure TX queue parameters (EDCF (aifs, cw_min, cw_max), bursting) for a hardware TX queue. Returns a negative error code on failure. The callback can sleep. get_tsf Get the current TSF timer value from firmware/hardware. Currently, this is only used for IBSS mode BSSID merging and debugging. Is not a required function. The callback can sleep. set_tsf Set the TSF timer to the specified value in the firmware/hardware. Currently, this is only used for IBSS mode debugging. Is not a required function. The callback can sleep. 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. The callback can sleep. 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. Returns non-zero if this device sent the last beacon. The callback can sleep. ampdu_action Perform a certain A-MPDU action The RA/TID combination determines the destination and TID we want the ampdu action to be performed for. The action is defined through ieee80211_ampdu_mlme_action. Starting sequence number (ssn) is the first frame we expect to perform the action on. Notice that TX/RX_STOP can pass NULL for this parameter. The buf_size parameter is only valid when the action is set to IEEE80211_AMPDU_TX_OPERATIONAL and indicates the peer's reorder buffer size (number of subframes) for this session -- the driver may neither send aggregates containing more subframes than this nor send aggregates in a way that lost frames would exceed the buffer size. If just limiting the aggregate size, this would be get_survey Return per-channel survey information rfkill_poll Poll rfkill hardware state. If you need this, you also need to set wiphy->rfkill_poll to true before registration, and need to call wiphy_rfkill_set_hw_state in the callback. The callback can sleep. set_coverage_class Set slot time for given coverage class as specified in IEEE 802.11-2007 section 17.3.8.6 and modify ACK timeout accordingly; coverage class equals to -1 to enable ACK timeout estimation algorithm (dynack). To disable dynack set valid value for coverage class. This callback is not required and may sleep. testmode_cmd Implement a cfg80211 test mode command. The passed vif may be NULL. The callback can sleep. testmode_dump Implement a cfg80211 test mode dump. The callback can sleep. flush Flush all pending frames from the hardware queue, making sure that the hardware queues are empty. The queues parameter is a bitmap of queues to flush, which is useful if different virtual interfaces use different hardware queues; it may also indicate all queues. If the parameter drop is set to true, pending frames may be dropped. Note that vif can be NULL. The callback can sleep. channel_switch Drivers that need (or want) to offload the channel switch operation for CSAs received from the AP may implement this callback. They must then call ieee80211_chswitch_done to indicate completion of the channel switch. set_antenna Set antenna configuration (tx_ant, rx_ant) on the device. Parameters are bitmaps of allowed antennas to use for TX/RX. Drivers may reject TX/RX mask combinations they cannot support by returning -EINVAL (also see nl80211.h NL80211_ATTR_WIPHY_ANTENNA_TX). get_antenna Get current antenna configuration from device (tx_ant, rx_ant). remain_on_channel Starts an off-channel period on the given channel, must call back to ieee80211_ready_on_channel when on that channel. Note that normal channel traffic is not stopped as this is intended for hw offload. Frames to transmit on the off-channel channel are transmitted normally except for the IEEE80211_TX_CTL_TX_OFFCHAN flag. When the duration (which will always be non-zero) expires, the driver must call ieee80211_remain_on_channel_expired. Note that this callback may be called while the device is in IDLE and must be accepted in this case. This callback may sleep. cancel_remain_on_channel Requests that an ongoing off-channel period is aborted before it expires. This callback may sleep. set_ringparam Set tx and rx ring sizes. get_ringparam Get tx and rx ring current and maximum sizes. tx_frames_pending Check if there is any pending frame in the hardware queues before entering power save. set_bitrate_mask Set a mask of rates to be used for rate control selection when transmitting a frame. Currently only legacy rates are handled. The callback can sleep. event_callback Notify driver about any event in mac80211. See enum ieee80211_event_type for the different types. The callback can sleep. allow_buffered_frames Prepare device to allow the given number of frames to go out to the given station. The frames will be sent by mac80211 via the usual TX path after this call. The TX information for frames released will also have the IEEE80211_TX_CTL_NO_PS_BUFFER flag set and the last one will also have IEEE80211_TX_STATUS_EOSP set. In case frames from multiple TIDs are released and the driver might reorder them between the TIDs, it must set the IEEE80211_TX_STATUS_EOSP flag on the last frame and clear it on all others and also handle the EOSP bit in the QoS header correctly. Alternatively, it can also call the ieee80211_sta_eosp function. The tids parameter is a bitmap and tells the driver which TIDs the frames will be on; it will at most have two bits set. This callback must be atomic. release_buffered_frames Release buffered frames according to the given parameters. In the case where the driver buffers some frames for sleeping stations mac80211 will use this callback to tell the driver to release some frames, either for PS-poll or uAPSD. Note that if the more_data parameter is false the driver must check if there are more frames on the given TIDs, and if there are more than the frames being released then it must still set the more-data bit in the frame. If the more_data parameter is true, then of course the more-data bit must always be set. The tids parameter tells the driver which TIDs to release frames from, for PS-poll it will always have only a single bit set. In the case this is used for a PS-poll initiated release, the num_frames parameter will always be 1 so code can be shared. In this case the driver must also set IEEE80211_TX_STATUS_EOSP flag on the TX status (and must report TX status) so that the PS-poll period is properly ended. This is used to avoid sending multiple responses for a retried PS-poll frame. In the case this is used for uAPSD, the num_frames parameter may be bigger than one, but the driver may send fewer frames (it must send at least one, however). In this case it is also responsible for setting the EOSP flag in the QoS header of the frames. Also, when the service period ends, the driver must set IEEE80211_TX_STATUS_EOSP on the last frame in the SP. Alternatively, it may call the function ieee80211_sta_eosp to inform mac80211 of the end of the SP. This callback must be atomic. get_et_sset_count Ethtool API to get string-set count. get_et_stats Ethtool API to get a set of u64 stats. get_et_strings Ethtool API to get a set of strings to describe stats and perhaps other supported types of ethtool data-sets. mgd_prepare_tx Prepare for transmitting a management frame for association before associated. In multi-channel scenarios, a virtual interface is bound to a channel before it is associated, but as it isn't associated yet it need not necessarily be given airtime, in particular since any transmission to a P2P GO needs to be synchronized against the GO's powersave state. mac80211 will call this function before transmitting a management frame prior to having successfully associated to allow the driver to give it channel time for the transmission, to get a response and to be able to synchronize with the GO. The callback will be called before each transmission and upon return mac80211 will transmit the frame right away. The callback is optional and can (should!) sleep. mgd_protect_tdls_discover Protect a TDLS discovery session. After sending a TDLS discovery-request, we expect a reply to arrive on the AP's channel. We must stay on the channel (no PSM, scan, etc.), since a TDLS setup-response is a direct packet not buffered by the AP. mac80211 will call this function just before the transmission of a TDLS discovery-request. The recommended period of protection is at least 2 * (DTIM period). The callback is optional and can sleep. add_chanctx Notifies device driver about new channel context creation. remove_chanctx Notifies device driver about channel context destruction. change_chanctx Notifies device driver about channel context changes that may happen when combining different virtual interfaces on the same channel context with different settings assign_vif_chanctx Notifies device driver about channel context being bound to vif. Possible use is for hw queue remapping. unassign_vif_chanctx Notifies device driver about channel context being unbound from vif. switch_vif_chanctx switch a number of vifs from one chanctx to another, as specified in the list of ieee80211_vif_chanctx_switch passed to the driver, according to the mode defined in ieee80211_chanctx_switch_mode. reconfig_complete Called after a call to ieee80211_restart_hw and during resume, when the reconfiguration has completed. This can help the driver implement the reconfiguration step (and indicate mac80211 is ready to receive frames). This callback may sleep. ipv6_addr_change IPv6 address assignment on the given interface changed. Currently, this is only called for managed or P2P client interfaces. This callback is optional; it must not sleep. channel_switch_beacon Starts a channel switch to a new channel. Beacons are modified to include CSA or ECSA IEs before calling this function. The corresponding count fields in these IEs must be decremented, and when they reach 1 the driver must call ieee80211_csa_finish. Drivers which use ieee80211_beacon_get get the csa counter decremented by mac80211, but must check if it is 1 using ieee80211_csa_is_complete after the beacon has been transmitted and then call ieee80211_csa_finish. If the CSA count starts as zero or 1, this function will not be called, since there won't be any time to beacon before the switch anyway. pre_channel_switch This is an optional callback that is called before a channel switch procedure is started (ie. when a STA gets a CSA or an userspace initiated channel-switch), allowing the driver to prepare for the channel switch. post_channel_switch This is an optional callback that is called after a channel switch procedure is completed, allowing the driver to go back to a normal configuration. join_ibss Join an IBSS (on an IBSS interface); this is called after all information in bss_conf is set up and the beacon can be retrieved. A channel context is bound before this is called. leave_ibss Leave the IBSS again. get_expected_throughput extract the expected throughput towards the specified station. The returned value is expressed in Kbps. It returns 0 if the RC algorithm does not have proper data to provide. get_txpower get current maximum tx power (in dBm) based on configuration and hardware limits. tdls_channel_switch Start channel-switching with a TDLS peer. The driver is responsible for continually initiating channel-switching operations and returning to the base channel for communication with the AP. The driver receives a channel-switch request template and the location of the switch-timing IE within the template as part of the invocation. The template is valid only within the call, and the driver can optionally copy the skb for further re-use. tdls_cancel_channel_switch Stop channel-switching with a TDLS peer. Both peers must be on the base channel when the call completes. tdls_recv_channel_switch a TDLS channel-switch related frame (request or response) has been received from a remote peer. The driver gets parameters parsed from the incoming frame and may use them to continue an ongoing channel-switch operation. In addition, a channel-switch response template is provided, together with the location of the switch-timing IE within the template. The skb can only be used within the function call. wake_tx_queue Called when new packets have been added to the queue. 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. possible with a buf_size of 8 - TX: 1.....7 - RX: 2....7 (lost frame #1) - TX: 8..1... which is invalid since #1 was now re-transmitted well past the buffer size of 8. Correct ways to retransmit #1 would be: - TX: 1 or 18 or 81 Even 189 would be wrong since 1 could be lost again. Returns a negative error code on failure. The callback can sleep. LINUX Kernel Hackers Manual July 2017 ieee80211_alloc_hw 9 4.1.27 ieee80211_alloc_hw Allocate a new hardware device Synopsis 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. Return A pointer to the new hardware device, or NULL on error. LINUX Kernel Hackers Manual July 2017 ieee80211_register_hw 9 4.1.27 ieee80211_register_hw Register hardware device Synopsis 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 in mac80211. Note that before a hardware can be registered, you need to fill the contained wiphy's information. Return 0 on success. An error code otherwise. LINUX Kernel Hackers Manual July 2017 ieee80211_unregister_hw 9 4.1.27 ieee80211_unregister_hw Unregister a hardware device Synopsis 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. LINUX Kernel Hackers Manual July 2017 ieee80211_free_hw 9 4.1.27 ieee80211_free_hw free hardware descriptor Synopsis 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. PHY configuration TBD This chapter should describe PHY handling including start/stop callbacks and the various structures used. LINUX Kernel Hackers Manual July 2017 struct ieee80211_conf 9 4.1.27 struct ieee80211_conf configuration of the device Synopsis struct ieee80211_conf { u32 flags; int power_level; int dynamic_ps_timeout; int max_sleep_period; u16 listen_interval; u8 ps_dtim_period; u8 long_frame_max_tx_count; u8 short_frame_max_tx_count; struct cfg80211_chan_def chandef; bool radar_enabled; enum ieee80211_smps_mode smps_mode; }; Members flags configuration flags defined above power_level requested transmit power (in dBm), backward compatibility value only that is set to the minimum of all interfaces dynamic_ps_timeout The dynamic powersave timeout (in ms), see the powersave documentation below. This variable is valid only when the CONF_PS flag is set. max_sleep_period the maximum number of beacon intervals to sleep for before checking the beacon for a TIM bit (managed mode only); this value will be only achievable between DTIM frames, the hardware needs to check for the multicast traffic bit in DTIM beacons. This variable is valid only when the CONF_PS flag is set. listen_interval listen interval in units of beacon interval ps_dtim_period The DTIM period of the AP we're connected to, for use in power saving. Power saving will not be enabled until a beacon has been received and the DTIM period is known. long_frame_max_tx_count Maximum number of transmissions for a long frame (a frame not RTS protected), called dot11LongRetryLimit in 802.11, but actually means the number of transmissions not the number of retries short_frame_max_tx_count Maximum number of transmissions for a short frame, called dot11ShortRetryLimit in 802.11, but actually means the number of transmissions not the number of retries chandef the channel definition to tune to radar_enabled whether radar detection is enabled smps_mode spatial multiplexing powersave mode; note that IEEE80211_SMPS_STATIC is used when the device is not configured for an HT channel. Note that this is only valid if channel contexts are not used, otherwise each channel context has the number of chains listed. Description This struct indicates how the driver shall configure the hardware. LINUX Kernel Hackers Manual July 2017 enum ieee80211_conf_flags 9 4.1.27 enum ieee80211_conf_flags configuration flags Synopsis enum ieee80211_conf_flags { IEEE80211_CONF_MONITOR, IEEE80211_CONF_PS, IEEE80211_CONF_IDLE, IEEE80211_CONF_OFFCHANNEL }; Constants IEEE80211_CONF_MONITOR there's a monitor interface present -- use this to determine for example whether to calculate timestamps for packets or not, do not use instead of filter flags! IEEE80211_CONF_PS Enable 802.11 power save mode (managed mode only). This is the power save mode defined by IEEE 802.11-2007 section 11.2, meaning that the hardware still wakes up for beacons, is able to transmit frames and receive the possible acknowledgment frames. Not to be confused with hardware specific wakeup/sleep states, driver is responsible for that. See the section Powersave support for more. IEEE80211_CONF_IDLE The device is running, but idle; if the flag is set the driver should be prepared to handle configuration requests but may turn the device off as much as possible. Typically, this flag will be set when an interface is set UP but not associated or scanning, but it can also be unset in that case when monitor interfaces are active. IEEE80211_CONF_OFFCHANNEL The device is currently not on its main operating channel. Description Flags to define PHY configuration options Virtual interfaces TBD This chapter should describe virtual interface basics that are relevant to the driver (VLANs, MGMT etc are not.) It should explain the use of the add_iface/remove_iface callbacks as well as the interface configuration callbacks. Things related to AP mode should be discussed there. Things related to supporting multiple interfaces should be in the appropriate chapter, a BIG FAT note should be here about this though and the recommendation to allow only a single interface in STA mode at first! LINUX Kernel Hackers Manual July 2017 struct ieee80211_vif 9 4.1.27 struct ieee80211_vif per-interface data Synopsis struct ieee80211_vif { enum nl80211_iftype type; struct ieee80211_bss_conf bss_conf; u8 addr[ETH_ALEN]; bool p2p; bool csa_active; u8 cab_queue; u8 hw_queue[IEEE80211_NUM_ACS]; struct ieee80211_txq * txq; struct ieee80211_chanctx_conf __rcu * chanctx_conf; u32 driver_flags; #ifdef CONFIG_MAC80211_DEBUGFS struct dentry * debugfs_dir; #endif u8 drv_priv[0]; }; Members type type of this virtual interface bss_conf BSS configuration for this interface, either our own or the BSS we're associated to addr[ETH_ALEN] address of this interface p2p indicates whether this AP or STA interface is a p2p interface, i.e. a GO or p2p-sta respectively csa_active marks whether a channel switch is going on. Internally it is write-protected by sdata_lock and local->mtx so holding either is fine for read access. cab_queue content-after-beacon (DTIM beacon really) queue, AP mode only hw_queue[IEEE80211_NUM_ACS] hardware queue for each AC txq the multicast data TX queue (if driver uses the TXQ abstraction) chanctx_conf The channel context this interface is assigned to, or NULL when it is not assigned. This pointer is RCU-protected due to the TX path needing to access it; even though the netdev carrier will always be off when it is NULL there can still be races and packets could be processed after it switches back to NULL. driver_flags flags/capabilities the driver has for this interface, these need to be set (or cleared) when the interface is added or, if supported by the driver, the interface type is changed at runtime, mac80211 will never touch this field debugfs_dir debugfs dentry, can be used by drivers to create own per interface debug files. Note that it will be NULL for the virtual monitor interface (if that is requested.) drv_priv[0] data area for driver use, will always be aligned to sizeof(void *). Description Data in this structure is continually present for driver use during the life of a virtual interface. Receive and transmit processing what should be here TBD This should describe the receive and transmit paths in mac80211/the drivers as well as transmit status handling. Frame format As a general rule, when frames are passed between mac80211 and the driver, they start with the IEEE 802.11 header and include the same octets that are sent over the air except for the FCS which should be calculated by the hardware. There are, however, various exceptions to this rule for advanced features: The first exception is for hardware encryption and decryption offload where the IV/ICV may or may not be generated in hardware. Secondly, when the hardware handles fragmentation, the frame handed to the driver from mac80211 is the MSDU, not the MPDU. Packet alignment Drivers always need to pass packets that are aligned to two-byte boundaries to the stack. Additionally, should, if possible, align the payload data in a way that guarantees that the contained IP header is aligned to a four-byte boundary. In the case of regular frames, this simply means aligning the payload to a four-byte boundary (because either the IP header is directly contained, or IV/RFC1042 headers that have a length divisible by four are in front of it). If the payload data is not properly aligned and the architecture doesn't support efficient unaligned operations, mac80211 will align the data. With A-MSDU frames, however, the payload data address must yield two modulo four because there are 14-byte 802.3 headers within the A-MSDU frames that push the IP header further back to a multiple of four again. Thankfully, the specs were sane enough this time around to require padding each A-MSDU subframe to a length that is a multiple of four. Padding like Atheros hardware adds which is between the 802.11 header and the payload is not supported, the driver is required to move the 802.11 header to be directly in front of the payload in that case. Calling into mac80211 from interrupts Only ieee80211_tx_status_irqsafe and ieee80211_rx_irqsafe can be called in hardware interrupt context. The low-level driver must not call any other functions in hardware interrupt context. If there is a need for such call, the low-level driver should first ACK the interrupt and perform the IEEE 802.11 code call after this, e.g. from a scheduled workqueue or even tasklet function. NOTE: If the driver opts to use the _irqsafe functions, it may not also use the non-IRQ-safe functions! functions/definitions LINUX Kernel Hackers Manual July 2017 struct ieee80211_rx_status 9 4.1.27 struct ieee80211_rx_status receive status Synopsis struct ieee80211_rx_status { u64 mactime; u32 device_timestamp; u32 ampdu_reference; u32 flag; u16 freq; u8 vht_flag; u8 rate_idx; u8 vht_nss; u8 rx_flags; u8 band; u8 antenna; s8 signal; u8 chains; s8 chain_signal[IEEE80211_MAX_CHAINS]; u8 ampdu_delimiter_crc; }; Members mactime value in microseconds of the 64-bit Time Synchronization Function (TSF) timer when the first data symbol (MPDU) arrived at the hardware. device_timestamp arbitrary timestamp for the device, mac80211 doesn't use it but can store it and pass it back to the driver for synchronisation ampdu_reference A-MPDU reference number, must be a different value for each A-MPDU but the same for each subframe within one A-MPDU flag RX_FLAG_* freq frequency the radio was tuned to when receiving this frame, in MHz vht_flag RX_VHT_FLAG_* rate_idx index of data rate into band's supported rates or MCS index if HT or VHT is used (RX_FLAG_HT/RX_FLAG_VHT) vht_nss number of streams (VHT only) rx_flags internal RX flags for mac80211 band the active band when this frame was received antenna antenna used signal signal strength when receiving this frame, either in dBm, in dB or unspecified depending on the hardware capabilities flags IEEE80211_HW_SIGNAL_* chains bitmask of receive chains for which separate signal strength values were filled. chain_signal[IEEE80211_MAX_CHAINS] per-chain signal strength, in dBm (unlike signal, doesn't support dB or unspecified units) ampdu_delimiter_crc A-MPDU delimiter CRC Description The low-level driver should provide this information (the subset supported by hardware) to the 802.11 code with each received frame, in the skb's control buffer (cb). LINUX Kernel Hackers Manual July 2017 enum mac80211_rx_flags 9 4.1.27 enum mac80211_rx_flags receive flags Synopsis enum mac80211_rx_flags { RX_FLAG_MMIC_ERROR, RX_FLAG_DECRYPTED, RX_FLAG_MMIC_STRIPPED, RX_FLAG_IV_STRIPPED, RX_FLAG_FAILED_FCS_CRC, RX_FLAG_FAILED_PLCP_CRC, RX_FLAG_MACTIME_START, RX_FLAG_SHORTPRE, RX_FLAG_HT, RX_FLAG_40MHZ, RX_FLAG_SHORT_GI, RX_FLAG_NO_SIGNAL_VAL, RX_FLAG_HT_GF, RX_FLAG_AMPDU_DETAILS, RX_FLAG_AMPDU_REPORT_ZEROLEN, RX_FLAG_AMPDU_IS_ZEROLEN, RX_FLAG_AMPDU_LAST_KNOWN, RX_FLAG_AMPDU_IS_LAST, RX_FLAG_AMPDU_DELIM_CRC_ERROR, RX_FLAG_AMPDU_DELIM_CRC_KNOWN, RX_FLAG_MACTIME_END, RX_FLAG_VHT, RX_FLAG_LDPC, RX_FLAG_STBC_MASK, RX_FLAG_10MHZ, RX_FLAG_5MHZ, RX_FLAG_AMSDU_MORE, RX_FLAG_RADIOTAP_VENDOR_DATA }; 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_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. RX_FLAG_MACTIME_START The timestamp passed in the RX status (mactime field) is valid and contains the time the first symbol of the MPDU was received. This is useful in monitor mode and for proper IBSS merging. RX_FLAG_SHORTPRE Short preamble was used for this frame RX_FLAG_HT HT MCS was used and rate_idx is MCS index RX_FLAG_40MHZ HT40 (40 MHz) was used RX_FLAG_SHORT_GI Short guard interval was used RX_FLAG_NO_SIGNAL_VAL The signal strength value is not present. Valid only for data frames (mainly A-MPDU) RX_FLAG_HT_GF This frame was received in a HT-greenfield transmission, if the driver fills this value it should add IEEE80211_RADIOTAP_MCS_HAVE_FMT to hw.radiotap_mcs_details to advertise that fact RX_FLAG_AMPDU_DETAILS A-MPDU details are known, in particular the reference number (ampdu_reference) must be populated and be a distinct number for each A-MPDU RX_FLAG_AMPDU_REPORT_ZEROLEN driver reports 0-length subframes RX_FLAG_AMPDU_IS_ZEROLEN This is a zero-length subframe, for monitoring purposes only RX_FLAG_AMPDU_LAST_KNOWN last subframe is known, should be set on all subframes of a single A-MPDU RX_FLAG_AMPDU_IS_LAST this subframe is the last subframe of the A-MPDU RX_FLAG_AMPDU_DELIM_CRC_ERROR A delimiter CRC error has been detected on this subframe RX_FLAG_AMPDU_DELIM_CRC_KNOWN The delimiter CRC field is known (the CRC is stored in the ampdu_delimiter_crc field) RX_FLAG_MACTIME_END The timestamp passed in the RX status (mactime field) is valid and contains the time the last symbol of the MPDU (including FCS) was received. RX_FLAG_VHT VHT MCS was used and rate_index is MCS index RX_FLAG_LDPC LDPC was used RX_FLAG_STBC_MASK STBC 2 bit bitmask. 1 - Nss=1, 2 - Nss=2, 3 - Nss=3 RX_FLAG_10MHZ 10 MHz (half channel) was used RX_FLAG_5MHZ 5 MHz (quarter channel) was used RX_FLAG_AMSDU_MORE Some drivers may prefer to report separate A-MSDU subframes instead of a one huge frame for performance reasons. All, but the last MSDU from an A-MSDU should have this flag set. E.g. if an A-MSDU has 3 frames, the first 2 must have the flag set, while the 3rd (last) one must not have this flag set. The flag is used to deal with retransmission/duplication recovery properly since A-MSDU subframes share the same sequence number. Reported subframes can be either regular MSDU or singly A-MSDUs. Subframes must not be interleaved with other frames. RX_FLAG_RADIOTAP_VENDOR_DATA This frame contains vendor-specific radiotap data in the skb->data (before the frame) as described by the struct ieee80211_vendor_radiotap. Description These flags are used with the flag member of struct ieee80211_rx_status. LINUX Kernel Hackers Manual July 2017 enum mac80211_tx_info_flags 9 4.1.27 enum mac80211_tx_info_flags flags to describe transmission information/status Synopsis enum mac80211_tx_info_flags { IEEE80211_TX_CTL_REQ_TX_STATUS, IEEE80211_TX_CTL_ASSIGN_SEQ, IEEE80211_TX_CTL_NO_ACK, IEEE80211_TX_CTL_CLEAR_PS_FILT, IEEE80211_TX_CTL_FIRST_FRAGMENT, IEEE80211_TX_CTL_SEND_AFTER_DTIM, IEEE80211_TX_CTL_AMPDU, IEEE80211_TX_CTL_INJECTED, IEEE80211_TX_STAT_TX_FILTERED, IEEE80211_TX_STAT_ACK, IEEE80211_TX_STAT_AMPDU, IEEE80211_TX_STAT_AMPDU_NO_BACK, IEEE80211_TX_CTL_RATE_CTRL_PROBE, IEEE80211_TX_INTFL_OFFCHAN_TX_OK, IEEE80211_TX_INTFL_NEED_TXPROCESSING, IEEE80211_TX_INTFL_RETRIED, IEEE80211_TX_INTFL_DONT_ENCRYPT, IEEE80211_TX_CTL_NO_PS_BUFFER, IEEE80211_TX_CTL_MORE_FRAMES, IEEE80211_TX_INTFL_RETRANSMISSION, IEEE80211_TX_INTFL_MLME_CONN_TX, IEEE80211_TX_INTFL_NL80211_FRAME_TX, IEEE80211_TX_CTL_LDPC, IEEE80211_TX_CTL_STBC, IEEE80211_TX_CTL_TX_OFFCHAN, IEEE80211_TX_INTFL_TKIP_MIC_FAILURE, IEEE80211_TX_CTL_NO_CCK_RATE, IEEE80211_TX_STATUS_EOSP, IEEE80211_TX_CTL_USE_MINRATE, IEEE80211_TX_CTL_DONTFRAG, IEEE80211_TX_STAT_NOACK_TRANSMITTED }; Constants IEEE80211_TX_CTL_REQ_TX_STATUS require TX status callback for this frame. IEEE80211_TX_CTL_ASSIGN_SEQ The driver has to assign a sequence number to this frame, taking care of not overwriting the fragment number and increasing the sequence number only when the IEEE80211_TX_CTL_FIRST_FRAGMENT flag is set. mac80211 will properly assign sequence numbers to QoS-data frames but cannot do so correctly for non-QoS-data and management frames because beacons need them from that counter as well and mac80211 cannot guarantee proper sequencing. If this flag is set, the driver should instruct the hardware to assign a sequence number to the frame or assign one itself. Cf. IEEE 802.11-2007 7.1.3.4.1 paragraph 3. This flag will always be set for beacons and always be clear for frames without a sequence number field. IEEE80211_TX_CTL_NO_ACK tell the low level not to wait for an ack IEEE80211_TX_CTL_CLEAR_PS_FILT clear powersave filter for destination station IEEE80211_TX_CTL_FIRST_FRAGMENT this is a first fragment of the frame IEEE80211_TX_CTL_SEND_AFTER_DTIM send this frame after DTIM beacon IEEE80211_TX_CTL_AMPDU this frame should be sent as part of an A-MPDU IEEE80211_TX_CTL_INJECTED Frame was injected, internal to mac80211. IEEE80211_TX_STAT_TX_FILTERED The frame was not transmitted because the destination STA was in powersave mode. Note that to avoid race conditions, the filter must be set by the hardware or firmware upon receiving a frame that indicates that the station went to sleep (must be done on device to filter frames already on the queue) and may only be unset after mac80211 gives the OK for that by setting the IEEE80211_TX_CTL_CLEAR_PS_FILT (see above), since only then is it guaranteed that no more frames are in the hardware queue. IEEE80211_TX_STAT_ACK Frame was acknowledged IEEE80211_TX_STAT_AMPDU The frame was aggregated, so status is for the whole aggregation. IEEE80211_TX_STAT_AMPDU_NO_BACK no block ack was returned, so consider using block ack request (BAR). IEEE80211_TX_CTL_RATE_CTRL_PROBE internal to mac80211, can be set by rate control algorithms to indicate probe rate, will be cleared for fragmented frames (except on the last fragment) IEEE80211_TX_INTFL_OFFCHAN_TX_OK Internal to mac80211. Used to indicate that a frame can be transmitted while the queues are stopped for off-channel operation. IEEE80211_TX_INTFL_NEED_TXPROCESSING completely internal to mac80211, used to indicate that a pending frame requires TX processing before it can be sent out. IEEE80211_TX_INTFL_RETRIED completely internal to mac80211, used to indicate that a frame was already retried due to PS IEEE80211_TX_INTFL_DONT_ENCRYPT completely internal to mac80211, used to indicate frame should not be encrypted IEEE80211_TX_CTL_NO_PS_BUFFER This frame is a response to a poll frame (PS-Poll or uAPSD) or a non-bufferable MMPDU and must be sent although the station is in powersave mode. IEEE80211_TX_CTL_MORE_FRAMES More frames will be passed to the transmit function after the current frame, this can be used by drivers to kick the DMA queue only if unset or when the queue gets full. IEEE80211_TX_INTFL_RETRANSMISSION This frame is being retransmitted after TX status because the destination was asleep, it must not be modified again (no seqno assignment, crypto, etc.) IEEE80211_TX_INTFL_MLME_CONN_TX This frame was transmitted by the MLME code for connection establishment, this indicates that its status should kick the MLME state machine. IEEE80211_TX_INTFL_NL80211_FRAME_TX Frame was requested through nl80211 MLME command (internal to mac80211 to figure out whether to send TX status to user space) IEEE80211_TX_CTL_LDPC tells the driver to use LDPC for this frame IEEE80211_TX_CTL_STBC Enables Space-Time Block Coding (STBC) for this frame and selects the maximum number of streams that it can use. IEEE80211_TX_CTL_TX_OFFCHAN Marks this packet to be transmitted on the off-channel channel when a remain-on-channel offload is done in hardware -- normal packets still flow and are expected to be handled properly by the device. IEEE80211_TX_INTFL_TKIP_MIC_FAILURE Marks this packet to be used for TKIP testing. It will be sent out with incorrect Michael MIC key to allow TKIP countermeasures to be tested. IEEE80211_TX_CTL_NO_CCK_RATE This frame will be sent at non CCK rate. This flag is actually used for management frame especially for P2P frames not being sent at CCK rate in 2GHz band. IEEE80211_TX_STATUS_EOSP This packet marks the end of service period, when its status is reported the service period ends. For frames in an SP that mac80211 transmits, it is already set; for driver frames the driver may set this flag. It is also used to do the same for PS-Poll responses. IEEE80211_TX_CTL_USE_MINRATE This frame will be sent at lowest rate. This flag is used to send nullfunc frame at minimum rate when the nullfunc is used for connection monitoring purpose. IEEE80211_TX_CTL_DONTFRAG Don't fragment this packet even if it would be fragmented by size (this is optional, only used for monitor injection). IEEE80211_TX_STAT_NOACK_TRANSMITTED A frame that was marked with IEEE80211_TX_CTL_NO_ACK has been successfully transmitted without any errors (like issues specific to the driver/HW). This flag must not be set for frames that don't request no-ack behaviour with IEEE80211_TX_CTL_NO_ACK. Description These flags are used with the flags member of ieee80211_tx_info. Note If you have to add new flags to the enumeration, then don't forget to update IEEE80211_TX_TEMPORARY_FLAGS when necessary. LINUX Kernel Hackers Manual July 2017 enum mac80211_tx_control_flags 9 4.1.27 enum mac80211_tx_control_flags flags to describe transmit control Synopsis enum mac80211_tx_control_flags { IEEE80211_TX_CTRL_PORT_CTRL_PROTO, IEEE80211_TX_CTRL_PS_RESPONSE }; Constants IEEE80211_TX_CTRL_PORT_CTRL_PROTO this frame is a port control protocol frame (e.g. EAP) IEEE80211_TX_CTRL_PS_RESPONSE This frame is a response to a poll frame (PS-Poll or uAPSD). Description These flags are used in tx_info->control.flags. LINUX Kernel Hackers Manual July 2017 enum mac80211_rate_control_flags 9 4.1.27 enum mac80211_rate_control_flags per-rate flags set by the Rate Control algorithm. Synopsis enum mac80211_rate_control_flags { IEEE80211_TX_RC_USE_RTS_CTS, IEEE80211_TX_RC_USE_CTS_PROTECT, IEEE80211_TX_RC_USE_SHORT_PREAMBLE, IEEE80211_TX_RC_MCS, IEEE80211_TX_RC_GREEN_FIELD, IEEE80211_TX_RC_40_MHZ_WIDTH, IEEE80211_TX_RC_DUP_DATA, IEEE80211_TX_RC_SHORT_GI, IEEE80211_TX_RC_VHT_MCS, IEEE80211_TX_RC_80_MHZ_WIDTH, IEEE80211_TX_RC_160_MHZ_WIDTH }; Constants IEEE80211_TX_RC_USE_RTS_CTS Use RTS/CTS exchange for this rate. IEEE80211_TX_RC_USE_CTS_PROTECT CTS-to-self protection is required. This is set if the current BSS requires ERP protection. IEEE80211_TX_RC_USE_SHORT_PREAMBLE Use short preamble. IEEE80211_TX_RC_MCS HT rate. IEEE80211_TX_RC_GREEN_FIELD Indicates whether this rate should be used in Greenfield mode. IEEE80211_TX_RC_40_MHZ_WIDTH Indicates if the Channel Width should be 40 MHz. IEEE80211_TX_RC_DUP_DATA The frame should be transmitted on both of the adjacent 20 MHz channels, if the current channel type is NL80211_CHAN_HT40MINUS or NL80211_CHAN_HT40PLUS. IEEE80211_TX_RC_SHORT_GI Short Guard interval should be used for this rate. IEEE80211_TX_RC_VHT_MCS VHT MCS rate, in this case the idx field is split into a higher 4 bits (Nss) and lower 4 bits (MCS number) IEEE80211_TX_RC_80_MHZ_WIDTH Indicates 80 MHz transmission IEEE80211_TX_RC_160_MHZ_WIDTH Indicates 160 MHz transmission (80+80 isn't supported yet) Description These flags are set by the Rate control algorithm for each rate during tx, in the flags member of struct ieee80211_tx_rate. LINUX Kernel Hackers Manual July 2017 struct ieee80211_tx_rate 9 4.1.27 struct ieee80211_tx_rate rate selection/status Synopsis struct ieee80211_tx_rate { s8 idx; u16 count:5; u16 flags:11; }; Members idx rate index to attempt to send with count number of tries in this rate before going to the next rate flags rate control flags (enum mac80211_rate_control_flags) Description A value of -1 for idx indicates an invalid rate and, if used in an array of retry rates, that no more rates should be tried. When used for transmit status reporting, the driver should always report the rate along with the flags it used. struct ieee80211_tx_info contains an array of these structs in the control information, and it will be filled by the rate control algorithm according to what should be sent. For example, if this array contains, in the format { <idx>, <count> } the information { 3, 2 }, { 2, 2 }, { 1, 4 }, { -1, 0 }, { -1, 0 } then this means that the frame should be transmitted up to twice at rate 3, up to twice at rate 2, and up to four times at rate 1 if it doesn't get acknowledged. Say it gets acknowledged by the peer after the fifth attempt, the status information should then contain { 3, 2 }, { 2, 2 }, { 1, 1 }, { -1, 0 } ... since it was transmitted twice at rate 3, twice at rate 2 and once at rate 1 after which we received an acknowledgement. LINUX Kernel Hackers Manual July 2017 struct ieee80211_tx_info 9 4.1.27 struct ieee80211_tx_info skb transmit information Synopsis struct ieee80211_tx_info { u32 flags; u8 band; u8 hw_queue; u16 ack_frame_id; union {unnamed_union}; }; Members flags transmit info flags, defined above band the band to transmit on (use for checking for races) hw_queue HW queue to put the frame on, skb_get_queue_mapping gives the AC ack_frame_id internal frame ID for TX status, used internally {unnamed_union} anonymous Description This structure is placed in skb->cb for three uses: (1) mac80211 TX control - mac80211 tells the driver what to do (2) driver internal use (if applicable) (3) TX status information - driver tells mac80211 what happened LINUX Kernel Hackers Manual July 2017 ieee80211_tx_info_clear_status 9 4.1.27 ieee80211_tx_info_clear_status clear TX status Synopsis void ieee80211_tx_info_clear_status struct ieee80211_tx_info * info Arguments info The struct ieee80211_tx_info to be cleared. Description When the driver passes an skb back to mac80211, it must report a number of things in TX status. This function clears everything in the TX status but the rate control information (it does clear the count since you need to fill that in anyway). NOTE You can only use this function if you do NOT use info->driver_data! Use info->rate_driver_data instead if you need only the less space that allows. LINUX Kernel Hackers Manual July 2017 ieee80211_rx 9 4.1.27 ieee80211_rx receive frame Synopsis void ieee80211_rx struct ieee80211_hw * hw struct sk_buff * skb Arguments hw the hardware this frame came in on skb the buffer to receive, owned by mac80211 after this call Description Use this function to hand received frames to mac80211. The receive buffer in skb must start with an IEEE 802.11 header. In case of a paged skb is used, the driver is recommended to put the ieee80211 header of the frame on the linear part of the skb to avoid memory allocation and/or memcpy by the stack. This function may not be called in IRQ context. Calls to this function for a single hardware must be synchronized against each other. Calls to this function, ieee80211_rx_ni and ieee80211_rx_irqsafe may not be mixed for a single hardware. Must not run concurrently with ieee80211_tx_status or ieee80211_tx_status_ni. In process context use instead ieee80211_rx_ni. LINUX Kernel Hackers Manual July 2017 ieee80211_rx_ni 9 4.1.27 ieee80211_rx_ni receive frame (in process context) Synopsis void ieee80211_rx_ni struct ieee80211_hw * hw struct sk_buff * skb Arguments hw the hardware this frame came in on skb the buffer to receive, owned by mac80211 after this call Description Like ieee80211_rx but can be called in process context (internally disables bottom halves). Calls to this function, ieee80211_rx and ieee80211_rx_irqsafe may not be mixed for a single hardware. Must not run concurrently with ieee80211_tx_status or ieee80211_tx_status_ni. LINUX Kernel Hackers Manual July 2017 ieee80211_rx_irqsafe 9 4.1.27 ieee80211_rx_irqsafe receive frame Synopsis void ieee80211_rx_irqsafe struct ieee80211_hw * hw struct sk_buff * skb Arguments hw the hardware this frame came in on skb the buffer to receive, owned by mac80211 after this call Description Like ieee80211_rx but can be called in IRQ context (internally defers to a tasklet.) Calls to this function, ieee80211_rx or ieee80211_rx_ni may not be mixed for a single hardware.Must not run concurrently with ieee80211_tx_status or ieee80211_tx_status_ni. LINUX Kernel Hackers Manual July 2017 ieee80211_tx_status 9 4.1.27 ieee80211_tx_status transmit status callback Synopsis void ieee80211_tx_status struct ieee80211_hw * hw struct sk_buff * skb Arguments hw the hardware the frame was transmitted by skb the frame that was transmitted, owned by mac80211 after this call 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. This function may not be called in IRQ context. Calls to this function for a single hardware must be synchronized against each other. Calls to this function, ieee80211_tx_status_ni and ieee80211_tx_status_irqsafe may not be mixed for a single hardware. Must not run concurrently with ieee80211_rx or ieee80211_rx_ni. LINUX Kernel Hackers Manual July 2017 ieee80211_tx_status_ni 9 4.1.27 ieee80211_tx_status_ni transmit status callback (in process context) Synopsis void ieee80211_tx_status_ni struct ieee80211_hw * hw struct sk_buff * skb Arguments hw the hardware the frame was transmitted by skb the frame that was transmitted, owned by mac80211 after this call Description Like ieee80211_tx_status but can be called in process context. Calls to this function, ieee80211_tx_status and ieee80211_tx_status_irqsafe may not be mixed for a single hardware. LINUX Kernel Hackers Manual July 2017 ieee80211_tx_status_irqsafe 9 4.1.27 ieee80211_tx_status_irqsafe IRQ-safe transmit status callback Synopsis void ieee80211_tx_status_irqsafe struct ieee80211_hw * hw struct sk_buff * skb Arguments hw the hardware the frame was transmitted by skb the frame that was transmitted, owned by mac80211 after this call Description Like ieee80211_tx_status but can be called in IRQ context (internally defers to a tasklet.) Calls to this function, ieee80211_tx_status and ieee80211_tx_status_ni may not be mixed for a single hardware. LINUX Kernel Hackers Manual July 2017 ieee80211_rts_get 9 4.1.27 ieee80211_rts_get RTS frame generation function Synopsis void ieee80211_rts_get struct ieee80211_hw * hw struct ieee80211_vif * vif const void * frame size_t frame_len const struct ieee80211_tx_info * frame_txctl struct ieee80211_rts * rts Arguments hw pointer obtained from ieee80211_alloc_hw. vif struct ieee80211_vif pointer from the add_interface callback. 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_info 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. LINUX Kernel Hackers Manual July 2017 ieee80211_rts_duration 9 4.1.27 ieee80211_rts_duration Get the duration field for an RTS frame Synopsis __le16 ieee80211_rts_duration struct ieee80211_hw * hw struct ieee80211_vif * vif size_t frame_len const struct ieee80211_tx_info * frame_txctl Arguments hw pointer obtained from ieee80211_alloc_hw. vif struct ieee80211_vif pointer from the add_interface callback. frame_len the length of the frame that is going to be protected by the RTS. frame_txctl struct ieee80211_tx_info 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. Return The duration. LINUX Kernel Hackers Manual July 2017 ieee80211_ctstoself_get 9 4.1.27 ieee80211_ctstoself_get CTS-to-self frame generation function Synopsis void ieee80211_ctstoself_get struct ieee80211_hw * hw struct ieee80211_vif * vif const void * frame size_t frame_len const struct ieee80211_tx_info * frame_txctl struct ieee80211_cts * cts Arguments hw pointer obtained from ieee80211_alloc_hw. vif struct ieee80211_vif pointer from the add_interface callback. 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_info 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. LINUX Kernel Hackers Manual July 2017 ieee80211_ctstoself_duration 9 4.1.27 ieee80211_ctstoself_duration Get the duration field for a CTS-to-self frame Synopsis __le16 ieee80211_ctstoself_duration struct ieee80211_hw * hw struct ieee80211_vif * vif size_t frame_len const struct ieee80211_tx_info * frame_txctl Arguments hw pointer obtained from ieee80211_alloc_hw. vif struct ieee80211_vif pointer from the add_interface callback. frame_len the length of the frame that is going to be protected by the CTS-to-self. frame_txctl struct ieee80211_tx_info 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. Return The duration. LINUX Kernel Hackers Manual July 2017 ieee80211_generic_frame_duration 9 4.1.27 ieee80211_generic_frame_duration Calculate the duration field for a frame Synopsis __le16 ieee80211_generic_frame_duration struct ieee80211_hw * hw struct ieee80211_vif * vif enum ieee80211_band band size_t frame_len struct ieee80211_rate * rate Arguments hw pointer obtained from ieee80211_alloc_hw. vif struct ieee80211_vif pointer from the add_interface callback. band the band to calculate the frame duration on frame_len the length of the frame. rate the rate 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). Return The duration. LINUX Kernel Hackers Manual July 2017 ieee80211_wake_queue 9 4.1.27 ieee80211_wake_queue wake specific queue Synopsis 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. LINUX Kernel Hackers Manual July 2017 ieee80211_stop_queue 9 4.1.27 ieee80211_stop_queue stop specific queue Synopsis 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. LINUX Kernel Hackers Manual July 2017 ieee80211_wake_queues 9 4.1.27 ieee80211_wake_queues wake all queues Synopsis 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. LINUX Kernel Hackers Manual July 2017 ieee80211_stop_queues 9 4.1.27 ieee80211_stop_queues stop all queues Synopsis 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. LINUX Kernel Hackers Manual July 2017 ieee80211_queue_stopped 9 4.1.27 ieee80211_queue_stopped test status of the queue Synopsis int ieee80211_queue_stopped 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. Return true if the queue is stopped. false otherwise. Frame filtering mac80211 requires to see many management frames for proper operation, and users may want to see many more frames when in monitor mode. However, for best CPU usage and power consumption, having as few frames as possible percolate through the stack is desirable. Hence, the hardware should filter as much as possible. To achieve this, mac80211 uses filter flags (see below) to tell the driver's configure_filter function which frames should be passed to mac80211 and which should be filtered out. Before configure_filter is invoked, the prepare_multicast callback is invoked with the parameters mc_count and mc_list for the combined multicast address list of all virtual interfaces. It's use is optional, and it returns a u64 that is passed to configure_filter. Additionally, configure_filter has the arguments changed_flags telling which flags were changed and total_flags with the new flag states. If your device has no multicast address filters your driver will need to check both the FIF_ALLMULTI flag and the mc_count parameter to see whether multicast frames should be accepted or dropped. All unsupported flags in total_flags must be cleared. Hardware does not support a flag if it is incapable of _passing_ the frame to the stack. Otherwise the driver must ignore the flag, but not clear it. You must _only_ clear the flag (announce no support for the flag to mac80211) if you are not able to pass the packet type to the stack (so the hardware always filters it). So for example, you should clear FIF_CONTROL, if your hardware always filters control frames. If your hardware always passes control frames to the kernel and is incapable of filtering them, you do _not_ clear the FIF_CONTROL flag. This rule applies to all other FIF flags as well. LINUX Kernel Hackers Manual July 2017 enum ieee80211_filter_flags 9 4.1.27 enum ieee80211_filter_flags hardware filter flags Synopsis enum ieee80211_filter_flags { FIF_PROMISC_IN_BSS, FIF_ALLMULTI, FIF_FCSFAIL, FIF_PLCPFAIL, FIF_BCN_PRBRESP_PROMISC, FIF_CONTROL, FIF_OTHER_BSS, FIF_PSPOLL, FIF_PROBE_REQ }; 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 (except for PS Poll), if PROMISC_IN_BSS is not set then only those addressed to this station. FIF_OTHER_BSS pass frames destined to other BSSes FIF_PSPOLL pass PS Poll frames, if PROMISC_IN_BSS is not set then only those addressed to this station. FIF_PROBE_REQ pass probe request frames HW queue control 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. The mac80211 workqueue mac80211 provides its own workqueue for drivers and internal mac80211 use. The workqueue is a single threaded workqueue and can only be accessed by helpers for sanity checking. Drivers must ensure all work added onto the mac80211 workqueue should be cancelled on the driver stop callback. mac80211 will flushed the workqueue upon interface removal and during suspend. All work performed on the mac80211 workqueue must not acquire the RTNL lock. LINUX Kernel Hackers Manual July 2017 ieee80211_queue_work 9 4.1.27 ieee80211_queue_work add work onto the mac80211 workqueue Synopsis void ieee80211_queue_work struct ieee80211_hw * hw struct work_struct * work Arguments hw the hardware struct for the interface we are adding work for work the work we want to add onto the mac80211 workqueue Description Drivers and mac80211 use this to add work onto the mac80211 workqueue. This helper ensures drivers are not queueing work when they should not be. LINUX Kernel Hackers Manual July 2017 ieee80211_queue_delayed_work 9 4.1.27 ieee80211_queue_delayed_work add work onto the mac80211 workqueue Synopsis void ieee80211_queue_delayed_work struct ieee80211_hw * hw struct delayed_work * dwork unsigned long delay Arguments hw the hardware struct for the interface we are adding work for dwork delayable work to queue onto the mac80211 workqueue delay number of jiffies to wait before queueing Description Drivers and mac80211 use this to queue delayed work onto the mac80211 workqueue. Advanced driver interface Information contained within this part of the book is of interest only for advanced interaction of mac80211 with drivers to exploit more hardware capabilities and improve performance. LED support Mac80211 supports various ways of blinking LEDs. Wherever possible, device LEDs should be exposed as LED class devices and hooked up to the appropriate trigger, which will then be triggered appropriately by mac80211. LINUX Kernel Hackers Manual July 2017 ieee80211_get_tx_led_name 9 4.1.27 ieee80211_get_tx_led_name get name of TX LED Synopsis 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. Return The name of the LED trigger. NULL if not configured for LEDs. LINUX Kernel Hackers Manual July 2017 ieee80211_get_rx_led_name 9 4.1.27 ieee80211_get_rx_led_name get name of RX LED Synopsis 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. Return The name of the LED trigger. NULL if not configured for LEDs. LINUX Kernel Hackers Manual July 2017 ieee80211_get_assoc_led_name 9 4.1.27 ieee80211_get_assoc_led_name get name of association LED Synopsis char * ieee80211_get_assoc_led_name struct ieee80211_hw * hw Arguments hw the hardware to get the LED trigger name for Description mac80211 creates a association 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. Return The name of the LED trigger. NULL if not configured for LEDs. LINUX Kernel Hackers Manual July 2017 ieee80211_get_radio_led_name 9 4.1.27 ieee80211_get_radio_led_name get name of radio LED Synopsis char * ieee80211_get_radio_led_name struct ieee80211_hw * hw Arguments hw the hardware to get the LED trigger name for Description mac80211 creates a radio change 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. Return The name of the LED trigger. NULL if not configured for LEDs. LINUX Kernel Hackers Manual July 2017 struct ieee80211_tpt_blink 9 4.1.27 struct ieee80211_tpt_blink throughput blink description Synopsis struct ieee80211_tpt_blink { int throughput; int blink_time; }; Members throughput throughput in Kbit/sec blink_time blink time in milliseconds (full cycle, ie. one off + one on period) LINUX Kernel Hackers Manual July 2017 enum ieee80211_tpt_led_trigger_flags 9 4.1.27 enum ieee80211_tpt_led_trigger_flags throughput trigger flags Synopsis enum ieee80211_tpt_led_trigger_flags { IEEE80211_TPT_LEDTRIG_FL_RADIO, IEEE80211_TPT_LEDTRIG_FL_WORK, IEEE80211_TPT_LEDTRIG_FL_CONNECTED }; Constants IEEE80211_TPT_LEDTRIG_FL_RADIO enable blinking with radio IEEE80211_TPT_LEDTRIG_FL_WORK enable blinking when working IEEE80211_TPT_LEDTRIG_FL_CONNECTED enable blinking when at least one interface is connected in some way, including being an AP LINUX Kernel Hackers Manual July 2017 ieee80211_create_tpt_led_trigger 9 4.1.27 ieee80211_create_tpt_led_trigger create throughput LED trigger Synopsis char * ieee80211_create_tpt_led_trigger struct ieee80211_hw * hw unsigned int flags const struct ieee80211_tpt_blink * blink_table unsigned int blink_table_len Arguments hw the hardware to create the trigger for flags trigger flags, see enum ieee80211_tpt_led_trigger_flags blink_table the blink table -- needs to be ordered by throughput blink_table_len size of the blink table Return NULL (in case of error, or if no LED triggers are configured) or the name of the new trigger. Note This function must be called before ieee80211_register_hw. Hardware crypto acceleration mac80211 is capable of taking advantage of many hardware acceleration designs for encryption and decryption operations. The set_key callback in the struct ieee80211_ops for a given device is called to enable hardware acceleration of encryption and decryption. The callback takes a sta parameter that will be NULL for default keys or keys used for transmission only, or point to the station information for the peer for individual keys. Multiple transmission keys with the same key index may be used when VLANs are configured for an access point. When transmitting, the TX control data will use the hw_key_idx selected by the driver by modifying the struct ieee80211_key_conf pointed to by the key parameter to the set_key function. The set_key call for the SET_KEY command should return 0 if the key is now in use, -EOPNOTSUPP or -ENOSPC if it couldn't be added; if you return 0 then hw_key_idx must be assigned to the hardware key index, you are free to use the full u8 range. Note that in the case that the IEEE80211_HW_SW_CRYPTO_CONTROL flag is set, mac80211 will not automatically fall back to software crypto if enabling hardware crypto failed. The set_key call may also return the value 1 to permit this specific key/algorithm to be done in software. When the cmd is DISABLE_KEY then it must succeed. Note that it is permissible to not decrypt a frame even if a key for it has been uploaded to hardware, the stack will not make any decision based on whether a key has been uploaded or not but rather based on the receive flags. The struct ieee80211_key_conf structure pointed to by the key parameter is guaranteed to be valid until another call to set_key removes it, but it can only be used as a cookie to differentiate keys. In TKIP some HW need to be provided a phase 1 key, for RX decryption acceleration (i.e. iwlwifi). Those drivers should provide update_tkip_key handler. The update_tkip_key call updates the driver with the new phase 1 key. This happens every time the iv16 wraps around (every 65536 packets). The set_key call will happen only once for each key (unless the AP did rekeying), it will not include a valid phase 1 key. The valid phase 1 key is provided by update_tkip_key only. The trigger that makes mac80211 call this handler is software decryption with wrap around of iv16. The set_default_unicast_key call updates the default WEP key index configured to the hardware for WEP encryption type. This is required for devices that support offload of data packets (e.g. ARP responses). LINUX Kernel Hackers Manual July 2017 enum set_key_cmd 9 4.1.27 enum set_key_cmd key command Synopsis 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. LINUX Kernel Hackers Manual July 2017 struct ieee80211_key_conf 9 4.1.27 struct ieee80211_key_conf key information Synopsis struct ieee80211_key_conf { u32 cipher; u8 icv_len; u8 iv_len; u8 hw_key_idx; u8 flags; s8 keyidx; u8 keylen; u8 key[0]; }; Members cipher The key's cipher suite selector. icv_len The ICV length for this key type iv_len The IV length for this key type 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. For ALG_TKIP the key is encoded as a 256-bit (32 byte) Description This key information is given by mac80211 to the driver by the set_key callback in struct ieee80211_ops. data block - Temporal Encryption Key (128 bits) - Temporal Authenticator Tx MIC Key (64 bits) - Temporal Authenticator Rx MIC Key (64 bits) LINUX Kernel Hackers Manual July 2017 enum ieee80211_key_flags 9 4.1.27 enum ieee80211_key_flags key flags Synopsis enum ieee80211_key_flags { IEEE80211_KEY_FLAG_GENERATE_IV_MGMT, IEEE80211_KEY_FLAG_GENERATE_IV, IEEE80211_KEY_FLAG_GENERATE_MMIC, IEEE80211_KEY_FLAG_PAIRWISE, IEEE80211_KEY_FLAG_SW_MGMT_TX, IEEE80211_KEY_FLAG_PUT_IV_SPACE, IEEE80211_KEY_FLAG_RX_MGMT, IEEE80211_KEY_FLAG_RESERVE_TAILROOM }; Constants IEEE80211_KEY_FLAG_GENERATE_IV_MGMT This flag should be set by the driver for a CCMP/GCMP key to indicate that is requires IV generation only for managment frames (MFP). IEEE80211_KEY_FLAG_GENERATE_IV This flag should be set by the driver to indicate that it requires IV generation for this particular key. Setting this flag does not necessarily mean that SKBs will have sufficient tailroom for ICV or MIC. 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. IEEE80211_KEY_FLAG_PAIRWISE Set by mac80211, this flag indicates that the key is pairwise rather then a shared key. IEEE80211_KEY_FLAG_SW_MGMT_TX This flag should be set by the driver for a CCMP/GCMP key if it requires CCMP/GCMP encryption of management frames (MFP) to be done in software. IEEE80211_KEY_FLAG_PUT_IV_SPACE This flag should be set by the driver if space should be prepared for the IV, but the IV itself should not be generated. Do not set together with IEEE80211_KEY_FLAG_GENERATE_IV on the same key. Setting this flag does not necessarily mean that SKBs will have sufficient tailroom for ICV or MIC. IEEE80211_KEY_FLAG_RX_MGMT This key will be used to decrypt received management frames. The flag can help drivers that have a hardware crypto implementation that doesn't deal with management frames properly by allowing them to not upload the keys to hardware and fall back to software crypto. Note that this flag deals only with RX, if your crypto engine can't deal with TX you can also set the IEEE80211_KEY_FLAG_SW_MGMT_TX flag to encrypt such frames in SW. IEEE80211_KEY_FLAG_RESERVE_TAILROOM This flag should be set by the driver for a key to indicate that sufficient tailroom must always be reserved for ICV or MIC, even when HW encryption is enabled. Description These flags are used for communication about keys between the driver and mac80211, with the flags parameter of struct ieee80211_key_conf. LINUX Kernel Hackers Manual July 2017 ieee80211_get_tkip_p1k 9 4.1.27 ieee80211_get_tkip_p1k get a TKIP phase 1 key Synopsis void ieee80211_get_tkip_p1k struct ieee80211_key_conf * keyconf struct sk_buff * skb u16 * p1k Arguments keyconf the parameter passed with the set key skb the packet to take the IV32 value from that will be encrypted with this P1K p1k a buffer to which the key will be written, as 5 u16 values Description This function returns the TKIP phase 1 key for the IV32 taken from the given packet. LINUX Kernel Hackers Manual July 2017 ieee80211_get_tkip_p1k_iv 9 4.1.27 ieee80211_get_tkip_p1k_iv get a TKIP phase 1 key for IV32 Synopsis void ieee80211_get_tkip_p1k_iv struct ieee80211_key_conf * keyconf u32 iv32 u16 * p1k Arguments keyconf the parameter passed with the set key iv32 IV32 to get the P1K for p1k a buffer to which the key will be written, as 5 u16 values Description This function returns the TKIP phase 1 key for the given IV32. LINUX Kernel Hackers Manual July 2017 ieee80211_get_tkip_p2k 9 4.1.27 ieee80211_get_tkip_p2k get a TKIP phase 2 key Synopsis void ieee80211_get_tkip_p2k struct ieee80211_key_conf * keyconf struct sk_buff * skb u8 * p2k Arguments keyconf the parameter passed with the set key skb the packet to take the IV32/IV16 values from that will be encrypted with this key p2k a buffer to which the key will be written, 16 bytes Description This function computes the TKIP RC4 key for the IV values in the packet. Powersave support mac80211 has support for various powersave implementations. First, it can support hardware that handles all powersaving by itself, such hardware should simply set the IEEE80211_HW_SUPPORTS_PS hardware flag. In that case, it will be told about the desired powersave mode with the IEEE80211_CONF_PS flag depending on the association status. The hardware must take care of sending nullfunc frames when necessary, i.e. when entering and leaving powersave mode. The hardware is required to look at the AID in beacons and signal to the AP that it woke up when it finds traffic directed to it. IEEE80211_CONF_PS flag enabled means that the powersave mode defined in IEEE 802.11-2007 section 11.2 is enabled. This is not to be confused with hardware wakeup and sleep states. Driver is responsible for waking up the hardware before issuing commands to the hardware and putting it back to sleep at appropriate times. When PS is enabled, hardware needs to wakeup for beacons and receive the buffered multicast/broadcast frames after the beacon. Also it must be possible to send frames and receive the acknowledment frame. Other hardware designs cannot send nullfunc frames by themselves and also need software support for parsing the TIM bitmap. This is also supported by mac80211 by combining the IEEE80211_HW_SUPPORTS_PS and IEEE80211_HW_PS_NULLFUNC_STACK flags. The hardware is of course still required to pass up beacons. The hardware is still required to handle waking up for multicast traffic; if it cannot the driver must handle that as best as it can, mac80211 is too slow to do that. Dynamic powersave is an extension to normal powersave in which the hardware stays awake for a user-specified period of time after sending a frame so that reply frames need not be buffered and therefore delayed to the next wakeup. It's compromise of getting good enough latency when there's data traffic and still saving significantly power in idle periods. Dynamic powersave is simply supported by mac80211 enabling and disabling PS based on traffic. Driver needs to only set IEEE80211_HW_SUPPORTS_PS flag and mac80211 will handle everything automatically. Additionally, hardware having support for the dynamic PS feature may set the IEEE80211_HW_SUPPORTS_DYNAMIC_PS flag to indicate that it can support dynamic PS mode itself. The driver needs to look at the dynamic_ps_timeout hardware configuration value and use it that value whenever IEEE80211_CONF_PS is set. In this case mac80211 will disable dynamic PS feature in stack and will just keep IEEE80211_CONF_PS enabled whenever user has enabled powersave. Driver informs U-APSD client support by enabling IEEE80211_VIF_SUPPORTS_UAPSD flag. The mode is configured through the uapsd parameter in conf_tx operation. Hardware needs to send the QoS Nullfunc frames and stay awake until the service period has ended. To utilize U-APSD, dynamic powersave is disabled for voip AC and all frames from that AC are transmitted with powersave enabled. Note: U-APSD client mode is not yet supported with IEEE80211_HW_PS_NULLFUNC_STACK. Beacon filter support Some hardware have beacon filter support to reduce host cpu wakeups which will reduce system power consumption. It usually works so that the firmware creates a checksum of the beacon but omits all constantly changing elements (TSF, TIM etc). Whenever the checksum changes the beacon is forwarded to the host, otherwise it will be just dropped. That way the host will only receive beacons where some relevant information (for example ERP protection or WMM settings) have changed. Beacon filter support is advertised with the IEEE80211_VIF_BEACON_FILTER interface capability. The driver needs to enable beacon filter support whenever power save is enabled, that is IEEE80211_CONF_PS is set. When power save is enabled, the stack will not check for beacon loss and the driver needs to notify about loss of beacons with ieee80211_beacon_loss. The time (or number of beacons missed) until the firmware notifies the driver of a beacon loss event (which in turn causes the driver to call ieee80211_beacon_loss) should be configurable and will be controlled by mac80211 and the roaming algorithm in the future. Since there may be constantly changing information elements that nothing in the software stack cares about, we will, in the future, have mac80211 tell the driver which information elements are interesting in the sense that we want to see changes in them. This will include - a list of information element IDs - a list of OUIs for the vendor information element Ideally, the hardware would filter out any beacons without changes in the requested elements, but if it cannot support that it may, at the expense of some efficiency, filter out only a subset. For example, if the device doesn't support checking for OUIs it should pass up all changes in all vendor information elements. Note that change, for the sake of simplification, also includes information elements appearing or disappearing from the beacon. Some hardware supports an ignore list instead, just make sure nothing that was requested is on the ignore list, and include commonly changing information element IDs in the ignore list, for example 11 (BSS load) and the various vendor-assigned IEs with unknown contents (128, 129, 133-136, 149, 150, 155, 156, 173, 176, 178, 179, 219); for forward compatibility it could also include some currently unused IDs. In addition to these capabilities, hardware should support notifying the host of changes in the beacon RSSI. This is relevant to implement roaming when no traffic is flowing (when traffic is flowing we see the RSSI of the received data packets). This can consist in notifying the host when the RSSI changes significantly or when it drops below or rises above configurable thresholds. In the future these thresholds will also be configured by mac80211 (which gets them from userspace) to implement them as the roaming algorithm requires. If the hardware cannot implement this, the driver should ask it to periodically pass beacon frames to the host so that software can do the signal strength threshold checking. LINUX Kernel Hackers Manual July 2017 ieee80211_beacon_loss 9 4.1.27 ieee80211_beacon_loss inform hardware does not receive beacons Synopsis void ieee80211_beacon_loss struct ieee80211_vif * vif Arguments vif struct ieee80211_vif pointer from the add_interface callback. Description When beacon filtering is enabled with IEEE80211_VIF_BEACON_FILTER and IEEE80211_CONF_PS is set, the driver needs to inform whenever the hardware is not receiving beacons with this function. Multiple queues and QoS support TBD LINUX Kernel Hackers Manual July 2017 struct ieee80211_tx_queue_params 9 4.1.27 struct ieee80211_tx_queue_params transmit queue configuration Synopsis struct ieee80211_tx_queue_params { u16 txop; u16 cw_min; u16 cw_max; u8 aifs; bool acm; bool uapsd; }; Members txop maximum burst time in units of 32 usecs, 0 meaning disabled cw_min minimum contention window [a value of the form 2^n-1 in the range 1..32767] cw_max maximum contention window [like cw_min] aifs arbitration interframe space [0..255] acm is mandatory admission control required for the access category uapsd is U-APSD mode enabled for the queue Description The information provided in this structure is required for QoS transmit queue configuration. Cf. IEEE 802.11 7.3.2.29. Access point mode support TBD Some parts of the if_conf should be discussed here instead Insert notes about VLAN interfaces with hw crypto here or in the hw crypto chapter.
support for powersaving clients In order to implement AP and P2P GO modes, mac80211 has support for client powersaving, both legacy PS (PS-Poll/null data) and uAPSD. There currently is no support for sAPSD. There is one assumption that mac80211 makes, namely that a client will not poll with PS-Poll and trigger with uAPSD at the same time. Both are supported, and both can be used by the same client, but they can't be used concurrently by the same client. This simplifies the driver code. The first thing to keep in mind is that there is a flag for complete driver implementation: IEEE80211_HW_AP_LINK_PS. If this flag is set, mac80211 expects the driver to handle most of the state machine for powersaving clients and will ignore the PM bit in incoming frames. Drivers then use ieee80211_sta_ps_transition to inform mac80211 of stations' powersave transitions. In this mode, mac80211 also doesn't handle PS-Poll/uAPSD. In the mode without IEEE80211_HW_AP_LINK_PS, mac80211 will check the PM bit in incoming frames for client powersave transitions. When a station goes to sleep, we will stop transmitting to it. There is, however, a race condition: a station might go to sleep while there is data buffered on hardware queues. If the device has support for this it will reject frames, and the driver should give the frames back to mac80211 with the IEEE80211_TX_STAT_TX_FILTERED flag set which will cause mac80211 to retry the frame when the station wakes up. The driver is also notified of powersave transitions by calling its sta_notify callback. When the station is asleep, it has three choices: it can wake up, it can PS-Poll, or it can possibly start a uAPSD service period. Waking up is implemented by simply transmitting all buffered (and filtered) frames to the station. This is the easiest case. When the station sends a PS-Poll or a uAPSD trigger frame, mac80211 will inform the driver of this with the allow_buffered_frames callback; this callback is optional. mac80211 will then transmit the frames as usual and set the IEEE80211_TX_CTL_NO_PS_BUFFER on each frame. The last frame in the service period (or the only response to a PS-Poll) also has IEEE80211_TX_STATUS_EOSP set to indicate that it ends the service period; as this frame must have TX status report it also sets IEEE80211_TX_CTL_REQ_TX_STATUS. When TX status is reported for this frame, the service period is marked has having ended and a new one can be started by the peer. Additionally, non-bufferable MMPDUs can also be transmitted by mac80211 with the IEEE80211_TX_CTL_NO_PS_BUFFER set in them. Another race condition can happen on some devices like iwlwifi when there are frames queued for the station and it wakes up or polls; the frames that are already queued could end up being transmitted first instead, causing reordering and/or wrong processing of the EOSP. The cause is that allowing frames to be transmitted to a certain station is out-of-band communication to the device. To allow this problem to be solved, the driver can call ieee80211_sta_block_awake if frames are buffered when it is notified that the station went to sleep. When all these frames have been filtered (see above), it must call the function again to indicate that the station is no longer blocked. If the driver buffers frames in the driver for aggregation in any way, it must use the ieee80211_sta_set_buffered call when it is notified of the station going to sleep to inform mac80211 of any TIDs that have frames buffered. Note that when a station wakes up this information is reset (hence the requirement to call it when informed of the station going to sleep). Then, when a service period starts for any reason, release_buffered_frames is called with the number of frames to be released and which TIDs they are to come from. In this case, the driver is responsible for setting the EOSP (for uAPSD) and MORE_DATA bits in the released frames, to help the more_data parameter is passed to tell the driver if there is more data on other TIDs -- the TIDs to release frames from are ignored since mac80211 doesn't know how many frames the buffers for those TIDs contain. If the driver also implement GO mode, where absence periods may shorten service periods (or abort PS-Poll responses), it must filter those response frames except in the case of frames that are buffered in the driver -- those must remain buffered to avoid reordering. Because it is possible that no frames are released in this case, the driver must call ieee80211_sta_eosp to indicate to mac80211 that the service period ended anyway. Finally, if frames from multiple TIDs are released from mac80211 but the driver might reorder them, it must clear & set the flags appropriately (only the last frame may have IEEE80211_TX_STATUS_EOSP) and also take care of the EOSP and MORE_DATA bits in the frame. The driver may also use ieee80211_sta_eosp in this case. Note that if the driver ever buffers frames other than QoS-data frames, it must take care to never send a non-QoS-data frame as the last frame in a service period, adding a QoS-nulldata frame after a non-QoS-data frame if needed. LINUX Kernel Hackers Manual July 2017 ieee80211_get_buffered_bc 9 4.1.27 ieee80211_get_buffered_bc accessing buffered broadcast and multicast frames Synopsis struct sk_buff * ieee80211_get_buffered_bc struct ieee80211_hw * hw struct ieee80211_vif * vif Arguments hw pointer as obtained from ieee80211_alloc_hw. vif struct ieee80211_vif pointer from the add_interface callback. 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. Return 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. LINUX Kernel Hackers Manual July 2017 ieee80211_beacon_get 9 4.1.27 ieee80211_beacon_get beacon generation function Synopsis struct sk_buff * ieee80211_beacon_get struct ieee80211_hw * hw struct ieee80211_vif * vif Arguments hw pointer obtained from ieee80211_alloc_hw. vif struct ieee80211_vif pointer from the add_interface callback. Description See ieee80211_beacon_get_tim. Return See ieee80211_beacon_get_tim. LINUX Kernel Hackers Manual July 2017 ieee80211_sta_eosp 9 4.1.27 ieee80211_sta_eosp notify mac80211 about end of SP Synopsis void ieee80211_sta_eosp struct ieee80211_sta * pubsta Arguments pubsta the station Description When a device transmits frames in a way that it can't tell mac80211 in the TX status about the EOSP, it must clear the IEEE80211_TX_STATUS_EOSP bit and call this function instead. This applies for PS-Poll as well as uAPSD. Note that just like with _tx_status and _rx drivers must not mix calls to irqsafe/non-irqsafe versions, this function must not be mixed with those either. Use the all irqsafe, or all non-irqsafe, don't mix! NB the _irqsafe version of this function doesn't exist, no driver needs it right now. Don't call this function if you'd need the _irqsafe version, look at the git history and restore the _irqsafe version! LINUX Kernel Hackers Manual July 2017 enum ieee80211_frame_release_type 9 4.1.27 enum ieee80211_frame_release_type frame release reason Synopsis enum ieee80211_frame_release_type { IEEE80211_FRAME_RELEASE_PSPOLL, IEEE80211_FRAME_RELEASE_UAPSD }; Constants IEEE80211_FRAME_RELEASE_PSPOLL frame released for PS-Poll IEEE80211_FRAME_RELEASE_UAPSD frame(s) released due to frame received on trigger-enabled AC LINUX Kernel Hackers Manual July 2017 ieee80211_sta_ps_transition 9 4.1.27 ieee80211_sta_ps_transition PS transition for connected sta Synopsis int ieee80211_sta_ps_transition struct ieee80211_sta * sta bool start Arguments sta currently connected sta start start or stop PS Description When operating in AP mode with the IEEE80211_HW_AP_LINK_PS flag set, use this function to inform mac80211 about a connected station entering/leaving PS mode. This function may not be called in IRQ context or with softirqs enabled. Calls to this function for a single hardware must be synchronized against each other. Return 0 on success. -EINVAL when the requested PS mode is already set. LINUX Kernel Hackers Manual July 2017 ieee80211_sta_ps_transition_ni 9 4.1.27 ieee80211_sta_ps_transition_ni PS transition for connected sta (in process context) Synopsis int ieee80211_sta_ps_transition_ni struct ieee80211_sta * sta bool start Arguments sta currently connected sta start start or stop PS Description Like ieee80211_sta_ps_transition but can be called in process context (internally disables bottom halves). Concurrent call restriction still applies. Return Like ieee80211_sta_ps_transition. LINUX Kernel Hackers Manual July 2017 ieee80211_sta_set_buffered 9 4.1.27 ieee80211_sta_set_buffered inform mac80211 about driver-buffered frames Synopsis void ieee80211_sta_set_buffered struct ieee80211_sta * sta u8 tid bool buffered Arguments sta struct ieee80211_sta pointer for the sleeping station tid the TID that has buffered frames buffered indicates whether or not frames are buffered for this TID Description If a driver buffers frames for a powersave station instead of passing them back to mac80211 for retransmission, the station may still need to be told that there are buffered frames via the TIM bit. This function informs mac80211 whether or not there are frames that are buffered in the driver for a given TID; mac80211 can then use this data to set the TIM bit (NOTE: This may call back into the driver's set_tim call! Beware of the locking!) If all frames are released to the station (due to PS-poll or uAPSD) then the driver needs to inform mac80211 that there no longer are frames buffered. However, when the station wakes up mac80211 assumes that all buffered frames will be transmitted and clears this data, drivers need to make sure they inform mac80211 about all buffered frames on the sleep transition (sta_notify with STA_NOTIFY_SLEEP). Note that technically mac80211 only needs to know this per AC, not per TID, but since driver buffering will inevitably happen per TID (since it is related to aggregation) it is easier to make mac80211 map the TID to the AC as required instead of keeping track in all drivers that use this API. LINUX Kernel Hackers Manual July 2017 ieee80211_sta_block_awake 9 4.1.27 ieee80211_sta_block_awake block station from waking up Synopsis void ieee80211_sta_block_awake struct ieee80211_hw * hw struct ieee80211_sta * pubsta bool block Arguments hw the hardware pubsta the station block whether to block or unblock Description Some devices require that all frames that are on the queues for a specific station that went to sleep are flushed before a poll response or frames after the station woke up can be delivered to that it. Note that such frames must be rejected by the driver as filtered, with the appropriate status flag. This function allows implementing this mode in a race-free manner. To do this, a driver must keep track of the number of frames still enqueued for a specific station. If this number is not zero when the station goes to sleep, the driver must call this function to force mac80211 to consider the station to be asleep regardless of the station's actual state. Once the number of outstanding frames reaches zero, the driver must call this function again to unblock the station. That will cause mac80211 to be able to send ps-poll responses, and if the station queried in the meantime then frames will also be sent out as a result of this. Additionally, the driver will be notified that the station woke up some time after it is unblocked, regardless of whether the station actually woke up while blocked or not.
Supporting multiple virtual interfaces TBD Note: WDS with identical MAC address should almost always be OK Insert notes about having multiple virtual interfaces with different MAC addresses here, note which configurations are supported by mac80211, add notes about supporting hw crypto with it. LINUX Kernel Hackers Manual July 2017 ieee80211_iterate_active_interfaces 9 4.1.27 ieee80211_iterate_active_interfaces iterate active interfaces Synopsis void ieee80211_iterate_active_interfaces struct ieee80211_hw * hw u32 iter_flags void (*iterator) void *data, u8 *mac, struct ieee80211_vif *vif void * data Arguments hw the hardware struct of which the interfaces should be iterated over iter_flags iteration flags, see enum ieee80211_interface_iteration_flags iterator the iterator function to call data first argument of the iterator function Description This function iterates over the interfaces associated with a given hardware that are currently active and calls the callback for them. This function allows the iterator function to sleep, when the iterator function is atomic ieee80211_iterate_active_interfaces_atomic can be used. Does not iterate over a new interface during add_interface. LINUX Kernel Hackers Manual July 2017 ieee80211_iterate_active_interfaces_atomic 9 4.1.27 ieee80211_iterate_active_interfaces_atomic iterate active interfaces Synopsis void ieee80211_iterate_active_interfaces_atomic struct ieee80211_hw * hw u32 iter_flags void (*iterator) void *data, u8 *mac, struct ieee80211_vif *vif void * data Arguments hw the hardware struct of which the interfaces should be iterated over iter_flags iteration flags, see enum ieee80211_interface_iteration_flags iterator the iterator function to call, cannot sleep data first argument of the iterator function Description This function iterates over the interfaces associated with a given hardware that are currently active and calls the callback for them. This function requires the iterator callback function to be atomic, if that is not desired, use ieee80211_iterate_active_interfaces instead. Does not iterate over a new interface during add_interface. Station handling TODO LINUX Kernel Hackers Manual July 2017 struct ieee80211_sta 9 4.1.27 struct ieee80211_sta station table entry Synopsis struct ieee80211_sta { u32 supp_rates[IEEE80211_NUM_BANDS]; u8 addr[ETH_ALEN]; u16 aid; struct ieee80211_sta_ht_cap ht_cap; struct ieee80211_sta_vht_cap vht_cap; bool wme; u8 uapsd_queues; u8 max_sp; u8 rx_nss; enum ieee80211_sta_rx_bandwidth bandwidth; enum ieee80211_smps_mode smps_mode; struct ieee80211_sta_rates __rcu * rates; bool tdls; bool tdls_initiator; bool mfp; struct ieee80211_txq * txq[IEEE80211_NUM_TIDS]; u8 drv_priv[0]; }; Members supp_rates[IEEE80211_NUM_BANDS] Bitmap of supported rates (per band) addr[ETH_ALEN] MAC address aid AID we assigned to the station if we're an AP ht_cap HT capabilities of this STA; restricted to our own capabilities vht_cap VHT capabilities of this STA; restricted to our own capabilities wme indicates whether the STA supports QoS/WME (if local devices does, otherwise always false) uapsd_queues bitmap of queues configured for uapsd. Only valid if wme is supported. max_sp max Service Period. Only valid if wme is supported. rx_nss in HT/VHT, the maximum number of spatial streams the station can receive at the moment, changed by operating mode notifications and capabilities. The value is only valid after the station moves to associated state. bandwidth current bandwidth the station can receive with smps_mode current SMPS mode (off, static or dynamic) rates rate control selection table tdls indicates whether the STA is a TDLS peer tdls_initiator indicates the STA is an initiator of the TDLS link. Only valid if the STA is a TDLS peer in the first place. mfp indicates whether the STA uses management frame protection or not. txq[IEEE80211_NUM_TIDS] per-TID data TX queues (if driver uses the TXQ abstraction) drv_priv[0] data area for driver use, will always be aligned to sizeof(void *), size is determined in hw information. Description A station table entry represents a station we are possibly communicating with. Since stations are RCU-managed in mac80211, any ieee80211_sta pointer you get access to must either be protected by rcu_read_lock explicitly or implicitly, or you must take good care to not use such a pointer after a call to your sta_remove callback that removed it. LINUX Kernel Hackers Manual July 2017 enum sta_notify_cmd 9 4.1.27 enum sta_notify_cmd sta notify command Synopsis enum sta_notify_cmd { STA_NOTIFY_SLEEP, STA_NOTIFY_AWAKE }; Constants STA_NOTIFY_SLEEP a station is now sleeping STA_NOTIFY_AWAKE a sleeping station woke up Description Used with the sta_notify callback in struct ieee80211_ops, this indicates if an associated station made a power state transition. LINUX Kernel Hackers Manual July 2017 ieee80211_find_sta 9 4.1.27 ieee80211_find_sta find a station Synopsis struct ieee80211_sta * ieee80211_find_sta struct ieee80211_vif * vif const u8 * addr Arguments vif virtual interface to look for station on addr station's address Return The station, if found. NULL otherwise. Note This function must be called under RCU lock and the resulting pointer is only valid under RCU lock as well. LINUX Kernel Hackers Manual July 2017 ieee80211_find_sta_by_ifaddr 9 4.1.27 ieee80211_find_sta_by_ifaddr find a station on hardware Synopsis struct ieee80211_sta * ieee80211_find_sta_by_ifaddr struct ieee80211_hw * hw const u8 * addr const u8 * localaddr Arguments hw pointer as obtained from ieee80211_alloc_hw addr remote station's address localaddr local address (vif->sdata->vif.addr). Use NULL for 'any'. Return The station, if found. NULL otherwise. Note This function must be called under RCU lock and the resulting pointer is only valid under RCU lock as well. NOTE You may pass NULL for localaddr, but then you will just get the first STA that matches the remote address 'addr'. We can have multiple STA associated with multiple logical stations (e.g. consider a station connecting to another BSSID on the same AP hardware without disconnecting first). In this case, the result of this method with localaddr NULL is not reliable. DO NOT USE THIS FUNCTION with localaddr NULL if at all possible. Hardware scan offload TBD LINUX Kernel Hackers Manual July 2017 ieee80211_scan_completed 9 4.1.27 ieee80211_scan_completed completed hardware scan Synopsis void ieee80211_scan_completed struct ieee80211_hw * hw bool aborted Arguments hw the hardware that finished the scan aborted set to true if scan was aborted 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. This function can be called from any context, including hardirq context. Aggregation TX A-MPDU aggregation Aggregation on the TX side requires setting the hardware flag IEEE80211_HW_AMPDU_AGGREGATION. The driver will then be handed packets with a flag indicating A-MPDU aggregation. The driver or device is responsible for actually aggregating the frames, as well as deciding how many and which to aggregate. When TX aggregation is started by some subsystem (usually the rate control algorithm would be appropriate) by calling the ieee80211_start_tx_ba_session function, the driver will be notified via its ampdu_action function, with the IEEE80211_AMPDU_TX_START action. In response to that, the driver is later required to call the ieee80211_start_tx_ba_cb_irqsafe function, which will really start the aggregation session after the peer has also responded. If the peer responds negatively, the session will be stopped again right away. Note that it is possible for the aggregation session to be stopped before the driver has indicated that it is done setting it up, in which case it must not indicate the setup completion. Also note that, since we also need to wait for a response from the peer, the driver is notified of the completion of the handshake by the IEEE80211_AMPDU_TX_OPERATIONAL action to the ampdu_action callback. Similarly, when the aggregation session is stopped by the peer or something calling ieee80211_stop_tx_ba_session, the driver's ampdu_action function will be called with the action IEEE80211_AMPDU_TX_STOP. In this case, the call must not fail, and the driver must later call ieee80211_stop_tx_ba_cb_irqsafe. Note that the sta can get destroyed before the BA tear down is complete. RX A-MPDU aggregation Aggregation on the RX side requires only implementing the ampdu_action callback that is invoked to start/stop any block-ack sessions for RX aggregation. When RX aggregation is started by the peer, the driver is notified via ampdu_action function, with the IEEE80211_AMPDU_RX_START action, and may reject the request in which case a negative response is sent to the peer, if it accepts it a positive response is sent. While the session is active, the device/driver are required to de-aggregate frames and pass them up one by one to mac80211, which will handle the reorder buffer. When the aggregation session is stopped again by the peer or ourselves, the driver's ampdu_action function will be called with the action IEEE80211_AMPDU_RX_STOP. In this case, the call must not fail. LINUX Kernel Hackers Manual July 2017 enum ieee80211_ampdu_mlme_action 9 4.1.27 enum ieee80211_ampdu_mlme_action A-MPDU actions Synopsis enum ieee80211_ampdu_mlme_action { IEEE80211_AMPDU_RX_START, IEEE80211_AMPDU_RX_STOP, IEEE80211_AMPDU_TX_START, IEEE80211_AMPDU_TX_STOP_CONT, IEEE80211_AMPDU_TX_STOP_FLUSH, IEEE80211_AMPDU_TX_STOP_FLUSH_CONT, IEEE80211_AMPDU_TX_OPERATIONAL }; Constants IEEE80211_AMPDU_RX_START start RX aggregation IEEE80211_AMPDU_RX_STOP stop RX aggregation IEEE80211_AMPDU_TX_START start TX aggregation IEEE80211_AMPDU_TX_STOP_CONT stop TX aggregation but continue transmitting queued packets, now unaggregated. After all packets are transmitted the driver has to call ieee80211_stop_tx_ba_cb_irqsafe. IEEE80211_AMPDU_TX_STOP_FLUSH stop TX aggregation and flush all packets, called when the station is removed. There's no need or reason to call ieee80211_stop_tx_ba_cb_irqsafe in this case as mac80211 assumes the session is gone and removes the station. IEEE80211_AMPDU_TX_STOP_FLUSH_CONT called when TX aggregation is stopped but the driver hasn't called ieee80211_stop_tx_ba_cb_irqsafe yet and now the connection is dropped and the station will be removed. Drivers should clean up and drop remaining packets when this is called. IEEE80211_AMPDU_TX_OPERATIONAL TX aggregation has become operational Description These flags are used with the ampdu_action callback in struct ieee80211_ops to indicate which action is needed. Note that drivers MUST be able to deal with a TX aggregation session being stopped even before they OK'ed starting it by calling ieee80211_start_tx_ba_cb_irqsafe, because the peer might receive the addBA frame and send a delBA right away! Spatial Multiplexing Powersave (SMPS) SMPS (Spatial multiplexing power save) is a mechanism to conserve power in an 802.11n implementation. For details on the mechanism and rationale, please refer to 802.11 (as amended by 802.11n-2009) 11.2.3 SM power save. The mac80211 implementation is capable of sending action frames to update the AP about the station's SMPS mode, and will instruct the driver to enter the specific mode. It will also announce the requested SMPS mode during the association handshake. Hardware support for this feature is required, and can be indicated by hardware flags. The default mode will be automatic, which nl80211/cfg80211 defines to be dynamic SMPS in (regular) powersave, and SMPS turned off otherwise. To support this feature, the driver must set the appropriate hardware support flags, and handle the SMPS flag to the config operation. It will then with this mechanism be instructed to enter the requested SMPS mode while associated to an HT AP. LINUX Kernel Hackers Manual July 2017 ieee80211_request_smps 9 4.1.27 ieee80211_request_smps request SM PS transition Synopsis void ieee80211_request_smps struct ieee80211_vif * vif enum ieee80211_smps_mode smps_mode Arguments vif struct ieee80211_vif pointer from the add_interface callback. smps_mode new SM PS mode Description This allows the driver to request an SM PS transition in managed mode. This is useful when the driver has more information than the stack about possible interference, for example by bluetooth. LINUX Kernel Hackers Manual July 2017 enum ieee80211_smps_mode 9 4.1.27 enum ieee80211_smps_mode spatial multiplexing power save mode Synopsis enum ieee80211_smps_mode { IEEE80211_SMPS_AUTOMATIC, IEEE80211_SMPS_OFF, IEEE80211_SMPS_STATIC, IEEE80211_SMPS_DYNAMIC, IEEE80211_SMPS_NUM_MODES }; Constants IEEE80211_SMPS_AUTOMATIC automatic IEEE80211_SMPS_OFF off IEEE80211_SMPS_STATIC static IEEE80211_SMPS_DYNAMIC dynamic IEEE80211_SMPS_NUM_MODES internal, don't use
Rate control interface TBD This part of the book describes the rate control algorithm interface and how it relates to mac80211 and drivers. Rate Control API TBD LINUX Kernel Hackers Manual July 2017 ieee80211_start_tx_ba_session 9 4.1.27 ieee80211_start_tx_ba_session Start a tx Block Ack session. Synopsis int ieee80211_start_tx_ba_session struct ieee80211_sta * sta u16 tid u16 timeout Arguments sta the station for which to start a BA session tid the TID to BA on. timeout session timeout value (in TUs) Return success if addBA request was sent, failure otherwise Although mac80211/low level driver/user space application can estimate the need to start aggregation on a certain RA/TID, the session level will be managed by the mac80211. LINUX Kernel Hackers Manual July 2017 ieee80211_start_tx_ba_cb_irqsafe 9 4.1.27 ieee80211_start_tx_ba_cb_irqsafe low level driver ready to aggregate. Synopsis void ieee80211_start_tx_ba_cb_irqsafe struct ieee80211_vif * vif const u8 * ra u16 tid Arguments vif struct ieee80211_vif pointer from the add_interface callback ra receiver address of the BA session recipient. tid the TID to BA on. Description This function must be called by low level driver once it has finished with preparations for the BA session. It can be called from any context. LINUX Kernel Hackers Manual July 2017 ieee80211_stop_tx_ba_session 9 4.1.27 ieee80211_stop_tx_ba_session Stop a Block Ack session. Synopsis int ieee80211_stop_tx_ba_session struct ieee80211_sta * sta u16 tid Arguments sta the station whose BA session to stop tid the TID to stop BA. Return negative error if the TID is invalid, or no aggregation active Although mac80211/low level driver/user space application can estimate the need to stop aggregation on a certain RA/TID, the session level will be managed by the mac80211. LINUX Kernel Hackers Manual July 2017 ieee80211_stop_tx_ba_cb_irqsafe 9 4.1.27 ieee80211_stop_tx_ba_cb_irqsafe low level driver ready to stop aggregate. Synopsis void ieee80211_stop_tx_ba_cb_irqsafe struct ieee80211_vif * vif const u8 * ra u16 tid Arguments vif struct ieee80211_vif pointer from the add_interface callback ra receiver address of the BA session recipient. tid the desired TID to BA on. Description This function must be called by low level driver once it has finished with preparations for the BA session tear down. It can be called from any context. LINUX Kernel Hackers Manual July 2017 enum ieee80211_rate_control_changed 9 4.1.27 enum ieee80211_rate_control_changed flags to indicate what changed Synopsis enum ieee80211_rate_control_changed { IEEE80211_RC_BW_CHANGED, IEEE80211_RC_SMPS_CHANGED, IEEE80211_RC_SUPP_RATES_CHANGED, IEEE80211_RC_NSS_CHANGED }; Constants IEEE80211_RC_BW_CHANGED The bandwidth that can be used to transmit to this station changed. The actual bandwidth is in the station information -- for HT20/40 the IEEE80211_HT_CAP_SUP_WIDTH_20_40 flag changes, for HT and VHT the bandwidth field changes. IEEE80211_RC_SMPS_CHANGED The SMPS state of the station changed. IEEE80211_RC_SUPP_RATES_CHANGED The supported rate set of this peer changed (in IBSS mode) due to discovering more information about the peer. IEEE80211_RC_NSS_CHANGED N_SS (number of spatial streams) was changed by the peer LINUX Kernel Hackers Manual July 2017 struct ieee80211_tx_rate_control 9 4.1.27 struct ieee80211_tx_rate_control rate control information for/from RC algo Synopsis struct ieee80211_tx_rate_control { struct ieee80211_hw * hw; struct ieee80211_supported_band * sband; struct ieee80211_bss_conf * bss_conf; struct sk_buff * skb; struct ieee80211_tx_rate reported_rate; bool rts; bool short_preamble; u8 max_rate_idx; u32 rate_idx_mask; u8 * rate_idx_mcs_mask; bool bss; }; Members hw The hardware the algorithm is invoked for. sband The band this frame is being transmitted on. bss_conf the current BSS configuration skb the skb that will be transmitted, the control information in it needs to be filled in reported_rate The rate control algorithm can fill this in to indicate which rate should be reported to userspace as the current rate and used for rate calculations in the mesh network. rts whether RTS will be used for this frame because it is longer than the RTS threshold short_preamble whether mac80211 will request short-preamble transmission if the selected rate supports it max_rate_idx user-requested maximum (legacy) rate (deprecated; this will be removed once drivers get updated to use rate_idx_mask) rate_idx_mask user-requested (legacy) rate mask rate_idx_mcs_mask user-requested MCS rate mask (NULL if not in use) bss whether this frame is sent out in AP or IBSS mode LINUX Kernel Hackers Manual July 2017 rate_control_send_low 9 4.1.27 rate_control_send_low helper for drivers for management/no-ack frames Synopsis bool rate_control_send_low struct ieee80211_sta * sta void * priv_sta struct ieee80211_tx_rate_control * txrc Arguments sta struct ieee80211_sta pointer to the target destination. Note that this may be null. priv_sta private rate control structure. This may be null. txrc rate control information we sholud populate for mac80211. Description Rate control algorithms that agree to use the lowest rate to send management frames and NO_ACK data with the respective hw retries should use this in the beginning of their mac80211 get_rate callback. If true is returned the rate control can simply return. If false is returned we guarantee that sta and sta and priv_sta is not null. Rate control algorithms wishing to do more intelligent selection of rate for multicast/broadcast frames may choose to not use this. Internals TBD This part of the book describes mac80211 internals. Key handling Key handling basics Key handling in mac80211 is done based on per-interface (sub_if_data) keys and per-station keys. Since each station belongs to an interface, each station key also belongs to that interface. Hardware acceleration is done on a best-effort basis for algorithms that are implemented in software, for each key the hardware is asked to enable that key for offloading but if it cannot do that the key is simply kept for software encryption (unless it is for an algorithm that isn't implemented in software). There is currently no way of knowing whether a key is handled in SW or HW except by looking into debugfs. All key management is internally protected by a mutex. Within all other parts of mac80211, key references are, just as STA structure references, protected by RCU. Note, however, that some things are unprotected, namely the key->sta dereferences within the hardware acceleration functions. This means that sta_info_destroy must remove the key which waits for an RCU grace period. MORE TBD TBD Receive processing TBD Transmit processing TBD Station info handling Programming information LINUX Kernel Hackers Manual July 2017 struct sta_info 9 4.1.27 struct sta_info STA information Synopsis struct sta_info { struct list_head list; struct list_head free_list; struct rcu_head rcu_head; struct rhash_head hash_node; struct ieee80211_local * local; struct ieee80211_sub_if_data * sdata; struct ieee80211_key __rcu * gtk[NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS]; struct ieee80211_key __rcu * ptk[NUM_DEFAULT_KEYS]; u8 gtk_idx; u8 ptk_idx; struct rate_control_ref * rate_ctrl; void * rate_ctrl_priv; spinlock_t lock; struct work_struct drv_deliver_wk; u16 listen_interval; bool dead; bool uploaded; enum ieee80211_sta_state sta_state; unsigned long _flags; spinlock_t ps_lock; struct sk_buff_head ps_tx_buf[IEEE80211_NUM_ACS]; struct sk_buff_head tx_filtered[IEEE80211_NUM_ACS]; unsigned long driver_buffered_tids; unsigned long txq_buffered_tids; unsigned long rx_packets; u64 rx_bytes; unsigned long last_rx; long last_connected; unsigned long num_duplicates; unsigned long rx_fragments; unsigned long rx_dropped; int last_signal; struct ewma avg_signal; int last_ack_signal; u8 chains; s8 chain_signal_last[IEEE80211_MAX_CHAINS]; struct ewma chain_signal_avg[IEEE80211_MAX_CHAINS]; __le16 last_seq_ctrl[IEEE80211_NUM_TIDS + 1]; unsigned long tx_filtered_count; unsigned long tx_retry_failed; unsigned long tx_retry_count; unsigned int fail_avg; u32 tx_fragments; u64 tx_packets[IEEE80211_NUM_ACS]; u64 tx_bytes[IEEE80211_NUM_ACS]; struct ieee80211_tx_rate last_tx_rate; int last_rx_rate_idx; u32 last_rx_rate_flag; u32 last_rx_rate_vht_flag; u8 last_rx_rate_vht_nss; u16 tid_seq[IEEE80211_QOS_CTL_TID_MASK + 1]; u64 tx_msdu[IEEE80211_NUM_TIDS + 1]; u64 tx_msdu_retries[IEEE80211_NUM_TIDS + 1]; u64 tx_msdu_failed[IEEE80211_NUM_TIDS + 1]; u64 rx_msdu[IEEE80211_NUM_TIDS + 1]; struct sta_ampdu_mlme ampdu_mlme; u8 timer_to_tid[IEEE80211_NUM_TIDS]; #ifdef CONFIG_MAC80211_MESH u16 llid; u16 plid; u16 reason; u8 plink_retries; enum nl80211_plink_state plink_state; u32 plink_timeout; struct timer_list plink_timer; s64 t_offset; s64 t_offset_setpoint; enum nl80211_mesh_power_mode local_pm; enum nl80211_mesh_power_mode peer_pm; enum nl80211_mesh_power_mode nonpeer_pm; #endif #ifdef CONFIG_MAC80211_DEBUGFS struct sta_info_debugfsdentries debugfs; #endif enum ieee80211_sta_rx_bandwidth cur_max_bandwidth; unsigned int lost_packets; unsigned int beacon_loss_count; enum ieee80211_smps_mode known_smps_mode; const struct ieee80211_cipher_scheme * cipher_scheme; unsigned long last_tdls_pkt_time; u8 reserved_tid; struct ieee80211_sta sta; }; Members list global linked list entry free_list list entry for keeping track of stations to free rcu_head RCU head used for freeing this station struct hash_node hash node for rhashtable local pointer to the global information sdata virtual interface this station belongs to gtk[NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS] group keys negotiated with this station, if any ptk[NUM_DEFAULT_KEYS] peer keys negotiated with this station, if any gtk_idx last installed group key index ptk_idx last installed peer key index rate_ctrl rate control algorithm reference rate_ctrl_priv rate control private per-STA pointer lock used for locking all fields that require locking, see comments in the header file. drv_deliver_wk used for delivering frames after driver PS unblocking listen_interval listen interval of this station, when we're acting as AP dead set to true when sta is unlinked uploaded set to true when sta is uploaded to the driver sta_state duplicates information about station state (for debug) _flags STA flags, see enum ieee80211_sta_info_flags, do not use directly ps_lock used for powersave (when mac80211 is the AP) related locking ps_tx_buf[IEEE80211_NUM_ACS] buffers (per AC) of frames to transmit to this station when it leaves power saving state or polls tx_filtered[IEEE80211_NUM_ACS] buffers (per AC) of frames we already tried to transmit but were filtered by hardware due to STA having entered power saving state, these are also delivered to the station when it leaves powersave or polls for frames driver_buffered_tids bitmap of TIDs the driver has data buffered on txq_buffered_tids bitmap of TIDs that mac80211 has txq data buffered on rx_packets Number of MSDUs received from this STA rx_bytes Number of bytes received from this STA last_rx time (in jiffies) when last frame was received from this STA last_connected time (in seconds) when a station got connected num_duplicates number of duplicate frames received from this STA rx_fragments number of received MPDUs rx_dropped number of dropped MPDUs from this STA last_signal signal of last received frame from this STA avg_signal moving average of signal of received frames from this STA last_ack_signal signal of last received Ack frame from this STA chains chains ever used for RX from this station chain_signal_last[IEEE80211_MAX_CHAINS] last signal (per chain) chain_signal_avg[IEEE80211_MAX_CHAINS] signal average (per chain) last_seq_ctrl[IEEE80211_NUM_TIDS + 1] last received seq/frag number from this STA (per RX queue) tx_filtered_count number of frames the hardware filtered for this STA tx_retry_failed number of frames that failed retry tx_retry_count total number of retries for frames to this STA fail_avg moving percentage of failed MSDUs tx_fragments number of transmitted MPDUs tx_packets[IEEE80211_NUM_ACS] number of RX/TX MSDUs tx_bytes[IEEE80211_NUM_ACS] number of bytes transmitted to this STA last_tx_rate rate used for last transmit, to report to userspace as the transmit rate last_rx_rate_idx rx status rate index of the last data packet last_rx_rate_flag rx status flag of the last data packet last_rx_rate_vht_flag rx status vht flag of the last data packet last_rx_rate_vht_nss rx status nss of last data packet tid_seq[IEEE80211_QOS_CTL_TID_MASK + 1] per-TID sequence numbers for sending to this STA tx_msdu[IEEE80211_NUM_TIDS + 1] MSDUs transmitted to this station, using IEEE80211_NUM_TID entry for non-QoS frames tx_msdu_retries[IEEE80211_NUM_TIDS + 1] MSDU retries for transmissions to to this station, using IEEE80211_NUM_TID entry for non-QoS frames tx_msdu_failed[IEEE80211_NUM_TIDS + 1] MSDU failures for transmissions to to this station, using IEEE80211_NUM_TID entry for non-QoS frames rx_msdu[IEEE80211_NUM_TIDS + 1] MSDUs received from this station, using IEEE80211_NUM_TID entry for non-QoS frames ampdu_mlme A-MPDU state machine state timer_to_tid[IEEE80211_NUM_TIDS] identity mapping to ID timers llid Local link ID plid Peer link ID reason Cancel reason on PLINK_HOLDING state plink_retries Retries in establishment plink_state peer link state plink_timeout timeout of peer link plink_timer peer link watch timer t_offset timing offset relative to this host t_offset_setpoint reference timing offset of this sta to be used when calculating clockdrift local_pm local link-specific power save mode peer_pm peer-specific power save mode towards local STA nonpeer_pm STA power save mode towards non-peer neighbors debugfs debug filesystem info cur_max_bandwidth maximum bandwidth to use for TX to the station, taken from HT/VHT capabilities or VHT operating mode notification lost_packets number of consecutive lost packets beacon_loss_count number of times beacon loss has triggered known_smps_mode the smps_mode the client thinks we are in. Relevant for AP only. cipher_scheme optional cipher scheme for this station last_tdls_pkt_time holds the time in jiffies of last TDLS pkt ACKed reserved_tid reserved TID (if any, otherwise IEEE80211_TID_UNRESERVED) sta station information we share with the driver Description This structure collects information about a station that mac80211 is communicating with. LINUX Kernel Hackers Manual July 2017 enum ieee80211_sta_info_flags 9 4.1.27 enum ieee80211_sta_info_flags Stations flags Synopsis enum ieee80211_sta_info_flags { WLAN_STA_AUTH, WLAN_STA_ASSOC, WLAN_STA_PS_STA, WLAN_STA_AUTHORIZED, WLAN_STA_SHORT_PREAMBLE, WLAN_STA_WDS, WLAN_STA_CLEAR_PS_FILT, WLAN_STA_MFP, WLAN_STA_BLOCK_BA, WLAN_STA_PS_DRIVER, WLAN_STA_PSPOLL, WLAN_STA_TDLS_PEER, WLAN_STA_TDLS_PEER_AUTH, WLAN_STA_TDLS_INITIATOR, WLAN_STA_TDLS_CHAN_SWITCH, WLAN_STA_TDLS_OFF_CHANNEL, WLAN_STA_UAPSD, WLAN_STA_SP, WLAN_STA_4ADDR_EVENT, WLAN_STA_INSERTED, WLAN_STA_RATE_CONTROL, WLAN_STA_TOFFSET_KNOWN, WLAN_STA_MPSP_OWNER, WLAN_STA_MPSP_RECIPIENT, WLAN_STA_PS_DELIVER }; Constants WLAN_STA_AUTH Station is authenticated. WLAN_STA_ASSOC Station is associated. WLAN_STA_PS_STA Station is in power-save mode WLAN_STA_AUTHORIZED Station is authorized to send/receive traffic. This bit is always checked so needs to be enabled for all stations when virtual port control is not in use. WLAN_STA_SHORT_PREAMBLE Station is capable of receiving short-preamble frames. WLAN_STA_WDS Station is one of our WDS peers. WLAN_STA_CLEAR_PS_FILT Clear PS filter in hardware (using the IEEE80211_TX_CTL_CLEAR_PS_FILT control flag) when the next frame to this station is transmitted. WLAN_STA_MFP Management frame protection is used with this STA. WLAN_STA_BLOCK_BA Used to deny ADDBA requests (both TX and RX) during suspend/resume and station removal. WLAN_STA_PS_DRIVER driver requires keeping this station in power-save mode logically to flush frames that might still be in the queues WLAN_STA_PSPOLL Station sent PS-poll while driver was keeping station in power-save mode, reply when the driver unblocks. WLAN_STA_TDLS_PEER Station is a TDLS peer. WLAN_STA_TDLS_PEER_AUTH This TDLS peer is authorized to send direct packets. This means the link is enabled. WLAN_STA_TDLS_INITIATOR We are the initiator of the TDLS link with this station. WLAN_STA_TDLS_CHAN_SWITCH This TDLS peer supports TDLS channel-switching WLAN_STA_TDLS_OFF_CHANNEL The local STA is currently off-channel with this TDLS peer WLAN_STA_UAPSD Station requested unscheduled SP while driver was keeping station in power-save mode, reply when the driver unblocks the station. WLAN_STA_SP Station is in a service period, so don't try to reply to other uAPSD trigger frames or PS-Poll. WLAN_STA_4ADDR_EVENT 4-addr event was already sent for this frame. WLAN_STA_INSERTED This station is inserted into the hash table. WLAN_STA_RATE_CONTROL rate control was initialized for this station. WLAN_STA_TOFFSET_KNOWN toffset calculated for this station is valid. WLAN_STA_MPSP_OWNER local STA is owner of a mesh Peer Service Period. WLAN_STA_MPSP_RECIPIENT local STA is recipient of a MPSP. WLAN_STA_PS_DELIVER station woke up, but we're still blocking TX until pending frames are delivered Description These flags are used with struct sta_info's flags member, but only indirectly with set_sta_flag and friends. STA information lifetime rules STA info structures (struct sta_info) are managed in a hash table for faster lookup and a list for iteration. They are managed using RCU, i.e. access to the list and hash table is protected by RCU. Upon allocating a STA info structure with sta_info_alloc, the caller owns that structure. It must then insert it into the hash table using either sta_info_insert or sta_info_insert_rcu; only in the latter case (which acquires an rcu read section but must not be called from within one) will the pointer still be valid after the call. Note that the caller may not do much with the STA info before inserting it, in particular, it may not start any mesh peer link management or add encryption keys. When the insertion fails (sta_info_insert) returns non-zero), the structure will have been freed by sta_info_insert! Station entries are added by mac80211 when you establish a link with a peer. This means different things for the different type of interfaces we support. For a regular station this mean we add the AP sta when we receive an association response from the AP. For IBSS this occurs when get to know about a peer on the same IBSS. For WDS we add the sta for the peer immediately upon device open. When using AP mode we add stations for each respective station upon request from userspace through nl80211. In order to remove a STA info structure, various sta_info_destroy_*() calls are available. There is no concept of ownership on a STA entry, each structure is owned by the global hash table/list until it is removed. All users of the structure need to be RCU protected so that the structure won't be freed before they are done using it. Aggregation LINUX Kernel Hackers Manual July 2017 struct sta_ampdu_mlme 9 4.1.27 struct sta_ampdu_mlme STA aggregation information. Synopsis struct sta_ampdu_mlme { struct mutex mtx; struct tid_ampdu_rx __rcu * tid_rx[IEEE80211_NUM_TIDS]; unsigned long tid_rx_timer_expired[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; unsigned long tid_rx_stop_requested[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; struct work_struct work; struct tid_ampdu_tx __rcu * tid_tx[IEEE80211_NUM_TIDS]; struct tid_ampdu_tx * tid_start_tx[IEEE80211_NUM_TIDS]; unsigned long last_addba_req_time[IEEE80211_NUM_TIDS]; u8 addba_req_num[IEEE80211_NUM_TIDS]; u8 dialog_token_allocator; }; Members mtx mutex to protect all TX data (except non-NULL assignments to tid_tx[idx], which are protected by the sta spinlock) tid_start_tx is also protected by sta->lock. tid_rx[IEEE80211_NUM_TIDS] aggregation info for Rx per TID -- RCU protected tid_rx_timer_expired[BITS_TO_LONGS(IEEE80211_NUM_TIDS)] bitmap indicating on which TIDs the RX timer expired until the work for it runs tid_rx_stop_requested[BITS_TO_LONGS(IEEE80211_NUM_TIDS)] bitmap indicating which BA sessions per TID the driver requested to close until the work for it runs work work struct for starting/stopping aggregation tid_tx[IEEE80211_NUM_TIDS] aggregation info for Tx per TID tid_start_tx[IEEE80211_NUM_TIDS] sessions where start was requested last_addba_req_time[IEEE80211_NUM_TIDS] timestamp of the last addBA request. addba_req_num[IEEE80211_NUM_TIDS] number of times addBA request has been sent. dialog_token_allocator dialog token enumerator for each new session; LINUX Kernel Hackers Manual July 2017 struct tid_ampdu_tx 9 4.1.27 struct tid_ampdu_tx TID aggregation information (Tx). Synopsis struct tid_ampdu_tx { struct rcu_head rcu_head; struct timer_list session_timer; struct timer_list addba_resp_timer; struct sk_buff_head pending; unsigned long state; unsigned long last_tx; u16 timeout; u8 dialog_token; u8 stop_initiator; bool tx_stop; u8 buf_size; u16 failed_bar_ssn; bool bar_pending; }; Members rcu_head rcu head for freeing structure session_timer check if we keep Tx-ing on the TID (by timeout value) addba_resp_timer timer for peer's response to addba request pending pending frames queue -- use sta's spinlock to protect state session state (see above) last_tx jiffies of last tx activity timeout session timeout value to be filled in ADDBA requests dialog_token dialog token for aggregation session stop_initiator initiator of a session stop tx_stop TX DelBA frame when stopping buf_size reorder buffer size at receiver failed_bar_ssn ssn of the last failed BAR tx attempt bar_pending BAR needs to be re-sent Description This structure's lifetime is managed by RCU, assignments to the array holding it must hold the aggregation mutex. The TX path can access it under RCU lock-free if, and only if, the state has the flag HT_AGG_STATE_OPERATIONAL set. Otherwise, the TX path must also acquire the spinlock and re-check the state, see comments in the tx code touching it. LINUX Kernel Hackers Manual July 2017 struct tid_ampdu_rx 9 4.1.27 struct tid_ampdu_rx TID aggregation information (Rx). Synopsis struct tid_ampdu_rx { struct rcu_head rcu_head; spinlock_t reorder_lock; struct sk_buff_head * reorder_buf; unsigned long * reorder_time; struct timer_list session_timer; struct timer_list reorder_timer; unsigned long last_rx; u16 head_seq_num; u16 stored_mpdu_num; u16 ssn; u16 buf_size; u16 timeout; u8 dialog_token; bool auto_seq; bool removed; }; Members rcu_head RCU head used for freeing this struct reorder_lock serializes access to reorder buffer, see below. reorder_buf buffer to reorder incoming aggregated MPDUs. An MPDU may be an A-MSDU with individually reported subframes. reorder_time jiffies when skb was added session_timer check if peer keeps Tx-ing on the TID (by timeout value) reorder_timer releases expired frames from the reorder buffer. last_rx jiffies of last rx activity head_seq_num head sequence number in reordering buffer. stored_mpdu_num number of MPDUs in reordering buffer ssn Starting Sequence Number expected to be aggregated. buf_size buffer size for incoming A-MPDUs timeout reset timer value (in TUs). dialog_token dialog token for aggregation session auto_seq used for offloaded BA sessions to automatically pick head_seq_and and ssn. removed this session is removed (but might have been found due to RCU) Description This structure's lifetime is managed by RCU, assignments to the array holding it must hold the aggregation mutex. The reorder_lock is used to protect the members of this struct, except for timeout, buf_size and dialog_token, which are constant across the lifetime of the struct (the dialog token being used only for debugging). Synchronisation TBD Locking, lots of RCU