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: Alexander Bondar <alexander.bondar@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Родитель
e562078a19
Коммит
817cee7675
|
@ -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 {
|
||||||
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 {
|
||||||
#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,
|
||||||
* 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,
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче