diff options
Diffstat (limited to 'drivers/net/wireless/mac80211_hwsim.c')
| -rw-r--r-- | drivers/net/wireless/mac80211_hwsim.c | 303 | 
1 files changed, 200 insertions, 103 deletions
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c index 772e54f0696f..635956024e88 100644 --- a/drivers/net/wireless/mac80211_hwsim.c +++ b/drivers/net/wireless/mac80211_hwsim.c @@ -2216,7 +2216,8 @@ static int mac80211_hwsim_roc(struct ieee80211_hw *hw,  	return 0;  } -static int mac80211_hwsim_croc(struct ieee80211_hw *hw) +static int mac80211_hwsim_croc(struct ieee80211_hw *hw, +			       struct ieee80211_vif *vif)  {  	struct mac80211_hwsim_data *hwsim = hw->priv; @@ -2496,116 +2497,211 @@ out_err:  	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, - -			/* Leave all the other PHY capability bytes unset, as -			 * DCM, beam forming, RU and PPE threshold information -			 * are not supported -			 */ +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), +			},  		}, -		.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, - -			/* Leave all the other PHY capability bytes unset, as -			 * DCM, beam forming, RU and PPE threshold information -			 * are not supported -			 */ +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), +			},  		}, -		.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_hswim_he_capab(struct ieee80211_supported_band *sband) +static void mac80211_hwsim_he_capab(struct ieee80211_supported_band *sband)  { -	if (sband->band == NL80211_BAND_2GHZ) +	u16 n_iftype_data; + +	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) +			(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 +			(struct ieee80211_sband_iftype_data *)he_capa_5ghz; +	} else {  		return; +	} -	sband->n_iftype_data = 1; +	sband->n_iftype_data = n_iftype_data;  }  #ifdef CONFIG_MAC80211_MESH @@ -2805,12 +2901,6 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,  	ieee80211_hw_set(hw, SIGNAL_DBM);  	ieee80211_hw_set(hw, SUPPORTS_PS);  	ieee80211_hw_set(hw, TDLS_WIDER_BW); - -	/* We only have SW crypto and only implement the A-MPDU API -	 * (but don't really build A-MPDUs) so can have extended key -	 * support -	 */ -	ieee80211_hw_set(hw, EXT_KEY_ID_NATIVE);  	if (rctbl)  		ieee80211_hw_set(hw, SUPPORTS_RC_TABLE);  	ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID); @@ -2897,7 +2987,7 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,  		sband->ht_cap.mcs.rx_mask[1] = 0xff;  		sband->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; -		mac80211_hswim_he_capab(sband); +		mac80211_hwsim_he_capab(sband);  		hw->wiphy->bands[band] = sband;  	} @@ -3233,6 +3323,7 @@ static int hwsim_cloned_frame_received_nl(struct sk_buff *skb_2,  {  	struct mac80211_hwsim_data *data2;  	struct ieee80211_rx_status rx_status; +	struct ieee80211_hdr *hdr;  	const u8 *dst;  	int frame_data_len;  	void *frame_data; @@ -3299,6 +3390,12 @@ static int hwsim_cloned_frame_received_nl(struct sk_buff *skb_2,  	rx_status.rate_idx = nla_get_u32(info->attrs[HWSIM_ATTR_RX_RATE]);  	rx_status.signal = nla_get_u32(info->attrs[HWSIM_ATTR_SIGNAL]); +	hdr = (void *)skb->data; + +	if (ieee80211_is_beacon(hdr->frame_control) || +	    ieee80211_is_probe_resp(hdr->frame_control)) +		rx_status.boottime_ns = ktime_get_boottime_ns(); +  	memcpy(IEEE80211_SKB_RXCB(skb), &rx_status, sizeof(rx_status));  	data2->rx_pkts++;  	data2->rx_bytes += skb->len;  |