mirror of
https://github.com/torvalds/linux.git
synced 2024-11-08 21:21:47 +00:00
371842448c
A regression was added through patch a4ed90d6
:
"cfg80211: respect API on orig_flags on channel for beacon hint"
We did indeed respect _orig flags but the intention was not clearly
stated in the commit log. This patch fixes firmware issues picked
up by iwlwifi when we lift passive scan of beaconing restrictions
on channels its EEPROM has been configured to always enable.
By doing so though we also disallowed beacon hints on devices
registering their wiphy with custom world regulatory domains
enabled, this happens to be currently ath5k, ath9k and ar9170.
The passive scan and beacon restrictions on those devices would
never be lifted even if we did find a beacon and the hardware did
support such enhancements when world roaming.
Since Johannes indicates iwlwifi firmware cannot be changed to
allow beacon hinting we set up a flag now to specifically allow
drivers to disable beacon hints for devices which cannot use them.
We enable the flag on iwlwifi to disable beacon hints and by default
enable it for all other drivers. It should be noted beacon hints lift
passive scan flags and beacon restrictions when we receive a beacon from
an AP on any 5 GHz non-DFS channels, and channels 12-14 on the 2.4 GHz
band. We don't bother with channels 1-11 as those channels are allowed
world wide.
This should fix world roaming for ath5k, ath9k and ar9170, thereby
improving scan time when we receive the first beacon from any AP,
and also enabling beaconing operation (AP/IBSS/Mesh) on cards which
would otherwise not be allowed to do so. Drivers not using custom
regulatory stuff (wiphy_apply_custom_regulatory()) were not affected
by this as the orig_flags for the channels would have been cleared
upon wiphy registration.
I tested this with a world roaming ath5k card.
Cc: Jouni Malinen <jouni.malinen@atheros.com>
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
Reviewed-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
1696 lines
55 KiB
C
1696 lines
55 KiB
C
#ifndef __NET_CFG80211_H
|
|
#define __NET_CFG80211_H
|
|
/*
|
|
* 802.11 device and configuration interface
|
|
*
|
|
* Copyright 2006-2009 Johannes Berg <johannes@sipsolutions.net>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#include <linux/netdevice.h>
|
|
#include <linux/debugfs.h>
|
|
#include <linux/list.h>
|
|
#include <linux/netlink.h>
|
|
#include <linux/skbuff.h>
|
|
#include <linux/nl80211.h>
|
|
#include <linux/if_ether.h>
|
|
#include <linux/ieee80211.h>
|
|
#include <net/regulatory.h>
|
|
|
|
/* remove once we remove the wext stuff */
|
|
#include <net/iw_handler.h>
|
|
#include <linux/wireless.h>
|
|
|
|
|
|
/*
|
|
* wireless hardware capability structures
|
|
*/
|
|
|
|
/**
|
|
* enum ieee80211_band - supported frequency bands
|
|
*
|
|
* The bands are assigned this way because the supported
|
|
* bitrates differ in these bands.
|
|
*
|
|
* @IEEE80211_BAND_2GHZ: 2.4GHz ISM band
|
|
* @IEEE80211_BAND_5GHZ: around 5GHz band (4.9-5.7)
|
|
*/
|
|
enum ieee80211_band {
|
|
IEEE80211_BAND_2GHZ,
|
|
IEEE80211_BAND_5GHZ,
|
|
|
|
/* keep last */
|
|
IEEE80211_NUM_BANDS
|
|
};
|
|
|
|
/**
|
|
* enum ieee80211_channel_flags - channel flags
|
|
*
|
|
* Channel flags set by the regulatory control code.
|
|
*
|
|
* @IEEE80211_CHAN_DISABLED: This channel is disabled.
|
|
* @IEEE80211_CHAN_PASSIVE_SCAN: Only passive scanning is permitted
|
|
* on this channel.
|
|
* @IEEE80211_CHAN_NO_IBSS: IBSS is not allowed on this channel.
|
|
* @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.
|
|
*/
|
|
enum ieee80211_channel_flags {
|
|
IEEE80211_CHAN_DISABLED = 1<<0,
|
|
IEEE80211_CHAN_PASSIVE_SCAN = 1<<1,
|
|
IEEE80211_CHAN_NO_IBSS = 1<<2,
|
|
IEEE80211_CHAN_RADAR = 1<<3,
|
|
IEEE80211_CHAN_NO_HT40PLUS = 1<<4,
|
|
IEEE80211_CHAN_NO_HT40MINUS = 1<<5,
|
|
};
|
|
|
|
#define IEEE80211_CHAN_NO_HT40 \
|
|
(IEEE80211_CHAN_NO_HT40PLUS | IEEE80211_CHAN_NO_HT40MINUS)
|
|
|
|
/**
|
|
* struct ieee80211_channel - channel definition
|
|
*
|
|
* This structure describes a single channel for use
|
|
* with cfg80211.
|
|
*
|
|
* @center_freq: center frequency in MHz
|
|
* @max_bandwidth: maximum allowed bandwidth for this channel, in MHz
|
|
* @hw_value: hardware-specific value for the channel
|
|
* @flags: channel flags from &enum ieee80211_channel_flags.
|
|
* @orig_flags: channel flags at registration time, used by regulatory
|
|
* code to support devices with additional restrictions
|
|
* @band: band this channel belongs to.
|
|
* @max_antenna_gain: maximum antenna gain in dBi
|
|
* @max_power: maximum 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 is useful only on 5 GHz band.
|
|
* @orig_mag: internal use
|
|
* @orig_mpwr: internal use
|
|
*/
|
|
struct ieee80211_channel {
|
|
enum ieee80211_band band;
|
|
u16 center_freq;
|
|
u8 max_bandwidth;
|
|
u16 hw_value;
|
|
u32 flags;
|
|
int max_antenna_gain;
|
|
int max_power;
|
|
bool beacon_found;
|
|
u32 orig_flags;
|
|
int orig_mag, orig_mpwr;
|
|
};
|
|
|
|
/**
|
|
* enum ieee80211_rate_flags - rate flags
|
|
*
|
|
* Hardware/specification flags for rates. These are structured
|
|
* in a way that allows using the same bitrate structure for
|
|
* different bands/PHY modes.
|
|
*
|
|
* @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.
|
|
*/
|
|
enum ieee80211_rate_flags {
|
|
IEEE80211_RATE_SHORT_PREAMBLE = 1<<0,
|
|
IEEE80211_RATE_MANDATORY_A = 1<<1,
|
|
IEEE80211_RATE_MANDATORY_B = 1<<2,
|
|
IEEE80211_RATE_MANDATORY_G = 1<<3,
|
|
IEEE80211_RATE_ERP_G = 1<<4,
|
|
};
|
|
|
|
/**
|
|
* struct ieee80211_rate - bitrate definition
|
|
*
|
|
* 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.
|
|
*
|
|
* @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
|
|
*/
|
|
struct ieee80211_rate {
|
|
u32 flags;
|
|
u16 bitrate;
|
|
u16 hw_value, hw_value_short;
|
|
};
|
|
|
|
/**
|
|
* struct ieee80211_sta_ht_cap - STA's HT capabilities
|
|
*
|
|
* This structure describes most essential parameters needed
|
|
* to describe 802.11n HT capabilities for an STA.
|
|
*
|
|
* @ht_supported: is HT supported by the STA
|
|
* @cap: HT capabilities map as described in 802.11n spec
|
|
* @ampdu_factor: Maximum A-MPDU length factor
|
|
* @ampdu_density: Minimum A-MPDU spacing
|
|
* @mcs: Supported MCS rates
|
|
*/
|
|
struct ieee80211_sta_ht_cap {
|
|
u16 cap; /* use IEEE80211_HT_CAP_ */
|
|
bool ht_supported;
|
|
u8 ampdu_factor;
|
|
u8 ampdu_density;
|
|
struct ieee80211_mcs_info mcs;
|
|
};
|
|
|
|
/**
|
|
* struct ieee80211_supported_band - frequency band definition
|
|
*
|
|
* This structure describes a frequency band a wiphy
|
|
* is able to operate in.
|
|
*
|
|
* @channels: Array of channels the hardware can operate in
|
|
* in this band.
|
|
* @band: the band this structure represents
|
|
* @n_channels: Number of channels in @channels
|
|
* @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.
|
|
* @n_bitrates: Number of bitrates in @bitrates
|
|
*/
|
|
struct ieee80211_supported_band {
|
|
struct ieee80211_channel *channels;
|
|
struct ieee80211_rate *bitrates;
|
|
enum ieee80211_band band;
|
|
int n_channels;
|
|
int n_bitrates;
|
|
struct ieee80211_sta_ht_cap ht_cap;
|
|
};
|
|
|
|
/*
|
|
* Wireless hardware/device configuration structures and methods
|
|
*/
|
|
|
|
/**
|
|
* struct vif_params - describes virtual interface parameters
|
|
* @mesh_id: mesh ID to use
|
|
* @mesh_id_len: length of the mesh ID
|
|
*/
|
|
struct vif_params {
|
|
u8 *mesh_id;
|
|
int mesh_id_len;
|
|
};
|
|
|
|
/**
|
|
* struct key_params - key information
|
|
*
|
|
* Information about a key
|
|
*
|
|
* @key: key material
|
|
* @key_len: length of key material
|
|
* @cipher: cipher suite selector
|
|
* @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.
|
|
*/
|
|
struct key_params {
|
|
u8 *key;
|
|
u8 *seq;
|
|
int key_len;
|
|
int seq_len;
|
|
u32 cipher;
|
|
};
|
|
|
|
/**
|
|
* struct beacon_parameters - beacon parameters
|
|
*
|
|
* Used to configure the beacon for an interface.
|
|
*
|
|
* @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
|
|
* @interval: beacon interval or zero if not changed
|
|
* @dtim_period: DTIM period or zero if not changed
|
|
* @head_len: length of @head
|
|
* @tail_len: length of @tail
|
|
*/
|
|
struct beacon_parameters {
|
|
u8 *head, *tail;
|
|
int interval, dtim_period;
|
|
int head_len, tail_len;
|
|
};
|
|
|
|
/**
|
|
* enum plink_action - actions to perform in mesh peers
|
|
*
|
|
* @PLINK_ACTION_INVALID: action 0 is reserved
|
|
* @PLINK_ACTION_OPEN: start mesh peer link establishment
|
|
* @PLINK_ACTION_BLOCL: block traffic from this mesh peer
|
|
*/
|
|
enum plink_actions {
|
|
PLINK_ACTION_INVALID,
|
|
PLINK_ACTION_OPEN,
|
|
PLINK_ACTION_BLOCK,
|
|
};
|
|
|
|
/**
|
|
* struct station_parameters - station parameters
|
|
*
|
|
* Used to change and create a new station.
|
|
*
|
|
* @vlan: vlan interface station should belong to
|
|
* @supported_rates: supported rates in IEEE 802.11 format
|
|
* (or NULL for no change)
|
|
* @supported_rates_len: number of supported rates
|
|
* @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_...))
|
|
* @listen_interval: listen interval or -1 for no change
|
|
* @aid: AID or zero for no change
|
|
*/
|
|
struct station_parameters {
|
|
u8 *supported_rates;
|
|
struct net_device *vlan;
|
|
u32 sta_flags_mask, sta_flags_set;
|
|
int listen_interval;
|
|
u16 aid;
|
|
u8 supported_rates_len;
|
|
u8 plink_action;
|
|
struct ieee80211_ht_cap *ht_capa;
|
|
};
|
|
|
|
/**
|
|
* enum station_info_flags - station information flags
|
|
*
|
|
* Used by the driver to indicate which info in &struct station_info
|
|
* it has filled in during get_station() or dump_station().
|
|
*
|
|
* @STATION_INFO_INACTIVE_TIME: @inactive_time filled
|
|
* @STATION_INFO_RX_BYTES: @rx_bytes filled
|
|
* @STATION_INFO_TX_BYTES: @tx_bytes filled
|
|
* @STATION_INFO_LLID: @llid filled
|
|
* @STATION_INFO_PLID: @plid filled
|
|
* @STATION_INFO_PLINK_STATE: @plink_state filled
|
|
* @STATION_INFO_SIGNAL: @signal filled
|
|
* @STATION_INFO_TX_BITRATE: @tx_bitrate fields are filled
|
|
* (tx_bitrate, tx_bitrate_flags and tx_bitrate_mcs)
|
|
* @STATION_INFO_RX_PACKETS: @rx_packets filled
|
|
* @STATION_INFO_TX_PACKETS: @tx_packets filled
|
|
*/
|
|
enum station_info_flags {
|
|
STATION_INFO_INACTIVE_TIME = 1<<0,
|
|
STATION_INFO_RX_BYTES = 1<<1,
|
|
STATION_INFO_TX_BYTES = 1<<2,
|
|
STATION_INFO_LLID = 1<<3,
|
|
STATION_INFO_PLID = 1<<4,
|
|
STATION_INFO_PLINK_STATE = 1<<5,
|
|
STATION_INFO_SIGNAL = 1<<6,
|
|
STATION_INFO_TX_BITRATE = 1<<7,
|
|
STATION_INFO_RX_PACKETS = 1<<8,
|
|
STATION_INFO_TX_PACKETS = 1<<9,
|
|
};
|
|
|
|
/**
|
|
* enum station_info_rate_flags - bitrate info flags
|
|
*
|
|
* Used by the driver to indicate the specific rate transmission
|
|
* type for 802.11n transmissions.
|
|
*
|
|
* @RATE_INFO_FLAGS_MCS: @tx_bitrate_mcs filled
|
|
* @RATE_INFO_FLAGS_40_MHZ_WIDTH: 40 Mhz width transmission
|
|
* @RATE_INFO_FLAGS_SHORT_GI: 400ns guard interval
|
|
*/
|
|
enum rate_info_flags {
|
|
RATE_INFO_FLAGS_MCS = 1<<0,
|
|
RATE_INFO_FLAGS_40_MHZ_WIDTH = 1<<1,
|
|
RATE_INFO_FLAGS_SHORT_GI = 1<<2,
|
|
};
|
|
|
|
/**
|
|
* struct rate_info - bitrate information
|
|
*
|
|
* Information about a receiving or transmitting bitrate
|
|
*
|
|
* @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
|
|
*/
|
|
struct rate_info {
|
|
u8 flags;
|
|
u8 mcs;
|
|
u16 legacy;
|
|
};
|
|
|
|
/**
|
|
* struct station_info - station information
|
|
*
|
|
* Station information filled by driver for get_station() and dump_station.
|
|
*
|
|
* @filled: bitflag of flags from &enum station_info_flags
|
|
* @inactive_time: time since last station activity (tx/rx) in milliseconds
|
|
* @rx_bytes: bytes received from this station
|
|
* @tx_bytes: bytes transmitted to this station
|
|
* @llid: mesh local link id
|
|
* @plid: mesh peer link id
|
|
* @plink_state: mesh peer link state
|
|
* @signal: signal strength of last received packet in dBm
|
|
* @txrate: current unicast bitrate to this station
|
|
* @rx_packets: packets received from this station
|
|
* @tx_packets: packets transmitted to this station
|
|
*/
|
|
struct station_info {
|
|
u32 filled;
|
|
u32 inactive_time;
|
|
u32 rx_bytes;
|
|
u32 tx_bytes;
|
|
u16 llid;
|
|
u16 plid;
|
|
u8 plink_state;
|
|
s8 signal;
|
|
struct rate_info txrate;
|
|
u32 rx_packets;
|
|
u32 tx_packets;
|
|
};
|
|
|
|
/**
|
|
* enum monitor_flags - monitor flags
|
|
*
|
|
* Monitor interface configuration flags. Note that these must be the bits
|
|
* according to the nl80211 flags.
|
|
*
|
|
* @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
|
|
*/
|
|
enum monitor_flags {
|
|
MONITOR_FLAG_FCSFAIL = 1<<NL80211_MNTR_FLAG_FCSFAIL,
|
|
MONITOR_FLAG_PLCPFAIL = 1<<NL80211_MNTR_FLAG_PLCPFAIL,
|
|
MONITOR_FLAG_CONTROL = 1<<NL80211_MNTR_FLAG_CONTROL,
|
|
MONITOR_FLAG_OTHER_BSS = 1<<NL80211_MNTR_FLAG_OTHER_BSS,
|
|
MONITOR_FLAG_COOK_FRAMES = 1<<NL80211_MNTR_FLAG_COOK_FRAMES,
|
|
};
|
|
|
|
/**
|
|
* enum mpath_info_flags - mesh path information flags
|
|
*
|
|
* Used by the driver to indicate which info in &struct mpath_info it has filled
|
|
* in during get_station() or dump_station().
|
|
*
|
|
* MPATH_INFO_FRAME_QLEN: @frame_qlen filled
|
|
* MPATH_INFO_DSN: @dsn 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
|
|
*/
|
|
enum mpath_info_flags {
|
|
MPATH_INFO_FRAME_QLEN = BIT(0),
|
|
MPATH_INFO_DSN = BIT(1),
|
|
MPATH_INFO_METRIC = BIT(2),
|
|
MPATH_INFO_EXPTIME = BIT(3),
|
|
MPATH_INFO_DISCOVERY_TIMEOUT = BIT(4),
|
|
MPATH_INFO_DISCOVERY_RETRIES = BIT(5),
|
|
MPATH_INFO_FLAGS = BIT(6),
|
|
};
|
|
|
|
/**
|
|
* struct mpath_info - mesh path information
|
|
*
|
|
* Mesh path information filled by driver for get_mpath() and dump_mpath().
|
|
*
|
|
* @filled: bitfield of flags from &enum mpath_info_flags
|
|
* @frame_qlen: number of queued frames for this destination
|
|
* @dsn: destination sequence number
|
|
* @metric: metric (cost) of this mesh path
|
|
* @exptime: expiration time for the mesh path from now, in msecs
|
|
* @flags: mesh path flags
|
|
* @discovery_timeout: total mesh path discovery timeout, in msecs
|
|
* @discovery_retries: mesh path discovery retries
|
|
*/
|
|
struct mpath_info {
|
|
u32 filled;
|
|
u32 frame_qlen;
|
|
u32 dsn;
|
|
u32 metric;
|
|
u32 exptime;
|
|
u32 discovery_timeout;
|
|
u8 discovery_retries;
|
|
u8 flags;
|
|
};
|
|
|
|
/**
|
|
* struct bss_parameters - BSS parameters
|
|
*
|
|
* Used to change BSS parameters (mainly for AP mode).
|
|
*
|
|
* @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
|
|
*/
|
|
struct bss_parameters {
|
|
int use_cts_prot;
|
|
int use_short_preamble;
|
|
int use_short_slot_time;
|
|
u8 *basic_rates;
|
|
u8 basic_rates_len;
|
|
};
|
|
|
|
struct mesh_config {
|
|
/* Timeouts in ms */
|
|
/* Mesh plink management parameters */
|
|
u16 dot11MeshRetryTimeout;
|
|
u16 dot11MeshConfirmTimeout;
|
|
u16 dot11MeshHoldingTimeout;
|
|
u16 dot11MeshMaxPeerLinks;
|
|
u8 dot11MeshMaxRetries;
|
|
u8 dot11MeshTTL;
|
|
bool auto_open_plinks;
|
|
/* HWMP parameters */
|
|
u8 dot11MeshHWMPmaxPREQretries;
|
|
u32 path_refresh_time;
|
|
u16 min_discovery_timeout;
|
|
u32 dot11MeshHWMPactivePathTimeout;
|
|
u16 dot11MeshHWMPpreqMinInterval;
|
|
u16 dot11MeshHWMPnetDiameterTraversalTime;
|
|
};
|
|
|
|
/**
|
|
* struct ieee80211_txq_params - TX queue parameters
|
|
* @queue: TX queue identifier (NL80211_TXQ_Q_*)
|
|
* @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 ieee80211_txq_params {
|
|
enum nl80211_txq_q queue;
|
|
u16 txop;
|
|
u16 cwmin;
|
|
u16 cwmax;
|
|
u8 aifs;
|
|
};
|
|
|
|
/* from net/wireless.h */
|
|
struct wiphy;
|
|
|
|
/* from net/ieee80211.h */
|
|
struct ieee80211_channel;
|
|
|
|
/**
|
|
* struct cfg80211_ssid - SSID description
|
|
* @ssid: the SSID
|
|
* @ssid_len: length of the ssid
|
|
*/
|
|
struct cfg80211_ssid {
|
|
u8 ssid[IEEE80211_MAX_SSID_LEN];
|
|
u8 ssid_len;
|
|
};
|
|
|
|
/**
|
|
* struct cfg80211_scan_request - scan request description
|
|
*
|
|
* @ssids: SSIDs to scan for (active scan only)
|
|
* @n_ssids: number of SSIDs
|
|
* @channels: channels to scan on.
|
|
* @n_channels: number of channels for each band
|
|
* @ie: optional information element(s) to add into Probe Request or %NULL
|
|
* @ie_len: length of ie in octets
|
|
* @wiphy: the wiphy this was for
|
|
* @ifidx: the interface index
|
|
*/
|
|
struct cfg80211_scan_request {
|
|
struct cfg80211_ssid *ssids;
|
|
int n_ssids;
|
|
struct ieee80211_channel **channels;
|
|
u32 n_channels;
|
|
const u8 *ie;
|
|
size_t ie_len;
|
|
|
|
/* internal */
|
|
struct wiphy *wiphy;
|
|
int ifidx;
|
|
};
|
|
|
|
/**
|
|
* enum cfg80211_signal_type - signal type
|
|
*
|
|
* @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 cfg80211_signal_type {
|
|
CFG80211_SIGNAL_TYPE_NONE,
|
|
CFG80211_SIGNAL_TYPE_MBM,
|
|
CFG80211_SIGNAL_TYPE_UNSPEC,
|
|
};
|
|
|
|
/**
|
|
* struct cfg80211_bss - BSS description
|
|
*
|
|
* This structure describes a BSS (which may also be a mesh network)
|
|
* for use in scan results and similar.
|
|
*
|
|
* @bssid: BSSID of the BSS
|
|
* @tsf: timestamp of last received update
|
|
* @beacon_interval: the beacon interval as from the frame
|
|
* @capability: the capability field in host byte order
|
|
* @information_elements: the information elements (Note that there
|
|
* is no guarantee that these are well-formed!)
|
|
* @len_information_elements: total length of the information elements
|
|
* @signal: signal strength value (type depends on the wiphy's signal_type)
|
|
* @hold: BSS should not expire
|
|
* @free_priv: function pointer to free private data
|
|
* @priv: private area for driver use, has at least wiphy->bss_priv_size bytes
|
|
*/
|
|
struct cfg80211_bss {
|
|
struct ieee80211_channel *channel;
|
|
|
|
u8 bssid[ETH_ALEN];
|
|
u64 tsf;
|
|
u16 beacon_interval;
|
|
u16 capability;
|
|
u8 *information_elements;
|
|
size_t len_information_elements;
|
|
|
|
s32 signal;
|
|
|
|
void (*free_priv)(struct cfg80211_bss *bss);
|
|
u8 priv[0] __attribute__((__aligned__(sizeof(void *))));
|
|
};
|
|
|
|
/**
|
|
* struct cfg80211_auth_request - Authentication request data
|
|
*
|
|
* This structure provides information needed to complete IEEE 802.11
|
|
* authentication.
|
|
* NOTE: This structure will likely change when more code from mac80211 is
|
|
* moved into cfg80211 so that non-mac80211 drivers can benefit from it, too.
|
|
* Before using this in a driver that does not use mac80211, it would be better
|
|
* to check the status of that work and better yet, volunteer to work on it.
|
|
*
|
|
* @chan: The channel to use or %NULL if not specified (auto-select based on
|
|
* scan results)
|
|
* @peer_addr: The address of the peer STA (AP BSSID in infrastructure case);
|
|
* this field is required to be present; if the driver wants to help with
|
|
* BSS selection, it should use (yet to be added) MLME event to allow user
|
|
* space SME to be notified of roaming candidate, so that the SME can then
|
|
* use the authentication request with the recommended BSSID and whatever
|
|
* other data may be needed for authentication/association
|
|
* @ssid: SSID or %NULL if not yet available
|
|
* @ssid_len: Length of ssid in octets
|
|
* @auth_type: Authentication type (algorithm)
|
|
* @ie: Extra IEs to add to Authentication frame or %NULL
|
|
* @ie_len: Length of ie buffer in octets
|
|
*/
|
|
struct cfg80211_auth_request {
|
|
struct ieee80211_channel *chan;
|
|
u8 *peer_addr;
|
|
const u8 *ssid;
|
|
size_t ssid_len;
|
|
enum nl80211_auth_type auth_type;
|
|
const u8 *ie;
|
|
size_t ie_len;
|
|
};
|
|
|
|
/**
|
|
* struct cfg80211_assoc_request - (Re)Association request data
|
|
*
|
|
* This structure provides information needed to complete IEEE 802.11
|
|
* (re)association.
|
|
* NOTE: This structure will likely change when more code from mac80211 is
|
|
* moved into cfg80211 so that non-mac80211 drivers can benefit from it, too.
|
|
* Before using this in a driver that does not use mac80211, it would be better
|
|
* to check the status of that work and better yet, volunteer to work on it.
|
|
*
|
|
* @chan: The channel to use or %NULL if not specified (auto-select based on
|
|
* scan results)
|
|
* @peer_addr: The address of the peer STA (AP BSSID); this field is required
|
|
* to be present and the STA must be in State 2 (authenticated) with the
|
|
* peer STA
|
|
* @ssid: SSID
|
|
* @ssid_len: Length of ssid in octets
|
|
* @ie: Extra IEs to add to (Re)Association Request frame or %NULL
|
|
* @ie_len: Length of ie buffer in octets
|
|
* @use_mfp: Use management frame protection (IEEE 802.11w) in this association
|
|
* @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.
|
|
*/
|
|
struct cfg80211_assoc_request {
|
|
struct ieee80211_channel *chan;
|
|
u8 *peer_addr;
|
|
const u8 *ssid;
|
|
size_t ssid_len;
|
|
const u8 *ie;
|
|
size_t ie_len;
|
|
bool use_mfp;
|
|
bool control_port;
|
|
};
|
|
|
|
/**
|
|
* struct cfg80211_deauth_request - Deauthentication request data
|
|
*
|
|
* This structure provides information needed to complete IEEE 802.11
|
|
* deauthentication.
|
|
*
|
|
* @peer_addr: The address of the peer STA (AP BSSID); this field is required
|
|
* to be present and the STA must be authenticated with the peer STA
|
|
* @ie: Extra IEs to add to Deauthentication frame or %NULL
|
|
* @ie_len: Length of ie buffer in octets
|
|
*/
|
|
struct cfg80211_deauth_request {
|
|
u8 *peer_addr;
|
|
u16 reason_code;
|
|
const u8 *ie;
|
|
size_t ie_len;
|
|
};
|
|
|
|
/**
|
|
* struct cfg80211_disassoc_request - Disassociation request data
|
|
*
|
|
* This structure provides information needed to complete IEEE 802.11
|
|
* disassocation.
|
|
*
|
|
* @peer_addr: The address of the peer STA (AP BSSID); this field is required
|
|
* to be present and the STA must be associated with the peer STA
|
|
* @ie: Extra IEs to add to Disassociation frame or %NULL
|
|
* @ie_len: Length of ie buffer in octets
|
|
*/
|
|
struct cfg80211_disassoc_request {
|
|
u8 *peer_addr;
|
|
u16 reason_code;
|
|
const u8 *ie;
|
|
size_t ie_len;
|
|
};
|
|
|
|
/**
|
|
* struct cfg80211_ibss_params - IBSS parameters
|
|
*
|
|
* This structure defines the IBSS parameters for the join_ibss()
|
|
* method.
|
|
*
|
|
* @ssid: The SSID, will always be non-null.
|
|
* @ssid_len: The length of the SSID, will always be non-zero.
|
|
* @bssid: Fixed BSSID requested, maybe be %NULL, if set do not
|
|
* search for IBSSs with a different BSSID.
|
|
* @channel: The channel to use if no IBSS can be found to join.
|
|
* @channel_fixed: The channel should be fixed -- do not search for
|
|
* IBSSs to join on other channels.
|
|
* @ie: information element(s) to include in the beacon
|
|
* @ie_len: length of that
|
|
* @beacon_interval: beacon interval to use
|
|
*/
|
|
struct cfg80211_ibss_params {
|
|
u8 *ssid;
|
|
u8 *bssid;
|
|
struct ieee80211_channel *channel;
|
|
u8 *ie;
|
|
u8 ssid_len, ie_len;
|
|
u16 beacon_interval;
|
|
bool channel_fixed;
|
|
};
|
|
|
|
/**
|
|
* enum wiphy_params_flags - set_wiphy_params bitfield values
|
|
* 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
|
|
*/
|
|
enum wiphy_params_flags {
|
|
WIPHY_PARAM_RETRY_SHORT = 1 << 0,
|
|
WIPHY_PARAM_RETRY_LONG = 1 << 1,
|
|
WIPHY_PARAM_FRAG_THRESHOLD = 1 << 2,
|
|
WIPHY_PARAM_RTS_THRESHOLD = 1 << 3,
|
|
};
|
|
|
|
/**
|
|
* enum tx_power_setting - TX power adjustment
|
|
*
|
|
* @TX_POWER_AUTOMATIC: the dbm parameter is ignored
|
|
* @TX_POWER_LIMITED: limit TX power by the dbm parameter
|
|
* @TX_POWER_FIXED: fix TX power to the dbm parameter
|
|
*/
|
|
enum tx_power_setting {
|
|
TX_POWER_AUTOMATIC,
|
|
TX_POWER_LIMITED,
|
|
TX_POWER_FIXED,
|
|
};
|
|
|
|
/**
|
|
* struct cfg80211_ops - backend description for wireless configuration
|
|
*
|
|
* 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.
|
|
*
|
|
* @suspend: wiphy device needs to be suspended
|
|
* @resume: wiphy device needs to be resumed
|
|
*
|
|
* @add_virtual_intf: create a new virtual interface with the given name,
|
|
* must set the struct wireless_dev's iftype.
|
|
*
|
|
* @del_virtual_intf: remove the virtual interface determined by ifindex.
|
|
*
|
|
* @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
|
|
*
|
|
* @add_beacon: Add a beacon with given parameters, @head, @interval
|
|
* and @dtim_period will be valid, @tail is optional.
|
|
* @set_beacon: Change the beacon parameters for an access point mode
|
|
* interface. This should reject the call when no beacon has been
|
|
* configured.
|
|
* @del_beacon: Remove beacon configuration and stop sending the beacon.
|
|
*
|
|
* @add_station: Add a new station.
|
|
*
|
|
* @del_station: Remove a station; @mac may be NULL to remove all stations.
|
|
*
|
|
* @change_station: Modify a given station.
|
|
*
|
|
* @get_mesh_params: Put the current mesh parameters into *params
|
|
*
|
|
* @set_mesh_params: Set mesh parameters.
|
|
* The mask is a bitfield which tells us which parameters to
|
|
* set, and which to leave alone.
|
|
*
|
|
* @set_mesh_cfg: set mesh parameters (by now, just mesh id)
|
|
*
|
|
* @change_bss: Modify parameters for a given BSS.
|
|
*
|
|
* @set_txq_params: Set TX queue parameters
|
|
*
|
|
* @set_channel: Set channel
|
|
*
|
|
* @scan: Request to do a scan. If returning zero, the scan request is given
|
|
* the driver, and will be valid until passed to cfg80211_scan_done().
|
|
* For scan results, call cfg80211_inform_bss(); you can call this outside
|
|
* the scan/scan_done bracket too.
|
|
*
|
|
* @auth: Request to authenticate with the specified peer
|
|
* @assoc: Request to (re)associate with the specified peer
|
|
* @deauth: Request to deauthenticate from the specified peer
|
|
* @disassoc: Request to disassociate from the specified peer
|
|
*
|
|
* @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.
|
|
* @leave_ibss: Leave the IBSS.
|
|
*
|
|
* @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
|
|
* @get_tx_power: store the current TX power into the dbm variable;
|
|
* return 0 if successful
|
|
*
|
|
* @rfkill_poll: polls the hw rfkill line, use cfg80211 reporting
|
|
* functions to adjust rfkill hw state
|
|
*/
|
|
struct cfg80211_ops {
|
|
int (*suspend)(struct wiphy *wiphy);
|
|
int (*resume)(struct wiphy *wiphy);
|
|
|
|
int (*add_virtual_intf)(struct wiphy *wiphy, char *name,
|
|
enum nl80211_iftype type, u32 *flags,
|
|
struct vif_params *params);
|
|
int (*del_virtual_intf)(struct wiphy *wiphy, int ifindex);
|
|
int (*change_virtual_intf)(struct wiphy *wiphy, int ifindex,
|
|
enum nl80211_iftype type, u32 *flags,
|
|
struct vif_params *params);
|
|
|
|
int (*add_key)(struct wiphy *wiphy, struct net_device *netdev,
|
|
u8 key_index, const u8 *mac_addr,
|
|
struct key_params *params);
|
|
int (*get_key)(struct wiphy *wiphy, struct net_device *netdev,
|
|
u8 key_index, const u8 *mac_addr, void *cookie,
|
|
void (*callback)(void *cookie, struct key_params*));
|
|
int (*del_key)(struct wiphy *wiphy, struct net_device *netdev,
|
|
u8 key_index, const u8 *mac_addr);
|
|
int (*set_default_key)(struct wiphy *wiphy,
|
|
struct net_device *netdev,
|
|
u8 key_index);
|
|
int (*set_default_mgmt_key)(struct wiphy *wiphy,
|
|
struct net_device *netdev,
|
|
u8 key_index);
|
|
|
|
int (*add_beacon)(struct wiphy *wiphy, struct net_device *dev,
|
|
struct beacon_parameters *info);
|
|
int (*set_beacon)(struct wiphy *wiphy, struct net_device *dev,
|
|
struct beacon_parameters *info);
|
|
int (*del_beacon)(struct wiphy *wiphy, struct net_device *dev);
|
|
|
|
|
|
int (*add_station)(struct wiphy *wiphy, struct net_device *dev,
|
|
u8 *mac, struct station_parameters *params);
|
|
int (*del_station)(struct wiphy *wiphy, struct net_device *dev,
|
|
u8 *mac);
|
|
int (*change_station)(struct wiphy *wiphy, struct net_device *dev,
|
|
u8 *mac, struct station_parameters *params);
|
|
int (*get_station)(struct wiphy *wiphy, struct net_device *dev,
|
|
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,
|
|
u8 *dst, u8 *next_hop);
|
|
int (*del_mpath)(struct wiphy *wiphy, struct net_device *dev,
|
|
u8 *dst);
|
|
int (*change_mpath)(struct wiphy *wiphy, struct net_device *dev,
|
|
u8 *dst, 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_mesh_params)(struct wiphy *wiphy,
|
|
struct net_device *dev,
|
|
struct mesh_config *conf);
|
|
int (*set_mesh_params)(struct wiphy *wiphy,
|
|
struct net_device *dev,
|
|
const struct mesh_config *nconf, u32 mask);
|
|
int (*change_bss)(struct wiphy *wiphy, struct net_device *dev,
|
|
struct bss_parameters *params);
|
|
|
|
int (*set_txq_params)(struct wiphy *wiphy,
|
|
struct ieee80211_txq_params *params);
|
|
|
|
int (*set_channel)(struct wiphy *wiphy,
|
|
struct ieee80211_channel *chan,
|
|
enum nl80211_channel_type channel_type);
|
|
|
|
int (*scan)(struct wiphy *wiphy, struct net_device *dev,
|
|
struct cfg80211_scan_request *request);
|
|
|
|
int (*auth)(struct wiphy *wiphy, struct net_device *dev,
|
|
struct cfg80211_auth_request *req);
|
|
int (*assoc)(struct wiphy *wiphy, struct net_device *dev,
|
|
struct cfg80211_assoc_request *req);
|
|
int (*deauth)(struct wiphy *wiphy, struct net_device *dev,
|
|
struct cfg80211_deauth_request *req);
|
|
int (*disassoc)(struct wiphy *wiphy, struct net_device *dev,
|
|
struct cfg80211_disassoc_request *req);
|
|
|
|
int (*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_wiphy_params)(struct wiphy *wiphy, u32 changed);
|
|
|
|
int (*set_tx_power)(struct wiphy *wiphy,
|
|
enum tx_power_setting type, int dbm);
|
|
int (*get_tx_power)(struct wiphy *wiphy, int *dbm);
|
|
|
|
void (*rfkill_poll)(struct wiphy *wiphy);
|
|
};
|
|
|
|
/*
|
|
* wireless hardware and networking interfaces structures
|
|
* and registration/helper functions
|
|
*/
|
|
|
|
/**
|
|
* struct wiphy - wireless hardware description
|
|
* @idx: the wiphy index assigned to this item
|
|
* @class_dev: the class device representing /sys/class/ieee80211/<wiphy-name>
|
|
* @custom_regulatory: tells us the driver for this device
|
|
* has its own custom regulatory domain and cannot identify the
|
|
* ISO / IEC 3166 alpha2 it belongs to. When this is enabled
|
|
* we will disregard the first regulatory hint (when the
|
|
* initiator is %REGDOM_SET_BY_CORE).
|
|
* @strict_regulatory: tells us the driver for this device will ignore
|
|
* regulatory domain settings until it gets its own regulatory domain
|
|
* via its regulatory_hint(). After its gets its own regulatory domain
|
|
* it will only allow further regulatory domain settings to further
|
|
* enhance compliance. For example if channel 13 and 14 are disabled
|
|
* by this regulatory domain no user regulatory domain can enable these
|
|
* channels at a later time. This can be used for devices which do not
|
|
* have calibration information gauranteed for frequencies or settings
|
|
* outside of its regulatory domain.
|
|
* @disable_beacon_hints: enable this if your driver needs to ensure that
|
|
* passive scan flags and beaconing flags may not be lifted by cfg80211
|
|
* due to regulatory beacon hints. For more information on beacon
|
|
* hints read the documenation for regulatory_hint_found_beacon()
|
|
* @reg_notifier: the driver's regulatory notification callback
|
|
* @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.
|
|
* @signal_type: signal type reported in &struct cfg80211_bss.
|
|
* @cipher_suites: supported cipher suites
|
|
* @n_cipher_suites: number of 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
|
|
*/
|
|
struct wiphy {
|
|
/* assign these fields before you register the wiphy */
|
|
|
|
/* permanent MAC address */
|
|
u8 perm_addr[ETH_ALEN];
|
|
|
|
/* Supported interface modes, OR together BIT(NL80211_IFTYPE_...) */
|
|
u16 interface_modes;
|
|
|
|
bool custom_regulatory;
|
|
bool strict_regulatory;
|
|
bool disable_beacon_hints;
|
|
|
|
enum cfg80211_signal_type signal_type;
|
|
|
|
int bss_priv_size;
|
|
u8 max_scan_ssids;
|
|
u16 max_scan_ie_len;
|
|
|
|
int n_cipher_suites;
|
|
const u32 *cipher_suites;
|
|
|
|
u8 retry_short;
|
|
u8 retry_long;
|
|
u32 frag_threshold;
|
|
u32 rts_threshold;
|
|
|
|
/* If multiple wiphys are registered and you're handed e.g.
|
|
* a regular netdev with assigned ieee80211_ptr, you won't
|
|
* know whether it points to a wiphy your driver has registered
|
|
* or not. Assign this to something global to your driver to
|
|
* help determine whether you own this wiphy or not. */
|
|
const void *privid;
|
|
|
|
struct ieee80211_supported_band *bands[IEEE80211_NUM_BANDS];
|
|
|
|
/* Lets us get back the wiphy on the callback */
|
|
int (*reg_notifier)(struct wiphy *wiphy,
|
|
struct regulatory_request *request);
|
|
|
|
/* fields below are read-only, assigned by cfg80211 */
|
|
|
|
const struct ieee80211_regdomain *regd;
|
|
|
|
/* the item in /sys/class/ieee80211/ points to this,
|
|
* you need use set_wiphy_dev() (see below) */
|
|
struct device dev;
|
|
|
|
/* dir in debugfs: ieee80211/<wiphyname> */
|
|
struct dentry *debugfsdir;
|
|
|
|
char priv[0] __attribute__((__aligned__(NETDEV_ALIGN)));
|
|
};
|
|
|
|
/**
|
|
* wiphy_priv - return priv from wiphy
|
|
*
|
|
* @wiphy: the wiphy whose priv pointer to return
|
|
*/
|
|
static inline void *wiphy_priv(struct wiphy *wiphy)
|
|
{
|
|
BUG_ON(!wiphy);
|
|
return &wiphy->priv;
|
|
}
|
|
|
|
/**
|
|
* set_wiphy_dev - set device pointer for wiphy
|
|
*
|
|
* @wiphy: The wiphy whose device to bind
|
|
* @dev: The device to parent it to
|
|
*/
|
|
static inline void set_wiphy_dev(struct wiphy *wiphy, struct device *dev)
|
|
{
|
|
wiphy->dev.parent = dev;
|
|
}
|
|
|
|
/**
|
|
* wiphy_dev - get wiphy dev pointer
|
|
*
|
|
* @wiphy: The wiphy whose device struct to look up
|
|
*/
|
|
static inline struct device *wiphy_dev(struct wiphy *wiphy)
|
|
{
|
|
return wiphy->dev.parent;
|
|
}
|
|
|
|
/**
|
|
* wiphy_name - get wiphy name
|
|
*
|
|
* @wiphy: The wiphy whose name to return
|
|
*/
|
|
static inline const char *wiphy_name(struct wiphy *wiphy)
|
|
{
|
|
return dev_name(&wiphy->dev);
|
|
}
|
|
|
|
/**
|
|
* wiphy_new - create a new wiphy for use with cfg80211
|
|
*
|
|
* @ops: The configuration operations for this device
|
|
* @sizeof_priv: The size of the private area to allocate
|
|
*
|
|
* Create a new wiphy and associate the given operations with it.
|
|
* @sizeof_priv bytes are allocated for private use.
|
|
*
|
|
* The returned pointer must be assigned to each netdev's
|
|
* ieee80211_ptr for proper operation.
|
|
*/
|
|
struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv);
|
|
|
|
/**
|
|
* wiphy_register - register a wiphy with cfg80211
|
|
*
|
|
* @wiphy: The wiphy to register.
|
|
*
|
|
* Returns a non-negative wiphy index or a negative error code.
|
|
*/
|
|
extern int wiphy_register(struct wiphy *wiphy);
|
|
|
|
/**
|
|
* wiphy_unregister - deregister a wiphy from cfg80211
|
|
*
|
|
* @wiphy: The wiphy to unregister.
|
|
*
|
|
* 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.
|
|
*/
|
|
extern void wiphy_unregister(struct wiphy *wiphy);
|
|
|
|
/**
|
|
* wiphy_free - free wiphy
|
|
*
|
|
* @wiphy: The wiphy to free
|
|
*/
|
|
extern void wiphy_free(struct wiphy *wiphy);
|
|
|
|
/**
|
|
* struct wireless_dev - wireless per-netdev state
|
|
*
|
|
* This structure must be allocated by the driver/stack
|
|
* that uses the ieee80211_ptr field in struct net_device
|
|
* (this is intentional so it can be allocated along with
|
|
* the netdev.)
|
|
*
|
|
* @wiphy: pointer to hardware description
|
|
* @iftype: interface type
|
|
* @list: (private) Used to collect the interfaces
|
|
* @netdev: (private) Used to reference back to the netdev
|
|
* @current_bss: (private) Used by the internal configuration code
|
|
* @bssid: (private) Used by the internal configuration code
|
|
* @ssid: (private) Used by the internal configuration code
|
|
* @ssid_len: (private) Used by the internal configuration code
|
|
* @wext: (private) Used by the internal wireless extensions compat code
|
|
* @wext_bssid: (private) Used by the internal wireless extensions compat code
|
|
*/
|
|
struct wireless_dev {
|
|
struct wiphy *wiphy;
|
|
enum nl80211_iftype iftype;
|
|
|
|
/* private to the generic wireless code */
|
|
struct list_head list;
|
|
struct net_device *netdev;
|
|
|
|
/* currently used for IBSS - might be rearranged in the future */
|
|
struct cfg80211_bss *current_bss;
|
|
u8 bssid[ETH_ALEN];
|
|
u8 ssid[IEEE80211_MAX_SSID_LEN];
|
|
u8 ssid_len;
|
|
|
|
#ifdef CONFIG_WIRELESS_EXT
|
|
/* wext data */
|
|
struct {
|
|
struct cfg80211_ibss_params ibss;
|
|
u8 bssid[ETH_ALEN];
|
|
s8 default_key, default_mgmt_key;
|
|
} wext;
|
|
#endif
|
|
};
|
|
|
|
/**
|
|
* wdev_priv - return wiphy priv from wireless_dev
|
|
*
|
|
* @wdev: The wireless device whose wiphy's priv pointer to return
|
|
*/
|
|
static inline void *wdev_priv(struct wireless_dev *wdev)
|
|
{
|
|
BUG_ON(!wdev);
|
|
return wiphy_priv(wdev->wiphy);
|
|
}
|
|
|
|
/*
|
|
* Utility functions
|
|
*/
|
|
|
|
/**
|
|
* ieee80211_channel_to_frequency - convert channel number to frequency
|
|
*/
|
|
extern int ieee80211_channel_to_frequency(int chan);
|
|
|
|
/**
|
|
* ieee80211_frequency_to_channel - convert frequency to channel number
|
|
*/
|
|
extern int ieee80211_frequency_to_channel(int freq);
|
|
|
|
/*
|
|
* Name indirection necessary because the ieee80211 code also has
|
|
* a function named "ieee80211_get_channel", so if you include
|
|
* cfg80211's header file you get cfg80211's version, if you try
|
|
* to include both header files you'll (rightfully!) get a symbol
|
|
* clash.
|
|
*/
|
|
extern struct ieee80211_channel *__ieee80211_get_channel(struct wiphy *wiphy,
|
|
int freq);
|
|
/**
|
|
* ieee80211_get_channel - get channel struct from wiphy for specified frequency
|
|
*/
|
|
static inline struct ieee80211_channel *
|
|
ieee80211_get_channel(struct wiphy *wiphy, int freq)
|
|
{
|
|
return __ieee80211_get_channel(wiphy, freq);
|
|
}
|
|
|
|
/**
|
|
* ieee80211_get_response_rate - get basic rate for a given rate
|
|
*
|
|
* @sband: the band to look for rates in
|
|
* @basic_rates: bitmap of basic rates
|
|
* @bitrate: the bitrate for which to find the basic rate
|
|
*
|
|
* This function returns 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.
|
|
*/
|
|
struct ieee80211_rate *
|
|
ieee80211_get_response_rate(struct ieee80211_supported_band *sband,
|
|
u32 basic_rates, int bitrate);
|
|
|
|
/*
|
|
* Radiotap parsing functions -- for controlled injection support
|
|
*
|
|
* Implemented in net/wireless/radiotap.c
|
|
* Documentation in Documentation/networking/radiotap-headers.txt
|
|
*/
|
|
|
|
/**
|
|
* struct ieee80211_radiotap_iterator - tracks walk thru present radiotap args
|
|
* @rtheader: pointer to the radiotap header we are walking through
|
|
* @max_length: length of radiotap header in cpu byte ordering
|
|
* @this_arg_index: IEEE80211_RADIOTAP_... index of current arg
|
|
* @this_arg: pointer to current radiotap arg
|
|
* @arg_index: internal next argument index
|
|
* @arg: internal next argument pointer
|
|
* @next_bitmap: internal pointer to next present u32
|
|
* @bitmap_shifter: internal shifter for curr u32 bitmap, b0 set == arg present
|
|
*/
|
|
|
|
struct ieee80211_radiotap_iterator {
|
|
struct ieee80211_radiotap_header *rtheader;
|
|
int max_length;
|
|
int this_arg_index;
|
|
u8 *this_arg;
|
|
|
|
int arg_index;
|
|
u8 *arg;
|
|
__le32 *next_bitmap;
|
|
u32 bitmap_shifter;
|
|
};
|
|
|
|
extern int ieee80211_radiotap_iterator_init(
|
|
struct ieee80211_radiotap_iterator *iterator,
|
|
struct ieee80211_radiotap_header *radiotap_header,
|
|
int max_length);
|
|
|
|
extern int ieee80211_radiotap_iterator_next(
|
|
struct ieee80211_radiotap_iterator *iterator);
|
|
|
|
extern const unsigned char rfc1042_header[6];
|
|
extern const unsigned char bridge_tunnel_header[6];
|
|
|
|
/**
|
|
* ieee80211_get_hdrlen_from_skb - get header length from data
|
|
*
|
|
* Given an skb with a raw 802.11 header at the data pointer this function
|
|
* returns the 802.11 header length in bytes (not including encryption
|
|
* headers). If the data in the sk_buff is too short to contain a valid 802.11
|
|
* header the function returns 0.
|
|
*
|
|
* @skb: the frame
|
|
*/
|
|
unsigned int ieee80211_get_hdrlen_from_skb(const struct sk_buff *skb);
|
|
|
|
/**
|
|
* ieee80211_hdrlen - get header length in bytes from frame control
|
|
* @fc: frame control field in little-endian format
|
|
*/
|
|
unsigned int ieee80211_hdrlen(__le16 fc);
|
|
|
|
/**
|
|
* ieee80211_data_to_8023 - convert an 802.11 data frame to 802.3
|
|
* @skb: the 802.11 data frame
|
|
* @addr: the device MAC address
|
|
* @iftype: the virtual interface type
|
|
*/
|
|
int ieee80211_data_to_8023(struct sk_buff *skb, u8 *addr,
|
|
enum nl80211_iftype iftype);
|
|
|
|
/**
|
|
* ieee80211_data_from_8023 - convert an 802.3 frame to 802.11
|
|
* @skb: the 802.3 frame
|
|
* @addr: the device MAC address
|
|
* @iftype: the virtual interface type
|
|
* @bssid: the network bssid (used only for iftype STATION and ADHOC)
|
|
* @qos: build 802.11 QoS data frame
|
|
*/
|
|
int ieee80211_data_from_8023(struct sk_buff *skb, u8 *addr,
|
|
enum nl80211_iftype iftype, u8 *bssid, bool qos);
|
|
|
|
/**
|
|
* cfg80211_classify8021d - determine the 802.1p/1d tag for a data frame
|
|
* @skb: the data frame
|
|
*/
|
|
unsigned int cfg80211_classify8021d(struct sk_buff *skb);
|
|
|
|
/*
|
|
* Regulatory helper functions for wiphys
|
|
*/
|
|
|
|
/**
|
|
* regulatory_hint - driver hint to the wireless core a regulatory domain
|
|
* @wiphy: the wireless device giving the hint (used only for reporting
|
|
* conflicts)
|
|
* @alpha2: the ISO/IEC 3166 alpha2 the driver claims its regulatory domain
|
|
* should be in. If @rd is set this should be NULL. Note that if you
|
|
* set this to NULL you should still set rd->alpha2 to some accepted
|
|
* alpha2.
|
|
*
|
|
* 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.
|
|
*/
|
|
extern int regulatory_hint(struct wiphy *wiphy, const char *alpha2);
|
|
|
|
/**
|
|
* regulatory_hint_11d - hints a country IE as a regulatory domain
|
|
* @wiphy: the wireless device giving the hint (used only for reporting
|
|
* conflicts)
|
|
* @country_ie: pointer to the country IE
|
|
* @country_ie_len: length of the country IE
|
|
*
|
|
* We will intersect the rd with the what CRDA tells us should apply
|
|
* for the alpha2 this country IE belongs to, this prevents APs from
|
|
* sending us incorrect or outdated information against a country.
|
|
*/
|
|
extern void regulatory_hint_11d(struct wiphy *wiphy,
|
|
u8 *country_ie,
|
|
u8 country_ie_len);
|
|
/**
|
|
* wiphy_apply_custom_regulatory - apply a custom driver regulatory domain
|
|
* @wiphy: the wireless device we want to process the regulatory domain on
|
|
* @regd: the custom regulatory domain to use for this wiphy
|
|
*
|
|
* 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.
|
|
*/
|
|
extern void wiphy_apply_custom_regulatory(
|
|
struct wiphy *wiphy,
|
|
const struct ieee80211_regdomain *regd);
|
|
|
|
/**
|
|
* freq_reg_info - get regulatory information for the given frequency
|
|
* @wiphy: the wiphy for which we want to process this rule for
|
|
* @center_freq: Frequency in KHz for which we want regulatory information for
|
|
* @desired_bw_khz: the desired max bandwidth you want to use per
|
|
* channel. Note that this is still 20 MHz if you want to use HT40
|
|
* as HT40 makes use of two channels for its 40 MHz width bandwidth.
|
|
* If set to 0 we'll assume you want the standard 20 MHz.
|
|
* @reg_rule: the regulatory rule which we have for this frequency
|
|
*
|
|
* 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.
|
|
*
|
|
* Returns 0 if it was able to find a valid regulatory rule which does
|
|
* apply to the given center_freq otherwise it returns non-zero. It will
|
|
* also return -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 its 802.11 specific.
|
|
*/
|
|
extern int freq_reg_info(struct wiphy *wiphy,
|
|
u32 center_freq,
|
|
u32 desired_bw_khz,
|
|
const struct ieee80211_reg_rule **reg_rule);
|
|
|
|
/*
|
|
* Temporary wext handlers & helper functions
|
|
*
|
|
* In the future cfg80211 will simply assign the entire wext handler
|
|
* structure to netdevs it manages, but we're not there yet.
|
|
*/
|
|
int cfg80211_wext_giwname(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
char *name, char *extra);
|
|
int cfg80211_wext_siwmode(struct net_device *dev, struct iw_request_info *info,
|
|
u32 *mode, char *extra);
|
|
int cfg80211_wext_giwmode(struct net_device *dev, struct iw_request_info *info,
|
|
u32 *mode, char *extra);
|
|
int cfg80211_wext_siwscan(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
union iwreq_data *wrqu, char *extra);
|
|
int cfg80211_wext_giwscan(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct iw_point *data, char *extra);
|
|
int cfg80211_wext_siwmlme(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct iw_point *data, char *extra);
|
|
int cfg80211_wext_giwrange(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct iw_point *data, char *extra);
|
|
int cfg80211_ibss_wext_siwfreq(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct iw_freq *freq, char *extra);
|
|
int cfg80211_ibss_wext_giwfreq(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct iw_freq *freq, char *extra);
|
|
int cfg80211_ibss_wext_siwessid(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct iw_point *data, char *ssid);
|
|
int cfg80211_ibss_wext_giwessid(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct iw_point *data, char *ssid);
|
|
int cfg80211_ibss_wext_siwap(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct sockaddr *ap_addr, char *extra);
|
|
int cfg80211_ibss_wext_giwap(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct sockaddr *ap_addr, char *extra);
|
|
|
|
struct ieee80211_channel *cfg80211_wext_freq(struct wiphy *wiphy,
|
|
struct iw_freq *freq);
|
|
|
|
int cfg80211_wext_siwrts(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct iw_param *rts, char *extra);
|
|
int cfg80211_wext_giwrts(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct iw_param *rts, char *extra);
|
|
int cfg80211_wext_siwfrag(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct iw_param *frag, char *extra);
|
|
int cfg80211_wext_giwfrag(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct iw_param *frag, char *extra);
|
|
int cfg80211_wext_siwretry(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct iw_param *retry, char *extra);
|
|
int cfg80211_wext_giwretry(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct iw_param *retry, char *extra);
|
|
int cfg80211_wext_siwencodeext(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct iw_point *erq, char *extra);
|
|
int cfg80211_wext_siwencode(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct iw_point *erq, char *keybuf);
|
|
int cfg80211_wext_giwencode(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct iw_point *erq, char *keybuf);
|
|
int cfg80211_wext_siwtxpower(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
union iwreq_data *data, char *keybuf);
|
|
int cfg80211_wext_giwtxpower(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
union iwreq_data *data, char *keybuf);
|
|
|
|
/*
|
|
* callbacks for asynchronous cfg80211 methods, notification
|
|
* functions and BSS handling helpers
|
|
*/
|
|
|
|
/**
|
|
* cfg80211_scan_done - notify that scan finished
|
|
*
|
|
* @request: the corresponding scan request
|
|
* @aborted: set to true if the scan was aborted for any reason,
|
|
* userspace will be notified of that
|
|
*/
|
|
void cfg80211_scan_done(struct cfg80211_scan_request *request, bool aborted);
|
|
|
|
/**
|
|
* cfg80211_inform_bss - inform cfg80211 of a new BSS
|
|
*
|
|
* @wiphy: the wiphy reporting the BSS
|
|
* @bss: the found BSS
|
|
* @signal: the signal strength, type depends on the wiphy's signal_type
|
|
* @gfp: context flags
|
|
*
|
|
* This informs cfg80211 that BSS information was found and
|
|
* the BSS should be updated/added.
|
|
*/
|
|
struct cfg80211_bss*
|
|
cfg80211_inform_bss_frame(struct wiphy *wiphy,
|
|
struct ieee80211_channel *channel,
|
|
struct ieee80211_mgmt *mgmt, size_t len,
|
|
s32 signal, gfp_t gfp);
|
|
|
|
struct cfg80211_bss*
|
|
cfg80211_inform_bss(struct wiphy *wiphy,
|
|
struct ieee80211_channel *channel,
|
|
const u8 *bssid,
|
|
u64 timestamp, u16 capability, u16 beacon_interval,
|
|
const u8 *ie, size_t ielen,
|
|
s32 signal, gfp_t gfp);
|
|
|
|
struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy,
|
|
struct ieee80211_channel *channel,
|
|
const u8 *bssid,
|
|
const u8 *ssid, size_t ssid_len,
|
|
u16 capa_mask, u16 capa_val);
|
|
static inline struct cfg80211_bss *
|
|
cfg80211_get_ibss(struct wiphy *wiphy,
|
|
struct ieee80211_channel *channel,
|
|
const u8 *ssid, size_t ssid_len)
|
|
{
|
|
return cfg80211_get_bss(wiphy, channel, NULL, ssid, ssid_len,
|
|
WLAN_CAPABILITY_IBSS, WLAN_CAPABILITY_IBSS);
|
|
}
|
|
|
|
struct cfg80211_bss *cfg80211_get_mesh(struct wiphy *wiphy,
|
|
struct ieee80211_channel *channel,
|
|
const u8 *meshid, size_t meshidlen,
|
|
const u8 *meshcfg);
|
|
void cfg80211_put_bss(struct cfg80211_bss *bss);
|
|
|
|
/**
|
|
* cfg80211_unlink_bss - unlink BSS from internal data structures
|
|
* @wiphy: the wiphy
|
|
* @bss: the bss to remove
|
|
*
|
|
* 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.
|
|
*/
|
|
void cfg80211_unlink_bss(struct wiphy *wiphy, struct cfg80211_bss *bss);
|
|
|
|
/**
|
|
* cfg80211_send_rx_auth - notification of processed authentication
|
|
* @dev: network device
|
|
* @buf: authentication frame (header + body)
|
|
* @len: length of the frame data
|
|
*
|
|
* This function is called whenever an authentication has been processed in
|
|
* station mode. The driver is required to call either this function or
|
|
* cfg80211_send_auth_timeout() to indicate the result of cfg80211_ops::auth()
|
|
* call.
|
|
*/
|
|
void cfg80211_send_rx_auth(struct net_device *dev, const u8 *buf, size_t len);
|
|
|
|
/**
|
|
* cfg80211_send_auth_timeout - notification of timed out authentication
|
|
* @dev: network device
|
|
* @addr: The MAC address of the device with which the authentication timed out
|
|
*/
|
|
void cfg80211_send_auth_timeout(struct net_device *dev, const u8 *addr);
|
|
|
|
/**
|
|
* cfg80211_send_rx_assoc - notification of processed association
|
|
* @dev: network device
|
|
* @buf: (re)association response frame (header + body)
|
|
* @len: length of the frame data
|
|
*
|
|
* This function is called whenever a (re)association response has been
|
|
* processed in station mode. The driver is required to call either this
|
|
* function or cfg80211_send_assoc_timeout() to indicate the result of
|
|
* cfg80211_ops::assoc() call.
|
|
*/
|
|
void cfg80211_send_rx_assoc(struct net_device *dev, const u8 *buf, size_t len);
|
|
|
|
/**
|
|
* cfg80211_send_assoc_timeout - notification of timed out association
|
|
* @dev: network device
|
|
* @addr: The MAC address of the device with which the association timed out
|
|
*/
|
|
void cfg80211_send_assoc_timeout(struct net_device *dev, const u8 *addr);
|
|
|
|
/**
|
|
* cfg80211_send_deauth - notification of processed deauthentication
|
|
* @dev: network device
|
|
* @buf: deauthentication frame (header + body)
|
|
* @len: length of the frame data
|
|
*
|
|
* This function is called whenever deauthentication has been processed in
|
|
* station mode. This includes both received deauthentication frames and
|
|
* locally generated ones.
|
|
*/
|
|
void cfg80211_send_deauth(struct net_device *dev, const u8 *buf, size_t len);
|
|
|
|
/**
|
|
* cfg80211_send_disassoc - notification of processed disassociation
|
|
* @dev: network device
|
|
* @buf: disassociation response frame (header + body)
|
|
* @len: length of the frame data
|
|
*
|
|
* This function is called whenever disassociation has been processed in
|
|
* station mode. This includes both received disassociation frames and locally
|
|
* generated ones.
|
|
*/
|
|
void cfg80211_send_disassoc(struct net_device *dev, const u8 *buf, size_t len);
|
|
|
|
/**
|
|
* cfg80211_hold_bss - exclude bss from expiration
|
|
* @bss: bss which should not expire
|
|
*
|
|
* In a case when the BSS is not updated but it shouldn't expire this
|
|
* function can be used to mark the BSS to be excluded from expiration.
|
|
*/
|
|
void cfg80211_hold_bss(struct cfg80211_bss *bss);
|
|
|
|
/**
|
|
* cfg80211_unhold_bss - remove expiration exception from the BSS
|
|
* @bss: bss which can expire again
|
|
*
|
|
* This function marks the BSS to be expirable again.
|
|
*/
|
|
void cfg80211_unhold_bss(struct cfg80211_bss *bss);
|
|
|
|
/**
|
|
* cfg80211_michael_mic_failure - notification of Michael MIC failure (TKIP)
|
|
* @dev: network device
|
|
* @addr: The source MAC address of the frame
|
|
* @key_type: The key type that the received frame used
|
|
* @key_id: Key identifier (0..3)
|
|
* @tsc: The TSC value of the frame that generated the MIC failure (6 octets)
|
|
*
|
|
* This function is called whenever the local MAC detects a MIC failure in a
|
|
* received frame. This matches with MLME-MICHAELMICFAILURE.indication()
|
|
* primitive.
|
|
*/
|
|
void cfg80211_michael_mic_failure(struct net_device *dev, const u8 *addr,
|
|
enum nl80211_key_type key_type, int key_id,
|
|
const u8 *tsc);
|
|
|
|
/**
|
|
* cfg80211_ibss_joined - notify cfg80211 that device joined an IBSS
|
|
*
|
|
* @dev: network device
|
|
* @bssid: the BSSID of the IBSS joined
|
|
* @gfp: allocation flags
|
|
*
|
|
* 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_ibss_joined(struct net_device *dev, const u8 *bssid, gfp_t gfp);
|
|
|
|
/**
|
|
* wiphy_rfkill_set_hw_state - notify cfg80211 about hw block state
|
|
* @wiphy: the wiphy
|
|
* @blocked: block status
|
|
*/
|
|
void wiphy_rfkill_set_hw_state(struct wiphy *wiphy, bool blocked);
|
|
|
|
/**
|
|
* wiphy_rfkill_start_polling - start polling rfkill
|
|
* @wiphy: the wiphy
|
|
*/
|
|
void wiphy_rfkill_start_polling(struct wiphy *wiphy);
|
|
|
|
/**
|
|
* wiphy_rfkill_stop_polling - stop polling rfkill
|
|
* @wiphy: the wiphy
|
|
*/
|
|
void wiphy_rfkill_stop_polling(struct wiphy *wiphy);
|
|
|
|
#endif /* __NET_CFG80211_H */
|