Commit 392b9ffb authored by Stanislaw Gruszka's avatar Stanislaw Gruszka Committed by Johannes Berg

mac80211: change beacon/connection polling

Since when we detect beacon lost we do active AP probing (using nullfunc
frame or probe request) there is no need to have beacon polling. Flags
IEEE80211_STA_BEACON_POLL seems to be used just for historical reasons.

Change also make that after we start connection poll due to beacon loss,
next received beacon will abort the poll.
Signed-off-by: default avatarStanislaw Gruszka <sgruszka@redhat.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent a6ececf4
...@@ -322,7 +322,6 @@ struct ieee80211_roc_work { ...@@ -322,7 +322,6 @@ struct ieee80211_roc_work {
/* flags used in struct ieee80211_if_managed.flags */ /* flags used in struct ieee80211_if_managed.flags */
enum ieee80211_sta_flags { enum ieee80211_sta_flags {
IEEE80211_STA_BEACON_POLL = BIT(0),
IEEE80211_STA_CONNECTION_POLL = BIT(1), IEEE80211_STA_CONNECTION_POLL = BIT(1),
IEEE80211_STA_CONTROL_PORT = BIT(2), IEEE80211_STA_CONTROL_PORT = BIT(2),
IEEE80211_STA_DISABLE_HT = BIT(4), IEEE80211_STA_DISABLE_HT = BIT(4),
......
...@@ -893,8 +893,7 @@ void ieee80211_send_nullfunc(struct ieee80211_local *local, ...@@ -893,8 +893,7 @@ void ieee80211_send_nullfunc(struct ieee80211_local *local,
if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)
IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS; IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS;
if (ifmgd->flags & (IEEE80211_STA_BEACON_POLL | if (ifmgd->flags & IEEE80211_STA_CONNECTION_POLL)
IEEE80211_STA_CONNECTION_POLL))
IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_USE_MINRATE; IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_USE_MINRATE;
ieee80211_tx_skb(sdata, skb); ieee80211_tx_skb(sdata, skb);
...@@ -1374,8 +1373,7 @@ static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata) ...@@ -1374,8 +1373,7 @@ static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata)
if (!mgd->associated) if (!mgd->associated)
return false; return false;
if (mgd->flags & (IEEE80211_STA_BEACON_POLL | if (mgd->flags & IEEE80211_STA_CONNECTION_POLL)
IEEE80211_STA_CONNECTION_POLL))
return false; return false;
if (!mgd->have_beacon) if (!mgd->have_beacon)
...@@ -1691,8 +1689,7 @@ static void __ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) ...@@ -1691,8 +1689,7 @@ static void __ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata)
{ {
lockdep_assert_held(&sdata->local->mtx); lockdep_assert_held(&sdata->local->mtx);
sdata->u.mgd.flags &= ~(IEEE80211_STA_CONNECTION_POLL | sdata->u.mgd.flags &= ~IEEE80211_STA_CONNECTION_POLL;
IEEE80211_STA_BEACON_POLL);
ieee80211_run_deferred_scan(sdata->local); ieee80211_run_deferred_scan(sdata->local);
} }
...@@ -1954,11 +1951,8 @@ static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata) ...@@ -1954,11 +1951,8 @@ static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata)
struct ieee80211_local *local = sdata->local; struct ieee80211_local *local = sdata->local;
mutex_lock(&local->mtx); mutex_lock(&local->mtx);
if (!(ifmgd->flags & (IEEE80211_STA_BEACON_POLL | if (!(ifmgd->flags & IEEE80211_STA_CONNECTION_POLL))
IEEE80211_STA_CONNECTION_POLL))) { goto out;
mutex_unlock(&local->mtx);
return;
}
__ieee80211_stop_poll(sdata); __ieee80211_stop_poll(sdata);
...@@ -2094,15 +2088,9 @@ static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata, ...@@ -2094,15 +2088,9 @@ static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata,
* because otherwise we would reset the timer every time and * because otherwise we would reset the timer every time and
* never check whether we received a probe response! * never check whether we received a probe response!
*/ */
if (ifmgd->flags & (IEEE80211_STA_BEACON_POLL | if (ifmgd->flags & IEEE80211_STA_CONNECTION_POLL)
IEEE80211_STA_CONNECTION_POLL))
already = true; already = true;
if (beacon)
ifmgd->flags |= IEEE80211_STA_BEACON_POLL;
else
ifmgd->flags |= IEEE80211_STA_CONNECTION_POLL;
mutex_unlock(&sdata->local->mtx); mutex_unlock(&sdata->local->mtx);
if (already) if (already)
...@@ -3061,17 +3049,10 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, ...@@ -3061,17 +3049,10 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
} }
} }
if (ifmgd->flags & IEEE80211_STA_BEACON_POLL) { if (ifmgd->flags & IEEE80211_STA_CONNECTION_POLL) {
mlme_dbg_ratelimited(sdata, mlme_dbg_ratelimited(sdata,
"cancelling AP probe due to a received beacon\n"); "cancelling AP probe due to a received beacon\n");
mutex_lock(&local->mtx); ieee80211_reset_ap_probe(sdata);
ifmgd->flags &= ~IEEE80211_STA_BEACON_POLL;
ieee80211_run_deferred_scan(local);
mutex_unlock(&local->mtx);
mutex_lock(&local->iflist_mtx);
ieee80211_recalc_ps(local, -1);
mutex_unlock(&local->iflist_mtx);
} }
/* /*
...@@ -3543,8 +3524,7 @@ void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata) ...@@ -3543,8 +3524,7 @@ void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
} else if (ifmgd->assoc_data && ifmgd->assoc_data->timeout_started) } else if (ifmgd->assoc_data && ifmgd->assoc_data->timeout_started)
run_again(sdata, ifmgd->assoc_data->timeout); run_again(sdata, ifmgd->assoc_data->timeout);
if (ifmgd->flags & (IEEE80211_STA_BEACON_POLL | if (ifmgd->flags & IEEE80211_STA_CONNECTION_POLL &&
IEEE80211_STA_CONNECTION_POLL) &&
ifmgd->associated) { ifmgd->associated) {
u8 bssid[ETH_ALEN]; u8 bssid[ETH_ALEN];
int max_tries; int max_tries;
......
...@@ -391,8 +391,7 @@ static bool ieee80211_can_scan(struct ieee80211_local *local, ...@@ -391,8 +391,7 @@ static bool ieee80211_can_scan(struct ieee80211_local *local,
return false; return false;
if (sdata->vif.type == NL80211_IFTYPE_STATION && if (sdata->vif.type == NL80211_IFTYPE_STATION &&
sdata->u.mgd.flags & (IEEE80211_STA_BEACON_POLL | sdata->u.mgd.flags & IEEE80211_STA_CONNECTION_POLL)
IEEE80211_STA_CONNECTION_POLL))
return false; return false;
return true; return true;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment