Merge branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
Conflicts: drivers/net/wireless/ath/carl9170/debug.c drivers/net/wireless/ath/carl9170/main.c net/mac80211/ieee80211_i.h
Este cometimento está contido em:
@@ -56,7 +56,10 @@ MODULE_PARM_DESC(max_probe_tries,
|
||||
* probe on beacon miss before declaring the connection lost
|
||||
* default to what we want.
|
||||
*/
|
||||
#define IEEE80211_BEACON_LOSS_COUNT 7
|
||||
static int beacon_loss_count = 7;
|
||||
module_param(beacon_loss_count, int, 0644);
|
||||
MODULE_PARM_DESC(beacon_loss_count,
|
||||
"Number of beacon intervals before we decide beacon was lost.");
|
||||
|
||||
/*
|
||||
* Time the connection can be idle before we probe
|
||||
@@ -985,6 +988,7 @@ static void ieee80211_chswitch_work(struct work_struct *work)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata =
|
||||
container_of(work, struct ieee80211_sub_if_data, u.mgd.chswitch_work);
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||
|
||||
if (!ieee80211_sdata_running(sdata))
|
||||
@@ -994,21 +998,30 @@ static void ieee80211_chswitch_work(struct work_struct *work)
|
||||
if (!ifmgd->associated)
|
||||
goto out;
|
||||
|
||||
sdata->local->_oper_channel = sdata->local->csa_channel;
|
||||
if (!sdata->local->ops->channel_switch) {
|
||||
/*
|
||||
* FIXME: Here we are downgrading to NL80211_CHAN_WIDTH_20_NOHT
|
||||
* and don't adjust our ht/vht settings
|
||||
* This is wrong - we should behave according to the CSA params
|
||||
*/
|
||||
local->_oper_chandef.chan = local->csa_channel;
|
||||
local->_oper_chandef.width = NL80211_CHAN_WIDTH_20_NOHT;
|
||||
local->_oper_chandef.center_freq1 =
|
||||
local->_oper_chandef.chan->center_freq;
|
||||
local->_oper_chandef.center_freq2 = 0;
|
||||
|
||||
if (!local->ops->channel_switch) {
|
||||
/* call "hw_config" only if doing sw channel switch */
|
||||
ieee80211_hw_config(sdata->local,
|
||||
IEEE80211_CONF_CHANGE_CHANNEL);
|
||||
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
|
||||
} else {
|
||||
/* update the device channel directly */
|
||||
sdata->local->hw.conf.channel = sdata->local->_oper_channel;
|
||||
local->hw.conf.chandef = local->_oper_chandef;
|
||||
}
|
||||
|
||||
/* XXX: shouldn't really modify cfg80211-owned data! */
|
||||
ifmgd->associated->channel = sdata->local->_oper_channel;
|
||||
ifmgd->associated->channel = local->_oper_chandef.chan;
|
||||
|
||||
/* XXX: wait for a beacon first? */
|
||||
ieee80211_wake_queues_by_reason(&sdata->local->hw,
|
||||
ieee80211_wake_queues_by_reason(&local->hw,
|
||||
IEEE80211_MAX_QUEUE_MAP,
|
||||
IEEE80211_QUEUE_STOP_REASON_CSA);
|
||||
out:
|
||||
@@ -1430,13 +1443,11 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work)
|
||||
|
||||
if ((local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) &&
|
||||
!(ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED)) {
|
||||
netif_tx_stop_all_queues(sdata->dev);
|
||||
|
||||
if (drv_tx_frames_pending(local))
|
||||
if (drv_tx_frames_pending(local)) {
|
||||
mod_timer(&local->dynamic_ps_timer, jiffies +
|
||||
msecs_to_jiffies(
|
||||
local->hw.conf.dynamic_ps_timeout));
|
||||
else {
|
||||
} else {
|
||||
ieee80211_send_nullfunc(local, sdata, 1);
|
||||
/* Flush to get the tx status of nullfunc frame */
|
||||
ieee80211_flush_queues(local, sdata);
|
||||
@@ -1450,9 +1461,6 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work)
|
||||
local->hw.conf.flags |= IEEE80211_CONF_PS;
|
||||
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
|
||||
}
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)
|
||||
netif_tx_wake_all_queues(sdata->dev);
|
||||
}
|
||||
|
||||
void ieee80211_dynamic_ps_timer(unsigned long data)
|
||||
@@ -1645,7 +1653,7 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
|
||||
bss_conf->assoc_capability, bss->has_erp_value, bss->erp_value);
|
||||
|
||||
sdata->u.mgd.beacon_timeout = usecs_to_jiffies(ieee80211_tu_to_usec(
|
||||
IEEE80211_BEACON_LOSS_COUNT * bss_conf->beacon_int));
|
||||
beacon_loss_count * bss_conf->beacon_int));
|
||||
|
||||
sdata->u.mgd.associated = cbss;
|
||||
memcpy(sdata->u.mgd.bssid, cbss->bssid, ETH_ALEN);
|
||||
@@ -1658,18 +1666,17 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
|
||||
rcu_read_lock();
|
||||
ies = rcu_dereference(cbss->ies);
|
||||
if (ies) {
|
||||
u8 noa[2];
|
||||
int ret;
|
||||
|
||||
ret = cfg80211_get_p2p_attr(
|
||||
ies->data, ies->len,
|
||||
IEEE80211_P2P_ATTR_ABSENCE_NOTICE,
|
||||
noa, sizeof(noa));
|
||||
(u8 *) &bss_conf->p2p_noa_attr,
|
||||
sizeof(bss_conf->p2p_noa_attr));
|
||||
if (ret >= 2) {
|
||||
bss_conf->p2p_oppps = noa[1] & 0x80;
|
||||
bss_conf->p2p_ctwindow = noa[1] & 0x7f;
|
||||
sdata->u.mgd.p2p_noa_index =
|
||||
bss_conf->p2p_noa_attr.index;
|
||||
bss_info_changed |= BSS_CHANGED_P2P_PS;
|
||||
sdata->u.mgd.p2p_noa_index = noa[0];
|
||||
}
|
||||
}
|
||||
rcu_read_unlock();
|
||||
@@ -1713,7 +1720,6 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
|
||||
ieee80211_recalc_smps(sdata);
|
||||
ieee80211_recalc_ps_vif(sdata);
|
||||
|
||||
netif_tx_start_all_queues(sdata->dev);
|
||||
netif_carrier_on(sdata->dev);
|
||||
}
|
||||
|
||||
@@ -1736,22 +1742,6 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
|
||||
ieee80211_stop_poll(sdata);
|
||||
|
||||
ifmgd->associated = NULL;
|
||||
|
||||
/*
|
||||
* we need to commit the associated = NULL change because the
|
||||
* scan code uses that to determine whether this iface should
|
||||
* go to/wake up from powersave or not -- and could otherwise
|
||||
* wake the queues erroneously.
|
||||
*/
|
||||
smp_mb();
|
||||
|
||||
/*
|
||||
* Thus, we can only afterwards stop the queues -- to account
|
||||
* for the case where another CPU is finishing a scan at this
|
||||
* time -- we don't want the scan code to enable queues.
|
||||
*/
|
||||
|
||||
netif_tx_stop_all_queues(sdata->dev);
|
||||
netif_carrier_off(sdata->dev);
|
||||
|
||||
/*
|
||||
@@ -1794,8 +1784,9 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
|
||||
changed |= BSS_CHANGED_ASSOC;
|
||||
sdata->vif.bss_conf.assoc = false;
|
||||
|
||||
sdata->vif.bss_conf.p2p_ctwindow = 0;
|
||||
sdata->vif.bss_conf.p2p_oppps = false;
|
||||
ifmgd->p2p_noa_index = -1;
|
||||
memset(&sdata->vif.bss_conf.p2p_noa_attr, 0,
|
||||
sizeof(sdata->vif.bss_conf.p2p_noa_attr));
|
||||
|
||||
/* on the next assoc, re-program HT/VHT parameters */
|
||||
memset(&ifmgd->ht_capa, 0, sizeof(ifmgd->ht_capa));
|
||||
@@ -1975,12 +1966,15 @@ static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (beacon)
|
||||
if (beacon) {
|
||||
mlme_dbg_ratelimited(sdata,
|
||||
"detected beacon loss from AP - probing\n");
|
||||
"detected beacon loss from AP (missed %d beacons) - probing\n",
|
||||
beacon_loss_count);
|
||||
|
||||
ieee80211_cqm_rssi_notify(&sdata->vif,
|
||||
NL80211_CQM_RSSI_BEACON_LOSS_EVENT, GFP_KERNEL);
|
||||
ieee80211_cqm_rssi_notify(&sdata->vif,
|
||||
NL80211_CQM_RSSI_BEACON_LOSS_EVENT,
|
||||
GFP_KERNEL);
|
||||
}
|
||||
|
||||
/*
|
||||
* The driver/our work has already reported this event or the
|
||||
@@ -2613,10 +2607,10 @@ ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
|
||||
ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems);
|
||||
|
||||
if (status_code == WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY &&
|
||||
elems.timeout_int && elems.timeout_int_len == 5 &&
|
||||
elems.timeout_int[0] == WLAN_TIMEOUT_ASSOC_COMEBACK) {
|
||||
elems.timeout_int &&
|
||||
elems.timeout_int->type == WLAN_TIMEOUT_ASSOC_COMEBACK) {
|
||||
u32 tu, ms;
|
||||
tu = get_unaligned_le32(elems.timeout_int + 1);
|
||||
tu = le32_to_cpu(elems.timeout_int->value);
|
||||
ms = tu * 1024 / 1000;
|
||||
sdata_info(sdata,
|
||||
"%pM rejected association temporarily; comeback duration %u TU (%u ms)\n",
|
||||
@@ -2679,7 +2673,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
|
||||
}
|
||||
}
|
||||
|
||||
if (elems->ds_params && elems->ds_params_len == 1)
|
||||
if (elems->ds_params)
|
||||
freq = ieee80211_channel_to_frequency(elems->ds_params[0],
|
||||
rx_status->band);
|
||||
else
|
||||
@@ -2957,22 +2951,30 @@ ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
|
||||
}
|
||||
|
||||
if (sdata->vif.p2p) {
|
||||
u8 noa[2];
|
||||
struct ieee80211_p2p_noa_attr noa = {};
|
||||
int ret;
|
||||
|
||||
ret = cfg80211_get_p2p_attr(mgmt->u.beacon.variable,
|
||||
len - baselen,
|
||||
IEEE80211_P2P_ATTR_ABSENCE_NOTICE,
|
||||
noa, sizeof(noa));
|
||||
if (ret >= 2 && sdata->u.mgd.p2p_noa_index != noa[0]) {
|
||||
bss_conf->p2p_oppps = noa[1] & 0x80;
|
||||
bss_conf->p2p_ctwindow = noa[1] & 0x7f;
|
||||
(u8 *) &noa, sizeof(noa));
|
||||
if (ret >= 2) {
|
||||
if (sdata->u.mgd.p2p_noa_index != noa.index) {
|
||||
/* valid noa_attr and index changed */
|
||||
sdata->u.mgd.p2p_noa_index = noa.index;
|
||||
memcpy(&bss_conf->p2p_noa_attr, &noa, sizeof(noa));
|
||||
changed |= BSS_CHANGED_P2P_PS;
|
||||
/*
|
||||
* make sure we update all information, the CRC
|
||||
* mechanism doesn't look at P2P attributes.
|
||||
*/
|
||||
ifmgd->beacon_crc_valid = false;
|
||||
}
|
||||
} else if (sdata->u.mgd.p2p_noa_index != -1) {
|
||||
/* noa_attr not found and we had valid noa_attr before */
|
||||
sdata->u.mgd.p2p_noa_index = -1;
|
||||
memset(&bss_conf->p2p_noa_attr, 0, sizeof(bss_conf->p2p_noa_attr));
|
||||
changed |= BSS_CHANGED_P2P_PS;
|
||||
sdata->u.mgd.p2p_noa_index = noa[0];
|
||||
/*
|
||||
* make sure we update all information, the CRC
|
||||
* mechanism doesn't look at P2P attributes.
|
||||
*/
|
||||
ifmgd->beacon_crc_valid = false;
|
||||
}
|
||||
}
|
||||
@@ -3014,7 +3016,7 @@ ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
|
||||
changed |= BSS_CHANGED_DTIM_PERIOD;
|
||||
}
|
||||
|
||||
if (elems.erp_info && elems.erp_info_len >= 1) {
|
||||
if (elems.erp_info) {
|
||||
erp_valid = true;
|
||||
erp_value = elems.erp_info[0];
|
||||
} else {
|
||||
@@ -3513,8 +3515,9 @@ void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata)
|
||||
|
||||
ifmgd->flags = 0;
|
||||
ifmgd->powersave = sdata->wdev.ps;
|
||||
ifmgd->uapsd_queues = IEEE80211_DEFAULT_UAPSD_QUEUES;
|
||||
ifmgd->uapsd_max_sp_len = IEEE80211_DEFAULT_MAX_SP_LEN;
|
||||
ifmgd->uapsd_queues = sdata->local->hw.uapsd_queues;
|
||||
ifmgd->uapsd_max_sp_len = sdata->local->hw.uapsd_max_sp_len;
|
||||
ifmgd->p2p_noa_index = -1;
|
||||
|
||||
mutex_init(&ifmgd->mtx);
|
||||
|
||||
@@ -4063,7 +4066,8 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
|
||||
rcu_read_unlock();
|
||||
|
||||
if (bss->wmm_used && bss->uapsd_supported &&
|
||||
(sdata->local->hw.flags & IEEE80211_HW_SUPPORTS_UAPSD)) {
|
||||
(sdata->local->hw.flags & IEEE80211_HW_SUPPORTS_UAPSD) &&
|
||||
sdata->wmm_acm != 0xff) {
|
||||
assoc_data->uapsd = true;
|
||||
ifmgd->flags |= IEEE80211_STA_UAPSD_ENABLED;
|
||||
} else {
|
||||
|
Criar uma nova questão referindo esta
Bloquear um utilizador