cfg80211 subsystem

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.

enum ieee80211_channel_flags

channel flags

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_IR_CONCURRENT
see NL80211_FREQUENCY_ATTR_IR_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.

struct ieee80211_channel

channel definition

Definition

struct ieee80211_channel {
  enum nl80211_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.

enum ieee80211_rate_flags

rate flags

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.

struct ieee80211_rate

bitrate definition

Definition

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.

struct ieee80211_sta_ht_cap

STA’s HT capabilities

Definition

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.

struct ieee80211_supported_band

frequency band definition

Definition

struct ieee80211_supported_band {
  struct ieee80211_channel * channels;
  struct ieee80211_rate * bitrates;
  enum nl80211_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.

enum cfg80211_signal_type

signal type

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
enum wiphy_params_flags

set_wiphy_params bitfield values

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
enum wiphy_flags

wiphy capability flags

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, ...).
WIPHY_FLAG_HAS_STATIC_WEP
The device supports static WEP key installation before connection.
struct wiphy

wireless hardware description

Definition

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;
  u32 max_sched_scan_plans;
  u32 max_sched_scan_plan_interval;
  u32 max_sched_scan_plan_iterations;
  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 struct wiphy_iftype_ext_capab * iftype_ext_capab;
  unsigned int num_iftype_ext_capab;
  const void * privid;
  struct ieee80211_supported_band * bands[NUM_NL80211_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;
  struct list_head wdev_list;
  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;
  u32 bss_select_support;
  u64 cookie_counter;
  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
max_sched_scan_plans
maximum number of scan plans (scan interval and number of iterations) for scheduled scan supported by the device.
max_sched_scan_plan_interval
maximum interval (in seconds) for a single scan plan supported by the device.
max_sched_scan_plan_iterations
maximum number of iterations for a single scan plan supported by the device.
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. These are the default extended capabilities to be used if the capabilities are not specified for a specific interface type in iftype_ext_capab.
extended_capabilities_mask
mask of the valid values
extended_capabilities_len
length of the extended capabilities
iftype_ext_capab
array of extended capabilities per interface type
num_iftype_ext_capab
number of interface types for which extended capabilities are specified separately.
privid
a pointer that drivers can use to identify if an arbitrary wiphy is theirs, e.g. in global notifiers
bands[NUM_NL80211_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.
wdev_list
the list of associated (virtual) interfaces; this list must not be modified by the driver, but can be read with RTNL/RCU protection.
_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.
bss_select_support
bitmask indicating the BSS selection criteria supported by the driver in the .:c:func:connect() callback. The bit position maps to the attribute indices defined in enum nl80211_bss_select_attr.
cookie_counter
unique generic cookie counter, used to identify objects.
priv[0]
driver private data (sized according to wiphy_new() parameter)
struct wireless_dev

wireless device state

Definition

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;
  bool nan_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;
  enum ieee80211_bss_type conn_bss_type;
  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
nan_started
true if this is a NAN interface 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
conn_bss_type
connecting/connected BSS type
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.

struct wiphy * wiphy_new(const struct cfg80211_ops * ops, int sizeof_priv)

create a new wiphy for use with cfg80211

Parameters

const struct cfg80211_ops * ops
The configuration operations for this device
int 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.

int wiphy_register(struct wiphy * wiphy)

register a wiphy with cfg80211

Parameters

struct wiphy * wiphy
The wiphy to register.

Return

A non-negative wiphy index or a negative error code.

void wiphy_unregister(struct wiphy * wiphy)

deregister a wiphy from cfg80211

Parameters

struct wiphy * 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.

void wiphy_free(struct wiphy * wiphy)

free wiphy

Parameters

struct wiphy * wiphy
The wiphy to free
const char * wiphy_name(const struct wiphy * wiphy)

get wiphy name

Parameters

const struct wiphy * wiphy
The wiphy whose name to return

Return

The name of wiphy.

struct device * wiphy_dev(struct wiphy * wiphy)

get wiphy dev pointer

Parameters

struct wiphy * wiphy
The wiphy whose device struct to look up

Return

The dev of wiphy.

void * wiphy_priv(struct wiphy * wiphy)

return priv from wiphy

Parameters

struct wiphy * wiphy
the wiphy whose priv pointer to return

Return

The priv of wiphy.

struct wiphy * priv_to_wiphy(void * priv)

return the wiphy containing the priv

Parameters

void * priv
a pointer previously returned by wiphy_priv

Return

The wiphy of priv.

void set_wiphy_dev(struct wiphy * wiphy, struct device * dev)

set device pointer for wiphy

Parameters

struct wiphy * wiphy
The wiphy whose device to bind
struct device * dev
The device to parent it to
void * wdev_priv(struct wireless_dev * wdev)

return wiphy priv from wireless_dev

Parameters

struct wireless_dev * wdev
The wireless device whose wiphy’s priv pointer to return

Return

The wiphy priv of wdev.

struct ieee80211_iface_limit

limit on certain interface types

Definition

struct ieee80211_iface_limit {
  u16 max;
  u16 types;
};

Members

max
maximum number of interfaces of these types
types
interface types (bits)
struct ieee80211_iface_combination

possible interface combination

Definition

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,
    };
    
int cfg80211_check_combinations(struct wiphy * wiphy, const int num_different_channels, const u8 radar_detect, const int iftype_num[NUM_NL80211_IFTYPES])

check interface combinations

Parameters

struct wiphy * wiphy
the wiphy
const int num_different_channels
the number of different channels we want to use for verification
const u8 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**
const int iftype_num[NUM_NL80211_IFTYPES]
undescribed

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.

struct cfg80211_ops

backend description for wireless configuration

Definition

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);
  void (* abort_scan) (struct wiphy *wiphy, struct wireless_dev *wdev);
  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[NUM_NL80211_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);
  int (* start_nan) (struct wiphy *wiphy, struct wireless_dev *wdev,struct cfg80211_nan_conf *conf);
  void (* stop_nan) (struct wiphy *wiphy, struct wireless_dev *wdev);
  int (* add_nan_func) (struct wiphy *wiphy, struct wireless_dev *wdev,struct cfg80211_nan_func *nan_func);
  void (* del_nan_func) (struct wiphy *wiphy, struct wireless_dev *wdev,u64 cookie);
  int (* nan_change_conf) (struct wiphy *wiphy,struct wireless_dev *wdev,struct cfg80211_nan_conf *conf,u32 changes);
};

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.
abort_scan
Tell the driver to abort an ongoing scan. The driver shall indicate the status of the scan through cfg80211_scan_done().
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()/cfg80211_connect_bss() with status code WLAN_STATUS_SUCCESS. If the connection fails for some reason, call cfg80211_connect_result()/cfg80211_connect_bss() with the status code from the AP or cfg80211_connect_timeout() if no frame with status code was received. The driver is allowed to roam to other BSSes within the ESS when the other BSS matches the connect parameters. When such roaming is initiated by the driver, the driver is expected to verify that the target matches the configured security parameters and to use Reassociation Request frame instead of Association Request frame. The connect function can also be used to request the driver to perform a specific roam when connected to an ESS. In that case, the prev_bssid parameter is set to the BSSID of the currently associated BSS as an indication of requesting reassociation. In both the driver-initiated and new connect() call initiated roaming cases, the result of roaming is indicated with a call to cfg80211_roamed() or cfg80211_roamed_bss(). (invoked with the wireless_dev mutex held)
disconnect
Disconnect from the BSS/ESS. Once done, call cfg80211_disconnected(). (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. After configuration, the driver should (soon) send an event indicating the current level is above/below the configured threshold; this may need some care when the configuration is changed (without first being disabled.)
set_cqm_txe_config
Configure connection quality monitor TX error thresholds.
mgmt_frame_register
Notify driver that a management frame type was registered. The callback is allowed to sleep.
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.
start_nan
Start the NAN interface.
stop_nan
Stop the NAN interface.
add_nan_func
Add a NAN function. Returns negative value on failure. On success nan_func ownership is transferred to the driver and it may access it outside of the scope of this function. The driver should free the nan_func when no longer needed by calling cfg80211_free_nan_func(). On success the driver should assign an instance_id in the provided nan_func.
del_nan_func
Delete a NAN function.
nan_change_conf
changes NAN configuration. The changed parameters must be specified in changes (using enum cfg80211_nan_conf_changes); All other parameters must be ignored.

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.

struct vif_params

describes virtual interface parameters

Definition

struct vif_params {
  int use_4addr;
  u8 macaddr[ETH_ALEN];
  u8 vht_mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN];
};

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.
vht_mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN]
MU-MIMO groupID. used for monitoring only packets belonging to that MU-MIMO groupID.
struct key_params

