File Index
Files and directories
Sign in
FILE

util.c

File preview with syntax highlighting.

linux-6.19.14/net/mac80211/tests/util.c C
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * Utilities for mac80211 unit testing
  4 *
  5 * Copyright (C) 2024 Intel Corporation
  6 */
  7#include <linux/ieee80211.h>
  8#include <net/mac80211.h>
  9#include <kunit/test.h>
 10#include <kunit/test-bug.h>
 11#include "util.h"
 12
 13#define CHAN2G(_freq)  { \
 14	.band = NL80211_BAND_2GHZ, \
 15	.center_freq = (_freq), \
 16	.hw_value = (_freq), \
 17}
 18
 19static const struct ieee80211_channel channels_2ghz[] = {
 20	CHAN2G(2412), /* Channel 1 */
 21	CHAN2G(2417), /* Channel 2 */
 22	CHAN2G(2422), /* Channel 3 */
 23	CHAN2G(2427), /* Channel 4 */
 24	CHAN2G(2432), /* Channel 5 */
 25	CHAN2G(2437), /* Channel 6 */
 26	CHAN2G(2442), /* Channel 7 */
 27	CHAN2G(2447), /* Channel 8 */
 28	CHAN2G(2452), /* Channel 9 */
 29	CHAN2G(2457), /* Channel 10 */
 30	CHAN2G(2462), /* Channel 11 */
 31	CHAN2G(2467), /* Channel 12 */
 32	CHAN2G(2472), /* Channel 13 */
 33	CHAN2G(2484), /* Channel 14 */
 34};
 35
 36#define CHAN5G(_freq) { \
 37	.band = NL80211_BAND_5GHZ, \
 38	.center_freq = (_freq), \
 39	.hw_value = (_freq), \
 40}
 41
 42static const struct ieee80211_channel channels_5ghz[] = {
 43	CHAN5G(5180), /* Channel 36 */
 44	CHAN5G(5200), /* Channel 40 */
 45	CHAN5G(5220), /* Channel 44 */
 46	CHAN5G(5240), /* Channel 48 */
 47};
 48
 49static const struct ieee80211_rate bitrates[] = {
 50	{ .bitrate = 10 },
 51	{ .bitrate = 20, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
 52	{ .bitrate = 55, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
 53	{ .bitrate = 110, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
 54	{ .bitrate = 60 },
 55	{ .bitrate = 90 },
 56	{ .bitrate = 120 },
 57	{ .bitrate = 180 },
 58	{ .bitrate = 240 },
 59	{ .bitrate = 360 },
 60	{ .bitrate = 480 },
 61	{ .bitrate = 540 }
 62};
 63
 64/* Copied from hwsim except that it only supports 4 EHT streams and STA/P2P mode */
 65static const struct ieee80211_sband_iftype_data sband_capa_5ghz[] = {
 66	{
 67		.types_mask = BIT(NL80211_IFTYPE_STATION) |
 68			      BIT(NL80211_IFTYPE_P2P_CLIENT),
 69		.he_cap = {
 70			.has_he = true,
 71			.he_cap_elem = {
 72				.mac_cap_info[0] =
 73					IEEE80211_HE_MAC_CAP0_HTC_HE,
 74				.mac_cap_info[1] =
 75					IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US |
 76					IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
 77				.mac_cap_info[2] =
 78					IEEE80211_HE_MAC_CAP2_BSR |
 79					IEEE80211_HE_MAC_CAP2_MU_CASCADING |
 80					IEEE80211_HE_MAC_CAP2_ACK_EN,
 81				.mac_cap_info[3] =
 82					IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
 83					IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
 84				.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
 85				.phy_cap_info[0] =
 86					IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
 87					IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
 88					IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G,
 89				.phy_cap_info[1] =
 90					IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
 91					IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
 92					IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
 93					IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS,
 94				.phy_cap_info[2] =
 95					IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US |
 96					IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ |
 97					IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ |
 98					IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
 99					IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO,
100
101				/* Leave all the other PHY capability bytes
102				 * unset, as DCM, beam forming, RU and PPE
103				 * threshold information are not supported
104				 */
105			},
106			.he_mcs_nss_supp = {
107				.rx_mcs_80 = cpu_to_le16(0xfffa),
108				.tx_mcs_80 = cpu_to_le16(0xfffa),
109				.rx_mcs_160 = cpu_to_le16(0xfffa),
110				.tx_mcs_160 = cpu_to_le16(0xfffa),
111				.rx_mcs_80p80 = cpu_to_le16(0xfffa),
112				.tx_mcs_80p80 = cpu_to_le16(0xfffa),
113			},
114		},
115		.eht_cap = {
116			.has_eht = true,
117			.eht_cap_elem = {
118				.mac_cap_info[0] =
119					IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS |
120					IEEE80211_EHT_MAC_CAP0_OM_CONTROL |
121					IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1,
122				.phy_cap_info[0] =
123					IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ |
124					IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI |
125					IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO |
126					IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER |
127					IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE |
128					IEEE80211_EHT_PHY_CAP0_BEAMFORMEE_SS_80MHZ_MASK,
129				.phy_cap_info[1] =
130					IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_80MHZ_MASK |
131					IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK,
132				.phy_cap_info[2] =
133					IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_80MHZ_MASK |
134					IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK,
135				.phy_cap_info[3] =
136					IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK |
137					IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
138					IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK |
139					IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
140					IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK |
141					IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
142					IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK,
143				.phy_cap_info[4] =
144					IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO |
145					IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP |
146					IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP |
147					IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI |
148					IEEE80211_EHT_PHY_CAP4_MAX_NC_MASK,
149				.phy_cap_info[5] =
150					IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK |
151					IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP |
152					IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP |
153					IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT |
154					IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK |
155					IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK,
156				.phy_cap_info[6] =
157					IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK |
158					IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK,
159				.phy_cap_info[7] =
160					IEEE80211_EHT_PHY_CAP7_20MHZ_STA_RX_NDP_WIDER_BW |
161					IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
162					IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
163					IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
164					IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ,
165			},
166
167			/* For all MCS and bandwidth, set 4 NSS for both Tx and
168			 * Rx
169			 */
170			.eht_mcs_nss_supp = {
171				/*
172				 * As B1 and B2 are set in the supported
173				 * channel width set field in the HE PHY
174				 * capabilities information field include all
175				 * the following MCS/NSS.
176				 */
177				.bw._80 = {
178					.rx_tx_mcs9_max_nss = 0x44,
179					.rx_tx_mcs11_max_nss = 0x44,
180					.rx_tx_mcs13_max_nss = 0x44,
181				},
182				.bw._160 = {
183					.rx_tx_mcs9_max_nss = 0x44,
184					.rx_tx_mcs11_max_nss = 0x44,
185					.rx_tx_mcs13_max_nss = 0x44,
186				},
187			},
188			/* PPE threshold information is not supported */
189		},
190	},
191};
192
193int t_sdata_init(struct kunit_resource *resource, void *ctx)
194{
195	struct kunit *test = kunit_get_current_test();
196	struct t_sdata *t_sdata;
197
198	t_sdata = kzalloc(sizeof(*t_sdata), GFP_KERNEL);
199	KUNIT_ASSERT_NOT_NULL(test, t_sdata);
200
201	resource->data = t_sdata;
202	resource->name = "sdata";
203
204	t_sdata->sdata = kzalloc(sizeof(*t_sdata->sdata), GFP_KERNEL);
205	KUNIT_ASSERT_NOT_NULL(test, t_sdata->sdata);
206
207	t_sdata->wiphy = kzalloc(sizeof(*t_sdata->wiphy), GFP_KERNEL);
208	KUNIT_ASSERT_NOT_NULL(test, t_sdata->wiphy);
209
210	strscpy(t_sdata->sdata->name, "kunit");
211
212	t_sdata->sdata->local = &t_sdata->local;
213	t_sdata->sdata->local->hw.wiphy = t_sdata->wiphy;
214	t_sdata->sdata->wdev.wiphy = t_sdata->wiphy;
215	t_sdata->sdata->vif.type = NL80211_IFTYPE_STATION;
216
217	t_sdata->sdata->deflink.sdata = t_sdata->sdata;
218	t_sdata->sdata->deflink.link_id = 0;
219
220	t_sdata->wiphy->bands[NL80211_BAND_2GHZ] = &t_sdata->band_2ghz;
221	t_sdata->wiphy->bands[NL80211_BAND_5GHZ] = &t_sdata->band_5ghz;
222
223	for (int band = NL80211_BAND_2GHZ; band <= NL80211_BAND_5GHZ; band++) {
224		struct ieee80211_supported_band *sband;
225
226		sband = t_sdata->wiphy->bands[band];
227		sband->band = band;
228
229		sband->bitrates =
230			kmemdup(bitrates, sizeof(bitrates), GFP_KERNEL);
231		sband->n_bitrates = ARRAY_SIZE(bitrates);
232
233		/* Initialize channels, feel free to add more channels/bands */
234		switch (band) {
235		case NL80211_BAND_2GHZ:
236			sband->channels = kmemdup(channels_2ghz,
237						  sizeof(channels_2ghz),
238						  GFP_KERNEL);
239			sband->n_channels = ARRAY_SIZE(channels_2ghz);
240			sband->bitrates = kmemdup(bitrates,
241						  sizeof(bitrates),
242						  GFP_KERNEL);
243			sband->n_bitrates = ARRAY_SIZE(bitrates);
244			break;
245		case NL80211_BAND_5GHZ:
246			sband->channels = kmemdup(channels_5ghz,
247						  sizeof(channels_5ghz),
248						  GFP_KERNEL);
249			sband->n_channels = ARRAY_SIZE(channels_5ghz);
250			sband->bitrates = kmemdup(bitrates,
251						  sizeof(bitrates),
252						  GFP_KERNEL);
253			sband->n_bitrates = ARRAY_SIZE(bitrates);
254
255			sband->vht_cap.vht_supported = true;
256			sband->vht_cap.cap =
257				IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 |
258				IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ |
259				IEEE80211_VHT_CAP_RXLDPC |
260				IEEE80211_VHT_CAP_SHORT_GI_80 |
261				IEEE80211_VHT_CAP_SHORT_GI_160 |
262				IEEE80211_VHT_CAP_TXSTBC |
263				IEEE80211_VHT_CAP_RXSTBC_4 |
264				IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK;
265			sband->vht_cap.vht_mcs.rx_mcs_map =
266				cpu_to_le16(IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 |
267					    IEEE80211_VHT_MCS_SUPPORT_0_9 << 2 |
268					    IEEE80211_VHT_MCS_SUPPORT_0_9 << 4 |
269					    IEEE80211_VHT_MCS_SUPPORT_0_9 << 6);
270			sband->vht_cap.vht_mcs.tx_mcs_map =
271				sband->vht_cap.vht_mcs.rx_mcs_map;
272			break;
273		default:
274			continue;
275		}
276
277		sband->ht_cap.ht_supported = band != NL80211_BAND_6GHZ;
278		sband->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
279					IEEE80211_HT_CAP_GRN_FLD |
280					IEEE80211_HT_CAP_SGI_20 |
281					IEEE80211_HT_CAP_SGI_40 |
282					IEEE80211_HT_CAP_DSSSCCK40;
283		sband->ht_cap.ampdu_factor = 0x3;
284		sband->ht_cap.ampdu_density = 0x6;
285		memset(&sband->ht_cap.mcs, 0, sizeof(sband->ht_cap.mcs));
286		sband->ht_cap.mcs.rx_mask[0] = 0xff;
287		sband->ht_cap.mcs.rx_mask[1] = 0xff;
288		sband->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
289	}
290
291	ieee80211_set_sband_iftype_data(&t_sdata->band_5ghz, sband_capa_5ghz);
292
293	return 0;
294}
295
296void t_sdata_exit(struct kunit_resource *resource)
297{
298	struct t_sdata *t_sdata = resource->data;
299
300	kfree(t_sdata->band_2ghz.channels);
301	kfree(t_sdata->band_2ghz.bitrates);
302	kfree(t_sdata->band_5ghz.channels);
303	kfree(t_sdata->band_5ghz.bitrates);
304
305	kfree(t_sdata->sdata);
306	kfree(t_sdata->wiphy);
307
308	kfree(t_sdata);
309}
~/ Read-only file preview.