Merge tag 'mac80211-next-for-davem-2015-10-05' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
Johannes Berg says: ==================== For the current cycle, we have the following right now: * many internal fixes, API improvements, cleanups, etc. * full AP client state tracking in cfg80211/mac80211 from Ayala * VHT support (in mac80211) for mesh * some A-MSDU in A-MPDU support from Emmanuel * show current TX power to userspace (from Rafał) * support for netlink dump in vendor commands (myself) ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -81,13 +81,6 @@ MODULE_PARM_DESC(probe_wait_ms,
|
||||
"Maximum time(ms) to wait for probe response"
|
||||
" before disconnecting (reason 4).");
|
||||
|
||||
/*
|
||||
* Weight given to the latest Beacon frame when calculating average signal
|
||||
* strength for Beacon frames received in the current BSS. This must be
|
||||
* between 1 and 15.
|
||||
*/
|
||||
#define IEEE80211_SIGNAL_AVE_WEIGHT 3
|
||||
|
||||
/*
|
||||
* How many Beacon frames need to have been used in average signal strength
|
||||
* before starting to indicate signal change events.
|
||||
@@ -943,7 +936,7 @@ void ieee80211_send_pspoll(struct ieee80211_local *local,
|
||||
|
||||
void ieee80211_send_nullfunc(struct ieee80211_local *local,
|
||||
struct ieee80211_sub_if_data *sdata,
|
||||
int powersave)
|
||||
bool powersave)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
struct ieee80211_hdr_3addr *nullfunc;
|
||||
@@ -1427,7 +1420,7 @@ static void ieee80211_enable_ps(struct ieee80211_local *local,
|
||||
msecs_to_jiffies(conf->dynamic_ps_timeout));
|
||||
} else {
|
||||
if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK))
|
||||
ieee80211_send_nullfunc(local, sdata, 1);
|
||||
ieee80211_send_nullfunc(local, sdata, true);
|
||||
|
||||
if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK) &&
|
||||
ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
|
||||
@@ -1642,7 +1635,7 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work)
|
||||
msecs_to_jiffies(
|
||||
local->hw.conf.dynamic_ps_timeout));
|
||||
} else {
|
||||
ieee80211_send_nullfunc(local, sdata, 1);
|
||||
ieee80211_send_nullfunc(local, sdata, true);
|
||||
/* Flush to get the tx status of nullfunc frame */
|
||||
ieee80211_flush_queues(local, sdata, false);
|
||||
}
|
||||
@@ -2275,7 +2268,7 @@ static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata)
|
||||
|
||||
if (ieee80211_hw_check(&sdata->local->hw, REPORTS_TX_ACK_STATUS)) {
|
||||
ifmgd->nullfunc_failed = false;
|
||||
ieee80211_send_nullfunc(sdata->local, sdata, 0);
|
||||
ieee80211_send_nullfunc(sdata->local, sdata, false);
|
||||
} else {
|
||||
int ssid_len;
|
||||
|
||||
@@ -3262,16 +3255,6 @@ static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata,
|
||||
if (ifmgd->associated &&
|
||||
ether_addr_equal(mgmt->bssid, ifmgd->associated->bssid))
|
||||
ieee80211_reset_ap_probe(sdata);
|
||||
|
||||
if (ifmgd->auth_data && !ifmgd->auth_data->bss->proberesp_ies &&
|
||||
ether_addr_equal(mgmt->bssid, ifmgd->auth_data->bss->bssid)) {
|
||||
/* got probe response, continue with auth */
|
||||
sdata_info(sdata, "direct probe responded\n");
|
||||
ifmgd->auth_data->tries = 0;
|
||||
ifmgd->auth_data->timeout = jiffies;
|
||||
ifmgd->auth_data->timeout_started = true;
|
||||
run_again(sdata, ifmgd->auth_data->timeout);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3374,24 +3357,21 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
|
||||
bssid = ifmgd->associated->bssid;
|
||||
|
||||
/* Track average RSSI from the Beacon frames of the current AP */
|
||||
ifmgd->last_beacon_signal = rx_status->signal;
|
||||
if (ifmgd->flags & IEEE80211_STA_RESET_SIGNAL_AVE) {
|
||||
ifmgd->flags &= ~IEEE80211_STA_RESET_SIGNAL_AVE;
|
||||
ifmgd->ave_beacon_signal = rx_status->signal * 16;
|
||||
ewma_beacon_signal_init(&ifmgd->ave_beacon_signal);
|
||||
ifmgd->last_cqm_event_signal = 0;
|
||||
ifmgd->count_beacon_signal = 1;
|
||||
ifmgd->last_ave_beacon_signal = 0;
|
||||
} else {
|
||||
ifmgd->ave_beacon_signal =
|
||||
(IEEE80211_SIGNAL_AVE_WEIGHT * rx_status->signal * 16 +
|
||||
(16 - IEEE80211_SIGNAL_AVE_WEIGHT) *
|
||||
ifmgd->ave_beacon_signal) / 16;
|
||||
ifmgd->count_beacon_signal++;
|
||||
}
|
||||
|
||||
ewma_beacon_signal_add(&ifmgd->ave_beacon_signal, -rx_status->signal);
|
||||
|
||||
if (ifmgd->rssi_min_thold != ifmgd->rssi_max_thold &&
|
||||
ifmgd->count_beacon_signal >= IEEE80211_SIGNAL_AVE_MIN_COUNT) {
|
||||
int sig = ifmgd->ave_beacon_signal;
|
||||
int sig = -ewma_beacon_signal_read(&ifmgd->ave_beacon_signal);
|
||||
int last_sig = ifmgd->last_ave_beacon_signal;
|
||||
struct ieee80211_event event = {
|
||||
.type = RSSI_EVENT,
|
||||
@@ -3418,10 +3398,11 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
|
||||
if (bss_conf->cqm_rssi_thold &&
|
||||
ifmgd->count_beacon_signal >= IEEE80211_SIGNAL_AVE_MIN_COUNT &&
|
||||
!(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)) {
|
||||
int sig = ifmgd->ave_beacon_signal / 16;
|
||||
int sig = -ewma_beacon_signal_read(&ifmgd->ave_beacon_signal);
|
||||
int last_event = ifmgd->last_cqm_event_signal;
|
||||
int thold = bss_conf->cqm_rssi_thold;
|
||||
int hyst = bss_conf->cqm_rssi_hyst;
|
||||
|
||||
if (sig < thold &&
|
||||
(last_event == 0 || sig < last_event - hyst)) {
|
||||
ifmgd->last_cqm_event_signal = sig;
|
||||
@@ -3456,31 +3437,27 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
|
||||
len - baselen, false, &elems,
|
||||
care_about_ies, ncrc);
|
||||
|
||||
if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK)) {
|
||||
bool directed_tim = ieee80211_check_tim(elems.tim,
|
||||
elems.tim_len,
|
||||
ifmgd->aid);
|
||||
if (directed_tim) {
|
||||
if (local->hw.conf.dynamic_ps_timeout > 0) {
|
||||
if (local->hw.conf.flags & IEEE80211_CONF_PS) {
|
||||
local->hw.conf.flags &= ~IEEE80211_CONF_PS;
|
||||
ieee80211_hw_config(local,
|
||||
IEEE80211_CONF_CHANGE_PS);
|
||||
}
|
||||
ieee80211_send_nullfunc(local, sdata, 0);
|
||||
} else if (!local->pspolling && sdata->u.mgd.powersave) {
|
||||
local->pspolling = true;
|
||||
|
||||
/*
|
||||
* Here is assumed that the driver will be
|
||||
* able to send ps-poll frame and receive a
|
||||
* response even though power save mode is
|
||||
* enabled, but some drivers might require
|
||||
* to disable power save here. This needs
|
||||
* to be investigated.
|
||||
*/
|
||||
ieee80211_send_pspoll(local, sdata);
|
||||
if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK) &&
|
||||
ieee80211_check_tim(elems.tim, elems.tim_len, ifmgd->aid)) {
|
||||
if (local->hw.conf.dynamic_ps_timeout > 0) {
|
||||
if (local->hw.conf.flags & IEEE80211_CONF_PS) {
|
||||
local->hw.conf.flags &= ~IEEE80211_CONF_PS;
|
||||
ieee80211_hw_config(local,
|
||||
IEEE80211_CONF_CHANGE_PS);
|
||||
}
|
||||
ieee80211_send_nullfunc(local, sdata, false);
|
||||
} else if (!local->pspolling && sdata->u.mgd.powersave) {
|
||||
local->pspolling = true;
|
||||
|
||||
/*
|
||||
* Here is assumed that the driver will be
|
||||
* able to send ps-poll frame and receive a
|
||||
* response even though power save mode is
|
||||
* enabled, but some drivers might require
|
||||
* to disable power save here. This needs
|
||||
* to be investigated.
|
||||
*/
|
||||
ieee80211_send_pspoll(local, sdata);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3717,12 +3694,14 @@ static void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata,
|
||||
reason);
|
||||
}
|
||||
|
||||
static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata)
|
||||
static int ieee80211_auth(struct ieee80211_sub_if_data *sdata)
|
||||
{
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||
struct ieee80211_mgd_auth_data *auth_data = ifmgd->auth_data;
|
||||
u32 tx_flags = 0;
|
||||
u16 trans = 1;
|
||||
u16 status = 0;
|
||||
|
||||
sdata_assert_lock(sdata);
|
||||
|
||||
@@ -3746,55 +3725,28 @@ static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata)
|
||||
|
||||
drv_mgd_prepare_tx(local, sdata);
|
||||
|
||||
if (auth_data->bss->proberesp_ies) {
|
||||
u16 trans = 1;
|
||||
u16 status = 0;
|
||||
sdata_info(sdata, "send auth to %pM (try %d/%d)\n",
|
||||
auth_data->bss->bssid, auth_data->tries,
|
||||
IEEE80211_AUTH_MAX_TRIES);
|
||||
|
||||
sdata_info(sdata, "send auth to %pM (try %d/%d)\n",
|
||||
auth_data->bss->bssid, auth_data->tries,
|
||||
IEEE80211_AUTH_MAX_TRIES);
|
||||
auth_data->expected_transaction = 2;
|
||||
|
||||
auth_data->expected_transaction = 2;
|
||||
|
||||
if (auth_data->algorithm == WLAN_AUTH_SAE) {
|
||||
trans = auth_data->sae_trans;
|
||||
status = auth_data->sae_status;
|
||||
auth_data->expected_transaction = trans;
|
||||
}
|
||||
|
||||
if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
|
||||
tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
|
||||
IEEE80211_TX_INTFL_MLME_CONN_TX;
|
||||
|
||||
ieee80211_send_auth(sdata, trans, auth_data->algorithm, status,
|
||||
auth_data->data, auth_data->data_len,
|
||||
auth_data->bss->bssid,
|
||||
auth_data->bss->bssid, NULL, 0, 0,
|
||||
tx_flags);
|
||||
} else {
|
||||
const u8 *ssidie;
|
||||
|
||||
sdata_info(sdata, "direct probe to %pM (try %d/%i)\n",
|
||||
auth_data->bss->bssid, auth_data->tries,
|
||||
IEEE80211_AUTH_MAX_TRIES);
|
||||
|
||||
rcu_read_lock();
|
||||
ssidie = ieee80211_bss_get_ie(auth_data->bss, WLAN_EID_SSID);
|
||||
if (!ssidie) {
|
||||
rcu_read_unlock();
|
||||
return -EINVAL;
|
||||
}
|
||||
/*
|
||||
* Direct probe is sent to broadcast address as some APs
|
||||
* will not answer to direct packet in unassociated state.
|
||||
*/
|
||||
ieee80211_send_probe_req(sdata, sdata->vif.addr, NULL,
|
||||
ssidie + 2, ssidie[1],
|
||||
NULL, 0, (u32) -1, true, 0,
|
||||
auth_data->bss->channel, false);
|
||||
rcu_read_unlock();
|
||||
if (auth_data->algorithm == WLAN_AUTH_SAE) {
|
||||
trans = auth_data->sae_trans;
|
||||
status = auth_data->sae_status;
|
||||
auth_data->expected_transaction = trans;
|
||||
}
|
||||
|
||||
if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
|
||||
tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
|
||||
IEEE80211_TX_INTFL_MLME_CONN_TX;
|
||||
|
||||
ieee80211_send_auth(sdata, trans, auth_data->algorithm, status,
|
||||
auth_data->data, auth_data->data_len,
|
||||
auth_data->bss->bssid,
|
||||
auth_data->bss->bssid, NULL, 0, 0,
|
||||
tx_flags);
|
||||
|
||||
if (tx_flags == 0) {
|
||||
auth_data->timeout = jiffies + IEEE80211_AUTH_TIMEOUT;
|
||||
auth_data->timeout_started = true;
|
||||
@@ -3874,8 +3826,7 @@ void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
|
||||
bool status_acked = ifmgd->status_acked;
|
||||
|
||||
ifmgd->status_received = false;
|
||||
if (ifmgd->auth_data &&
|
||||
(ieee80211_is_probe_req(fc) || ieee80211_is_auth(fc))) {
|
||||
if (ifmgd->auth_data && ieee80211_is_auth(fc)) {
|
||||
if (status_acked) {
|
||||
ifmgd->auth_data->timeout =
|
||||
jiffies + IEEE80211_AUTH_TIMEOUT_SHORT;
|
||||
@@ -3906,7 +3857,7 @@ void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
|
||||
* so let's just kill the auth data
|
||||
*/
|
||||
ieee80211_destroy_auth_data(sdata, false);
|
||||
} else if (ieee80211_probe_auth(sdata)) {
|
||||
} else if (ieee80211_auth(sdata)) {
|
||||
u8 bssid[ETH_ALEN];
|
||||
struct ieee80211_event event = {
|
||||
.type = MLME_EVENT,
|
||||
@@ -4613,7 +4564,7 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
|
||||
if (err)
|
||||
goto err_clear;
|
||||
|
||||
err = ieee80211_probe_auth(sdata);
|
||||
err = ieee80211_auth(sdata);
|
||||
if (err) {
|
||||
sta_info_destroy_addr(sdata, req->bss->bssid);
|
||||
goto err_clear;
|
||||
|
Reference in New Issue
Block a user