key information

Definition

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

enum survey_info_flags

survey information flags

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().

struct survey_info

channel survey response

Definition

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.

struct cfg80211_beacon_data

beacon data

Definition

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)
struct cfg80211_ap_settings

AP configuration

Definition

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;
  bool pbss;
  struct cfg80211_bitrate_mask beacon_rate;
};

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
pbss
If set, start as a PCP instead of AP. Relevant for DMG networks.
beacon_rate
bitrate to be used for beacons

Description

Used to configure an AP interface.

struct station_parameters

station parameters

Definition

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;
  u16 peer_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;
  int support_p2p_ps;
};

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
peer_aid
mesh peer 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
support_p2p_ps
information if station supports P2P PS mechanism

Description

Used to change and create a new station.

enum rate_info_flags

bitrate info flags

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.

struct rate_info

bitrate information

Definition

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

struct station_info

station information

Definition

struct station_info {
  u64 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;
  u64 rx_duration;
  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_duration
aggregate PPDU duration(usecs) for all the frames from a 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.

enum monitor_flags

monitor flags

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.

enum mpath_info_flags

mesh path information 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().

struct mpath_info

mesh path information

Definition

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().

struct bss_parameters

BSS parameters

Definition

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).

struct ieee80211_txq_params

TX queue parameters

Definition

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]
struct cfg80211_crypto_settings

Crypto settings

Definition

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;
  struct key_params * wep_keys;
  int wep_tx_key;
};

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.
wep_keys
static WEP keys, if not NULL points to an array of CFG80211_MAX_WEP_KEYS WEP keys
wep_tx_key
key index (0..3) of the default TX static WEP key
struct cfg80211_auth_request

Authentication request data

Definition

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.

struct cfg80211_assoc_request

(Re)Association request data

Definition

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. This is used to indicate a request to reassociate within the ESS instead of a request do the initial association with the ESS. When included, this is set to the BSSID of the current association, i.e., to the value that is included in the Current AP address field of the Reassociation Request 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.

struct cfg80211_deauth_request

Deauthentication request data

Definition

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.

struct cfg80211_disassoc_request

Disassociation request data

Definition

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.

struct cfg80211_ibss_params

IBSS parameters

Definition

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[NUM_NL80211_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[NUM_NL80211_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.

struct cfg80211_connect_params

Connection parameters

Definition

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;
  bool pbss;
  struct cfg80211_bss_selection bss_select;
  const u8 * prev_bssid;
};

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.
pbss
if set, connect to a PCP instead of AP. Valid for DMG networks.
bss_select
criteria to be used for BSS selection.
prev_bssid
previous BSSID, if not NULL use reassociate frame. This is used to indicate a request to reassociate within the ESS instead of a request do the initial association with the ESS. When included, this is set to the BSSID of the current association, i.e., to the value that is included in the Current AP address field of the Reassociation Request frame.

Description

This structure provides information needed to complete IEEE 802.11 authentication and association.

struct cfg80211_pmksa

PMK Security Association

Definition

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.

void cfg80211_rx_mlme_mgmt(struct net_device * dev, const u8 * buf, size_t len)

notification of processed MLME management frame

Parameters

struct net_device * dev
network device
const u8 * buf
authentication frame (header + body)
size_t 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.

void cfg80211_auth_timeout(struct net_device * dev, const u8 * addr)

notification of timed out authentication

Parameters

struct net_device * dev
network device
const u8 * 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.

void cfg80211_rx_assoc_resp(struct net_device * dev, struct cfg80211_bss * bss, const u8 * buf, size_t len, int uapsd_queues)

notification of processed association response

Parameters

struct net_device * dev
network device
struct cfg80211_bss * bss
the BSS that association was requested with, ownership of the pointer moves to cfg80211 in this call
const u8 * buf
authentication frame (header + body)
size_t len
length of the frame data
int uapsd_queues
bitmap of ACs configured to uapsd. -1 if n/a.

Description

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.

void cfg80211_assoc_timeout(struct net_device * dev, struct cfg80211_bss * bss)

notification of timed out association

Parameters

struct net_device * dev
network device
struct cfg80211_bss * bss
The BSS entry with which association timed out.

Description

This function may sleep. The caller must hold the corresponding wdev’s mutex.

void cfg80211_tx_mlme_mgmt(struct net_device * dev, const u8 * buf, size_t len)

notification of transmitted deauth/disassoc frame

Parameters

struct net_device * dev
network device
const u8 * buf
802.11 frame (header + body)
size_t 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.

void cfg80211_ibss_joined(struct net_device * dev, const u8 * bssid, struct ieee80211_channel * channel, gfp_t gfp)

notify cfg80211 that device joined an IBSS

Parameters

struct net_device * dev
network device
const u8 * bssid
the BSSID of the IBSS joined
struct ieee80211_channel * channel
the channel of the IBSS joined
gfp_t 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.

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)

