mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
This commit is contained in:
commit
6475cb05ee
42 files changed
+1529
-619
No files matched your search
@@ -6057,7 +6057,7 @@ il4965_mac_channel_switch(struct ieee80211_hw *hw,
|
||||
struct il_priv *il = hw->priv;
|
||||
const struct il_channel_info *ch_info;
|
||||
struct ieee80211_conf *conf = &hw->conf;
|
||||
struct ieee80211_channel *channel = ch_switch->channel;
|
||||
struct ieee80211_channel *channel = ch_switch->chandef.chan;
|
||||
struct il_ht_config *ht_conf = &il->current_ht_config;
|
||||
u16 ch;
|
||||
|
||||
@@ -6094,23 +6094,21 @@ il4965_mac_channel_switch(struct ieee80211_hw *hw,
|
||||
il->current_ht_config.smps = conf->smps_mode;
|
||||
|
||||
/* Configure HT40 channels */
|
||||
il->ht.enabled = conf_is_ht(conf);
|
||||
if (il->ht.enabled) {
|
||||
if (conf_is_ht40_minus(conf)) {
|
||||
il->ht.extension_chan_offset =
|
||||
IEEE80211_HT_PARAM_CHA_SEC_BELOW;
|
||||
il->ht.is_40mhz = true;
|
||||
} else if (conf_is_ht40_plus(conf)) {
|
||||
il->ht.extension_chan_offset =
|
||||
IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
|
||||
il->ht.is_40mhz = true;
|
||||
} else {
|
||||
il->ht.extension_chan_offset =
|
||||
IEEE80211_HT_PARAM_CHA_SEC_NONE;
|
||||
il->ht.is_40mhz = false;
|
||||
}
|
||||
} else
|
||||
switch (cfg80211_get_chandef_type(&ch_switch->chandef)) {
|
||||
case NL80211_CHAN_NO_HT:
|
||||
case NL80211_CHAN_HT20:
|
||||
il->ht.is_40mhz = false;
|
||||
il->ht.extension_chan_offset = IEEE80211_HT_PARAM_CHA_SEC_NONE;
|
||||
break;
|
||||
case NL80211_CHAN_HT40MINUS:
|
||||
il->ht.extension_chan_offset = IEEE80211_HT_PARAM_CHA_SEC_BELOW;
|
||||
il->ht.is_40mhz = true;
|
||||
break;
|
||||
case NL80211_CHAN_HT40PLUS:
|
||||
il->ht.extension_chan_offset = IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
|
||||
il->ht.is_40mhz = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if ((le16_to_cpu(il->staging.channel) != ch))
|
||||
il->staging.flags = 0;
|
||||
|
||||
@@ -1493,7 +1493,7 @@ il4965_hw_channel_switch(struct il_priv *il,
|
||||
|
||||
cmd.band = band;
|
||||
cmd.expect_beacon = 0;
|
||||
ch = ch_switch->channel->hw_value;
|
||||
ch = ch_switch->chandef.chan->hw_value;
|
||||
cmd.channel = cpu_to_le16(ch);
|
||||
cmd.rxon_flags = il->staging.flags;
|
||||
cmd.rxon_filter_flags = il->staging.filter_flags;
|
||||
|
||||
@@ -379,7 +379,7 @@ static int iwl5000_hw_channel_switch(struct iwl_priv *priv,
|
||||
};
|
||||
|
||||
cmd.band = priv->band == IEEE80211_BAND_2GHZ;
|
||||
ch = ch_switch->channel->hw_value;
|
||||
ch = ch_switch->chandef.chan->hw_value;
|
||||
IWL_DEBUG_11H(priv, "channel switch from %d to %d\n",
|
||||
ctx->active.channel, ch);
|
||||
cmd.channel = cpu_to_le16(ch);
|
||||
@@ -414,7 +414,8 @@ static int iwl5000_hw_channel_switch(struct iwl_priv *priv,
|
||||
}
|
||||
IWL_DEBUG_11H(priv, "uCode time for the switch is 0x%x\n",
|
||||
cmd.switch_time);
|
||||
cmd.expect_beacon = ch_switch->channel->flags & IEEE80211_CHAN_RADAR;
|
||||
cmd.expect_beacon =
|
||||
ch_switch->chandef.chan->flags & IEEE80211_CHAN_RADAR;
|
||||
|
||||
return iwl_dvm_send_cmd(priv, &hcmd);
|
||||
}
|
||||
@@ -540,7 +541,7 @@ static int iwl6000_hw_channel_switch(struct iwl_priv *priv,
|
||||
hcmd.data[0] = cmd;
|
||||
|
||||
cmd->band = priv->band == IEEE80211_BAND_2GHZ;
|
||||
ch = ch_switch->channel->hw_value;
|
||||
ch = ch_switch->chandef.chan->hw_value;
|
||||
IWL_DEBUG_11H(priv, "channel switch from %u to %u\n",
|
||||
ctx->active.channel, ch);
|
||||
cmd->channel = cpu_to_le16(ch);
|
||||
@@ -575,7 +576,8 @@ static int iwl6000_hw_channel_switch(struct iwl_priv *priv,
|
||||
}
|
||||
IWL_DEBUG_11H(priv, "uCode time for the switch is 0x%x\n",
|
||||
cmd->switch_time);
|
||||
cmd->expect_beacon = ch_switch->channel->flags & IEEE80211_CHAN_RADAR;
|
||||
cmd->expect_beacon =
|
||||
ch_switch->chandef.chan->flags & IEEE80211_CHAN_RADAR;
|
||||
|
||||
err = iwl_dvm_send_cmd(priv, &hcmd);
|
||||
kfree(cmd);
|
||||
|
||||
@@ -970,7 +970,7 @@ static void iwlagn_mac_channel_switch(struct ieee80211_hw *hw,
|
||||
{
|
||||
struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
|
||||
struct ieee80211_conf *conf = &hw->conf;
|
||||
struct ieee80211_channel *channel = ch_switch->channel;
|
||||
struct ieee80211_channel *channel = ch_switch->chandef.chan;
|
||||
struct iwl_ht_config *ht_conf = &priv->current_ht_config;
|
||||
/*
|
||||
* MULTI-FIXME
|
||||
@@ -1008,11 +1008,21 @@ static void iwlagn_mac_channel_switch(struct ieee80211_hw *hw,
|
||||
priv->current_ht_config.smps = conf->smps_mode;
|
||||
|
||||
/* Configure HT40 channels */
|
||||
ctx->ht.enabled = conf_is_ht(conf);
|
||||
if (ctx->ht.enabled)
|
||||
iwlagn_config_ht40(conf, ctx);
|
||||
else
|
||||
switch (cfg80211_get_chandef_type(&ch_switch->chandef)) {
|
||||
case NL80211_CHAN_NO_HT:
|
||||
case NL80211_CHAN_HT20:
|
||||
ctx->ht.is_40mhz = false;
|
||||
ctx->ht.extension_chan_offset = IEEE80211_HT_PARAM_CHA_SEC_NONE;
|
||||
break;
|
||||
case NL80211_CHAN_HT40MINUS:
|
||||
ctx->ht.extension_chan_offset = IEEE80211_HT_PARAM_CHA_SEC_BELOW;
|
||||
ctx->ht.is_40mhz = true;
|
||||
break;
|
||||
case NL80211_CHAN_HT40PLUS:
|
||||
ctx->ht.extension_chan_offset = IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
|
||||
ctx->ht.is_40mhz = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if ((le16_to_cpu(ctx->staging.channel) != ch))
|
||||
ctx->staging.flags = 0;
|
||||
|
||||
@@ -1160,7 +1160,7 @@ int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
|
||||
}
|
||||
|
||||
void iwlagn_config_ht40(struct ieee80211_conf *conf,
|
||||
struct iwl_rxon_context *ctx)
|
||||
struct iwl_rxon_context *ctx)
|
||||
{
|
||||
if (conf_is_ht40_minus(conf)) {
|
||||
ctx->ht.extension_chan_offset =
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <linux/if_arp.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/ktime.h>
|
||||
@@ -52,6 +53,10 @@ static bool paged_rx = false;
|
||||
module_param(paged_rx, bool, 0644);
|
||||
MODULE_PARM_DESC(paged_rx, "Use paged SKBs for RX instead of linear ones");
|
||||
|
||||
static bool rctbl = false;
|
||||
module_param(rctbl, bool, 0444);
|
||||
MODULE_PARM_DESC(rctbl, "Handle rate control table");
|
||||
|
||||
/**
|
||||
* enum hwsim_regtest - the type of regulatory tests we offer
|
||||
*
|
||||
@@ -717,9 +722,17 @@ static bool mac80211_hwsim_tx_frame_no_nl(struct ieee80211_hw *hw,
|
||||
rx_status.flag |= RX_FLAG_MACTIME_START;
|
||||
rx_status.freq = chan->center_freq;
|
||||
rx_status.band = chan->band;
|
||||
rx_status.rate_idx = info->control.rates[0].idx;
|
||||
if (info->control.rates[0].flags & IEEE80211_TX_RC_MCS)
|
||||
rx_status.flag |= RX_FLAG_HT;
|
||||
if (info->control.rates[0].flags & IEEE80211_TX_RC_VHT_MCS) {
|
||||
rx_status.rate_idx =
|
||||
ieee80211_rate_get_vht_mcs(&info->control.rates[0]);
|
||||
rx_status.vht_nss =
|
||||
ieee80211_rate_get_vht_nss(&info->control.rates[0]);
|
||||
rx_status.flag |= RX_FLAG_VHT;
|
||||
} else {
|
||||
rx_status.rate_idx = info->control.rates[0].idx;
|
||||
if (info->control.rates[0].flags & IEEE80211_TX_RC_MCS)
|
||||
rx_status.flag |= RX_FLAG_HT;
|
||||
}
|
||||
if (info->control.rates[0].flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
|
||||
rx_status.flag |= RX_FLAG_40MHZ;
|
||||
if (info->control.rates[0].flags & IEEE80211_TX_RC_SHORT_GI)
|
||||
@@ -886,8 +899,12 @@ static void mac80211_hwsim_tx(struct ieee80211_hw *hw,
|
||||
if (control->sta)
|
||||
hwsim_check_sta_magic(control->sta);
|
||||
|
||||
txi->rate_driver_data[0] = channel;
|
||||
if (rctbl)
|
||||
ieee80211_get_tx_rates(txi->control.vif, control->sta, skb,
|
||||
txi->control.rates,
|
||||
ARRAY_SIZE(txi->control.rates));
|
||||
|
||||
txi->rate_driver_data[0] = channel;
|
||||
mac80211_hwsim_monitor_rx(hw, skb, channel);
|
||||
|
||||
/* wmediumd mode check */
|
||||
@@ -989,6 +1006,13 @@ static void mac80211_hwsim_tx_frame(struct ieee80211_hw *hw,
|
||||
{
|
||||
u32 _pid = ACCESS_ONCE(wmediumd_portid);
|
||||
|
||||
if (rctbl) {
|
||||
struct ieee80211_tx_info *txi = IEEE80211_SKB_CB(skb);
|
||||
ieee80211_get_tx_rates(txi->control.vif, NULL, skb,
|
||||
txi->control.rates,
|
||||
ARRAY_SIZE(txi->control.rates));
|
||||
}
|
||||
|
||||
mac80211_hwsim_monitor_rx(hw, skb, chan);
|
||||
|
||||
if (_pid)
|
||||
@@ -1019,6 +1043,11 @@ static void mac80211_hwsim_beacon_tx(void *arg, u8 *mac,
|
||||
if (skb == NULL)
|
||||
return;
|
||||
info = IEEE80211_SKB_CB(skb);
|
||||
if (rctbl)
|
||||
ieee80211_get_tx_rates(vif, NULL, skb,
|
||||
info->control.rates,
|
||||
ARRAY_SIZE(info->control.rates));
|
||||
|
||||
txrate = ieee80211_get_tx_rate(hw, info);
|
||||
|
||||
mgmt = (struct ieee80211_mgmt *) skb->data;
|
||||
@@ -1687,6 +1716,7 @@ static void mac80211_hwsim_free(void)
|
||||
debugfs_remove(data->debugfs_ps);
|
||||
debugfs_remove(data->debugfs);
|
||||
ieee80211_unregister_hw(data->hw);
|
||||
device_release_driver(data->dev);
|
||||
device_unregister(data->dev);
|
||||
ieee80211_free_hw(data->hw);
|
||||
}
|
||||
@@ -1695,7 +1725,9 @@ static void mac80211_hwsim_free(void)
|
||||
|
||||
|
||||
static struct device_driver mac80211_hwsim_driver = {
|
||||
.name = "mac80211_hwsim"
|
||||
.name = "mac80211_hwsim",
|
||||
.bus = &platform_bus_type,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
static const struct net_device_ops hwsim_netdev_ops = {
|
||||
@@ -2187,9 +2219,15 @@ static int __init init_mac80211_hwsim(void)
|
||||
spin_lock_init(&hwsim_radio_lock);
|
||||
INIT_LIST_HEAD(&hwsim_radios);
|
||||
|
||||
err = driver_register(&mac80211_hwsim_driver);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
hwsim_class = class_create(THIS_MODULE, "mac80211_hwsim");
|
||||
if (IS_ERR(hwsim_class))
|
||||
return PTR_ERR(hwsim_class);
|
||||
if (IS_ERR(hwsim_class)) {
|
||||
err = PTR_ERR(hwsim_class);
|
||||
goto failed_unregister_driver;
|
||||
}
|
||||
|
||||
memset(addr, 0, ETH_ALEN);
|
||||
addr[0] = 0x02;
|
||||
@@ -2211,12 +2249,20 @@ static int __init init_mac80211_hwsim(void)
|
||||
"hwsim%d", i);
|
||||
if (IS_ERR(data->dev)) {
|
||||
printk(KERN_DEBUG
|
||||
"mac80211_hwsim: device_create "
|
||||
"failed (%ld)\n", PTR_ERR(data->dev));
|
||||
"mac80211_hwsim: device_create failed (%ld)\n",
|
||||
PTR_ERR(data->dev));
|
||||
err = -ENOMEM;
|
||||
goto failed_drvdata;
|
||||
}
|
||||
data->dev->driver = &mac80211_hwsim_driver;
|
||||
err = device_bind_driver(data->dev);
|
||||
if (err != 0) {
|
||||
printk(KERN_DEBUG
|
||||
"mac80211_hwsim: device_bind_driver failed (%d)\n",
|
||||
err);
|
||||
goto failed_hw;
|
||||
}
|
||||
|
||||
skb_queue_head_init(&data->pending);
|
||||
|
||||
SET_IEEE80211_DEV(hw, data->dev);
|
||||
@@ -2259,6 +2305,8 @@ static int __init init_mac80211_hwsim(void)
|
||||
IEEE80211_HW_AMPDU_AGGREGATION |
|
||||
IEEE80211_HW_WANT_MONITOR_VIF |
|
||||
IEEE80211_HW_QUEUE_CONTROL;
|
||||
if (rctbl)
|
||||
hw->flags |= IEEE80211_HW_SUPPORTS_RC_TABLE;
|
||||
|
||||
hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS |
|
||||
WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
|
||||
@@ -2515,6 +2563,8 @@ failed_drvdata:
|
||||
ieee80211_free_hw(hw);
|
||||
failed:
|
||||
mac80211_hwsim_free();
|
||||
failed_unregister_driver:
|
||||
driver_unregister(&mac80211_hwsim_driver);
|
||||
return err;
|
||||
}
|
||||
module_init(init_mac80211_hwsim);
|
||||
@@ -2527,5 +2577,6 @@ static void __exit exit_mac80211_hwsim(void)
|
||||
|
||||
mac80211_hwsim_free();
|
||||
unregister_netdev(hwsim_mon);
|
||||
driver_unregister(&mac80211_hwsim_driver);
|
||||
}
|
||||
module_exit(exit_mac80211_hwsim);
|
||||
@@ -301,7 +301,7 @@ int wl12xx_cmd_channel_switch(struct wl1271 *wl,
|
||||
}
|
||||
|
||||
cmd->role_id = wlvif->role_id;
|
||||
cmd->channel = ch_switch->channel->hw_value;
|
||||
cmd->channel = ch_switch->chandef.chan->hw_value;
|
||||
cmd->switch_time = ch_switch->count;
|
||||
cmd->stop_tx = ch_switch->block_tx;
|
||||
|
||||
|
||||
@@ -42,11 +42,11 @@ int wl18xx_cmd_channel_switch(struct wl1271 *wl,
|
||||
}
|
||||
|
||||
cmd->role_id = wlvif->role_id;
|
||||
cmd->channel = ch_switch->channel->hw_value;
|
||||
cmd->channel = ch_switch->chandef.chan->hw_value;
|
||||
cmd->switch_time = ch_switch->count;
|
||||
cmd->stop_tx = ch_switch->block_tx;
|
||||
|
||||
switch (ch_switch->channel->band) {
|
||||
switch (ch_switch->chandef.chan->band) {
|
||||
case IEEE80211_BAND_2GHZ:
|
||||
cmd->band = WLCORE_BAND_2_4GHZ;
|
||||
break;
|
||||
@@ -55,7 +55,7 @@ int wl18xx_cmd_channel_switch(struct wl1271 *wl,
|
||||
break;
|
||||
default:
|
||||
wl1271_error("invalid channel switch band: %d",
|
||||
ch_switch->channel->band);
|
||||
ch_switch->chandef.chan->band);
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
@@ -672,6 +672,36 @@ struct ieee80211_channel_sw_ie {
|
||||
u8 count;
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* struct ieee80211_ext_chansw_ie
|
||||
*
|
||||
* This structure represents the "Extended Channel Switch Announcement element"
|
||||
*/
|
||||
struct ieee80211_ext_chansw_ie {
|
||||
u8 mode;
|
||||
u8 new_operating_class;
|
||||
u8 new_ch_num;
|
||||
u8 count;
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* struct ieee80211_sec_chan_offs_ie - secondary channel offset IE
|
||||
* @sec_chan_offs: secondary channel offset, uses IEEE80211_HT_PARAM_CHA_SEC_*
|
||||
* values here
|
||||
* This structure represents the "Secondary Channel Offset element"
|
||||
*/
|
||||
struct ieee80211_sec_chan_offs_ie {
|
||||
u8 sec_chan_offs;
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* struct ieee80211_wide_bw_chansw_ie - wide bandwidth channel switch IE
|
||||
*/
|
||||
struct ieee80211_wide_bw_chansw_ie {
|
||||
u8 new_channel_width;
|
||||
u8 new_center_freq_seg0, new_center_freq_seg1;
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* struct ieee80211_tim
|
||||
*
|
||||
@@ -840,10 +870,13 @@ struct ieee80211_mgmt {
|
||||
} __packed wme_action;
|
||||
struct{
|
||||
u8 action_code;
|
||||
u8 element_id;
|
||||
u8 length;
|
||||
struct ieee80211_channel_sw_ie sw_elem;
|
||||
u8 variable[0];
|
||||
} __packed chan_switch;
|
||||
struct{
|
||||
u8 action_code;
|
||||
struct ieee80211_ext_chansw_ie data;
|
||||
u8 variable[0];
|
||||
} __packed ext_chan_switch;
|
||||
struct{
|
||||
u8 action_code;
|
||||
u8 dialog_token;
|
||||
@@ -1638,6 +1671,7 @@ enum ieee80211_eid {
|
||||
|
||||
WLAN_EID_HT_CAPABILITY = 45,
|
||||
WLAN_EID_HT_OPERATION = 61,
|
||||
WLAN_EID_SECONDARY_CHANNEL_OFFSET = 62,
|
||||
|
||||
WLAN_EID_RSN = 48,
|
||||
WLAN_EID_MMIE = 76,
|
||||
@@ -1672,6 +1706,8 @@ enum ieee80211_eid {
|
||||
WLAN_EID_VHT_CAPABILITY = 191,
|
||||
WLAN_EID_VHT_OPERATION = 192,
|
||||
WLAN_EID_OPMODE_NOTIF = 199,
|
||||
WLAN_EID_WIDE_BW_CHANNEL_SWITCH = 194,
|
||||
WLAN_EID_CHANNEL_SWITCH_WRAPPER = 196,
|
||||
|
||||
/* 802.11ad */
|
||||
WLAN_EID_NON_TX_BSSID_CAP = 83,
|
||||
@@ -1795,6 +1831,7 @@ enum ieee80211_key_len {
|
||||
|
||||
/* Public action codes */
|
||||
enum ieee80211_pub_actioncode {
|
||||
WLAN_PUB_ACTION_EXT_CHANSW_ANN = 4,
|
||||
WLAN_PUB_ACTION_TDLS_DISCOVER_RES = 14,
|
||||
};
|
||||
|
||||
|
||||
@@ -2002,6 +2002,12 @@ struct cfg80211_update_ft_ies_params {
|
||||
* @update_ft_ies: Provide updated Fast BSS Transition information to the
|
||||
* driver. If the SME is in the driver/firmware, this information can be
|
||||
* used in building Authentication and Reassociation Request frames.
|
||||
*
|
||||
* @crit_proto_start: Indicates a critical protocol needs more link reliability
|
||||
* for a given duration (milliseconds). The protocol is provided so the
|
||||
* driver can take the most appropriate actions.
|
||||
* @crit_proto_stop: Indicates critical protocol no longer needs increased link
|
||||
* reliability. This operation can not fail.
|
||||
*/
|
||||
struct cfg80211_ops {
|
||||
int (*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow);
|
||||
@@ -2231,6 +2237,12 @@ struct cfg80211_ops {
|
||||
struct cfg80211_chan_def *chandef);
|
||||
int (*update_ft_ies)(struct wiphy *wiphy, struct net_device *dev,
|
||||
struct cfg80211_update_ft_ies_params *ftie);
|
||||
int (*crit_proto_start)(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev,
|
||||
enum nl80211_crit_proto_id protocol,
|
||||
u16 duration);
|
||||
void (*crit_proto_stop)(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev);
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -4024,6 +4036,17 @@ bool cfg80211_reg_can_beacon(struct wiphy *wiphy,
|
||||
void cfg80211_ch_switch_notify(struct net_device *dev,
|
||||
struct cfg80211_chan_def *chandef);
|
||||
|
||||
/**
|
||||
* ieee80211_operating_class_to_band - convert operating class to band
|
||||
*
|
||||
* @operating_class: the operating class to convert
|
||||
* @band: band pointer to fill
|
||||
*
|
||||
* Returns %true if the conversion was successful, %false otherwise.
|
||||
*/
|
||||
bool ieee80211_operating_class_to_band(u8 operating_class,
|
||||
enum ieee80211_band *band);
|
||||
|
||||
/*
|
||||
* cfg80211_tdls_oper_request - request userspace to perform TDLS operation
|
||||
* @dev: the device on which the operation is requested
|
||||
@@ -4126,6 +4149,17 @@ void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev,
|
||||
struct cfg80211_wowlan_wakeup *wakeup,
|
||||
gfp_t gfp);
|
||||
|
||||
/**
|
||||
* cfg80211_crit_proto_stopped() - indicate critical protocol stopped by driver.
|
||||
*
|
||||
* @wdev: the wireless device for which critical protocol is stopped.
|
||||
*
|
||||
* This function can be called by the driver to indicate it has reverted
|
||||
* operation back to normal. One reason could be that the duration given
|
||||
* by .crit_proto_start() has expired.
|
||||
*/
|
||||
void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp);
|
||||
|
||||
/* Logging, debugging and troubleshooting/diagnostic helpers. */
|
||||
|
||||
/* wiphy_printk helpers, similar to dev_printk */
|
||||
|
||||
+80
-10
@@ -128,6 +128,7 @@ enum ieee80211_ac_numbers {
|
||||
* 2^n-1 in the range 1..32767]
|
||||
* @cw_max: maximum contention window [like @cw_min]
|
||||
* @txop: maximum burst time in units of 32 usecs, 0 meaning disabled
|
||||
* @acm: is mandatory admission control required for the access category
|
||||
* @uapsd: is U-APSD mode enabled for the queue
|
||||
*/
|
||||
struct ieee80211_tx_queue_params {
|
||||
@@ -135,6 +136,7 @@ struct ieee80211_tx_queue_params {
|
||||
u16 cw_min;
|
||||
u16 cw_max;
|
||||
u8 aifs;
|
||||
bool acm;
|
||||
bool uapsd;
|
||||
};
|
||||
|
||||
@@ -209,7 +211,7 @@ struct ieee80211_chanctx_conf {
|
||||
* @BSS_CHANGED_QOS: QoS for this association was enabled/disabled. Note
|
||||
* that it is only ever disabled for station mode.
|
||||
* @BSS_CHANGED_IDLE: Idle changed for this BSS/interface.
|
||||
* @BSS_CHANGED_SSID: SSID changed for this BSS (AP mode)
|
||||
* @BSS_CHANGED_SSID: SSID changed for this BSS (AP and IBSS mode)
|
||||
* @BSS_CHANGED_AP_PROBE_RESP: Probe Response changed for this BSS (AP mode)
|
||||
* @BSS_CHANGED_PS: PS changed for this BSS (STA mode)
|
||||
* @BSS_CHANGED_TXPOWER: TX power setting changed for this interface
|
||||
@@ -326,7 +328,7 @@ enum ieee80211_rssi_event {
|
||||
* your driver/device needs to do.
|
||||
* @ps: power-save mode (STA only). This flag is NOT affected by
|
||||
* offchannel/dynamic_ps operations.
|
||||
* @ssid: The SSID of the current vif. Only valid in AP-mode.
|
||||
* @ssid: The SSID of the current vif. Valid in AP and IBSS mode.
|
||||
* @ssid_len: Length of SSID given in @ssid.
|
||||
* @hidden_ssid: The SSID of the current vif is hidden. Only valid in AP-mode.
|
||||
* @txpower: TX power in dBm
|
||||
@@ -561,6 +563,9 @@ enum mac80211_rate_control_flags {
|
||||
/* maximum number of rate stages */
|
||||
#define IEEE80211_TX_MAX_RATES 4
|
||||
|
||||
/* maximum number of rate table entries */
|
||||
#define IEEE80211_TX_RATE_TABLE_SIZE 4
|
||||
|
||||
/**
|
||||
* struct ieee80211_tx_rate - rate selection/status
|
||||
*
|
||||
@@ -601,8 +606,8 @@ static inline void ieee80211_rate_set_vht(struct ieee80211_tx_rate *rate,
|
||||
u8 mcs, u8 nss)
|
||||
{
|
||||
WARN_ON(mcs & ~0xF);
|
||||
WARN_ON(nss & ~0x7);
|
||||
rate->idx = (nss << 4) | mcs;
|
||||
WARN_ON((nss - 1) & ~0x7);
|
||||
rate->idx = ((nss - 1) << 4) | mcs;
|
||||
}
|
||||
|
||||
static inline u8
|
||||
@@ -614,7 +619,7 @@ ieee80211_rate_get_vht_mcs(const struct ieee80211_tx_rate *rate)
|
||||
static inline u8
|
||||
ieee80211_rate_get_vht_nss(const struct ieee80211_tx_rate *rate)
|
||||
{
|
||||
return rate->idx >> 4;
|
||||
return (rate->idx >> 4) + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -655,7 +660,11 @@ struct ieee80211_tx_info {
|
||||
struct ieee80211_tx_rate rates[
|
||||
IEEE80211_TX_MAX_RATES];
|
||||
s8 rts_cts_rate_idx;
|
||||
/* 3 bytes free */
|
||||
u8 use_rts:1;
|
||||
u8 use_cts_prot:1;
|
||||
u8 short_preamble:1;
|
||||
u8 skip_table:1;
|
||||
/* 2 bytes free */
|
||||
};
|
||||
/* only needed before rate control */
|
||||
unsigned long jiffies;
|
||||
@@ -676,6 +685,8 @@ struct ieee80211_tx_info {
|
||||
struct {
|
||||
struct ieee80211_tx_rate driver_rates[
|
||||
IEEE80211_TX_MAX_RATES];
|
||||
u8 pad[4];
|
||||
|
||||
void *rate_driver_data[
|
||||
IEEE80211_TX_INFO_RATE_DRIVER_DATA_SIZE / sizeof(void *)];
|
||||
};
|
||||
@@ -1017,13 +1028,13 @@ struct ieee80211_conf {
|
||||
* the driver passed into mac80211.
|
||||
* @block_tx: Indicates whether transmission must be blocked before the
|
||||
* scheduled channel switch, as indicated by the AP.
|
||||
* @channel: the new channel to switch to
|
||||
* @chandef: the new channel to switch to
|
||||
* @count: the number of TBTT's until the channel switch event
|
||||
*/
|
||||
struct ieee80211_channel_switch {
|
||||
u64 timestamp;
|
||||
bool block_tx;
|
||||
struct ieee80211_channel *channel;
|
||||
struct cfg80211_chan_def chandef;
|
||||
u8 count;
|
||||
};
|
||||
|
||||
@@ -1220,6 +1231,24 @@ enum ieee80211_sta_rx_bandwidth {
|
||||
IEEE80211_STA_RX_BW_160,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_sta_rates - station rate selection table
|
||||
*
|
||||
* @rcu_head: RCU head used for freeing the table on update
|
||||
* @rates: transmit rates/flags to be used by default.
|
||||
* Overriding entries per-packet is possible by using cb tx control.
|
||||
*/
|
||||
struct ieee80211_sta_rates {
|
||||
struct rcu_head rcu_head;
|
||||
struct {
|
||||
s8 idx;
|
||||
u8 count;
|
||||
u8 count_cts;
|
||||
u8 count_rts;
|
||||
u16 flags;
|
||||
} rate[IEEE80211_TX_RATE_TABLE_SIZE];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_sta - station table entry
|
||||
*
|
||||
@@ -1247,6 +1276,7 @@ enum ieee80211_sta_rx_bandwidth {
|
||||
* notifications and capabilities. The value is only valid after
|
||||
* the station moves to associated state.
|
||||
* @smps_mode: current SMPS mode (off, static or dynamic)
|
||||
* @tx_rates: rate control selection table
|
||||
*/
|
||||
struct ieee80211_sta {
|
||||
u32 supp_rates[IEEE80211_NUM_BANDS];
|
||||
@@ -1260,6 +1290,7 @@ struct ieee80211_sta {
|
||||
u8 rx_nss;
|
||||
enum ieee80211_sta_rx_bandwidth bandwidth;
|
||||
enum ieee80211_smps_mode smps_mode;
|
||||
struct ieee80211_sta_rates __rcu *rates;
|
||||
|
||||
/* must be last */
|
||||
u8 drv_priv[0] __aligned(sizeof(void *));
|
||||
@@ -1415,6 +1446,9 @@ struct ieee80211_tx_control {
|
||||
* for different virtual interfaces. See the doc section on HW queue
|
||||
* control for more details.
|
||||
*
|
||||
* @IEEE80211_HW_SUPPORTS_RC_TABLE: The driver supports using a rate
|
||||
* selection table provided by the rate control algorithm.
|
||||
*
|
||||
* @IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF: Use the P2P Device address for any
|
||||
* P2P Interface. This will be honoured even if more than one interface
|
||||
* is supported.
|
||||
@@ -1447,6 +1481,7 @@ enum ieee80211_hw_flags {
|
||||
IEEE80211_HW_SUPPORTS_PER_STA_GTK = 1<<21,
|
||||
IEEE80211_HW_AP_LINK_PS = 1<<22,
|
||||
IEEE80211_HW_TX_AMPDU_SETUP_IN_HW = 1<<23,
|
||||
IEEE80211_HW_SUPPORTS_RC_TABLE = 1<<24,
|
||||
IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF = 1<<25,
|
||||
IEEE80211_HW_TIMING_BEACON_ONLY = 1<<26,
|
||||
};
|
||||
@@ -3132,6 +3167,25 @@ static inline int ieee80211_sta_ps_transition_ni(struct ieee80211_sta *sta,
|
||||
void ieee80211_sta_set_buffered(struct ieee80211_sta *sta,
|
||||
u8 tid, bool buffered);
|
||||
|
||||
/**
|
||||
* ieee80211_get_tx_rates - get the selected transmit rates for a packet
|
||||
*
|
||||
* Call this function in a driver with per-packet rate selection support
|
||||
* to combine the rate info in the packet tx info with the most recent
|
||||
* rate selection table for the station entry.
|
||||
*
|
||||
* @vif: &struct ieee80211_vif pointer from the add_interface callback.
|
||||
* @sta: the receiver station to which this packet is sent.
|
||||
* @skb: the frame to be transmitted.
|
||||
* @dest: buffer for extracted rate/retry information
|
||||
* @max_rates: maximum number of rates to fetch
|
||||
*/
|
||||
void ieee80211_get_tx_rates(struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
struct sk_buff *skb,
|
||||
struct ieee80211_tx_rate *dest,
|
||||
int max_rates);
|
||||
|
||||
/**
|
||||
* ieee80211_tx_status - transmit status callback
|
||||
*
|
||||
@@ -4107,7 +4161,7 @@ void ieee80211_send_bar(struct ieee80211_vif *vif, u8 *ra, u16 tid, u16 ssn);
|
||||
* (deprecated; this will be removed once drivers get updated to use
|
||||
* rate_idx_mask)
|
||||
* @rate_idx_mask: user-requested (legacy) rate mask
|
||||
* @rate_idx_mcs_mask: user-requested MCS rate mask
|
||||
* @rate_idx_mcs_mask: user-requested MCS rate mask (NULL if not in use)
|
||||
* @bss: whether this frame is sent out in AP or IBSS mode
|
||||
*/
|
||||
struct ieee80211_tx_rate_control {
|
||||
@@ -4119,7 +4173,7 @@ struct ieee80211_tx_rate_control {
|
||||
bool rts, short_preamble;
|
||||
u8 max_rate_idx;
|
||||
u32 rate_idx_mask;
|
||||
u8 rate_idx_mcs_mask[IEEE80211_HT_MCS_MASK_LEN];
|
||||
u8 *rate_idx_mcs_mask;
|
||||
bool bss;
|
||||
};
|
||||
|
||||
@@ -4208,6 +4262,22 @@ bool rate_usable_index_exists(struct ieee80211_supported_band *sband,
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* rate_control_set_rates - pass the sta rate selection to mac80211/driver
|
||||
*
|
||||
* When not doing a rate control probe to test rates, rate control should pass
|
||||
* its rate selection to mac80211. If the driver supports receiving a station
|
||||
* rate table, it will use it to ensure that frames are always sent based on
|
||||
* the most recent rate control module decision.
|
||||
*
|
||||
* @hw: pointer as obtained from ieee80211_alloc_hw()
|
||||
* @pubsta: &struct ieee80211_sta pointer to the target destination.
|
||||
* @rates: new tx rate set to be used for this station.
|
||||
*/
|
||||
int rate_control_set_rates(struct ieee80211_hw *hw,
|
||||
struct ieee80211_sta *pubsta,
|
||||
struct ieee80211_sta_rates *rates);
|
||||
|
||||
int ieee80211_rate_control_register(struct rate_control_ops *ops);
|
||||
void ieee80211_rate_control_unregister(struct rate_control_ops *ops);
|
||||
|
||||
|
||||
@@ -639,6 +639,13 @@
|
||||
* with the relevant Information Elements. This event is used to report
|
||||
* received FT IEs (MDIE, FTIE, RSN IE, TIE, RICIE).
|
||||
*
|
||||
* @NL80211_CMD_CRIT_PROTOCOL_START: Indicates user-space will start running
|
||||
* a critical protocol that needs more reliability in the connection to
|
||||
* complete.
|
||||
*
|
||||
* @NL80211_CMD_CRIT_PROTOCOL_STOP: Indicates the connection reliability can
|
||||
* return back to normal.
|
||||
*
|
||||
* @NL80211_CMD_MAX: highest used command number
|
||||
* @__NL80211_CMD_AFTER_LAST: internal use
|
||||
*/
|
||||
@@ -798,6 +805,9 @@ enum nl80211_commands {
|
||||
NL80211_CMD_UPDATE_FT_IES,
|
||||
NL80211_CMD_FT_EVENT,
|
||||
|
||||
NL80211_CMD_CRIT_PROTOCOL_START,
|
||||
NL80211_CMD_CRIT_PROTOCOL_STOP,
|
||||
|
||||
/* add new commands above here */
|
||||
|
||||
/* used to define NL80211_CMD_MAX below */
|
||||
@@ -1414,6 +1424,11 @@ enum nl80211_commands {
|
||||
* @NL80211_ATTR_IE_RIC: Resource Information Container Information
|
||||
* Element
|
||||
*
|
||||
* @NL80211_ATTR_CRIT_PROT_ID: critical protocol identifier requiring increased
|
||||
* reliability, see &enum nl80211_crit_proto_id (u16).
|
||||
* @NL80211_ATTR_MAX_CRIT_PROT_DURATION: duration in milliseconds in which
|
||||
* the connection should have increased reliability (u16).
|
||||
*
|
||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||
*/
|
||||
@@ -1709,6 +1724,9 @@ enum nl80211_attrs {
|
||||
NL80211_ATTR_MDID,
|
||||
NL80211_ATTR_IE_RIC,
|
||||
|
||||
NL80211_ATTR_CRIT_PROT_ID,
|
||||
NL80211_ATTR_MAX_CRIT_PROT_DURATION,
|
||||
|
||||
/* add attributes here, update the policy in nl80211.c */
|
||||
|
||||
__NL80211_ATTR_AFTER_LAST,
|
||||
@@ -3682,4 +3700,25 @@ enum nl80211_protocol_features {
|
||||
NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP = 1 << 0,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum nl80211_crit_proto_id - nl80211 critical protocol identifiers
|
||||
*
|
||||
* @NL80211_CRIT_PROTO_UNSPEC: protocol unspecified.
|
||||
* @NL80211_CRIT_PROTO_DHCP: BOOTP or DHCPv6 protocol.
|
||||
* @NL80211_CRIT_PROTO_EAPOL: EAPOL protocol.
|
||||
* @NL80211_CRIT_PROTO_APIPA: APIPA protocol.
|
||||
* @NUM_NL80211_CRIT_PROTO: must be kept last.
|
||||
*/
|
||||
enum nl80211_crit_proto_id {
|
||||
NL80211_CRIT_PROTO_UNSPEC,
|
||||
NL80211_CRIT_PROTO_DHCP,
|
||||
NL80211_CRIT_PROTO_EAPOL,
|
||||
NL80211_CRIT_PROTO_APIPA,
|
||||
/* add other protocols before this one */
|
||||
NUM_NL80211_CRIT_PROTO
|
||||
};
|
||||
|
||||
/* maximum duration for critical protocol measures */
|
||||
#define NL80211_CRIT_PROTO_MAX_DURATION 5000 /* msec */
|
||||
|
||||
#endif /* __LINUX_NL80211_H */
|
||||
@@ -1043,6 +1043,7 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
|
||||
list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
|
||||
sta_info_flush_defer(vlan);
|
||||
sta_info_flush_defer(sdata);
|
||||
synchronize_net();
|
||||
rcu_barrier();
|
||||
list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) {
|
||||
sta_info_flush_cleanup(vlan);
|
||||
@@ -1052,6 +1053,7 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
|
||||
ieee80211_free_keys(sdata);
|
||||
|
||||
sdata->vif.bss_conf.enable_beacon = false;
|
||||
sdata->vif.bss_conf.ssid_len = 0;
|
||||
clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state);
|
||||
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED);
|
||||
|
||||
@@ -2416,9 +2418,22 @@ static int ieee80211_set_bitrate_mask(struct wiphy *wiphy,
|
||||
}
|
||||
|
||||
for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
|
||||
struct ieee80211_supported_band *sband = wiphy->bands[i];
|
||||
int j;
|
||||
|
||||
sdata->rc_rateidx_mask[i] = mask->control[i].legacy;
|
||||
memcpy(sdata->rc_rateidx_mcs_mask[i], mask->control[i].mcs,
|
||||
sizeof(mask->control[i].mcs));
|
||||
|
||||
sdata->rc_has_mcs_mask[i] = false;
|
||||
if (!sband)
|
||||
continue;
|
||||
|
||||
for (j = 0; j < IEEE80211_HT_MCS_MASK_LEN; j++)
|
||||
if (~sdata->rc_rateidx_mcs_mask[i][j]) {
|
||||
sdata->rc_has_mcs_mask[i] = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
+33
-10
@@ -57,6 +57,22 @@ ieee80211_find_chanctx(struct ieee80211_local *local,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static bool ieee80211_is_radar_required(struct ieee80211_local *local)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(sdata, &local->interfaces, list) {
|
||||
if (sdata->radar_required) {
|
||||
rcu_read_unlock();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static struct ieee80211_chanctx *
|
||||
ieee80211_new_chanctx(struct ieee80211_local *local,
|
||||
const struct cfg80211_chan_def *chandef,
|
||||
@@ -76,6 +92,9 @@ ieee80211_new_chanctx(struct ieee80211_local *local,
|
||||
ctx->conf.rx_chains_static = 1;
|
||||
ctx->conf.rx_chains_dynamic = 1;
|
||||
ctx->mode = mode;
|
||||
ctx->conf.radar_enabled = ieee80211_is_radar_required(local);
|
||||
if (!local->use_chanctx)
|
||||
local->hw.conf.radar_enabled = ctx->conf.radar_enabled;
|
||||
|
||||
/* acquire mutex to prevent idle from changing */
|
||||
mutex_lock(&local->mtx);
|
||||
@@ -110,6 +129,7 @@ ieee80211_new_chanctx(struct ieee80211_local *local,
|
||||
static void ieee80211_free_chanctx(struct ieee80211_local *local,
|
||||
struct ieee80211_chanctx *ctx)
|
||||
{
|
||||
bool check_single_channel = false;
|
||||
lockdep_assert_held(&local->chanctx_mtx);
|
||||
|
||||
WARN_ON_ONCE(ctx->refcount != 0);
|
||||
@@ -119,6 +139,14 @@ static void ieee80211_free_chanctx(struct ieee80211_local *local,
|
||||
chandef->width = NL80211_CHAN_WIDTH_20_NOHT;
|
||||
chandef->center_freq1 = chandef->chan->center_freq;
|
||||
chandef->center_freq2 = 0;
|
||||
|
||||
/* NOTE: Disabling radar is only valid here for
|
||||
* single channel context. To be sure, check it ...
|
||||
*/
|
||||
if (local->hw.conf.radar_enabled)
|
||||
check_single_channel = true;
|
||||
local->hw.conf.radar_enabled = false;
|
||||
|
||||
ieee80211_hw_config(local, 0);
|
||||
} else {
|
||||
drv_remove_chanctx(local, ctx);
|
||||
@@ -127,6 +155,9 @@ static void ieee80211_free_chanctx(struct ieee80211_local *local,
|
||||
list_del_rcu(&ctx->list);
|
||||
kfree_rcu(ctx, rcu_head);
|
||||
|
||||
/* throw a warning if this wasn't the only channel context. */
|
||||
WARN_ON(check_single_channel && !list_empty(&local->chanctx_list));
|
||||
|
||||
mutex_lock(&local->mtx);
|
||||
ieee80211_recalc_idle(local);
|
||||
mutex_unlock(&local->mtx);
|
||||
@@ -238,19 +269,11 @@ static void __ieee80211_vif_release_channel(struct ieee80211_sub_if_data *sdata)
|
||||
void ieee80211_recalc_radar_chanctx(struct ieee80211_local *local,
|
||||
struct ieee80211_chanctx *chanctx)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
bool radar_enabled = false;
|
||||
bool radar_enabled;
|
||||
|
||||
lockdep_assert_held(&local->chanctx_mtx);
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(sdata, &local->interfaces, list) {
|
||||
if (sdata->radar_required) {
|
||||
radar_enabled = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
rcu_read_unlock();
|
||||
radar_enabled = ieee80211_is_radar_required(local);
|
||||
|
||||
if (radar_enabled == chanctx->conf.radar_enabled)
|
||||
return;
|
||||
|
||||
+5
-1
@@ -209,6 +209,8 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
||||
sdata->vif.bss_conf.enable_beacon = true;
|
||||
sdata->vif.bss_conf.beacon_int = beacon_int;
|
||||
sdata->vif.bss_conf.basic_rates = basic_rates;
|
||||
sdata->vif.bss_conf.ssid_len = ifibss->ssid_len;
|
||||
memcpy(sdata->vif.bss_conf.ssid, ifibss->ssid, ifibss->ssid_len);
|
||||
bss_change = BSS_CHANGED_BEACON_INT;
|
||||
bss_change |= ieee80211_reset_erp_info(sdata);
|
||||
bss_change |= BSS_CHANGED_BSSID;
|
||||
@@ -217,6 +219,7 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
||||
bss_change |= BSS_CHANGED_BASIC_RATES;
|
||||
bss_change |= BSS_CHANGED_HT;
|
||||
bss_change |= BSS_CHANGED_IBSS;
|
||||
bss_change |= BSS_CHANGED_SSID;
|
||||
|
||||
/*
|
||||
* In 5 GHz/802.11a, we can always use short slot time.
|
||||
@@ -911,7 +914,7 @@ void ieee80211_rx_mgmt_probe_beacon(struct ieee80211_sub_if_data *sdata,
|
||||
return;
|
||||
|
||||
ieee802_11_parse_elems(mgmt->u.probe_resp.variable, len - baselen,
|
||||
&elems);
|
||||
false, &elems);
|
||||
|
||||
ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems);
|
||||
}
|
||||
@@ -1159,6 +1162,7 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata)
|
||||
sdata->vif.bss_conf.ibss_joined = false;
|
||||
sdata->vif.bss_conf.ibss_creator = false;
|
||||
sdata->vif.bss_conf.enable_beacon = false;
|
||||
sdata->vif.bss_conf.ssid_len = 0;
|
||||
clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state);
|
||||
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED |
|
||||
BSS_CHANGED_IBSS);
|
||||
|
||||
@@ -156,6 +156,7 @@ struct ieee80211_tx_data {
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
struct sta_info *sta;
|
||||
struct ieee80211_key *key;
|
||||
struct ieee80211_tx_rate rate;
|
||||
|
||||
unsigned int flags;
|
||||
};
|
||||
@@ -740,6 +741,8 @@ struct ieee80211_sub_if_data {
|
||||
|
||||
/* bitmap of allowed (non-MCS) rate indexes for rate control */
|
||||
u32 rc_rateidx_mask[IEEE80211_NUM_BANDS];
|
||||
|
||||
bool rc_has_mcs_mask[IEEE80211_NUM_BANDS];
|
||||
u8 rc_rateidx_mcs_mask[IEEE80211_NUM_BANDS][IEEE80211_HT_MCS_MASK_LEN];
|
||||
|
||||
union {
|
||||
@@ -1020,7 +1023,7 @@ struct ieee80211_local {
|
||||
enum mac80211_scan_state next_scan_state;
|
||||
struct delayed_work scan_work;
|
||||
struct ieee80211_sub_if_data __rcu *scan_sdata;
|
||||
struct ieee80211_channel *csa_channel;
|
||||
struct cfg80211_chan_def csa_chandef;
|
||||
/* For backward compatibility only -- do not use */
|
||||
struct cfg80211_chan_def _oper_chandef;
|
||||
|
||||
@@ -1179,10 +1182,13 @@ struct ieee802_11_elems {
|
||||
const u8 *perr;
|
||||
const struct ieee80211_rann_ie *rann;
|
||||
const struct ieee80211_channel_sw_ie *ch_switch_ie;
|
||||
const struct ieee80211_ext_chansw_ie *ext_chansw_ie;
|
||||
const struct ieee80211_wide_bw_chansw_ie *wide_bw_chansw_ie;
|
||||
const u8 *country_elem;
|
||||
const u8 *pwr_constr_elem;
|
||||
const struct ieee80211_timeout_interval_ie *timeout_int;
|
||||
const u8 *opmode_notif;
|
||||
const struct ieee80211_sec_chan_offs_ie *sec_chan_offs;
|
||||
|
||||
/* length of them, respectively */
|
||||
u8 ssid_len;
|
||||
@@ -1253,10 +1259,6 @@ void ieee80211_recalc_ps_vif(struct ieee80211_sub_if_data *sdata);
|
||||
int ieee80211_max_network_latency(struct notifier_block *nb,
|
||||
unsigned long data, void *dummy);
|
||||
int ieee80211_set_arp_filter(struct ieee80211_sub_if_data *sdata);
|
||||
void
|
||||
ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata,
|
||||
const struct ieee80211_channel_sw_ie *sw_elem,
|
||||
struct ieee80211_bss *bss, u64 timestamp);
|
||||
void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata);
|
||||
void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
||||
struct sk_buff *skb);
|
||||
@@ -1494,13 +1496,13 @@ static inline void ieee80211_tx_skb(struct ieee80211_sub_if_data *sdata,
|
||||
ieee80211_tx_skb_tid(sdata, skb, 7);
|
||||
}
|
||||
|
||||
u32 ieee802_11_parse_elems_crc(u8 *start, size_t len,
|
||||
u32 ieee802_11_parse_elems_crc(u8 *start, size_t len, bool action,
|
||||
struct ieee802_11_elems *elems,
|
||||
u64 filter, u32 crc);
|
||||
static inline void ieee802_11_parse_elems(u8 *start, size_t len,
|
||||
static inline void ieee802_11_parse_elems(u8 *start, size_t len, bool action,
|
||||
struct ieee802_11_elems *elems)
|
||||
{
|
||||
ieee802_11_parse_elems_crc(start, len, elems, 0, 0);
|
||||
ieee802_11_parse_elems_crc(start, len, action, elems, 0, 0);
|
||||
}
|
||||
|
||||
u32 ieee80211_mandatory_rates(struct ieee80211_local *local,
|
||||
|
||||
@@ -839,11 +839,12 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
||||
*
|
||||
* sta_info_flush_cleanup() requires rcu_barrier()
|
||||
* first to wait for the station call_rcu() calls
|
||||
* to complete, here we need at least sychronize_rcu()
|
||||
* it to wait for the RX path in case it is using the
|
||||
* to complete, and we also need synchronize_rcu()
|
||||
* to wait for the RX path in case it is using the
|
||||
* interface and enqueuing frames at this very time on
|
||||
* another CPU.
|
||||
*/
|
||||
synchronize_rcu();
|
||||
rcu_barrier();
|
||||
sta_info_flush_cleanup(sdata);
|
||||
|
||||
|
||||
+12
-11
@@ -668,6 +668,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
||||
int channels, max_bitrates;
|
||||
bool supp_ht, supp_vht;
|
||||
netdev_features_t feature_whitelist;
|
||||
struct cfg80211_chan_def dflt_chandef = {};
|
||||
static const u32 cipher_suites[] = {
|
||||
/* keep WEP first, it may be removed below */
|
||||
WLAN_CIPHER_SUITE_WEP40,
|
||||
@@ -745,19 +746,19 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
||||
sband = local->hw.wiphy->bands[band];
|
||||
if (!sband)
|
||||
continue;
|
||||
if (!local->use_chanctx && !local->_oper_chandef.chan) {
|
||||
|
||||
if (!dflt_chandef.chan) {
|
||||
cfg80211_chandef_create(&dflt_chandef,
|
||||
&sband->channels[0],
|
||||
NL80211_CHAN_NO_HT);
|
||||
/* init channel we're on */
|
||||
struct cfg80211_chan_def chandef = {
|
||||
.chan = &sband->channels[0],
|
||||
.width = NL80211_CHAN_NO_HT,
|
||||
.center_freq1 = sband->channels[0].center_freq,
|
||||
.center_freq2 = 0
|
||||
};
|
||||
local->hw.conf.chandef = local->_oper_chandef = chandef;
|
||||
if (!local->use_chanctx && !local->_oper_chandef.chan) {
|
||||
local->hw.conf.chandef = dflt_chandef;
|
||||
local->_oper_chandef = dflt_chandef;
|
||||
}
|
||||
local->monitor_chandef = dflt_chandef;
|
||||
}
|
||||
cfg80211_chandef_create(&local->monitor_chandef,
|
||||
&sband->channels[0],
|
||||
NL80211_CHAN_NO_HT);
|
||||
|
||||
channels += sband->n_channels;
|
||||
|
||||
if (max_bitrates < sband->n_bitrates)
|
||||
|
||||
+2
-2
@@ -838,7 +838,7 @@ ieee80211_mesh_rx_probe_req(struct ieee80211_sub_if_data *sdata,
|
||||
if (baselen > len)
|
||||
return;
|
||||
|
||||
ieee802_11_parse_elems(pos, len - baselen, &elems);
|
||||
ieee802_11_parse_elems(pos, len - baselen, false, &elems);
|
||||
|
||||
/* 802.11-2012 10.1.4.3.2 */
|
||||
if ((!ether_addr_equal(mgmt->da, sdata->vif.addr) &&
|
||||
@@ -899,7 +899,7 @@ static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata,
|
||||
return;
|
||||
|
||||
ieee802_11_parse_elems(mgmt->u.probe_resp.variable, len - baselen,
|
||||
&elems);
|
||||
false, &elems);
|
||||
|
||||
/* ignore non-mesh or secure / unsecure mismatch */
|
||||
if ((!elems.mesh_id || !elems.mesh_config) ||
|
||||
|
||||
@@ -880,7 +880,7 @@ void mesh_rx_path_sel_frame(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
baselen = (u8 *) mgmt->u.action.u.mesh_action.variable - (u8 *) mgmt;
|
||||
ieee802_11_parse_elems(mgmt->u.action.u.mesh_action.variable,
|
||||
len - baselen, &elems);
|
||||
len - baselen, false, &elems);
|
||||
|
||||
if (elems.preq) {
|
||||
if (elems.preq_len != 37)
|
||||
|
||||
Loaded 20 of 42 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user