OSDN Git Service

cfg80211: simplify cfg80211_chandef_valid()
authorJohannes Berg <johannes.berg@intel.com>
Mon, 29 Nov 2021 13:32:43 +0000 (15:32 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 20 Dec 2021 09:36:24 +0000 (10:36 +0100)
There are a lot of duplicate checks in this function to
check the delta between the control channel and CF1.
With the addition of 320 MHz, this will become even more.
Simplify the code so that the common checks are done
only once for multiple bandwidths.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20211129152938.2d0240b07f11.I759e8e990f5386ba2b56ffb2488a8d4e16e22c1b@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/wireless/chan.c

index 00fc7b7..ac2e567 100644 (file)
@@ -245,19 +245,7 @@ bool cfg80211_chandef_valid(const struct cfg80211_chan_def *chandef)
                    oper_freq - MHZ_TO_KHZ(oper_width) / 2)
                        return false;
                break;
-       case NL80211_CHAN_WIDTH_40:
-               if (chandef->center_freq1 != control_freq + 10 &&
-                   chandef->center_freq1 != control_freq - 10)
-                       return false;
-               if (chandef->center_freq2)
-                       return false;
-               break;
        case NL80211_CHAN_WIDTH_80P80:
-               if (chandef->center_freq1 != control_freq + 30 &&
-                   chandef->center_freq1 != control_freq + 10 &&
-                   chandef->center_freq1 != control_freq - 10 &&
-                   chandef->center_freq1 != control_freq - 30)
-                       return false;
                if (!chandef->center_freq2)
                        return false;
                /* adjacent is not allowed -- that's a 160 MHz channel */
@@ -265,28 +253,42 @@ bool cfg80211_chandef_valid(const struct cfg80211_chan_def *chandef)
                    chandef->center_freq2 - chandef->center_freq1 == 80)
                        return false;
                break;
-       case NL80211_CHAN_WIDTH_80:
-               if (chandef->center_freq1 != control_freq + 30 &&
-                   chandef->center_freq1 != control_freq + 10 &&
-                   chandef->center_freq1 != control_freq - 10 &&
-                   chandef->center_freq1 != control_freq - 30)
-                       return false;
+       default:
                if (chandef->center_freq2)
                        return false;
                break;
-       case NL80211_CHAN_WIDTH_160:
-               if (chandef->center_freq1 != control_freq + 70 &&
-                   chandef->center_freq1 != control_freq + 50 &&
-                   chandef->center_freq1 != control_freq + 30 &&
-                   chandef->center_freq1 != control_freq + 10 &&
-                   chandef->center_freq1 != control_freq - 10 &&
-                   chandef->center_freq1 != control_freq - 30 &&
-                   chandef->center_freq1 != control_freq - 50 &&
-                   chandef->center_freq1 != control_freq - 70)
-                       return false;
-               if (chandef->center_freq2)
-                       return false;
+       }
+
+       switch (chandef->width) {
+       case NL80211_CHAN_WIDTH_5:
+       case NL80211_CHAN_WIDTH_10:
+       case NL80211_CHAN_WIDTH_20:
+       case NL80211_CHAN_WIDTH_20_NOHT:
+       case NL80211_CHAN_WIDTH_1:
+       case NL80211_CHAN_WIDTH_2:
+       case NL80211_CHAN_WIDTH_4:
+       case NL80211_CHAN_WIDTH_8:
+       case NL80211_CHAN_WIDTH_16:
+               /* all checked above */
                break;
+       case NL80211_CHAN_WIDTH_160:
+               if (chandef->center_freq1 == control_freq + 70 ||
+                   chandef->center_freq1 == control_freq + 50 ||
+                   chandef->center_freq1 == control_freq - 50 ||
+                   chandef->center_freq1 == control_freq - 70)
+                       break;
+               fallthrough;
+       case NL80211_CHAN_WIDTH_80P80:
+       case NL80211_CHAN_WIDTH_80:
+               if (chandef->center_freq1 == control_freq + 30 ||
+                   chandef->center_freq1 == control_freq - 30)
+                       break;
+               fallthrough;
+       case NL80211_CHAN_WIDTH_40:
+               if (chandef->center_freq1 == control_freq + 10 ||
+                   chandef->center_freq1 == control_freq - 10)
+                       break;
+               fallthrough;
        default:
                return false;
        }