notify cfg80211 of connection result

Parameters

struct net_device * dev
network device
const u8 * bssid
the BSSID of the AP
const u8 * req_ie
association request IEs (maybe be NULL)
size_t req_ie_len
association request IEs length
const u8 * resp_ie
association response IEs (may be NULL)
size_t resp_ie_len
assoc response IEs length
u16 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_t gfp
allocation flags

Description

It should be called by the underlying driver whenever connect() has succeeded.

void cfg80211_connect_bss(struct net_device * dev, const u8 * bssid, struct cfg80211_bss * bss, const u8 * req_ie, size_t req_ie_len, const u8 * resp_ie, size_t resp_ie_len, int status, gfp_t gfp)

notify cfg80211 of connection result

Parameters

struct net_device * dev
network device
const u8 * bssid
the BSSID of the AP
struct cfg80211_bss * bss
entry of bss to which STA got connected to, can be obtained through cfg80211_get_bss (may be NULL)
const u8 * req_ie
association request IEs (maybe be NULL)
size_t req_ie_len
association request IEs length
const u8 * resp_ie
association response IEs (may be NULL)
size_t resp_ie_len
assoc response IEs length
int 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_t gfp
allocation flags

Description

It should be called by the underlying driver whenever connect() has succeeded. This is similar to cfg80211_connect_result(), but with the option of identifying the exact bss entry for the connection. Only one of these functions should be called.

void cfg80211_connect_timeout(struct net_device * dev, const u8 * bssid, const u8 * req_ie, size_t req_ie_len, gfp_t gfp)

notify cfg80211 of connection timeout

Parameters

struct net_device * dev
network device
const u8 * bssid
the BSSID of the AP
const u8 * req_ie
association request IEs (maybe be NULL)
size_t req_ie_len
association request IEs length
gfp_t gfp
allocation flags

Description

It should be called by the underlying driver whenever connect() has failed in a sequence where no explicit authentication/association rejection was received from the AP. This could happen, e.g., due to not being able to send out the Authentication or Association Request frame or timing out while waiting for the response.

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)

notify cfg80211 of roaming

Parameters

struct net_device * dev
network device
struct ieee80211_channel * channel
the channel of the new AP
const u8 * bssid
the BSSID of the new AP
const u8 * req_ie
association request IEs (maybe be NULL)
size_t req_ie_len
association request IEs length
const u8 * resp_ie
association response IEs (may be NULL)
size_t resp_ie_len
assoc response IEs length
gfp_t gfp
allocation flags

Description

It should be called by the underlying driver whenever it roamed from one AP to another while connected.

void cfg80211_disconnected(struct net_device * dev, u16 reason, const u8 * ie, size_t ie_len, bool locally_generated, gfp_t gfp)

notify cfg80211 that connection was dropped

Parameters

struct net_device * dev
network device
u16 reason
reason code for the disconnection, set it to 0 if unknown
const u8 * ie
information elements of the deauth/disassoc frame (may be NULL)
size_t ie_len
length of IEs
bool locally_generated
disconnection was requested locally
gfp_t 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.

void cfg80211_ready_on_channel(struct wireless_dev * wdev, u64 cookie, struct ieee80211_channel * chan, unsigned int duration, gfp_t gfp)

notification of remain_on_channel start

Parameters

