Message ID | 1393275270-7255-5-git-send-email-luca@coelho.fi (mailing list archive) |
---|---|
State | Not Applicable, archived |
Headers | show |
On 24 February 2014 21:54, Luciano Coelho <luca@coelho.fi> wrote: > From: Luciano Coelho <luciano.coelho@intel.com> > > 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> > --- > In v2: > > * lock the chanctx mutex in ieee80211_ibss_join() before calling > ieee80211_check_combinations(). (Thanks Michal); > > * pass the mode argument instead of IEEE80211_CHANCTX_SHARED to > ieee80211_check_combinations() in ieee80211_vif_use_channel(); > > In v3: > > * moved the second change from v2 (pass the mode argument...) to > the previous patch, where it should be; > > In v4: > > * rebased on top of slightly modified applied patches > --- > net/mac80211/ibss.c | 30 +++++++++++++++++++++++++++--- > net/wireless/ibss.c | 28 ---------------------------- > 2 files changed, 27 insertions(+), 31 deletions(-) > > diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c > index bca7d09..745b445 100644 > --- a/net/mac80211/ibss.c > +++ b/net/mac80211/ibss.c > @@ -1643,7 +1643,31 @@ 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; > int i; > + int ret; > + > + radar_detect_width = cfg80211_chandef_dfs_required(local->hw.wiphy, > + ¶ms->chandef, > + sdata->vif.type); > + if (radar_detect_width < 0) > + return radar_detect_width; > + > + if (radar_detect_width > 0 && !params->userspace_handles_dfs) > + return -EINVAL; > + > + chanmode = (params->channel_fixed && !radar_detect_width) ? > + IEEE80211_CHANCTX_SHARED : IEEE80211_CHANCTX_EXCLUSIVE; > + > + mutex_lock(&local->chanctx_mtx); > + ret = ieee80211_check_combinations(local->hw.wiphy, &sdata->wdev, > + ¶ms->chandef, chanmode, > + radar_detect_width); I think you forgot to update this call - you should be passing `local` and `sdata` here, no? Micha? -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tue, 2014-02-25 at 08:49 +0100, Michal Kazior wrote: > On 24 February 2014 21:54, Luciano Coelho <luca@coelho.fi> wrote: > > diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c > > index bca7d09..745b445 100644 > > --- a/net/mac80211/ibss.c > > +++ b/net/mac80211/ibss.c > > @@ -1643,7 +1643,31 @@ 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; > > int i; > > + int ret; > > + > > + radar_detect_width = cfg80211_chandef_dfs_required(local->hw.wiphy, > > + ¶ms->chandef, > > + sdata->vif.type); > > + if (radar_detect_width < 0) > > + return radar_detect_width; > > + > > + if (radar_detect_width > 0 && !params->userspace_handles_dfs) > > + return -EINVAL; > > + > > + chanmode = (params->channel_fixed && !radar_detect_width) ? > > + IEEE80211_CHANCTX_SHARED : IEEE80211_CHANCTX_EXCLUSIVE; > > + > > + mutex_lock(&local->chanctx_mtx); > > + ret = ieee80211_check_combinations(local->hw.wiphy, &sdata->wdev, > > + ¶ms->chandef, chanmode, > > + radar_detect_width); > > I think you forgot to update this call - you should be passing `local` > and `sdata` here, no? Definitely. Forgot to commit. :( I'll commit and send v5. -- Luca. -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c index bca7d09..745b445 100644 --- a/net/mac80211/ibss.c +++ b/net/mac80211/ibss.c @@ -1643,7 +1643,31 @@ 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; int i; + int ret; + + radar_detect_width = cfg80211_chandef_dfs_required(local->hw.wiphy, + ¶ms->chandef, + sdata->vif.type); + if (radar_detect_width < 0) + return radar_detect_width; + + if (radar_detect_width > 0 && !params->userspace_handles_dfs) + return -EINVAL; + + chanmode = (params->channel_fixed && !radar_detect_width) ? + IEEE80211_CHANCTX_SHARED : IEEE80211_CHANCTX_EXCLUSIVE; + + mutex_lock(&local->chanctx_mtx); + ret = ieee80211_check_combinations(local->hw.wiphy, &sdata->wdev, + ¶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); @@ -1658,7 +1682,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); @@ -1707,9 +1731,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; } diff --git a/net/wireless/ibss.c b/net/wireless/ibss.c index d81cb68..8282de8 100644 --- a/net/wireless/ibss.c +++ b/net/wireless/ibss.c @@ -88,8 +88,6 @@ 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 @@ 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;