aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorAlexander Bondar <alexander.bondar@intel.com>2013-05-16 10:34:17 -0400
committerJohannes Berg <johannes.berg@intel.com>2013-06-05 03:12:20 -0400
commit989c6505cdda587f87573bb6828f23964dd3d19b (patch)
tree5804f7d8569273db24015655b16cd3e703756053 /net
parent482a9c74fa17c5d584995c19e1a36eaf710d1193 (diff)
mac80211: Use suitable semantics for beacon availability indication
Currently beacon availability upon association is marked by have_beacon flag of assoc_data structure that becomes unavailable when association completes. However beacon availability indication is required also after association to inform a driver. Currently dtim_period parameter is used for this purpose. Move have_beacon flag to another structure, persistant throughout a interface's life cycle. Use suitable sematics for beacon availability indication. Signed-off-by: Alexander Bondar <alexander.bondar@intel.com> [fix another instance of BSS_CHANGED_DTIM_PERIOD in docs] Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net')
-rw-r--r--net/mac80211/ieee80211_i.h3
-rw-r--r--net/mac80211/mlme.c20
-rw-r--r--net/mac80211/util.c5
3 files changed, 16 insertions, 12 deletions
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 9eed6f1d1614..7a6f1a0207ec 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -366,7 +366,7 @@ struct ieee80211_mgd_assoc_data {
366 u8 ssid_len; 366 u8 ssid_len;
367 u8 supp_rates_len; 367 u8 supp_rates_len;
368 bool wmm, uapsd; 368 bool wmm, uapsd;
369 bool have_beacon, need_beacon; 369 bool need_beacon;
370 bool synced; 370 bool synced;
371 bool timeout_started; 371 bool timeout_started;
372 372
@@ -404,6 +404,7 @@ struct ieee80211_if_managed {
404 404
405 bool powersave; /* powersave requested for this iface */ 405 bool powersave; /* powersave requested for this iface */
406 bool broken_ap; /* AP is broken -- turn off powersave */ 406 bool broken_ap; /* AP is broken -- turn off powersave */
407 bool have_beacon;
407 u8 dtim_period; 408 u8 dtim_period;
408 enum ieee80211_smps_mode req_smps, /* requested smps mode */ 409 enum ieee80211_smps_mode req_smps, /* requested smps mode */
409 driver_smps_mode; /* smps mode request */ 410 driver_smps_mode; /* smps mode request */
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index aa5cd2e138be..ad9bb9e10cbb 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -1360,7 +1360,7 @@ static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata)
1360 IEEE80211_STA_CONNECTION_POLL)) 1360 IEEE80211_STA_CONNECTION_POLL))
1361 return false; 1361 return false;
1362 1362
1363 if (!sdata->vif.bss_conf.dtim_period) 1363 if (!mgd->have_beacon)
1364 return false; 1364 return false;
1365 1365
1366 rcu_read_lock(); 1366 rcu_read_lock();
@@ -1771,7 +1771,7 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
1771 1771
1772 ieee80211_led_assoc(local, 1); 1772 ieee80211_led_assoc(local, 1);
1773 1773
1774 if (sdata->u.mgd.assoc_data->have_beacon) { 1774 if (sdata->u.mgd.have_beacon) {
1775 /* 1775 /*
1776 * If the AP is buggy we may get here with no DTIM period 1776 * If the AP is buggy we may get here with no DTIM period
1777 * known, so assume it's 1 which is the only safe assumption 1777 * known, so assume it's 1 which is the only safe assumption
@@ -1779,7 +1779,7 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
1779 * probably just won't work at all. 1779 * probably just won't work at all.
1780 */ 1780 */
1781 bss_conf->dtim_period = sdata->u.mgd.dtim_period ?: 1; 1781 bss_conf->dtim_period = sdata->u.mgd.dtim_period ?: 1;
1782 bss_info_changed |= BSS_CHANGED_DTIM_PERIOD; 1782 bss_info_changed |= BSS_CHANGED_BEACON_INFO;
1783 } else { 1783 } else {
1784 bss_conf->dtim_period = 0; 1784 bss_conf->dtim_period = 0;
1785 } 1785 }
@@ -1903,6 +1903,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
1903 del_timer_sync(&sdata->u.mgd.chswitch_timer); 1903 del_timer_sync(&sdata->u.mgd.chswitch_timer);
1904 1904
1905 sdata->vif.bss_conf.dtim_period = 0; 1905 sdata->vif.bss_conf.dtim_period = 0;
1906 ifmgd->have_beacon = false;
1906 1907
1907 ifmgd->flags = 0; 1908 ifmgd->flags = 0;
1908 ieee80211_vif_release_channel(sdata); 1909 ieee80211_vif_release_channel(sdata);
@@ -2877,7 +2878,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
2877 const struct ieee80211_tim_ie *tim_ie = elems.tim; 2878 const struct ieee80211_tim_ie *tim_ie = elems.tim;
2878 ifmgd->dtim_period = tim_ie->dtim_period; 2879 ifmgd->dtim_period = tim_ie->dtim_period;
2879 } 2880 }
2880 ifmgd->assoc_data->have_beacon = true; 2881 ifmgd->have_beacon = true;
2881 ifmgd->assoc_data->need_beacon = false; 2882 ifmgd->assoc_data->need_beacon = false;
2882 if (local->hw.flags & IEEE80211_HW_TIMING_BEACON_ONLY) { 2883 if (local->hw.flags & IEEE80211_HW_TIMING_BEACON_ONLY) {
2883 sdata->vif.bss_conf.sync_tsf = 2884 sdata->vif.bss_conf.sync_tsf =
@@ -3059,7 +3060,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
3059 * If we haven't had a beacon before, tell the driver about the 3060 * If we haven't had a beacon before, tell the driver about the
3060 * DTIM period (and beacon timing if desired) now. 3061 * DTIM period (and beacon timing if desired) now.
3061 */ 3062 */
3062 if (!bss_conf->dtim_period) { 3063 if (!ifmgd->have_beacon) {
3063 /* a few bogus AP send dtim_period = 0 or no TIM IE */ 3064 /* a few bogus AP send dtim_period = 0 or no TIM IE */
3064 if (elems.tim) 3065 if (elems.tim)
3065 bss_conf->dtim_period = elems.tim->dtim_period ?: 1; 3066 bss_conf->dtim_period = elems.tim->dtim_period ?: 1;
@@ -3078,7 +3079,8 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
3078 sdata->vif.bss_conf.sync_dtim_count = 0; 3079 sdata->vif.bss_conf.sync_dtim_count = 0;
3079 } 3080 }
3080 3081
3081 changed |= BSS_CHANGED_DTIM_PERIOD; 3082 changed |= BSS_CHANGED_BEACON_INFO;
3083 ifmgd->have_beacon = true;
3082 3084
3083 mutex_lock(&local->iflist_mtx); 3085 mutex_lock(&local->iflist_mtx);
3084 ieee80211_recalc_ps(local, -1); 3086 ieee80211_recalc_ps(local, -1);
@@ -3424,8 +3426,7 @@ void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
3424 3426
3425 if (ifmgd->assoc_data && ifmgd->assoc_data->timeout_started && 3427 if (ifmgd->assoc_data && ifmgd->assoc_data->timeout_started &&
3426 time_after(jiffies, ifmgd->assoc_data->timeout)) { 3428 time_after(jiffies, ifmgd->assoc_data->timeout)) {
3427 if ((ifmgd->assoc_data->need_beacon && 3429 if ((ifmgd->assoc_data->need_beacon && !ifmgd->have_beacon) ||
3428 !ifmgd->assoc_data->have_beacon) ||
3429 ieee80211_do_assoc(sdata)) { 3430 ieee80211_do_assoc(sdata)) {
3430 u8 bssid[ETH_ALEN]; 3431 u8 bssid[ETH_ALEN];
3431 3432
@@ -4193,6 +4194,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
4193 4194
4194 ifmgd->assoc_data = assoc_data; 4195 ifmgd->assoc_data = assoc_data;
4195 ifmgd->dtim_period = 0; 4196 ifmgd->dtim_period = 0;
4197 ifmgd->have_beacon = false;
4196 4198
4197 err = ieee80211_prep_connection(sdata, req->bss, true); 4199 err = ieee80211_prep_connection(sdata, req->bss, true);
4198 if (err) 4200 if (err)
@@ -4224,7 +4226,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
4224 ifmgd->dtim_period = tim->dtim_period; 4226 ifmgd->dtim_period = tim->dtim_period;
4225 dtim_count = tim->dtim_count; 4227 dtim_count = tim->dtim_count;
4226 } 4228 }
4227 assoc_data->have_beacon = true; 4229 ifmgd->have_beacon = true;
4228 assoc_data->timeout = jiffies; 4230 assoc_data->timeout = jiffies;
4229 assoc_data->timeout_started = true; 4231 assoc_data->timeout_started = true;
4230 4232
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index 89a83770d152..5a6c1351d1d3 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -1584,8 +1584,9 @@ int ieee80211_reconfig(struct ieee80211_local *local)
1584 BSS_CHANGED_ARP_FILTER | 1584 BSS_CHANGED_ARP_FILTER |
1585 BSS_CHANGED_PS; 1585 BSS_CHANGED_PS;
1586 1586
1587 if (sdata->u.mgd.dtim_period) 1587 /* Re-send beacon info report to the driver */
1588 changed |= BSS_CHANGED_DTIM_PERIOD; 1588 if (sdata->u.mgd.have_beacon)
1589 changed |= BSS_CHANGED_BEACON_INFO;
1589 1590
1590 sdata_lock(sdata); 1591 sdata_lock(sdata);
1591 ieee80211_bss_info_change_notify(sdata, changed); 1592 ieee80211_bss_info_change_notify(sdata, changed);