struct wireless_dev * wdev
wireless device
u64 cookie
the request cookie
struct ieee80211_channel * chan
The current channel (from remain_on_channel request)
unsigned int duration
Duration in milliseconds that the driver intents to remain on the channel
gfp_t gfp
allocation flags
void cfg80211_remain_on_channel_expired(struct wireless_dev * wdev, u64 cookie, struct ieee80211_channel * chan, gfp_t gfp)

remain_on_channel duration expired

Parameters

struct wireless_dev * wdev
wireless device
u64 cookie
the request cookie
struct ieee80211_channel * chan
The current channel (from remain_on_channel request)
gfp_t gfp
allocation flags
void cfg80211_new_sta(struct net_device * dev, const u8 * mac_addr, struct station_info * sinfo, gfp_t gfp)

notify userspace about station

Parameters

struct net_device * dev
the netdev
const u8 * mac_addr
the station’s address
struct station_info * sinfo
the station information
gfp_t gfp
allocation flags
bool cfg80211_rx_mgmt(struct wireless_dev * wdev, int freq, int sig_dbm, const u8 * buf, size_t len, u32 flags)

notification of received, unprocessed management frame

Parameters

struct wireless_dev * wdev
wireless device receiving the frame
int freq
Frequency on which the frame was received in MHz
int sig_dbm
signal strength in mBm, or 0 if unknown
const u8 * buf
Management frame (header + body)
size_t len
length of the frame data
u32 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.

void cfg80211_mgmt_tx_status(struct wireless_dev * wdev, u64 cookie, const u8 * buf, size_t len, bool ack, gfp_t gfp)

notification of TX status for management frame

Parameters

struct wireless_dev * wdev
wireless device receiving the frame
u64 cookie
Cookie returned by cfg80211_ops::mgmt_tx()
const u8 * buf
Management frame (header + body)
size_t len
length of the frame data
bool ack
Whether frame was acknowledged
gfp_t 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.

void cfg80211_cqm_rssi_notify(struct net_device * dev, enum nl80211_cqm_rssi_threshold_event rssi_event, gfp_t gfp)

connection quality monitoring rssi event

Parameters

struct net_device * dev
network device
enum nl80211_cqm_rssi_threshold_event rssi_event
the triggered RSSI event
gfp_t gfp
context flags

Description

This function is called when a configured connection quality monitoring rssi threshold reached event occurs.

void cfg80211_cqm_pktloss_notify(struct net_device * dev, const u8 * peer, u32 num_packets, gfp_t gfp)

notify userspace about packetloss to peer

Parameters

struct net_device * dev
network device
const u8 * peer
peer’s MAC address
u32 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_t gfp
context flags
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)

notification of Michael MIC failure (TKIP)

Parameters

struct net_device * dev
network device
const u8 * addr
The source MAC address of the frame
enum nl80211_key_type key_type
The key type that the received frame used
int key_id
Key identifier (0..3). Can be -1 if missing.
const u8 * tsc
The TSC value of the frame that generated the MIC failure (6 octets)
gfp_t 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.:c:func: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.

struct cfg80211_ssid

SSID description

Definition

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
struct cfg80211_scan_request

scan request description

Definition

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;
  u16 duration;
  bool duration_mandatory;
  u32 flags;
  u32 rates[NUM_NL80211_BANDS];
  struct wireless_dev * wdev;
  u8 mac_addr[ETH_ALEN];
  u8 mac_addr_mask[ETH_ALEN];
  u8 bssid[ETH_ALEN];
  struct wiphy * wiphy;
  unsigned long scan_start;
  struct cfg80211_scan_info info;
  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
duration
how long to listen on each channel, in TUs. If duration_mandatory is not set, this is the maximum dwell time and the actual dwell time may be shorter.
duration_mandatory
if set, the scan duration must be as specified by the duration field.
flags
bit field of flags controlling operation
rates[NUM_NL80211_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
bssid[ETH_ALEN]
BSSID to scan for (most commonly, the wildcard BSSID)
wiphy
the wiphy this was for
scan_start
time (in jiffies) when the scan started
info
(internal) information about completed scan
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.
void cfg80211_scan_done(struct cfg80211_scan_request * request, struct cfg80211_scan_info * info)

notify that scan finished

Parameters

struct cfg80211_scan_request * request
the corresponding scan request
struct cfg80211_scan_info * info
information about the completed scan
struct cfg80211_bss

BSS description

Definition

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.

struct cfg80211_inform_bss

BSS inform data

Definition

struct cfg80211_inform_bss {
  struct ieee80211_channel * chan;
  enum nl80211_bss_scan_width scan_width;
  s32 signal;
  u64 boottime_ns;
  u64 parent_tsf;
  u8 parent_bssid[ETH_ALEN];
};

Members

chan
channel the frame was received on
scan_width
scan width that was used
signal
signal strength value, according to the wiphy’s signal type
boottime_ns
timestamp (CLOCK_BOOTTIME) when the information was received; should match the time when the frame was actually received by the device (not just by the host, in case it was buffered on the device) and be accurate to about 10ms. If the frame isn’t buffered, just passing the return value of ktime_get_boot_ns() is likely appropriate.
parent_tsf
the time at the start of reception of the first octet of the timestamp field of the frame. The time is the TSF of the BSS specified by parent_bssid.
parent_bssid[ETH_ALEN]
the BSS according to which parent_tsf is set. This is set to the BSS that requested the scan in which the beacon/probe was received.
struct cfg80211_bss * cfg80211_inform_bss_frame_data(struct wiphy * wiphy, struct cfg80211_inform_bss * data, struct ieee80211_mgmt * mgmt, size_t len, gfp_t gfp)

inform cfg80211 of a received BSS frame

Parameters

struct wiphy * wiphy
the wiphy reporting the BSS
struct cfg80211_inform_bss * data
the BSS metadata
struct ieee80211_mgmt * mgmt
the management frame (probe response or beacon)
size_t len
length of the management frame
gfp_t 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.

struct cfg80211_bss * cfg80211_inform_bss_data(struct wiphy * wiphy, struct cfg80211_inform_bss * data, enum cfg80211_bss_frame_type ftype, const u8 * bssid, u64 tsf, u16 capability, u16 beacon_interval, const u8 * ie, size_t ielen, gfp_t gfp)

inform cfg80211 of a new BSS

Parameters

struct wiphy * wiphy
the wiphy reporting the BSS
struct cfg80211_inform_bss * data
the BSS metadata
enum cfg80211_bss_frame_type ftype
frame type (if known)
const u8 * bssid
the BSSID of the BSS
u64 tsf
the TSF sent by the peer in the beacon/probe response (or 0)
u16 capability
the capability field sent by the peer
u16 beacon_interval
the beacon interval announced by the peer
const u8 * ie
additional IEs sent by the peer
size_t ielen
length of the additional IEs
gfp_t 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.

unlink BSS from internal data structures

Parameters

struct wiphy * wiphy
the wiphy
struct cfg80211_bss * 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.

const u8 * cfg80211_find_ie(u8 eid, const u8 * ies, int len)

find information element in data

Parameters

u8 eid
element ID
const u8 * ies
data consisting of IEs
int 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.

const u8 * ieee80211_bss_get_ie(struct cfg80211_bss * bss, u8 ie)

find IE with given ID

Parameters

struct cfg80211_bss * bss
the bss to search
u8 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.

int ieee80211_channel_to_frequency(int chan, enum nl80211_band band)

convert channel number to frequency

Parameters

int chan
channel number
enum nl80211_band band
band, necessary due to channel number overlap

Return

The corresponding frequency (in MHz), or 0 if the conversion failed.

int ieee80211_frequency_to_channel(int freq)

convert frequency to channel number

Parameters

int freq
center frequency

Return

The corresponding channel, or 0 if the conversion failed.

struct ieee80211_channel * ieee80211_get_channel(struct wiphy * wiphy, int freq)

get channel struct from wiphy for specified frequency

Parameters

struct wiphy * wiphy
the struct wiphy to get the channel for
int freq
the center frequency of the channel

Return

The channel struct from wiphy at freq.

struct ieee80211_rate * ieee80211_get_response_rate(struct ieee80211_supported_band * sband, u32 basic_rates, int bitrate)

get basic rate for a given rate

Parameters

struct ieee80211_supported_band * sband
the band to look for rates in
u32 basic_rates
bitmap of basic rates
int 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.

unsigned int __attribute_const__ ieee80211_hdrlen(__le16 fc)

get header length in bytes from frame control

Parameters

__le16 fc
frame control field in little-endian format

Return

The header length in bytes.

unsigned int ieee80211_get_hdrlen_from_skb(const struct sk_buff * skb)

get header length from data

Parameters

const struct sk_buff * 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.

struct ieee80211_radiotap_iterator

tracks walk thru present radiotap args

Definition

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.

int ieee80211_data_to_8023(struct sk_buff * skb, const u8 * addr, enum nl80211_iftype iftype)

convert an 802.11 data frame to 802.3

Parameters

struct sk_buff * skb
the 802.11 data frame
const u8 * addr
the device MAC address
enum nl80211_iftype iftype
the virtual interface type

Return

0 on success. Non-zero on error.

int ieee80211_data_from_8023(struct sk_buff * skb, const u8 * addr, enum nl80211_iftype iftype, const u8 * bssid, bool qos)

convert an 802.3 frame to 802.11

Parameters

struct sk_buff * skb
the 802.3 frame
const u8 * addr
the device MAC address
enum nl80211_iftype iftype
the virtual interface type
const u8 * bssid
the network bssid (used only for iftype STATION and ADHOC)
bool qos
build 802.11 QoS data frame

Return

0 on success, or a negative error code.

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)

