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:
Ahmad Masri 2019-11-10 12:04:43 +02:00 committed by Jouni Malinen
parent 46cb161a81
commit a19277a28b
4 changed files with 79 additions and 23 deletions

View file

@ -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
}; };

View file

@ -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)",

View file

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

View file

@ -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;
} }