mirror of https://gitee.com/openkylin/linux.git
mac80211_hwsim: Register support for HE meshpoint
Some features of 802.11ax without central organizing (AP) STA can also be used in mesh mode. hwsim can be used to assist initial development of these features without having access to HW. Signed-off-by: Sven Eckelmann <seckelmann@datto.com> Link: https://lore.kernel.org/r/20190813063657.7544-1-sven@narfation.org Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
4b2c5a14cd
commit
b697746c62
|
@ -2497,116 +2497,211 @@ static void hwsim_mcast_new_radio(int id, struct genl_info *info,
|
|||
nlmsg_free(mcast_skb);
|
||||
}
|
||||
|
||||
static const struct ieee80211_sband_iftype_data he_capa_2ghz = {
|
||||
/* TODO: should we support other types, e.g., P2P?*/
|
||||
.types_mask = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP),
|
||||
.he_cap = {
|
||||
.has_he = true,
|
||||
.he_cap_elem = {
|
||||
.mac_cap_info[0] =
|
||||
IEEE80211_HE_MAC_CAP0_HTC_HE,
|
||||
.mac_cap_info[1] =
|
||||
IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US |
|
||||
IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
|
||||
.mac_cap_info[2] =
|
||||
IEEE80211_HE_MAC_CAP2_BSR |
|
||||
IEEE80211_HE_MAC_CAP2_MU_CASCADING |
|
||||
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
||||
.mac_cap_info[3] =
|
||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
|
||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU,
|
||||
.phy_cap_info[1] =
|
||||
IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
|
||||
IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
|
||||
IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
|
||||
IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS,
|
||||
.phy_cap_info[2] =
|
||||
IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US |
|
||||
IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ |
|
||||
IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ |
|
||||
IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
|
||||
IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO,
|
||||
static const struct ieee80211_sband_iftype_data he_capa_2ghz[] = {
|
||||
{
|
||||
/* TODO: should we support other types, e.g., P2P?*/
|
||||
.types_mask = BIT(NL80211_IFTYPE_STATION) |
|
||||
BIT(NL80211_IFTYPE_AP),
|
||||
.he_cap = {
|
||||
.has_he = true,
|
||||
.he_cap_elem = {
|
||||
.mac_cap_info[0] =
|
||||
IEEE80211_HE_MAC_CAP0_HTC_HE,
|
||||
.mac_cap_info[1] =
|
||||
IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US |
|
||||
IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
|
||||
.mac_cap_info[2] =
|
||||
IEEE80211_HE_MAC_CAP2_BSR |
|
||||
IEEE80211_HE_MAC_CAP2_MU_CASCADING |
|
||||
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
||||
.mac_cap_info[3] =
|
||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
|
||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU,
|
||||
.phy_cap_info[1] =
|
||||
IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
|
||||
IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
|
||||
IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
|
||||
IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS,
|
||||
.phy_cap_info[2] =
|
||||
IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US |
|
||||
IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ |
|
||||
IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ |
|
||||
IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
|
||||
IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO,
|
||||
|
||||
/* Leave all the other PHY capability bytes unset, as
|
||||
* DCM, beam forming, RU and PPE threshold information
|
||||
* are not supported
|
||||
*/
|
||||
},
|
||||
.he_mcs_nss_supp = {
|
||||
.rx_mcs_80 = cpu_to_le16(0xfffa),
|
||||
.tx_mcs_80 = cpu_to_le16(0xfffa),
|
||||
.rx_mcs_160 = cpu_to_le16(0xffff),
|
||||
.tx_mcs_160 = cpu_to_le16(0xffff),
|
||||
.rx_mcs_80p80 = cpu_to_le16(0xffff),
|
||||
.tx_mcs_80p80 = cpu_to_le16(0xffff),
|
||||
/* Leave all the other PHY capability bytes
|
||||
* unset, as DCM, beam forming, RU and PPE
|
||||
* threshold information are not supported
|
||||
*/
|
||||
},
|
||||
.he_mcs_nss_supp = {
|
||||
.rx_mcs_80 = cpu_to_le16(0xfffa),
|
||||
.tx_mcs_80 = cpu_to_le16(0xfffa),
|
||||
.rx_mcs_160 = cpu_to_le16(0xffff),
|
||||
.tx_mcs_160 = cpu_to_le16(0xffff),
|
||||
.rx_mcs_80p80 = cpu_to_le16(0xffff),
|
||||
.tx_mcs_80p80 = cpu_to_le16(0xffff),
|
||||
},
|
||||
},
|
||||
},
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
{
|
||||
/* TODO: should we support other types, e.g., IBSS?*/
|
||||
.types_mask = BIT(NL80211_IFTYPE_MESH_POINT),
|
||||
.he_cap = {
|
||||
.has_he = true,
|
||||
.he_cap_elem = {
|
||||
.mac_cap_info[0] =
|
||||
IEEE80211_HE_MAC_CAP0_HTC_HE,
|
||||
.mac_cap_info[1] =
|
||||
IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
|
||||
.mac_cap_info[2] =
|
||||
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
||||
.mac_cap_info[3] =
|
||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
|
||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU,
|
||||
.phy_cap_info[1] =
|
||||
IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
|
||||
IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
|
||||
IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
|
||||
IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS,
|
||||
.phy_cap_info[2] = 0,
|
||||
|
||||
/* Leave all the other PHY capability bytes
|
||||
* unset, as DCM, beam forming, RU and PPE
|
||||
* threshold information are not supported
|
||||
*/
|
||||
},
|
||||
.he_mcs_nss_supp = {
|
||||
.rx_mcs_80 = cpu_to_le16(0xfffa),
|
||||
.tx_mcs_80 = cpu_to_le16(0xfffa),
|
||||
.rx_mcs_160 = cpu_to_le16(0xffff),
|
||||
.tx_mcs_160 = cpu_to_le16(0xffff),
|
||||
.rx_mcs_80p80 = cpu_to_le16(0xffff),
|
||||
.tx_mcs_80p80 = cpu_to_le16(0xffff),
|
||||
},
|
||||
},
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
static const struct ieee80211_sband_iftype_data he_capa_5ghz = {
|
||||
/* TODO: should we support other types, e.g., P2P?*/
|
||||
.types_mask = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP),
|
||||
.he_cap = {
|
||||
.has_he = true,
|
||||
.he_cap_elem = {
|
||||
.mac_cap_info[0] =
|
||||
IEEE80211_HE_MAC_CAP0_HTC_HE,
|
||||
.mac_cap_info[1] =
|
||||
IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US |
|
||||
IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
|
||||
.mac_cap_info[2] =
|
||||
IEEE80211_HE_MAC_CAP2_BSR |
|
||||
IEEE80211_HE_MAC_CAP2_MU_CASCADING |
|
||||
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
||||
.mac_cap_info[3] =
|
||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
|
||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU,
|
||||
.phy_cap_info[0] =
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G,
|
||||
.phy_cap_info[1] =
|
||||
IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
|
||||
IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
|
||||
IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
|
||||
IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS,
|
||||
.phy_cap_info[2] =
|
||||
IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US |
|
||||
IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ |
|
||||
IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ |
|
||||
IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
|
||||
IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO,
|
||||
static const struct ieee80211_sband_iftype_data he_capa_5ghz[] = {
|
||||
{
|
||||
/* TODO: should we support other types, e.g., P2P?*/
|
||||
.types_mask = BIT(NL80211_IFTYPE_STATION) |
|
||||
BIT(NL80211_IFTYPE_AP),
|
||||
.he_cap = {
|
||||
.has_he = true,
|
||||
.he_cap_elem = {
|
||||
.mac_cap_info[0] =
|
||||
IEEE80211_HE_MAC_CAP0_HTC_HE,
|
||||
.mac_cap_info[1] =
|
||||
IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US |
|
||||
IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
|
||||
.mac_cap_info[2] =
|
||||
IEEE80211_HE_MAC_CAP2_BSR |
|
||||
IEEE80211_HE_MAC_CAP2_MU_CASCADING |
|
||||
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
||||
.mac_cap_info[3] =
|
||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
|
||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU,
|
||||
.phy_cap_info[0] =
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G,
|
||||
.phy_cap_info[1] =
|
||||
IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
|
||||
IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
|
||||
IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
|
||||
IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS,
|
||||
.phy_cap_info[2] =
|
||||
IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US |
|
||||
IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ |
|
||||
IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ |
|
||||
IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
|
||||
IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO,
|
||||
|
||||
/* Leave all the other PHY capability bytes unset, as
|
||||
* DCM, beam forming, RU and PPE threshold information
|
||||
* are not supported
|
||||
*/
|
||||
},
|
||||
.he_mcs_nss_supp = {
|
||||
.rx_mcs_80 = cpu_to_le16(0xfffa),
|
||||
.tx_mcs_80 = cpu_to_le16(0xfffa),
|
||||
.rx_mcs_160 = cpu_to_le16(0xfffa),
|
||||
.tx_mcs_160 = cpu_to_le16(0xfffa),
|
||||
.rx_mcs_80p80 = cpu_to_le16(0xfffa),
|
||||
.tx_mcs_80p80 = cpu_to_le16(0xfffa),
|
||||
/* Leave all the other PHY capability bytes
|
||||
* unset, as DCM, beam forming, RU and PPE
|
||||
* threshold information are not supported
|
||||
*/
|
||||
},
|
||||
.he_mcs_nss_supp = {
|
||||
.rx_mcs_80 = cpu_to_le16(0xfffa),
|
||||
.tx_mcs_80 = cpu_to_le16(0xfffa),
|
||||
.rx_mcs_160 = cpu_to_le16(0xfffa),
|
||||
.tx_mcs_160 = cpu_to_le16(0xfffa),
|
||||
.rx_mcs_80p80 = cpu_to_le16(0xfffa),
|
||||
.tx_mcs_80p80 = cpu_to_le16(0xfffa),
|
||||
},
|
||||
},
|
||||
},
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
{
|
||||
/* TODO: should we support other types, e.g., IBSS?*/
|
||||
.types_mask = BIT(NL80211_IFTYPE_MESH_POINT),
|
||||
.he_cap = {
|
||||
.has_he = true,
|
||||
.he_cap_elem = {
|
||||
.mac_cap_info[0] =
|
||||
IEEE80211_HE_MAC_CAP0_HTC_HE,
|
||||
.mac_cap_info[1] =
|
||||
IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
|
||||
.mac_cap_info[2] =
|
||||
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
||||
.mac_cap_info[3] =
|
||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
|
||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU,
|
||||
.phy_cap_info[0] =
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G,
|
||||
.phy_cap_info[1] =
|
||||
IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
|
||||
IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
|
||||
IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
|
||||
IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS,
|
||||
.phy_cap_info[2] = 0,
|
||||
|
||||
/* Leave all the other PHY capability bytes
|
||||
* unset, as DCM, beam forming, RU and PPE
|
||||
* threshold information are not supported
|
||||
*/
|
||||
},
|
||||
.he_mcs_nss_supp = {
|
||||
.rx_mcs_80 = cpu_to_le16(0xfffa),
|
||||
.tx_mcs_80 = cpu_to_le16(0xfffa),
|
||||
.rx_mcs_160 = cpu_to_le16(0xfffa),
|
||||
.tx_mcs_160 = cpu_to_le16(0xfffa),
|
||||
.rx_mcs_80p80 = cpu_to_le16(0xfffa),
|
||||
.tx_mcs_80p80 = cpu_to_le16(0xfffa),
|
||||
},
|
||||
},
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
static void mac80211_hwsim_he_capab(struct ieee80211_supported_band *sband)
|
||||
{
|
||||
if (sband->band == NL80211_BAND_2GHZ)
|
||||
sband->iftype_data =
|
||||
(struct ieee80211_sband_iftype_data *)&he_capa_2ghz;
|
||||
else if (sband->band == NL80211_BAND_5GHZ)
|
||||
sband->iftype_data =
|
||||
(struct ieee80211_sband_iftype_data *)&he_capa_5ghz;
|
||||
else
|
||||
return;
|
||||
u16 n_iftype_data;
|
||||
|
||||
sband->n_iftype_data = 1;
|
||||
if (sband->band == NL80211_BAND_2GHZ) {
|
||||
n_iftype_data = ARRAY_SIZE(he_capa_2ghz);
|
||||
sband->iftype_data =
|
||||
(struct ieee80211_sband_iftype_data *)he_capa_2ghz;
|
||||
} else if (sband->band == NL80211_BAND_5GHZ) {
|
||||
n_iftype_data = ARRAY_SIZE(he_capa_5ghz);
|
||||
sband->iftype_data =
|
||||
(struct ieee80211_sband_iftype_data *)he_capa_5ghz;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
sband->n_iftype_data = n_iftype_data;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
|
|
Loading…
Reference in New Issue