mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 06:23:51 -04:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6
This commit is contained in:
@@ -112,12 +112,14 @@ struct beacon_parameters {
|
||||
* @STATION_FLAG_SHORT_PREAMBLE: station is capable of receiving frames
|
||||
* with short preambles
|
||||
* @STATION_FLAG_WME: station is WME/QoS capable
|
||||
* @STATION_FLAG_MFP: station uses management frame protection
|
||||
*/
|
||||
enum station_flags {
|
||||
STATION_FLAG_CHANGED = 1<<0,
|
||||
STATION_FLAG_AUTHORIZED = 1<<NL80211_STA_FLAG_AUTHORIZED,
|
||||
STATION_FLAG_SHORT_PREAMBLE = 1<<NL80211_STA_FLAG_SHORT_PREAMBLE,
|
||||
STATION_FLAG_WME = 1<<NL80211_STA_FLAG_WME,
|
||||
STATION_FLAG_MFP = 1<<NL80211_STA_FLAG_MFP,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -355,6 +357,51 @@ enum reg_set_by {
|
||||
REGDOM_SET_BY_COUNTRY_IE,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum environment_cap - Environment parsed from country IE
|
||||
* @ENVIRON_ANY: indicates country IE applies to both indoor and
|
||||
* outdoor operation.
|
||||
* @ENVIRON_INDOOR: indicates country IE applies only to indoor operation
|
||||
* @ENVIRON_OUTDOOR: indicates country IE applies only to outdoor operation
|
||||
*/
|
||||
enum environment_cap {
|
||||
ENVIRON_ANY,
|
||||
ENVIRON_INDOOR,
|
||||
ENVIRON_OUTDOOR,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct regulatory_request - receipt of last regulatory request
|
||||
*
|
||||
* @wiphy: this is set if this request's initiator is
|
||||
* %REGDOM_SET_BY_COUNTRY_IE or %REGDOM_SET_BY_DRIVER. This
|
||||
* can be used by the wireless core to deal with conflicts
|
||||
* and potentially inform users of which devices specifically
|
||||
* cased the conflicts.
|
||||
* @initiator: indicates who sent this request, could be any of
|
||||
* of those set in reg_set_by, %REGDOM_SET_BY_*
|
||||
* @alpha2: the ISO / IEC 3166 alpha2 country code of the requested
|
||||
* regulatory domain. We have a few special codes:
|
||||
* 00 - World regulatory domain
|
||||
* 99 - built by driver but a specific alpha2 cannot be determined
|
||||
* 98 - result of an intersection between two regulatory domains
|
||||
* @intersect: indicates whether the wireless core should intersect
|
||||
* the requested regulatory domain with the presently set regulatory
|
||||
* domain.
|
||||
* @country_ie_checksum: checksum of the last processed and accepted
|
||||
* country IE
|
||||
* @country_ie_env: lets us know if the AP is telling us we are outdoor,
|
||||
* indoor, or if it doesn't matter
|
||||
*/
|
||||
struct regulatory_request {
|
||||
struct wiphy *wiphy;
|
||||
enum reg_set_by initiator;
|
||||
char alpha2[2];
|
||||
bool intersect;
|
||||
u32 country_ie_checksum;
|
||||
enum environment_cap country_ie_env;
|
||||
};
|
||||
|
||||
struct ieee80211_freq_range {
|
||||
u32 start_freq_khz;
|
||||
u32 end_freq_khz;
|
||||
@@ -431,6 +478,26 @@ struct ieee80211_txq_params {
|
||||
u8 aifs;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mgmt_extra_ie_params - Extra management frame IE parameters
|
||||
*
|
||||
* Used to add extra IE(s) into management frames. If the driver cannot add the
|
||||
* requested data into all management frames of the specified subtype that are
|
||||
* generated in kernel or firmware/hardware, it must reject the configuration
|
||||
* call. The IE data buffer is added to the end of the specified management
|
||||
* frame body after all other IEs. This addition is not applied to frames that
|
||||
* are injected through a monitor interface.
|
||||
*
|
||||
* @subtype: Management frame subtype
|
||||
* @ies: IE data buffer or %NULL to remove previous data
|
||||
* @ies_len: Length of @ies in octets
|
||||
*/
|
||||
struct mgmt_extra_ie_params {
|
||||
u8 subtype;
|
||||
u8 *ies;
|
||||
int ies_len;
|
||||
};
|
||||
|
||||
/* from net/wireless.h */
|
||||
struct wiphy;
|
||||
|
||||
@@ -450,6 +517,9 @@ struct ieee80211_channel;
|
||||
* 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.
|
||||
*
|
||||
@@ -471,6 +541,8 @@ struct ieee80211_channel;
|
||||
*
|
||||
* @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
|
||||
@@ -497,8 +569,13 @@ struct ieee80211_channel;
|
||||
* @set_txq_params: Set TX queue parameters
|
||||
*
|
||||
* @set_channel: Set channel
|
||||
*
|
||||
* @set_mgmt_extra_ie: Set extra IE data for management frames
|
||||
*/
|
||||
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);
|
||||
@@ -518,6 +595,9 @@ struct cfg80211_ops {
|
||||
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);
|
||||
@@ -564,6 +644,10 @@ struct cfg80211_ops {
|
||||
int (*set_channel)(struct wiphy *wiphy,
|
||||
struct ieee80211_channel *chan,
|
||||
enum nl80211_channel_type channel_type);
|
||||
|
||||
int (*set_mgmt_extra_ie)(struct wiphy *wiphy,
|
||||
struct net_device *dev,
|
||||
struct mgmt_extra_ie_params *params);
|
||||
};
|
||||
|
||||
/* temporary wext handlers */
|
||||
|
||||
@@ -207,7 +207,7 @@ struct ieee80211_bss_conf {
|
||||
u16 beacon_int;
|
||||
u16 assoc_capability;
|
||||
u64 timestamp;
|
||||
u64 basic_rates;
|
||||
u32 basic_rates;
|
||||
struct ieee80211_bss_ht_conf ht;
|
||||
};
|
||||
|
||||
@@ -262,6 +262,26 @@ enum mac80211_tx_control_flags {
|
||||
IEEE80211_TX_CTL_RATE_CTRL_PROBE = BIT(12),
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mac80211_rate_control_flags - per-rate flags set by the
|
||||
* Rate Control algorithm.
|
||||
*
|
||||
* These flags are set by the Rate control algorithm for each rate during tx,
|
||||
* in the @flags member of struct ieee80211_tx_rate.
|
||||
*
|
||||
* @IEEE80211_TX_RC_USE_RTS_CTS: Use RTS/CTS exchange for this rate.
|
||||
* @IEEE80211_TX_RC_USE_CTS_PROTECT: CTS-to-self protection is required.
|
||||
* This is set if the current BSS requires ERP protection.
|
||||
* @IEEE80211_TX_RC_USE_SHORT_PREAMBLE: Use short preamble.
|
||||
* @IEEE80211_TX_RC_MCS: HT rate.
|
||||
* @IEEE80211_TX_RC_GREEN_FIELD: Indicates whether this rate should be used in
|
||||
* Greenfield mode.
|
||||
* @IEEE80211_TX_RC_40_MHZ_WIDTH: Indicates if the Channel Width should be 40 MHz.
|
||||
* @IEEE80211_TX_RC_DUP_DATA: The frame should be transmitted on both of the
|
||||
* adjacent 20 MHz channels, if the current channel type is
|
||||
* NL80211_CHAN_HT40MINUS or NL80211_CHAN_HT40PLUS.
|
||||
* @IEEE80211_TX_RC_SHORT_GI: Short Guard interval should be used for this rate.
|
||||
*/
|
||||
enum mac80211_rate_control_flags {
|
||||
IEEE80211_TX_RC_USE_RTS_CTS = BIT(0),
|
||||
IEEE80211_TX_RC_USE_CTS_PROTECT = BIT(1),
|
||||
@@ -507,11 +527,6 @@ static inline int __deprecated __IEEE80211_CONF_SHORT_SLOT_TIME(void)
|
||||
}
|
||||
#define IEEE80211_CONF_SHORT_SLOT_TIME (__IEEE80211_CONF_SHORT_SLOT_TIME())
|
||||
|
||||
struct ieee80211_ht_conf {
|
||||
bool enabled;
|
||||
enum nl80211_channel_type channel_type;
|
||||
};
|
||||
|
||||
/**
|
||||
* enum ieee80211_conf_changed - denotes which configuration changed
|
||||
*
|
||||
@@ -520,10 +535,10 @@ struct ieee80211_ht_conf {
|
||||
* @IEEE80211_CONF_CHANGE_LISTEN_INTERVAL: the listen interval changed
|
||||
* @IEEE80211_CONF_CHANGE_RADIOTAP: the radiotap flag changed
|
||||
* @IEEE80211_CONF_CHANGE_PS: the PS flag changed
|
||||
* @IEEE80211_CONF_CHANGE_DYNPS_TIMEOUT: the dynamic PS timeout changed
|
||||
* @IEEE80211_CONF_CHANGE_POWER: the TX power changed
|
||||
* @IEEE80211_CONF_CHANGE_CHANNEL: the channel changed
|
||||
* @IEEE80211_CONF_CHANGE_CHANNEL: the channel/channel_type changed
|
||||
* @IEEE80211_CONF_CHANGE_RETRY_LIMITS: retry limits changed
|
||||
* @IEEE80211_CONF_CHANGE_HT: HT configuration changed
|
||||
*/
|
||||
enum ieee80211_conf_changed {
|
||||
IEEE80211_CONF_CHANGE_RADIO_ENABLED = BIT(0),
|
||||
@@ -531,10 +546,10 @@ enum ieee80211_conf_changed {
|
||||
IEEE80211_CONF_CHANGE_LISTEN_INTERVAL = BIT(2),
|
||||
IEEE80211_CONF_CHANGE_RADIOTAP = BIT(3),
|
||||
IEEE80211_CONF_CHANGE_PS = BIT(4),
|
||||
IEEE80211_CONF_CHANGE_POWER = BIT(5),
|
||||
IEEE80211_CONF_CHANGE_CHANNEL = BIT(6),
|
||||
IEEE80211_CONF_CHANGE_RETRY_LIMITS = BIT(7),
|
||||
IEEE80211_CONF_CHANGE_HT = BIT(8),
|
||||
IEEE80211_CONF_CHANGE_DYNPS_TIMEOUT = BIT(5),
|
||||
IEEE80211_CONF_CHANGE_POWER = BIT(6),
|
||||
IEEE80211_CONF_CHANGE_CHANNEL = BIT(7),
|
||||
IEEE80211_CONF_CHANGE_RETRY_LIMITS = BIT(8),
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -547,8 +562,9 @@ enum ieee80211_conf_changed {
|
||||
* @listen_interval: listen interval in units of beacon interval
|
||||
* @flags: configuration flags defined above
|
||||
* @power_level: requested transmit power (in dBm)
|
||||
* @dynamic_ps_timeout: dynamic powersave timeout (in ms)
|
||||
* @channel: the channel to tune to
|
||||
* @ht: the HT configuration for the device
|
||||
* @channel_type: the channel (HT) type
|
||||
* @long_frame_max_tx_count: Maximum number of transmissions for a "long" frame
|
||||
* (a frame not RTS protected), called "dot11LongRetryLimit" in 802.11,
|
||||
* but actually means the number of transmissions not the number of retries
|
||||
@@ -559,7 +575,7 @@ enum ieee80211_conf_changed {
|
||||
struct ieee80211_conf {
|
||||
int beacon_int;
|
||||
u32 flags;
|
||||
int power_level;
|
||||
int power_level, dynamic_ps_timeout;
|
||||
|
||||
u16 listen_interval;
|
||||
bool radio_enabled;
|
||||
@@ -567,7 +583,7 @@ struct ieee80211_conf {
|
||||
u8 long_frame_max_tx_count, short_frame_max_tx_count;
|
||||
|
||||
struct ieee80211_channel *channel;
|
||||
struct ieee80211_ht_conf ht;
|
||||
enum nl80211_channel_type channel_type;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -630,10 +646,12 @@ struct ieee80211_if_init_conf {
|
||||
* @IEEE80211_IFCC_BSSID: The BSSID changed.
|
||||
* @IEEE80211_IFCC_BEACON: The beacon for this interface changed
|
||||
* (currently AP and MESH only), use ieee80211_beacon_get().
|
||||
* @IEEE80211_IFCC_BEACON_ENABLED: The enable_beacon value changed.
|
||||
*/
|
||||
enum ieee80211_if_conf_change {
|
||||
IEEE80211_IFCC_BSSID = BIT(0),
|
||||
IEEE80211_IFCC_BEACON = BIT(1),
|
||||
IEEE80211_IFCC_BSSID = BIT(0),
|
||||
IEEE80211_IFCC_BEACON = BIT(1),
|
||||
IEEE80211_IFCC_BEACON_ENABLED = BIT(2),
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -641,13 +659,16 @@ enum ieee80211_if_conf_change {
|
||||
*
|
||||
* @changed: parameters that have changed, see &enum ieee80211_if_conf_change.
|
||||
* @bssid: BSSID of the network we are associated to/creating.
|
||||
* @enable_beacon: Indicates whether beacons can be sent.
|
||||
* This is valid only for AP/IBSS/MESH modes.
|
||||
*
|
||||
* This structure is passed to the config_interface() callback of
|
||||
* &struct ieee80211_hw.
|
||||
*/
|
||||
struct ieee80211_if_conf {
|
||||
u32 changed;
|
||||
u8 *bssid;
|
||||
const u8 *bssid;
|
||||
bool enable_beacon;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -655,11 +676,13 @@ struct ieee80211_if_conf {
|
||||
* @ALG_WEP: WEP40 or WEP104
|
||||
* @ALG_TKIP: TKIP
|
||||
* @ALG_CCMP: CCMP (AES)
|
||||
* @ALG_AES_CMAC: AES-128-CMAC
|
||||
*/
|
||||
enum ieee80211_key_alg {
|
||||
ALG_WEP,
|
||||
ALG_TKIP,
|
||||
ALG_CCMP,
|
||||
ALG_AES_CMAC,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -688,12 +711,16 @@ enum ieee80211_key_len {
|
||||
* generation in software.
|
||||
* @IEEE80211_KEY_FLAG_PAIRWISE: Set by mac80211, this flag indicates
|
||||
* that the key is pairwise rather then a shared key.
|
||||
* @IEEE80211_KEY_FLAG_SW_MGMT: This flag should be set by the driver for a
|
||||
* CCMP key if it requires CCMP encryption of management frames (MFP) to
|
||||
* be done in software.
|
||||
*/
|
||||
enum ieee80211_key_flags {
|
||||
IEEE80211_KEY_FLAG_WMM_STA = 1<<0,
|
||||
IEEE80211_KEY_FLAG_GENERATE_IV = 1<<1,
|
||||
IEEE80211_KEY_FLAG_GENERATE_MMIC= 1<<2,
|
||||
IEEE80211_KEY_FLAG_PAIRWISE = 1<<3,
|
||||
IEEE80211_KEY_FLAG_SW_MGMT = 1<<4,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -714,8 +741,8 @@ enum ieee80211_key_flags {
|
||||
* - Temporal Encryption Key (128 bits)
|
||||
* - Temporal Authenticator Tx MIC Key (64 bits)
|
||||
* - Temporal Authenticator Rx MIC Key (64 bits)
|
||||
* @icv_len: FIXME
|
||||
* @iv_len: FIXME
|
||||
* @icv_len: The ICV length for this key type
|
||||
* @iv_len: The IV length for this key type
|
||||
*/
|
||||
struct ieee80211_key_conf {
|
||||
enum ieee80211_key_alg alg;
|
||||
@@ -759,7 +786,7 @@ enum set_key_cmd {
|
||||
* sizeof(void *), size is determined in hw information.
|
||||
*/
|
||||
struct ieee80211_sta {
|
||||
u64 supp_rates[IEEE80211_NUM_BANDS];
|
||||
u32 supp_rates[IEEE80211_NUM_BANDS];
|
||||
u8 addr[ETH_ALEN];
|
||||
u16 aid;
|
||||
struct ieee80211_sta_ht_cap ht_cap;
|
||||
@@ -854,10 +881,18 @@ enum ieee80211_tkip_key_type {
|
||||
* @IEEE80211_HW_AMPDU_AGGREGATION:
|
||||
* Hardware supports 11n A-MPDU aggregation.
|
||||
*
|
||||
* @IEEE80211_HW_NO_STACK_DYNAMIC_PS:
|
||||
* Hardware which has dynamic power save support, meaning
|
||||
* that power save is enabled in idle periods, and don't need support
|
||||
* from stack.
|
||||
* @IEEE80211_HW_SUPPORTS_PS:
|
||||
* Hardware has power save support (i.e. can go to sleep).
|
||||
*
|
||||
* @IEEE80211_HW_PS_NULLFUNC_STACK:
|
||||
* Hardware requires nullfunc frame handling in stack, implies
|
||||
* stack support for dynamic PS.
|
||||
*
|
||||
* @IEEE80211_HW_SUPPORTS_DYNAMIC_PS:
|
||||
* Hardware has support for dynamic PS.
|
||||
*
|
||||
* @IEEE80211_HW_MFP_CAPABLE:
|
||||
* Hardware supports management frame protection (MFP, IEEE 802.11w).
|
||||
*/
|
||||
enum ieee80211_hw_flags {
|
||||
IEEE80211_HW_RX_INCLUDES_FCS = 1<<1,
|
||||
@@ -870,7 +905,10 @@ enum ieee80211_hw_flags {
|
||||
IEEE80211_HW_NOISE_DBM = 1<<8,
|
||||
IEEE80211_HW_SPECTRUM_MGMT = 1<<9,
|
||||
IEEE80211_HW_AMPDU_AGGREGATION = 1<<10,
|
||||
IEEE80211_HW_NO_STACK_DYNAMIC_PS = 1<<11,
|
||||
IEEE80211_HW_SUPPORTS_PS = 1<<11,
|
||||
IEEE80211_HW_PS_NULLFUNC_STACK = 1<<12,
|
||||
IEEE80211_HW_SUPPORTS_DYNAMIC_PS = 1<<13,
|
||||
IEEE80211_HW_MFP_CAPABLE = 1<<14,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -890,9 +928,8 @@ enum ieee80211_hw_flags {
|
||||
* @workqueue: single threaded workqueue available for driver use,
|
||||
* allocated by mac80211 on registration and flushed when an
|
||||
* interface is removed.
|
||||
* NOTICE: All work performed on this workqueue should NEVER
|
||||
* acquire the RTNL lock (i.e. Don't use the function
|
||||
* ieee80211_iterate_active_interfaces())
|
||||
* NOTICE: All work performed on this workqueue must not
|
||||
* acquire the RTNL lock.
|
||||
*
|
||||
* @priv: pointer to private area that was allocated for driver use
|
||||
* along with this structure.
|
||||
@@ -951,6 +988,19 @@ struct ieee80211_hw {
|
||||
u8 max_rate_tries;
|
||||
};
|
||||
|
||||
/**
|
||||
* wiphy_to_ieee80211_hw - return a mac80211 driver hw struct from a wiphy
|
||||
*
|
||||
* @wiphy: the &struct wiphy which we want to query
|
||||
*
|
||||
* mac80211 drivers can use this to get to their respective
|
||||
* &struct ieee80211_hw. Drivers wishing to get to their own private
|
||||
* structure can then access it via hw->priv. Note that mac802111 drivers should
|
||||
* not use wiphy_priv() to try to get their private driver structure as this
|
||||
* is already used internally by mac80211.
|
||||
*/
|
||||
struct ieee80211_hw *wiphy_to_ieee80211_hw(struct wiphy *wiphy);
|
||||
|
||||
/**
|
||||
* SET_IEEE80211_DEV - set device for 802.11 hardware
|
||||
*
|
||||
@@ -1018,16 +1068,12 @@ ieee80211_get_alt_retry_rate(const struct ieee80211_hw *hw,
|
||||
*
|
||||
* The set_key() callback in the &struct ieee80211_ops for a given
|
||||
* device is called to enable hardware acceleration of encryption and
|
||||
* decryption. The callback takes an @address parameter that will be
|
||||
* the broadcast address for default keys, the other station's hardware
|
||||
* address for individual keys or the zero address for keys that will
|
||||
* be used only for transmission.
|
||||
* decryption. The callback takes a @sta parameter that will be NULL
|
||||
* for default keys or keys used for transmission only, or point to
|
||||
* the station information for the peer for individual keys.
|
||||
* Multiple transmission keys with the same key index may be used when
|
||||
* VLANs are configured for an access point.
|
||||
*
|
||||
* The @local_address parameter will always be set to our own address,
|
||||
* this is only relevant if you support multiple local addresses.
|
||||
*
|
||||
* When transmitting, the TX control data will use the @hw_key_idx
|
||||
* selected by the driver by modifying the &struct ieee80211_key_conf
|
||||
* pointed to by the @key parameter to the set_key() function.
|
||||
@@ -1060,6 +1106,42 @@ ieee80211_get_alt_retry_rate(const struct ieee80211_hw *hw,
|
||||
* handler is software decryption with wrap around of iv16.
|
||||
*/
|
||||
|
||||
/**
|
||||
* DOC: Powersave support
|
||||
*
|
||||
* mac80211 has support for various powersave implementations.
|
||||
*
|
||||
* First, it can support hardware that handles all powersaving by
|
||||
* itself, such hardware should simply set the %IEEE80211_HW_SUPPORTS_PS
|
||||
* hardware flag. In that case, it will be told about the desired
|
||||
* powersave mode depending on the association status, and the driver
|
||||
* must take care of sending nullfunc frames when necessary, i.e. when
|
||||
* entering and leaving powersave mode. The driver is required to look at
|
||||
* the AID in beacons and signal to the AP that it woke up when it finds
|
||||
* traffic directed to it. This mode supports dynamic PS by simply
|
||||
* enabling/disabling PS.
|
||||
*
|
||||
* Additionally, such hardware may set the %IEEE80211_HW_SUPPORTS_DYNAMIC_PS
|
||||
* flag to indicate that it can support dynamic PS mode itself (see below).
|
||||
*
|
||||
* Other hardware designs cannot send nullfunc frames by themselves and also
|
||||
* need software support for parsing the TIM bitmap. This is also supported
|
||||
* by mac80211 by combining the %IEEE80211_HW_SUPPORTS_PS and
|
||||
* %IEEE80211_HW_PS_NULLFUNC_STACK flags. The hardware is of course still
|
||||
* required to pass up beacons. Additionally, in this case, mac80211 will
|
||||
* wake up the hardware when multicast traffic is announced in the beacon.
|
||||
*
|
||||
* FIXME: I don't think we can be fast enough in software when we want to
|
||||
* receive multicast traffic?
|
||||
*
|
||||
* Dynamic powersave mode is an extension to normal powersave mode in which
|
||||
* the hardware stays awake for a user-specified period of time after sending
|
||||
* a frame so that reply frames need not be buffered and therefore delayed
|
||||
* to the next wakeup. This can either be supported by hardware, in which case
|
||||
* the driver needs to look at the @dynamic_ps_timeout hardware configuration
|
||||
* value, or by the stack if all nullfunc handling is in the stack.
|
||||
*/
|
||||
|
||||
/**
|
||||
* DOC: Frame filtering
|
||||
*
|
||||
@@ -1172,6 +1254,8 @@ enum ieee80211_ampdu_mlme_action {
|
||||
* configuration in the TX control data. This handler should,
|
||||
* preferably, never fail and stop queues appropriately, more
|
||||
* importantly, however, it must never fail for A-MPDU-queues.
|
||||
* This function should return NETDEV_TX_OK except in very
|
||||
* limited cases.
|
||||
* Must be implemented and atomic.
|
||||
*
|
||||
* @start: Called before the first netdevice attached to the hardware
|
||||
@@ -1212,9 +1296,12 @@ enum ieee80211_ampdu_mlme_action {
|
||||
*
|
||||
* @config: Handler for configuration requests. IEEE 802.11 code calls this
|
||||
* function to change hardware configuration, e.g., channel.
|
||||
* This function should never fail but returns a negative error code
|
||||
* if it does.
|
||||
*
|
||||
* @config_interface: Handler for configuration requests related to interfaces
|
||||
* (e.g. BSSID changes.)
|
||||
* Returns a negative error code which will be seen in userspace.
|
||||
*
|
||||
* @bss_info_changed: Handler for configuration requests related to BSS
|
||||
* parameters that may vary during BSS's lifespan, and may affect low
|
||||
@@ -1232,8 +1319,9 @@ enum ieee80211_ampdu_mlme_action {
|
||||
*
|
||||
* @set_key: See the section "Hardware crypto acceleration"
|
||||
* This callback can sleep, and is only called between add_interface
|
||||
* and remove_interface calls, i.e. while the interface with the
|
||||
* given local_address is enabled.
|
||||
* and remove_interface calls, i.e. while the given virtual interface
|
||||
* is enabled.
|
||||
* Returns a negative error code if the key can't be added.
|
||||
*
|
||||
* @update_tkip_key: See the section "Hardware crypto acceleration"
|
||||
* This callback will be called in the context of Rx. Called for drivers
|
||||
@@ -1245,8 +1333,10 @@ enum ieee80211_ampdu_mlme_action {
|
||||
* bands. When the scan finishes, ieee80211_scan_completed() must be
|
||||
* called; note that it also must be called when the scan cannot finish
|
||||
* because the hardware is turned off! Anything else is a bug!
|
||||
* Returns a negative error code which will be seen in userspace.
|
||||
*
|
||||
* @get_stats: return low-level statistics
|
||||
* @get_stats: Return low-level statistics.
|
||||
* Returns zero if statistics are available.
|
||||
*
|
||||
* @get_tkip_seq: If your device implements TKIP encryption in hardware this
|
||||
* callback should be provided to read the TKIP transmit IVs (both IV32
|
||||
@@ -1260,6 +1350,7 @@ enum ieee80211_ampdu_mlme_action {
|
||||
*
|
||||
* @conf_tx: Configure TX queue parameters (EDCF (aifs, cw_min, cw_max),
|
||||
* bursting) for a hardware TX queue.
|
||||
* Returns a negative error code on failure.
|
||||
*
|
||||
* @get_tx_stats: Get statistics of the current TX queue status. This is used
|
||||
* to get number of currently queued packets (queue length), maximum queue
|
||||
@@ -1268,7 +1359,11 @@ enum ieee80211_ampdu_mlme_action {
|
||||
* hw->ampdu_queues items.
|
||||
*
|
||||
* @get_tsf: Get the current TSF timer value from firmware/hardware. Currently,
|
||||
* this is only used for IBSS mode debugging and, as such, is not a
|
||||
* this is only used for IBSS mode BSSID merging and debugging. Is not a
|
||||
* required function. Must be atomic.
|
||||
*
|
||||
* @set_tsf: Set the TSF timer to the specified value in the firmware/hardware.
|
||||
* Currently, this is only used for IBSS mode debugging. Is not a
|
||||
* required function. Must be atomic.
|
||||
*
|
||||
* @reset_tsf: Reset the TSF timer and allow firmware/hardware to synchronize
|
||||
@@ -1279,13 +1374,15 @@ enum ieee80211_ampdu_mlme_action {
|
||||
* @tx_last_beacon: Determine whether the last IBSS beacon was sent by us.
|
||||
* This is needed only for IBSS mode and the result of this function is
|
||||
* used to determine whether to reply to Probe Requests.
|
||||
* Returns non-zero if this device sent the last beacon.
|
||||
*
|
||||
* @ampdu_action: Perform a certain A-MPDU action
|
||||
* The RA/TID combination determines the destination and TID we want
|
||||
* the ampdu action to be performed for. The action is defined through
|
||||
* ieee80211_ampdu_mlme_action. Starting sequence number (@ssn)
|
||||
* is the first frame we expect to perform the action on. notice
|
||||
* is the first frame we expect to perform the action on. Notice
|
||||
* that TX/RX_STOP can pass NULL for this parameter.
|
||||
* Returns a negative error code on failure.
|
||||
*/
|
||||
struct ieee80211_ops {
|
||||
int (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb);
|
||||
@@ -1310,7 +1407,7 @@ struct ieee80211_ops {
|
||||
int (*set_tim)(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
|
||||
bool set);
|
||||
int (*set_key)(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
const u8 *local_address, const u8 *address,
|
||||
struct ieee80211_vif *vif, struct ieee80211_sta *sta,
|
||||
struct ieee80211_key_conf *key);
|
||||
void (*update_tkip_key)(struct ieee80211_hw *hw,
|
||||
struct ieee80211_key_conf *conf, const u8 *address,
|
||||
@@ -1328,6 +1425,7 @@ struct ieee80211_ops {
|
||||
int (*get_tx_stats)(struct ieee80211_hw *hw,
|
||||
struct ieee80211_tx_queue_stats *stats);
|
||||
u64 (*get_tsf)(struct ieee80211_hw *hw);
|
||||
void (*set_tsf)(struct ieee80211_hw *hw, u64 tsf);
|
||||
void (*reset_tsf)(struct ieee80211_hw *hw);
|
||||
int (*tx_last_beacon)(struct ieee80211_hw *hw);
|
||||
int (*ampdu_action)(struct ieee80211_hw *hw,
|
||||
@@ -1962,4 +2060,34 @@ rate_lowest_index(struct ieee80211_supported_band *sband,
|
||||
int ieee80211_rate_control_register(struct rate_control_ops *ops);
|
||||
void ieee80211_rate_control_unregister(struct rate_control_ops *ops);
|
||||
|
||||
static inline bool
|
||||
conf_is_ht20(struct ieee80211_conf *conf)
|
||||
{
|
||||
return conf->channel_type == NL80211_CHAN_HT20;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
conf_is_ht40_minus(struct ieee80211_conf *conf)
|
||||
{
|
||||
return conf->channel_type == NL80211_CHAN_HT40MINUS;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
conf_is_ht40_plus(struct ieee80211_conf *conf)
|
||||
{
|
||||
return conf->channel_type == NL80211_CHAN_HT40PLUS;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
conf_is_ht40(struct ieee80211_conf *conf)
|
||||
{
|
||||
return conf_is_ht40_minus(conf) || conf_is_ht40_plus(conf);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
conf_is_ht(struct ieee80211_conf *conf)
|
||||
{
|
||||
return conf->channel_type != NL80211_CHAN_NO_HT;
|
||||
}
|
||||
|
||||
#endif /* MAC80211_H */
|
||||
|
||||
@@ -181,12 +181,25 @@ struct ieee80211_supported_band {
|
||||
* struct wiphy - wireless hardware description
|
||||
* @idx: the wiphy index assigned to this item
|
||||
* @class_dev: the class device representing /sys/class/ieee80211/<wiphy-name>
|
||||
* @fw_handles_regulatory: tells us the firmware for this device
|
||||
* has its own regulatory solution and cannot identify the
|
||||
* @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.
|
||||
* @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.
|
||||
*/
|
||||
struct wiphy {
|
||||
/* assign these fields before you register the wiphy */
|
||||
@@ -197,7 +210,8 @@ struct wiphy {
|
||||
/* Supported interface modes, OR together BIT(NL80211_IFTYPE_...) */
|
||||
u16 interface_modes;
|
||||
|
||||
bool fw_handles_regulatory;
|
||||
bool custom_regulatory;
|
||||
bool strict_regulatory;
|
||||
|
||||
/* If multiple wiphys are registered and you're handed e.g.
|
||||
* a regular netdev with assigned ieee80211_ptr, you won't
|
||||
@@ -209,10 +223,13 @@ struct wiphy {
|
||||
struct ieee80211_supported_band *bands[IEEE80211_NUM_BANDS];
|
||||
|
||||
/* Lets us get back the wiphy on the callback */
|
||||
int (*reg_notifier)(struct wiphy *wiphy, enum reg_set_by setby);
|
||||
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;
|
||||
@@ -361,7 +378,7 @@ ieee80211_get_channel(struct wiphy *wiphy, int freq)
|
||||
*/
|
||||
struct ieee80211_rate *
|
||||
ieee80211_get_response_rate(struct ieee80211_supported_band *sband,
|
||||
u64 basic_rates, int bitrate);
|
||||
u32 basic_rates, int bitrate);
|
||||
|
||||
/**
|
||||
* regulatory_hint - driver hint to the wireless core a regulatory domain
|
||||
@@ -395,4 +412,45 @@ extern void regulatory_hint(struct wiphy *wiphy, const char *alpha2);
|
||||
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
|
||||
* @bandwidth: the bandwidth requirement you have in KHz, if you do not have one
|
||||
* you can set this to 0. If this frequency is allowed we then set
|
||||
* this value to the maximum allowed bandwidth.
|
||||
* @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 *bandwidth,
|
||||
const struct ieee80211_reg_rule **reg_rule);
|
||||
|
||||
#endif /* __NET_WIRELESS_H */
|
||||
|
||||
Reference in New Issue
Block a user