diff mbox

[v4,4/4] cfg80211/mac80211: move combination check to mac80211 for ibss

Message ID 1393275270-7255-5-git-send-email-luca@coelho.fi (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Luca Coelho Feb. 24, 2014, 8:54 p.m. UTC
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(-)

Comments

Michal Kazior Feb. 25, 2014, 7:49 a.m. UTC | #1
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,
> +                                                          &params->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,
> +                                          &params->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
Luca Coelho Feb. 25, 2014, 11:16 a.m. UTC | #2
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,
> > +                                                          &params->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,
> > +                                          &params->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 mbox

Patch

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