hostapd: update cfs0 and cfs1 for 160MHz
As per standard Draft P802.11ax_D8.0,( Table 26-9—Setting of the VHT Channel Width and VHT NSS at an HE STA transmitting the OM Control subfield ), center frequency of 160MHz should be published in HT information subset 2 of HT information when EXT NSS BW field is enabled. If the supported number of NSS in 160MHz is at least max NSS support, then center_freq_seg0 indicates the center frequency of 80MHz and center_freq_seg1 indicates the center frequency of 160MHz. If the supported number of NSS in 160MHz is less than max NSS support, then center_freq_seg0 indicates the center frequency of 80MHz and center_freq_seg1 is 0. The center frequency of 160MHz is published in HT operation information element instead. Signed-off-by: P Praneesh <ppranees@codeaurora.org>
This commit is contained in:
parent
c82091cbaa
commit
182f84d634
5 changed files with 31 additions and 0 deletions
|
@ -1229,6 +1229,8 @@ static int hostapd_config_vht_capab(struct hostapd_config *conf,
|
|||
conf->vht_capab |= VHT_CAP_RX_ANTENNA_PATTERN;
|
||||
if (os_strstr(capab, "[TX-ANTENNA-PATTERN]"))
|
||||
conf->vht_capab |= VHT_CAP_TX_ANTENNA_PATTERN;
|
||||
if (os_strstr(capab, "[EXT-NSS-BW-SUPP]"))
|
||||
conf->vht_capab |= VHT_CAP_EXTENDED_NSS_BW_SUPPORT;
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_IEEE80211AC */
|
||||
|
|
|
@ -127,7 +127,9 @@ no_update:
|
|||
u8 * hostapd_eid_ht_operation(struct hostapd_data *hapd, u8 *eid)
|
||||
{
|
||||
struct ieee80211_ht_operation *oper;
|
||||
le32 vht_capabilities_info;
|
||||
u8 *pos = eid;
|
||||
u8 chwidth;
|
||||
|
||||
if (!hapd->iconf->ieee80211n || hapd->conf->disable_11n ||
|
||||
is_6ghz_op_class(hapd->iconf->op_class))
|
||||
|
@ -143,6 +145,13 @@ u8 * hostapd_eid_ht_operation(struct hostapd_data *hapd, u8 *eid)
|
|||
oper->operation_mode = host_to_le16(hapd->iface->ht_op_mode);
|
||||
set_ht_param(hapd, oper);
|
||||
|
||||
vht_capabilities_info = host_to_le32(hapd->iface->current_mode->vht_capab);
|
||||
chwidth = hostapd_get_oper_chwidth(hapd->iconf);
|
||||
if (vht_capabilities_info & VHT_CAP_EXTENDED_NSS_BW_SUPPORT
|
||||
&& ((chwidth == CHANWIDTH_160MHZ) || (chwidth == CHANWIDTH_80P80MHZ))) {
|
||||
oper->operation_mode = host_to_le16(hapd->iconf->vht_oper_centr_freq_seg0_idx << 5);
|
||||
}
|
||||
|
||||
pos += sizeof(*oper);
|
||||
|
||||
return pos;
|
||||
|
|
|
@ -26,6 +26,7 @@ u8 * hostapd_eid_vht_capabilities(struct hostapd_data *hapd, u8 *eid, u32 nsts)
|
|||
struct ieee80211_vht_capabilities *cap;
|
||||
struct hostapd_hw_modes *mode = hapd->iface->current_mode;
|
||||
u8 *pos = eid;
|
||||
u8 chwidth;
|
||||
|
||||
if (!mode || is_6ghz_op_class(hapd->iconf->op_class))
|
||||
return eid;
|
||||
|
@ -63,6 +64,17 @@ u8 * hostapd_eid_vht_capabilities(struct hostapd_data *hapd, u8 *eid, u32 nsts)
|
|||
host_to_le32(nsts << VHT_CAP_BEAMFORMEE_STS_OFFSET);
|
||||
}
|
||||
|
||||
chwidth = hostapd_get_oper_chwidth(hapd->iconf);
|
||||
if (((host_to_le32(mode->vht_capab)) & VHT_CAP_EXTENDED_NSS_BW_SUPPORT)
|
||||
&& ((chwidth == CHANWIDTH_160MHZ) || (chwidth == CHANWIDTH_80P80MHZ))) {
|
||||
cap->vht_capabilities_info |= VHT_CAP_EXTENDED_NSS_BW_SUPPORT;
|
||||
cap->vht_capabilities_info &= ~(host_to_le32(VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ));
|
||||
cap->vht_capabilities_info &= ~(host_to_le32(VHT_CAP_SUPP_CHAN_WIDTH_160MHZ));
|
||||
cap->vht_capabilities_info &= ~(host_to_le32(VHT_CAP_SUPP_CHAN_WIDTH_MASK));
|
||||
} else {
|
||||
cap->vht_capabilities_info &= ~VHT_CAP_EXTENDED_NSS_BW_SUPPORT_MASK;
|
||||
}
|
||||
|
||||
/* Supported MCS set comes from hw */
|
||||
os_memcpy(&cap->vht_supported_mcs_set, mode->vht_mcs_set, 8);
|
||||
|
||||
|
@ -75,6 +87,7 @@ u8 * hostapd_eid_vht_capabilities(struct hostapd_data *hapd, u8 *eid, u32 nsts)
|
|||
u8 * hostapd_eid_vht_operation(struct hostapd_data *hapd, u8 *eid)
|
||||
{
|
||||
struct ieee80211_vht_operation *oper;
|
||||
le32 vht_capabilities_info;
|
||||
u8 *pos = eid;
|
||||
enum oper_chan_width oper_chwidth =
|
||||
hostapd_get_oper_chwidth(hapd->iconf);
|
||||
|
@ -110,6 +123,7 @@ u8 * hostapd_eid_vht_operation(struct hostapd_data *hapd, u8 *eid)
|
|||
oper->vht_op_info_chan_center_freq_seg1_idx = seg1;
|
||||
|
||||
oper->vht_op_info_chwidth = oper_chwidth;
|
||||
vht_capabilities_info = host_to_le32(hapd->iface->current_mode->vht_capab);
|
||||
if (oper_chwidth == CONF_OPER_CHWIDTH_160MHZ) {
|
||||
/*
|
||||
* Convert 160 MHz channel width to new style as interop
|
||||
|
@ -123,6 +137,9 @@ u8 * hostapd_eid_vht_operation(struct hostapd_data *hapd, u8 *eid)
|
|||
oper->vht_op_info_chan_center_freq_seg0_idx -= 8;
|
||||
else
|
||||
oper->vht_op_info_chan_center_freq_seg0_idx += 8;
|
||||
|
||||
if (vht_capabilities_info & VHT_CAP_EXTENDED_NSS_BW_SUPPORT)
|
||||
oper->vht_op_info_chan_center_freq_seg1_idx = 0;
|
||||
} else if (oper_chwidth == CONF_OPER_CHWIDTH_80P80MHZ) {
|
||||
/*
|
||||
* Convert 80+80 MHz channel width to new style as interop
|
||||
|
|
|
@ -898,6 +898,7 @@ int ieee80211ac_cap_check(u32 hw, u32 conf)
|
|||
VHT_CAP_CHECK(VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB);
|
||||
VHT_CAP_CHECK(VHT_CAP_RX_ANTENNA_PATTERN);
|
||||
VHT_CAP_CHECK(VHT_CAP_TX_ANTENNA_PATTERN);
|
||||
VHT_CAP_CHECK(VHT_CAP_EXTENDED_NSS_BW_SUPPORT);
|
||||
|
||||
#undef VHT_CAP_CHECK
|
||||
#undef VHT_CAP_CHECK_MAX
|
||||
|
|
|
@ -1401,6 +1401,8 @@ struct ieee80211_ampe_ie {
|
|||
#define VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB ((u32) BIT(26) | BIT(27))
|
||||
#define VHT_CAP_RX_ANTENNA_PATTERN ((u32) BIT(28))
|
||||
#define VHT_CAP_TX_ANTENNA_PATTERN ((u32) BIT(29))
|
||||
#define VHT_CAP_EXTENDED_NSS_BW_SUPPORT ((u32) BIT(30))
|
||||
#define VHT_CAP_EXTENDED_NSS_BW_SUPPORT_MASK ((u32) BIT(30) | BIT(31))
|
||||
|
||||
#define VHT_OPMODE_CHANNEL_WIDTH_MASK ((u8) BIT(0) | BIT(1))
|
||||
#define VHT_OPMODE_CHANNEL_RxNSS_MASK ((u8) BIT(4) | BIT(5) | \
|
||||
|
|
Loading…
Add table
Reference in a new issue