Commit 817cee76 authored by Alexander Bondar's avatar Alexander Bondar Committed by Johannes Berg

mac80211: track AP's beacon rate and give it to the driver

Track the AP's beacon rate in the scan BSS data and in the
interface configuration to let the drivers know which rate
the AP is using. This information may be used by drivers,
in our case to let the firmware optimise beacon RX.
Signed-off-by: default avatarAlexander Bondar <alexander.bondar@intel.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent e562078a
...@@ -305,6 +305,7 @@ enum ieee80211_rssi_event { ...@@ -305,6 +305,7 @@ enum ieee80211_rssi_event {
* @basic_rates: bitmap of basic rates, each bit stands for an * @basic_rates: bitmap of basic rates, each bit stands for an
* index into the rate table configured by the driver in * index into the rate table configured by the driver in
* the current band. * the current band.
* @beacon_rate: associated AP's beacon TX rate
* @mcast_rate: per-band multicast rate index + 1 (0: disabled) * @mcast_rate: per-band multicast rate index + 1 (0: disabled)
* @bssid: The BSSID for this BSS * @bssid: The BSSID for this BSS
* @enable_beacon: whether beaconing should be enabled or not * @enable_beacon: whether beaconing should be enabled or not
...@@ -352,6 +353,7 @@ struct ieee80211_bss_conf { ...@@ -352,6 +353,7 @@ struct ieee80211_bss_conf {
u32 sync_device_ts; u32 sync_device_ts;
u8 sync_dtim_count; u8 sync_dtim_count;
u32 basic_rates; u32 basic_rates;
struct ieee80211_rate *beacon_rate;
int mcast_rate[IEEE80211_NUM_BANDS]; int mcast_rate[IEEE80211_NUM_BANDS];
u16 ht_operation_mode; u16 ht_operation_mode;
s32 cqm_rssi_thold; s32 cqm_rssi_thold;
......
...@@ -94,6 +94,7 @@ struct ieee80211_bss { ...@@ -94,6 +94,7 @@ struct ieee80211_bss {
#define IEEE80211_MAX_SUPP_RATES 32 #define IEEE80211_MAX_SUPP_RATES 32
u8 supp_rates[IEEE80211_MAX_SUPP_RATES]; u8 supp_rates[IEEE80211_MAX_SUPP_RATES];
size_t supp_rates_len; size_t supp_rates_len;
struct ieee80211_rate *beacon_rate;
/* /*
* During association, we save an ERP value from a probe response so * During association, we save an ERP value from a probe response so
......
...@@ -1779,8 +1779,10 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, ...@@ -1779,8 +1779,10 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
* probably just won't work at all. * probably just won't work at all.
*/ */
bss_conf->dtim_period = sdata->u.mgd.dtim_period ?: 1; bss_conf->dtim_period = sdata->u.mgd.dtim_period ?: 1;
bss_conf->beacon_rate = bss->beacon_rate;
bss_info_changed |= BSS_CHANGED_BEACON_INFO; bss_info_changed |= BSS_CHANGED_BEACON_INFO;
} else { } else {
bss_conf->beacon_rate = NULL;
bss_conf->dtim_period = 0; bss_conf->dtim_period = 0;
} }
...@@ -1903,6 +1905,8 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, ...@@ -1903,6 +1905,8 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
del_timer_sync(&sdata->u.mgd.chswitch_timer); del_timer_sync(&sdata->u.mgd.chswitch_timer);
sdata->vif.bss_conf.dtim_period = 0; sdata->vif.bss_conf.dtim_period = 0;
sdata->vif.bss_conf.beacon_rate = NULL;
ifmgd->have_beacon = false; ifmgd->have_beacon = false;
ifmgd->flags = 0; ifmgd->flags = 0;
...@@ -2754,8 +2758,10 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, ...@@ -2754,8 +2758,10 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
bss = ieee80211_bss_info_update(local, rx_status, mgmt, len, elems, bss = ieee80211_bss_info_update(local, rx_status, mgmt, len, elems,
channel); channel);
if (bss) if (bss) {
ieee80211_rx_bss_put(local, bss); ieee80211_rx_bss_put(local, bss);
sdata->vif.bss_conf.beacon_rate = bss->beacon_rate;
}
if (!sdata->u.mgd.associated || if (!sdata->u.mgd.associated ||
!ether_addr_equal(mgmt->bssid, sdata->u.mgd.associated->bssid)) !ether_addr_equal(mgmt->bssid, sdata->u.mgd.associated->bssid))
......
...@@ -140,6 +140,15 @@ ieee80211_bss_info_update(struct ieee80211_local *local, ...@@ -140,6 +140,15 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
bss->valid_data |= IEEE80211_BSS_VALID_WMM; bss->valid_data |= IEEE80211_BSS_VALID_WMM;
} }
if (beacon) {
struct ieee80211_supported_band *sband =
local->hw.wiphy->bands[rx_status->band];
if (!(rx_status->flag & RX_FLAG_HT) &&
!(rx_status->flag & RX_FLAG_VHT))
bss->beacon_rate =
&sband->bitrates[rx_status->rate_idx];
}
return bss; return bss;
} }
......
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