forked from luck/tmp_suning_uos_patched
cfg80211/mac80211: move combination check to mac80211 for ibss
Now that mac80211 can check the interface combinations itself, move the combinations check from cfg80211 to mac80211 when joining an IBSS. Signed-off-by: Luciano Coelho <luciano.coelho@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
73de86a389
commit
71965c1d04
|
@ -1639,7 +1639,33 @@ int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
|
|||
u32 changed = 0;
|
||||
u32 rate_flags;
|
||||
struct ieee80211_supported_band *sband;
|
||||
enum ieee80211_chanctx_mode chanmode;
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
int radar_detect_width = 0;
|
||||
int i;
|
||||
int ret;
|
||||
|
||||
ret = cfg80211_chandef_dfs_required(local->hw.wiphy,
|
||||
¶ms->chandef,
|
||||
sdata->wdev.iftype);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (ret > 0) {
|
||||
if (!params->userspace_handles_dfs)
|
||||
return -EINVAL;
|
||||
radar_detect_width = BIT(params->chandef.width);
|
||||
}
|
||||
|
||||
chanmode = (params->channel_fixed && !ret) ?
|
||||
IEEE80211_CHANCTX_SHARED : IEEE80211_CHANCTX_EXCLUSIVE;
|
||||
|
||||
mutex_lock(&local->chanctx_mtx);
|
||||
ret = ieee80211_check_combinations(sdata, ¶ms->chandef, chanmode,
|
||||
radar_detect_width);
|
||||
mutex_unlock(&local->chanctx_mtx);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (params->bssid) {
|
||||
memcpy(sdata->u.ibss.bssid, params->bssid, ETH_ALEN);
|
||||
|
@ -1654,7 +1680,7 @@ int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
|
|||
|
||||
/* fix basic_rates if channel does not support these rates */
|
||||
rate_flags = ieee80211_chandef_rate_flags(¶ms->chandef);
|
||||
sband = sdata->local->hw.wiphy->bands[params->chandef.chan->band];
|
||||
sband = local->hw.wiphy->bands[params->chandef.chan->band];
|
||||
for (i = 0; i < sband->n_bitrates; i++) {
|
||||
if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
|
||||
sdata->u.ibss.basic_rates &= ~BIT(i);
|
||||
|
@ -1703,9 +1729,9 @@ int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
|
|||
ieee80211_bss_info_change_notify(sdata, changed);
|
||||
|
||||
sdata->smps_mode = IEEE80211_SMPS_OFF;
|
||||
sdata->needed_rx_chains = sdata->local->rx_chains;
|
||||
sdata->needed_rx_chains = local->rx_chains;
|
||||
|
||||
ieee80211_queue_work(&sdata->local->hw, &sdata->work);
|
||||
ieee80211_queue_work(&local->hw, &sdata->work);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -88,8 +88,6 @@ static int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev,
|
|||
struct cfg80211_cached_keys *connkeys)
|
||||
{
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
struct ieee80211_channel *check_chan;
|
||||
u8 radar_detect_width = 0;
|
||||
int err;
|
||||
|
||||
ASSERT_WDEV_LOCK(wdev);
|
||||
|
@ -126,32 +124,6 @@ static int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev,
|
|||
#ifdef CONFIG_CFG80211_WEXT
|
||||
wdev->wext.ibss.chandef = params->chandef;
|
||||
#endif
|
||||
check_chan = params->chandef.chan;
|
||||
if (params->userspace_handles_dfs) {
|
||||
/* Check for radar even if the current channel is not
|
||||
* a radar channel - it might decide to change to DFS
|
||||
* channel later.
|
||||
*/
|
||||
radar_detect_width = BIT(params->chandef.width);
|
||||
}
|
||||
|
||||
/* TODO: We need to check the combinations at this point, we
|
||||
* probably must move this call down to join_ibss() in
|
||||
* mac80211.
|
||||
*/
|
||||
err = cfg80211_can_use_iftype_chan(rdev, wdev, wdev->iftype,
|
||||
check_chan,
|
||||
(params->channel_fixed &&
|
||||
!radar_detect_width)
|
||||
? CHAN_MODE_SHARED
|
||||
: CHAN_MODE_EXCLUSIVE,
|
||||
radar_detect_width);
|
||||
|
||||
if (err) {
|
||||
wdev->connect_keys = NULL;
|
||||
return err;
|
||||
}
|
||||
|
||||
err = rdev_join_ibss(rdev, dev, params);
|
||||
if (err) {
|
||||
wdev->connect_keys = NULL;
|
||||
|
|
Loading…
Reference in New Issue
Block a user