mac80211: avoid VHT usage with no 80MHz chans allowed
Currently if 80MHz channels are not allowed for use, the VHT IE is not included in the probe request for an AP. This is not good enough if the AP is configured with the wrong regulatory and supports VHT even where prohibited or in TDLS scenarios. Mark the ifmgd with the DISABLE_VHT flag for the misbehaving-AP case, and unset VHT support from the peer-station entry for the TDLS case. Signed-off-by: Arik Nemtsov <arikx.nemtsov@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
549cc1c560
commit
52a45f38ca
|
@ -4267,6 +4267,8 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
struct cfg80211_chan_def chandef;
|
struct cfg80211_chan_def chandef;
|
||||||
int ret;
|
int ret;
|
||||||
|
u32 i;
|
||||||
|
bool have_80mhz;
|
||||||
|
|
||||||
sband = local->hw.wiphy->bands[cbss->channel->band];
|
sband = local->hw.wiphy->bands[cbss->channel->band];
|
||||||
|
|
||||||
|
@ -4317,6 +4319,20 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Allow VHT if at least one channel on the sband supports 80 MHz */
|
||||||
|
have_80mhz = false;
|
||||||
|
for (i = 0; i < sband->n_channels; i++) {
|
||||||
|
if (sband->channels[i].flags & (IEEE80211_CHAN_DISABLED |
|
||||||
|
IEEE80211_CHAN_NO_80MHZ))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
have_80mhz = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!have_80mhz)
|
||||||
|
ifmgd->flags |= IEEE80211_STA_DISABLE_VHT;
|
||||||
|
|
||||||
ifmgd->flags |= ieee80211_determine_chantype(sdata, sband,
|
ifmgd->flags |= ieee80211_determine_chantype(sdata, sband,
|
||||||
cbss->channel,
|
cbss->channel,
|
||||||
ht_cap, ht_oper, vht_oper,
|
ht_cap, ht_oper, vht_oper,
|
||||||
|
|
|
@ -120,6 +120,7 @@ ieee80211_vht_cap_ie_to_sta_vht_cap(struct ieee80211_sub_if_data *sdata,
|
||||||
struct ieee80211_sta_vht_cap *vht_cap = &sta->sta.vht_cap;
|
struct ieee80211_sta_vht_cap *vht_cap = &sta->sta.vht_cap;
|
||||||
struct ieee80211_sta_vht_cap own_cap;
|
struct ieee80211_sta_vht_cap own_cap;
|
||||||
u32 cap_info, i;
|
u32 cap_info, i;
|
||||||
|
bool have_80mhz;
|
||||||
|
|
||||||
memset(vht_cap, 0, sizeof(*vht_cap));
|
memset(vht_cap, 0, sizeof(*vht_cap));
|
||||||
|
|
||||||
|
@ -129,6 +130,20 @@ ieee80211_vht_cap_ie_to_sta_vht_cap(struct ieee80211_sub_if_data *sdata,
|
||||||
if (!vht_cap_ie || !sband->vht_cap.vht_supported)
|
if (!vht_cap_ie || !sband->vht_cap.vht_supported)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* Allow VHT if at least one channel on the sband supports 80 MHz */
|
||||||
|
have_80mhz = false;
|
||||||
|
for (i = 0; i < sband->n_channels; i++) {
|
||||||
|
if (sband->channels[i].flags & (IEEE80211_CHAN_DISABLED |
|
||||||
|
IEEE80211_CHAN_NO_80MHZ))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
have_80mhz = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!have_80mhz)
|
||||||
|
return;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A VHT STA must support 40 MHz, but if we verify that here
|
* A VHT STA must support 40 MHz, but if we verify that here
|
||||||
* then we break a few things - some APs (e.g. Netgear R6300v2
|
* then we break a few things - some APs (e.g. Netgear R6300v2
|
||||||
|
|
Loading…
Reference in a new issue