|
@@ -104,16 +104,35 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
|
|
|
cbss->free_priv = ieee80211_rx_bss_free;
|
|
|
bss = (void *)cbss->priv;
|
|
|
|
|
|
+ if (elems->parse_error) {
|
|
|
+ if (beacon)
|
|
|
+ bss->corrupt_data |= IEEE80211_BSS_CORRUPT_BEACON;
|
|
|
+ else
|
|
|
+ bss->corrupt_data |= IEEE80211_BSS_CORRUPT_PROBE_RESP;
|
|
|
+ } else {
|
|
|
+ if (beacon)
|
|
|
+ bss->corrupt_data &= ~IEEE80211_BSS_CORRUPT_BEACON;
|
|
|
+ else
|
|
|
+ bss->corrupt_data &= ~IEEE80211_BSS_CORRUPT_PROBE_RESP;
|
|
|
+ }
|
|
|
+
|
|
|
/* save the ERP value so that it is available at association time */
|
|
|
- if (elems->erp_info && elems->erp_info_len >= 1) {
|
|
|
+ if (elems->erp_info && elems->erp_info_len >= 1 &&
|
|
|
+ (!elems->parse_error ||
|
|
|
+ !(bss->valid_data & IEEE80211_BSS_VALID_ERP))) {
|
|
|
bss->erp_value = elems->erp_info[0];
|
|
|
bss->has_erp_value = true;
|
|
|
+ if (!elems->parse_error)
|
|
|
+ bss->valid_data |= IEEE80211_BSS_VALID_ERP;
|
|
|
}
|
|
|
|
|
|
- if (elems->tim) {
|
|
|
+ if (elems->tim && (!elems->parse_error ||
|
|
|
+ !(bss->valid_data & IEEE80211_BSS_VALID_DTIM))) {
|
|
|
struct ieee80211_tim_ie *tim_ie =
|
|
|
(struct ieee80211_tim_ie *)elems->tim;
|
|
|
bss->dtim_period = tim_ie->dtim_period;
|
|
|
+ if (!elems->parse_error)
|
|
|
+ bss->valid_data |= IEEE80211_BSS_VALID_DTIM;
|
|
|
}
|
|
|
|
|
|
/* If the beacon had no TIM IE, or it was invalid, use 1 */
|
|
@@ -121,26 +140,38 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
|
|
|
bss->dtim_period = 1;
|
|
|
|
|
|
/* replace old supported rates if we get new values */
|
|
|
- srlen = 0;
|
|
|
- if (elems->supp_rates) {
|
|
|
- clen = IEEE80211_MAX_SUPP_RATES;
|
|
|
- if (clen > elems->supp_rates_len)
|
|
|
- clen = elems->supp_rates_len;
|
|
|
- memcpy(bss->supp_rates, elems->supp_rates, clen);
|
|
|
- srlen += clen;
|
|
|
- }
|
|
|
- if (elems->ext_supp_rates) {
|
|
|
- clen = IEEE80211_MAX_SUPP_RATES - srlen;
|
|
|
- if (clen > elems->ext_supp_rates_len)
|
|
|
- clen = elems->ext_supp_rates_len;
|
|
|
- memcpy(bss->supp_rates + srlen, elems->ext_supp_rates, clen);
|
|
|
- srlen += clen;
|
|
|
+ if (!elems->parse_error ||
|
|
|
+ !(bss->valid_data & IEEE80211_BSS_VALID_RATES)) {
|
|
|
+ srlen = 0;
|
|
|
+ if (elems->supp_rates) {
|
|
|
+ clen = IEEE80211_MAX_SUPP_RATES;
|
|
|
+ if (clen > elems->supp_rates_len)
|
|
|
+ clen = elems->supp_rates_len;
|
|
|
+ memcpy(bss->supp_rates, elems->supp_rates, clen);
|
|
|
+ srlen += clen;
|
|
|
+ }
|
|
|
+ if (elems->ext_supp_rates) {
|
|
|
+ clen = IEEE80211_MAX_SUPP_RATES - srlen;
|
|
|
+ if (clen > elems->ext_supp_rates_len)
|
|
|
+ clen = elems->ext_supp_rates_len;
|
|
|
+ memcpy(bss->supp_rates + srlen, elems->ext_supp_rates,
|
|
|
+ clen);
|
|
|
+ srlen += clen;
|
|
|
+ }
|
|
|
+ if (srlen) {
|
|
|
+ bss->supp_rates_len = srlen;
|
|
|
+ if (!elems->parse_error)
|
|
|
+ bss->valid_data |= IEEE80211_BSS_VALID_RATES;
|
|
|
+ }
|
|
|
}
|
|
|
- if (srlen)
|
|
|
- bss->supp_rates_len = srlen;
|
|
|
|
|
|
- bss->wmm_used = elems->wmm_param || elems->wmm_info;
|
|
|
- bss->uapsd_supported = is_uapsd_supported(elems);
|
|
|
+ if (!elems->parse_error ||
|
|
|
+ !(bss->valid_data & IEEE80211_BSS_VALID_WMM)) {
|
|
|
+ bss->wmm_used = elems->wmm_param || elems->wmm_info;
|
|
|
+ bss->uapsd_supported = is_uapsd_supported(elems);
|
|
|
+ if (!elems->parse_error)
|
|
|
+ bss->valid_data |= IEEE80211_BSS_VALID_WMM;
|
|
|
+ }
|
|
|
|
|
|
if (!beacon)
|
|
|
bss->last_probe_resp = jiffies;
|