mac80211: ibss: fix ignored channel parameter
my earlier patch "mac80211: change IBSS channel state to chandef" created a regression by ignoring the channel parameter in __ieee80211_sta_join_ibss, which breaks IBSS channel selection. This patch fixes this situation by using the right channel and adopting the selected bandwidth mode. Cc: stable@vger.kernel.org Signed-off-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
2dfca312a9
commit
75a423f493
@ -36,7 +36,7 @@
|
|||||||
|
|
||||||
static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
||||||
const u8 *bssid, const int beacon_int,
|
const u8 *bssid, const int beacon_int,
|
||||||
struct ieee80211_channel *chan,
|
struct cfg80211_chan_def *req_chandef,
|
||||||
const u32 basic_rates,
|
const u32 basic_rates,
|
||||||
const u16 capability, u64 tsf,
|
const u16 capability, u64 tsf,
|
||||||
bool creator)
|
bool creator)
|
||||||
@ -51,6 +51,7 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
|||||||
u32 bss_change;
|
u32 bss_change;
|
||||||
u8 supp_rates[IEEE80211_MAX_SUPP_RATES];
|
u8 supp_rates[IEEE80211_MAX_SUPP_RATES];
|
||||||
struct cfg80211_chan_def chandef;
|
struct cfg80211_chan_def chandef;
|
||||||
|
struct ieee80211_channel *chan;
|
||||||
struct beacon_data *presp;
|
struct beacon_data *presp;
|
||||||
int frame_len;
|
int frame_len;
|
||||||
|
|
||||||
@ -81,7 +82,9 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
|||||||
|
|
||||||
sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0;
|
sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0;
|
||||||
|
|
||||||
chandef = ifibss->chandef;
|
/* make a copy of the chandef, it could be modified below. */
|
||||||
|
chandef = *req_chandef;
|
||||||
|
chan = chandef.chan;
|
||||||
if (!cfg80211_reg_can_beacon(local->hw.wiphy, &chandef)) {
|
if (!cfg80211_reg_can_beacon(local->hw.wiphy, &chandef)) {
|
||||||
chandef.width = NL80211_CHAN_WIDTH_20;
|
chandef.width = NL80211_CHAN_WIDTH_20;
|
||||||
chandef.center_freq1 = chan->center_freq;
|
chandef.center_freq1 = chan->center_freq;
|
||||||
@ -259,10 +262,12 @@ static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
|||||||
struct cfg80211_bss *cbss =
|
struct cfg80211_bss *cbss =
|
||||||
container_of((void *)bss, struct cfg80211_bss, priv);
|
container_of((void *)bss, struct cfg80211_bss, priv);
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
|
struct cfg80211_chan_def chandef;
|
||||||
u32 basic_rates;
|
u32 basic_rates;
|
||||||
int i, j;
|
int i, j;
|
||||||
u16 beacon_int = cbss->beacon_interval;
|
u16 beacon_int = cbss->beacon_interval;
|
||||||
const struct cfg80211_bss_ies *ies;
|
const struct cfg80211_bss_ies *ies;
|
||||||
|
enum nl80211_channel_type chan_type;
|
||||||
u64 tsf;
|
u64 tsf;
|
||||||
|
|
||||||
sdata_assert_lock(sdata);
|
sdata_assert_lock(sdata);
|
||||||
@ -270,6 +275,26 @@ static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
|||||||
if (beacon_int < 10)
|
if (beacon_int < 10)
|
||||||
beacon_int = 10;
|
beacon_int = 10;
|
||||||
|
|
||||||
|
switch (sdata->u.ibss.chandef.width) {
|
||||||
|
case NL80211_CHAN_WIDTH_20_NOHT:
|
||||||
|
case NL80211_CHAN_WIDTH_20:
|
||||||
|
case NL80211_CHAN_WIDTH_40:
|
||||||
|
chan_type = cfg80211_get_chandef_type(&sdata->u.ibss.chandef);
|
||||||
|
cfg80211_chandef_create(&chandef, cbss->channel, chan_type);
|
||||||
|
break;
|
||||||
|
case NL80211_CHAN_WIDTH_5:
|
||||||
|
case NL80211_CHAN_WIDTH_10:
|
||||||
|
cfg80211_chandef_create(&chandef, cbss->channel,
|
||||||
|
NL80211_CHAN_WIDTH_20_NOHT);
|
||||||
|
chandef.width = sdata->u.ibss.chandef.width;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* fall back to 20 MHz for unsupported modes */
|
||||||
|
cfg80211_chandef_create(&chandef, cbss->channel,
|
||||||
|
NL80211_CHAN_WIDTH_20_NOHT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
sband = sdata->local->hw.wiphy->bands[cbss->channel->band];
|
sband = sdata->local->hw.wiphy->bands[cbss->channel->band];
|
||||||
|
|
||||||
basic_rates = 0;
|
basic_rates = 0;
|
||||||
@ -294,7 +319,7 @@ static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
|||||||
|
|
||||||
__ieee80211_sta_join_ibss(sdata, cbss->bssid,
|
__ieee80211_sta_join_ibss(sdata, cbss->bssid,
|
||||||
beacon_int,
|
beacon_int,
|
||||||
cbss->channel,
|
&chandef,
|
||||||
basic_rates,
|
basic_rates,
|
||||||
cbss->capability,
|
cbss->capability,
|
||||||
tsf, false);
|
tsf, false);
|
||||||
@ -736,7 +761,7 @@ static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
|
|||||||
sdata->drop_unencrypted = 0;
|
sdata->drop_unencrypted = 0;
|
||||||
|
|
||||||
__ieee80211_sta_join_ibss(sdata, bssid, sdata->vif.bss_conf.beacon_int,
|
__ieee80211_sta_join_ibss(sdata, bssid, sdata->vif.bss_conf.beacon_int,
|
||||||
ifibss->chandef.chan, ifibss->basic_rates,
|
&ifibss->chandef, ifibss->basic_rates,
|
||||||
capability, 0, true);
|
capability, 0, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user