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:
Luciano Coelho 2014-02-18 17:07:53 +02:00 committed by Johannes Berg
parent 73de86a389
commit 71965c1d04
2 changed files with 29 additions and 31 deletions

View file

@ -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,
&params->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, &params->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(&params->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;
}

View file

@ -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;