On 8/29/2019 11:49 PM, Amar Singhal wrote:
Add new helper function to convert (chan_number, oper_class) pair to
frequency. Call this function ieee80211_channel_op_class_to_frequency.
This function would be very useful in the context of 6 GHz channels,
where channel number is not unique.
That 'unique' statement does not apply to 6GHz by itself. The addition
of 6GHz channels makes channel numbers across bands not unique.
The funcion
Signed-off-by: Amar Singhal <[email protected]>
---
include/net/cfg80211.h | 10 ++++++++++
net/wireless/util.c | 23 +++++++++++++++++++++++
2 files changed, 33 insertions(+)
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 6467b60..decafba 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -4914,1 +4914,1 @@ static inline void *wdev_priv(struct wireless_dev *wdev)
int ieee80211_channel_to_frequency(int chan, enum nl80211_band band);
/**
+ * ieee80211_channel_op_class_to_frequency - convert
+ * (channel, operating class) to frequency
+ * @chan_num: channel number
+ * @global_op_class: global operating class
+ *
+ * Return: The corresponding frequency, or 0 if the conversion failed.
+ */
+int ieee80211_channel_op_class_to_frequency(u8 chan_num, u8 global_op_class);
+
+/**
* ieee80211_frequency_to_channel - convert frequency to channel number
* @freq: center frequency
* Return: The corresponding channel, or 0 if the conversion failed.
diff --git a/net/wireless/util.c b/net/wireless/util.c
index 9aba8d54..7f64b4a 100644
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -144,6 +144,29 @@ struct ieee80211_channel *ieee80211_get_channel(struct
wiphy *wiphy, int freq)
}
EXPORT_SYMBOL(ieee80211_get_channel);
+int ieee80211_channel_op_class_to_frequency(u8 chan_num, u8 global_op_class)
+{
+ if (global_op_class >= 131 && global_op_class <= 135)
+ return (5940 + 5 * chan_num);
+ else if (global_op_class >= 115 && global_op_class <= 130)
+ return (5000 + 5 * chan_num);
+ else if (global_op_class >= 112 && global_op_class <= 113)
+ return (5000 + 5 * chan_num);
+ else if (global_op_class >= 109 && global_op_class <= 110)
+ return (4000 + 5 * chan_num);
+ else if (global_op_class >= 83 && global_op_class <= 84)
+ return (2407 + 5 * chan_num);
+ else if (global_op_class == 81)
+ return (2407 + 5 * chan_num);
+ else if (global_op_class == 82)
+ return (2414 + 5 * chan_num);
+ else if (global_op_class == 180)
+ return (56160 + 5 * chan_num);
+ else
+ return 0;
+}
+EXPORT_SYMBOL(ieee80211_channel_op_class_to_frequency);
The function ieee80211_operating_class_to_band() uses ranges within
switch statement, eg.:
case 128 ... 130:
*band = NL80211_BAND_5GHZ;
return true;
For consistency it might be good to do the same here.
Regards,
Arend