decode an IEEE 802.11n A-MSDU frame

Parameters

struct sk_buff * skb
The input IEEE 802.11n A-MSDU frame.
struct sk_buff_head * list
The output list of 802.3 frames. It must be allocated and initialized by by the caller.
const u8 * addr
The device MAC address.
enum nl80211_iftype iftype
The device interface type.
const unsigned int extra_headroom
The hardware extra headroom for SKBs in the list.
bool 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.

unsigned int cfg80211_classify8021d(struct sk_buff * skb, struct cfg80211_qos_map * qos_map)

determine the 802.1p/1d tag for a data frame

Parameters

struct sk_buff * skb
the data frame
struct cfg80211_qos_map * qos_map
Interworking QoS mapping or NULL if not in use

Return

The 802.1p/1d tag.

Regulatory enforcement infrastructure

TODO

int regulatory_hint(struct wiphy * wiphy, const char * alpha2)

driver hint to the wireless core a regulatory domain

Parameters

struct wiphy * wiphy
the wireless device giving the hint (used only for reporting conflicts)
const char * 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.

void wiphy_apply_custom_regulatory(struct wiphy * wiphy, const struct ieee80211_regdomain * regd)

apply a custom driver regulatory domain

Parameters

struct wiphy * wiphy
the wireless device we want to process the regulatory domain on
const struct ieee80211_regdomain * 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.

const struct ieee80211_reg_rule * freq_reg_info(struct wiphy * wiphy, u32 center_freq)

get regulatory information for the given frequency

Parameters

struct wiphy * wiphy
the wiphy for which we want to process this rule for
u32 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.

void wiphy_rfkill_set_hw_state(struct wiphy * wiphy, bool blocked)

notify cfg80211 about hw block state

Parameters

struct wiphy * wiphy
the wiphy
bool blocked
block status
void wiphy_rfkill_start_polling(struct wiphy * wiphy)

start polling rfkill

Parameters

struct wiphy * wiphy
the wiphy
void wiphy_rfkill_stop_polling(struct wiphy * wiphy)

stop polling rfkill

Parameters

struct wiphy * 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.

struct sk_buff * cfg80211_testmode_alloc_reply_skb(struct wiphy * wiphy, int approxlen)

allocate testmode reply

Parameters

struct wiphy * wiphy
the wiphy
int 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.

int cfg80211_testmode_reply(struct sk_buff * skb)

send the reply skb

Parameters

struct sk_buff * 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.

struct sk_buff * cfg80211_testmode_alloc_event_skb(struct wiphy * wiphy, int approxlen, gfp_t gfp)

allocate testmode event

Parameters

struct wiphy * wiphy
the wiphy
int approxlen
an upper bound of the length of the data that will be put into the skb
gfp_t 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.

void cfg80211_testmode_event(struct sk_buff * skb, gfp_t gfp)

send the event

Parameters

struct sk_buff * skb
The skb, must have been allocated with cfg80211_testmode_alloc_event_skb()
gfp_t 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.