Add EDMG bandwidth to channel frequency APIs
Add EDMG bandwidth to CHANWIDTH_ defines. Update API ieee80211_freq_to_channel_ext() to support EDMG bandwidth for EDMG channels. Signed-off-by: Ahmad Masri <amasri@codeaurora.org>
This commit is contained in:
parent
46cb161a81
commit
a19277a28b
4 changed files with 79 additions and 23 deletions
|
@ -416,6 +416,10 @@ enum chan_width {
|
||||||
CHAN_WIDTH_80,
|
CHAN_WIDTH_80,
|
||||||
CHAN_WIDTH_80P80,
|
CHAN_WIDTH_80P80,
|
||||||
CHAN_WIDTH_160,
|
CHAN_WIDTH_160,
|
||||||
|
CHAN_WIDTH_2160,
|
||||||
|
CHAN_WIDTH_4320,
|
||||||
|
CHAN_WIDTH_6480,
|
||||||
|
CHAN_WIDTH_8640,
|
||||||
CHAN_WIDTH_UNKNOWN
|
CHAN_WIDTH_UNKNOWN
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -720,13 +720,14 @@ enum hostapd_hw_mode ieee80211_freq_to_chan(int freq, u8 *channel)
|
||||||
* for HT40 and VHT. DFS channels are not covered.
|
* for HT40 and VHT. DFS channels are not covered.
|
||||||
* @freq: Frequency (MHz) to convert
|
* @freq: Frequency (MHz) to convert
|
||||||
* @sec_channel: 0 = non-HT40, 1 = sec. channel above, -1 = sec. channel below
|
* @sec_channel: 0 = non-HT40, 1 = sec. channel above, -1 = sec. channel below
|
||||||
* @vht: VHT channel width (CHANWIDTH_*)
|
* @chanwidth: VHT/EDMG channel width (CHANWIDTH_*)
|
||||||
* @op_class: Buffer for returning operating class
|
* @op_class: Buffer for returning operating class
|
||||||
* @channel: Buffer for returning channel number
|
* @channel: Buffer for returning channel number
|
||||||
* Returns: hw_mode on success, NUM_HOSTAPD_MODES on failure
|
* Returns: hw_mode on success, NUM_HOSTAPD_MODES on failure
|
||||||
*/
|
*/
|
||||||
enum hostapd_hw_mode ieee80211_freq_to_channel_ext(unsigned int freq,
|
enum hostapd_hw_mode ieee80211_freq_to_channel_ext(unsigned int freq,
|
||||||
int sec_channel, int vht,
|
int sec_channel,
|
||||||
|
int chanwidth,
|
||||||
u8 *op_class, u8 *channel)
|
u8 *op_class, u8 *channel)
|
||||||
{
|
{
|
||||||
u8 vht_opclass;
|
u8 vht_opclass;
|
||||||
|
@ -740,7 +741,7 @@ enum hostapd_hw_mode ieee80211_freq_to_channel_ext(unsigned int freq,
|
||||||
if ((freq - 2407) % 5)
|
if ((freq - 2407) % 5)
|
||||||
return NUM_HOSTAPD_MODES;
|
return NUM_HOSTAPD_MODES;
|
||||||
|
|
||||||
if (vht)
|
if (chanwidth)
|
||||||
return NUM_HOSTAPD_MODES;
|
return NUM_HOSTAPD_MODES;
|
||||||
|
|
||||||
/* 2.407 GHz, channels 1..13 */
|
/* 2.407 GHz, channels 1..13 */
|
||||||
|
@ -757,7 +758,7 @@ enum hostapd_hw_mode ieee80211_freq_to_channel_ext(unsigned int freq,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (freq == 2484) {
|
if (freq == 2484) {
|
||||||
if (sec_channel || vht)
|
if (sec_channel || chanwidth)
|
||||||
return NUM_HOSTAPD_MODES;
|
return NUM_HOSTAPD_MODES;
|
||||||
|
|
||||||
*op_class = 82; /* channel 14 */
|
*op_class = 82; /* channel 14 */
|
||||||
|
@ -774,7 +775,7 @@ enum hostapd_hw_mode ieee80211_freq_to_channel_ext(unsigned int freq,
|
||||||
return HOSTAPD_MODE_IEEE80211A;
|
return HOSTAPD_MODE_IEEE80211A;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (vht) {
|
switch (chanwidth) {
|
||||||
case CHANWIDTH_80MHZ:
|
case CHANWIDTH_80MHZ:
|
||||||
vht_opclass = 128;
|
vht_opclass = 128;
|
||||||
break;
|
break;
|
||||||
|
@ -875,17 +876,6 @@ enum hostapd_hw_mode ieee80211_freq_to_channel_ext(unsigned int freq,
|
||||||
return HOSTAPD_MODE_IEEE80211A;
|
return HOSTAPD_MODE_IEEE80211A;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 56.16 GHz, channel 1..6 */
|
|
||||||
if (freq >= 56160 + 2160 * 1 && freq <= 56160 + 2160 * 6) {
|
|
||||||
if (sec_channel || vht)
|
|
||||||
return NUM_HOSTAPD_MODES;
|
|
||||||
|
|
||||||
*channel = (freq - 56160) / 2160;
|
|
||||||
*op_class = 180;
|
|
||||||
|
|
||||||
return HOSTAPD_MODE_IEEE80211AD;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (freq > 5940 && freq <= 7105) {
|
if (freq > 5940 && freq <= 7105) {
|
||||||
int bw;
|
int bw;
|
||||||
u8 idx = (freq - 5940) / 5;
|
u8 idx = (freq - 5940) / 5;
|
||||||
|
@ -899,6 +889,48 @@ enum hostapd_hw_mode ieee80211_freq_to_channel_ext(unsigned int freq,
|
||||||
return HOSTAPD_MODE_IEEE80211A;
|
return HOSTAPD_MODE_IEEE80211A;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 56.16 GHz, channel 1..6 */
|
||||||
|
if (freq >= 56160 + 2160 * 1 && freq <= 56160 + 2160 * 6) {
|
||||||
|
if (sec_channel)
|
||||||
|
return NUM_HOSTAPD_MODES;
|
||||||
|
|
||||||
|
switch (chanwidth) {
|
||||||
|
case CHANWIDTH_USE_HT:
|
||||||
|
case CHANWIDTH_2160MHZ:
|
||||||
|
*channel = (freq - 56160) / 2160;
|
||||||
|
*op_class = 180;
|
||||||
|
break;
|
||||||
|
case CHANWIDTH_4320MHZ:
|
||||||
|
/* EDMG channels 9 - 13 */
|
||||||
|
if (freq > 56160 + 2160 * 5)
|
||||||
|
return NUM_HOSTAPD_MODES;
|
||||||
|
|
||||||
|
*channel = (freq - 56160) / 2160 + 8;
|
||||||
|
*op_class = 181;
|
||||||
|
break;
|
||||||
|
case CHANWIDTH_6480MHZ:
|
||||||
|
/* EDMG channels 17 - 20 */
|
||||||
|
if (freq > 56160 + 2160 * 4)
|
||||||
|
return NUM_HOSTAPD_MODES;
|
||||||
|
|
||||||
|
*channel = (freq - 56160) / 2160 + 16;
|
||||||
|
*op_class = 182;
|
||||||
|
break;
|
||||||
|
case CHANWIDTH_8640MHZ:
|
||||||
|
/* EDMG channels 25 - 27 */
|
||||||
|
if (freq > 56160 + 2160 * 3)
|
||||||
|
return NUM_HOSTAPD_MODES;
|
||||||
|
|
||||||
|
*channel = (freq - 56160) / 2160 + 24;
|
||||||
|
*op_class = 183;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return NUM_HOSTAPD_MODES;
|
||||||
|
}
|
||||||
|
|
||||||
|
return HOSTAPD_MODE_IEEE80211AD;
|
||||||
|
}
|
||||||
|
|
||||||
return NUM_HOSTAPD_MODES;
|
return NUM_HOSTAPD_MODES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -906,27 +938,39 @@ enum hostapd_hw_mode ieee80211_freq_to_channel_ext(unsigned int freq,
|
||||||
int ieee80211_chaninfo_to_channel(unsigned int freq, enum chan_width chanwidth,
|
int ieee80211_chaninfo_to_channel(unsigned int freq, enum chan_width chanwidth,
|
||||||
int sec_channel, u8 *op_class, u8 *channel)
|
int sec_channel, u8 *op_class, u8 *channel)
|
||||||
{
|
{
|
||||||
int vht = CHAN_WIDTH_UNKNOWN;
|
int cw = CHAN_WIDTH_UNKNOWN;
|
||||||
|
|
||||||
switch (chanwidth) {
|
switch (chanwidth) {
|
||||||
case CHAN_WIDTH_UNKNOWN:
|
case CHAN_WIDTH_UNKNOWN:
|
||||||
case CHAN_WIDTH_20_NOHT:
|
case CHAN_WIDTH_20_NOHT:
|
||||||
case CHAN_WIDTH_20:
|
case CHAN_WIDTH_20:
|
||||||
case CHAN_WIDTH_40:
|
case CHAN_WIDTH_40:
|
||||||
vht = CHANWIDTH_USE_HT;
|
cw = CHANWIDTH_USE_HT;
|
||||||
break;
|
break;
|
||||||
case CHAN_WIDTH_80:
|
case CHAN_WIDTH_80:
|
||||||
vht = CHANWIDTH_80MHZ;
|
cw = CHANWIDTH_80MHZ;
|
||||||
break;
|
break;
|
||||||
case CHAN_WIDTH_80P80:
|
case CHAN_WIDTH_80P80:
|
||||||
vht = CHANWIDTH_80P80MHZ;
|
cw = CHANWIDTH_80P80MHZ;
|
||||||
break;
|
break;
|
||||||
case CHAN_WIDTH_160:
|
case CHAN_WIDTH_160:
|
||||||
vht = CHANWIDTH_160MHZ;
|
cw = CHANWIDTH_160MHZ;
|
||||||
|
break;
|
||||||
|
case CHAN_WIDTH_2160:
|
||||||
|
cw = CHANWIDTH_2160MHZ;
|
||||||
|
break;
|
||||||
|
case CHAN_WIDTH_4320:
|
||||||
|
cw = CHANWIDTH_4320MHZ;
|
||||||
|
break;
|
||||||
|
case CHAN_WIDTH_6480:
|
||||||
|
cw = CHANWIDTH_6480MHZ;
|
||||||
|
break;
|
||||||
|
case CHAN_WIDTH_8640:
|
||||||
|
cw = CHANWIDTH_8640MHZ;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ieee80211_freq_to_channel_ext(freq, sec_channel, vht, op_class,
|
if (ieee80211_freq_to_channel_ext(freq, sec_channel, cw, op_class,
|
||||||
channel) == NUM_HOSTAPD_MODES) {
|
channel) == NUM_HOSTAPD_MODES) {
|
||||||
wpa_printf(MSG_WARNING,
|
wpa_printf(MSG_WARNING,
|
||||||
"Cannot determine operating class and channel (freq=%u chanwidth=%d sec_channel=%d)",
|
"Cannot determine operating class and channel (freq=%u chanwidth=%d sec_channel=%d)",
|
||||||
|
|
|
@ -1285,11 +1285,15 @@ struct ieee80211_ampe_ie {
|
||||||
|
|
||||||
#define VHT_RX_NSS_MAX_STREAMS 8
|
#define VHT_RX_NSS_MAX_STREAMS 8
|
||||||
|
|
||||||
/* VHT channel widths */
|
/* VHT/EDMG channel widths */
|
||||||
#define CHANWIDTH_USE_HT 0
|
#define CHANWIDTH_USE_HT 0
|
||||||
#define CHANWIDTH_80MHZ 1
|
#define CHANWIDTH_80MHZ 1
|
||||||
#define CHANWIDTH_160MHZ 2
|
#define CHANWIDTH_160MHZ 2
|
||||||
#define CHANWIDTH_80P80MHZ 3
|
#define CHANWIDTH_80P80MHZ 3
|
||||||
|
#define CHANWIDTH_2160MHZ 4
|
||||||
|
#define CHANWIDTH_4320MHZ 5
|
||||||
|
#define CHANWIDTH_6480MHZ 6
|
||||||
|
#define CHANWIDTH_8640MHZ 7
|
||||||
|
|
||||||
#define HE_NSS_MAX_STREAMS 8
|
#define HE_NSS_MAX_STREAMS 8
|
||||||
|
|
||||||
|
|
|
@ -524,6 +524,10 @@ static int calculate_chan_offset(int width, int freq, int cf1, int cf2)
|
||||||
break;
|
break;
|
||||||
case CHAN_WIDTH_UNKNOWN:
|
case CHAN_WIDTH_UNKNOWN:
|
||||||
case CHAN_WIDTH_80P80:
|
case CHAN_WIDTH_80P80:
|
||||||
|
case CHAN_WIDTH_2160:
|
||||||
|
case CHAN_WIDTH_4320:
|
||||||
|
case CHAN_WIDTH_6480:
|
||||||
|
case CHAN_WIDTH_8640:
|
||||||
/* FIXME: implement this */
|
/* FIXME: implement this */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue