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 <asinghal@xxxxxxxxxxxxxx> --- 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