mac80211: consider only relevant vifs for radar_required calculation
authorEliad Peller <eliad@wizery.com>
Wed, 7 Jan 2015 15:50:10 +0000 (17:50 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 14 Jan 2015 08:37:06 +0000 (09:37 +0100)
ctx->conf.radar_enabled should reflect whether radar
detection is enabled for the channel context.

When calculating it, make it consider only the vifs
that have this context assigned (instead of all the
vifs).

Signed-off-by: Eliad Peller <eliad@wizery.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/chan.c

index 92c721dbd5af80e6e02de15b3825f87425b31e41..35b11e11e0c49ba81cb4ecdc9b3624e02628f503 100644 (file)
@@ -406,6 +406,34 @@ bool ieee80211_is_radar_required(struct ieee80211_local *local)
        return false;
 }
 
+static bool
+ieee80211_chanctx_radar_required(struct ieee80211_local *local,
+                                struct ieee80211_chanctx *ctx)
+{
+       struct ieee80211_chanctx_conf *conf = &ctx->conf;
+       struct ieee80211_sub_if_data *sdata;
+       bool required = false;
+
+       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_held(&local->mtx);
+
+       rcu_read_lock();
+       list_for_each_entry_rcu(sdata, &local->interfaces, list) {
+               if (!ieee80211_sdata_running(sdata))
+                       continue;
+               if (rcu_access_pointer(sdata->vif.chanctx_conf) != conf)
+                       continue;
+               if (!sdata->radar_required)
+                       continue;
+
+               required = true;
+               break;
+       }
+       rcu_read_unlock();
+
+       return required;
+}
+
 static struct ieee80211_chanctx *
 ieee80211_alloc_chanctx(struct ieee80211_local *local,
                        const struct cfg80211_chan_def *chandef,
@@ -425,7 +453,7 @@ ieee80211_alloc_chanctx(struct ieee80211_local *local,
        ctx->conf.rx_chains_static = 1;
        ctx->conf.rx_chains_dynamic = 1;
        ctx->mode = mode;
-       ctx->conf.radar_enabled = ieee80211_is_radar_required(local);
+       ctx->conf.radar_enabled = false;
        ieee80211_recalc_chanctx_min_def(local, ctx);
 
        return ctx;
@@ -570,7 +598,7 @@ static void ieee80211_recalc_radar_chanctx(struct ieee80211_local *local,
        /* for ieee80211_is_radar_required */
        lockdep_assert_held(&local->mtx);
 
-       radar_enabled = ieee80211_is_radar_required(local);
+       radar_enabled = ieee80211_chanctx_radar_required(local, chanctx);
 
        if (radar_enabled == chanctx->conf.radar_enabled)
                return;