xref: /freebsd/sys/contrib/dev/iwlwifi/mld/tests/utils.h (revision 6b627f88584ce13118e0a24951b503c0b1f2d5a7)
1*6b627f88SBjoern A. Zeeb /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2*6b627f88SBjoern A. Zeeb /*
3*6b627f88SBjoern A. Zeeb  * Copyright (C) 2024-2025 Intel Corporation
4*6b627f88SBjoern A. Zeeb  */
5*6b627f88SBjoern A. Zeeb 
6*6b627f88SBjoern A. Zeeb #ifndef __iwl_mld_kunit_utils_h__
7*6b627f88SBjoern A. Zeeb #define __iwl_mld_kunit_utils_h__
8*6b627f88SBjoern A. Zeeb 
9*6b627f88SBjoern A. Zeeb #include <net/mac80211.h>
10*6b627f88SBjoern A. Zeeb #include <kunit/test-bug.h>
11*6b627f88SBjoern A. Zeeb 
12*6b627f88SBjoern A. Zeeb struct iwl_mld;
13*6b627f88SBjoern A. Zeeb 
14*6b627f88SBjoern A. Zeeb int iwlmld_kunit_test_init(struct kunit *test);
15*6b627f88SBjoern A. Zeeb 
16*6b627f88SBjoern A. Zeeb struct iwl_mld_kunit_link {
17*6b627f88SBjoern A. Zeeb 	const struct cfg80211_chan_def *chandef;
18*6b627f88SBjoern A. Zeeb 	u8 id;
19*6b627f88SBjoern A. Zeeb };
20*6b627f88SBjoern A. Zeeb 
21*6b627f88SBjoern A. Zeeb enum nl80211_iftype;
22*6b627f88SBjoern A. Zeeb 
23*6b627f88SBjoern A. Zeeb struct ieee80211_vif *iwlmld_kunit_add_vif(bool mlo, enum nl80211_iftype type);
24*6b627f88SBjoern A. Zeeb 
25*6b627f88SBjoern A. Zeeb struct ieee80211_bss_conf *
26*6b627f88SBjoern A. Zeeb iwlmld_kunit_add_link(struct ieee80211_vif *vif, int link_id);
27*6b627f88SBjoern A. Zeeb 
28*6b627f88SBjoern A. Zeeb #define KUNIT_ALLOC_AND_ASSERT_SIZE(test, ptr, size)			\
29*6b627f88SBjoern A. Zeeb do {									\
30*6b627f88SBjoern A. Zeeb 	(ptr) = kunit_kzalloc((test), (size), GFP_KERNEL);		\
31*6b627f88SBjoern A. Zeeb 	KUNIT_ASSERT_NOT_NULL((test), (ptr));				\
32*6b627f88SBjoern A. Zeeb } while (0)
33*6b627f88SBjoern A. Zeeb 
34*6b627f88SBjoern A. Zeeb #define KUNIT_ALLOC_AND_ASSERT(test, ptr)				\
35*6b627f88SBjoern A. Zeeb 	KUNIT_ALLOC_AND_ASSERT_SIZE(test, ptr, sizeof(*(ptr)))
36*6b627f88SBjoern A. Zeeb 
37*6b627f88SBjoern A. Zeeb #define CHANNEL(_name, _band, _freq)				\
38*6b627f88SBjoern A. Zeeb static struct ieee80211_channel _name = {			\
39*6b627f88SBjoern A. Zeeb 	.band = (_band),					\
40*6b627f88SBjoern A. Zeeb 	.center_freq = (_freq),					\
41*6b627f88SBjoern A. Zeeb 	.hw_value = (_freq),					\
42*6b627f88SBjoern A. Zeeb }
43*6b627f88SBjoern A. Zeeb 
44*6b627f88SBjoern A. Zeeb CHANNEL(chan_2ghz, NL80211_BAND_2GHZ, 2412);
45*6b627f88SBjoern A. Zeeb CHANNEL(chan_2ghz_11, NL80211_BAND_2GHZ, 2462);
46*6b627f88SBjoern A. Zeeb CHANNEL(chan_5ghz, NL80211_BAND_5GHZ, 5200);
47*6b627f88SBjoern A. Zeeb CHANNEL(chan_5ghz_120, NL80211_BAND_5GHZ, 5600);
48*6b627f88SBjoern A. Zeeb CHANNEL(chan_6ghz, NL80211_BAND_6GHZ, 6115);
49*6b627f88SBjoern A. Zeeb CHANNEL(chan_6ghz_221, NL80211_BAND_6GHZ, 7055);
50*6b627f88SBjoern A. Zeeb /* Feel free to add more */
51*6b627f88SBjoern A. Zeeb #undef CHANNEL
52*6b627f88SBjoern A. Zeeb 
53*6b627f88SBjoern A. Zeeb #define CHANDEF_LIST \
54*6b627f88SBjoern A. Zeeb 	CHANDEF(chandef_2ghz_20mhz, chan_2ghz, 2412,		\
55*6b627f88SBjoern A. Zeeb 		NL80211_CHAN_WIDTH_20)				\
56*6b627f88SBjoern A. Zeeb 	CHANDEF(chandef_2ghz_40mhz, chan_2ghz, 2422,		\
57*6b627f88SBjoern A. Zeeb 		NL80211_CHAN_WIDTH_40)				\
58*6b627f88SBjoern A. Zeeb 	CHANDEF(chandef_2ghz_11_20mhz, chan_2ghz_11, 2462,	\
59*6b627f88SBjoern A. Zeeb 		NL80211_CHAN_WIDTH_20)				\
60*6b627f88SBjoern A. Zeeb 	CHANDEF(chandef_5ghz_20mhz, chan_5ghz, 5200,		\
61*6b627f88SBjoern A. Zeeb 		NL80211_CHAN_WIDTH_20)				\
62*6b627f88SBjoern A. Zeeb 	CHANDEF(chandef_5ghz_40mhz, chan_5ghz, 5210,		\
63*6b627f88SBjoern A. Zeeb 		NL80211_CHAN_WIDTH_40)				\
64*6b627f88SBjoern A. Zeeb 	CHANDEF(chandef_5ghz_80mhz, chan_5ghz, 5210,		\
65*6b627f88SBjoern A. Zeeb 		NL80211_CHAN_WIDTH_80)				\
66*6b627f88SBjoern A. Zeeb 	CHANDEF(chandef_5ghz_160mhz, chan_5ghz, 5250,		\
67*6b627f88SBjoern A. Zeeb 		NL80211_CHAN_WIDTH_160)				\
68*6b627f88SBjoern A. Zeeb 	CHANDEF(chandef_5ghz_120_40mhz, chan_5ghz_120, 5610,	\
69*6b627f88SBjoern A. Zeeb 		NL80211_CHAN_WIDTH_40)				\
70*6b627f88SBjoern A. Zeeb 	CHANDEF(chandef_6ghz_20mhz, chan_6ghz, 6115,		\
71*6b627f88SBjoern A. Zeeb 		NL80211_CHAN_WIDTH_20)				\
72*6b627f88SBjoern A. Zeeb 	CHANDEF(chandef_6ghz_40mhz, chan_6ghz, 6125,		\
73*6b627f88SBjoern A. Zeeb 		NL80211_CHAN_WIDTH_40)				\
74*6b627f88SBjoern A. Zeeb 	CHANDEF(chandef_6ghz_80mhz, chan_6ghz, 6145,		\
75*6b627f88SBjoern A. Zeeb 		NL80211_CHAN_WIDTH_80)				\
76*6b627f88SBjoern A. Zeeb 	CHANDEF(chandef_6ghz_160mhz, chan_6ghz, 6185,		\
77*6b627f88SBjoern A. Zeeb 		NL80211_CHAN_WIDTH_160)				\
78*6b627f88SBjoern A. Zeeb 	CHANDEF(chandef_6ghz_320mhz, chan_6ghz, 6105,		\
79*6b627f88SBjoern A. Zeeb 		NL80211_CHAN_WIDTH_320)				\
80*6b627f88SBjoern A. Zeeb 	CHANDEF(chandef_6ghz_221_160mhz, chan_6ghz_221, 6985,	\
81*6b627f88SBjoern A. Zeeb 		NL80211_CHAN_WIDTH_160)				\
82*6b627f88SBjoern A. Zeeb 	/* Feel free to add more */
83*6b627f88SBjoern A. Zeeb 
84*6b627f88SBjoern A. Zeeb #define CHANDEF(_name, _channel, _freq1, _width)		\
85*6b627f88SBjoern A. Zeeb __maybe_unused static const struct cfg80211_chan_def _name = {	\
86*6b627f88SBjoern A. Zeeb 	.chan = &(_channel),					\
87*6b627f88SBjoern A. Zeeb 	.center_freq1 = (_freq1),				\
88*6b627f88SBjoern A. Zeeb 	.width = (_width),					\
89*6b627f88SBjoern A. Zeeb };
90*6b627f88SBjoern A. Zeeb CHANDEF_LIST
91*6b627f88SBjoern A. Zeeb #undef CHANDEF
92*6b627f88SBjoern A. Zeeb 
93*6b627f88SBjoern A. Zeeb struct ieee80211_chanctx_conf *
94*6b627f88SBjoern A. Zeeb iwlmld_kunit_add_chanctx(const struct cfg80211_chan_def *def);
95*6b627f88SBjoern A. Zeeb 
96*6b627f88SBjoern A. Zeeb void iwlmld_kunit_assign_chanctx_to_link(struct ieee80211_vif *vif,
97*6b627f88SBjoern A. Zeeb 					 struct ieee80211_bss_conf *link,
98*6b627f88SBjoern A. Zeeb 					 struct ieee80211_chanctx_conf *ctx);
99*6b627f88SBjoern A. Zeeb 
100*6b627f88SBjoern A. Zeeb /* Allocate a sta, initialize it and move it to the wanted state */
101*6b627f88SBjoern A. Zeeb struct ieee80211_sta *iwlmld_kunit_setup_sta(struct ieee80211_vif *vif,
102*6b627f88SBjoern A. Zeeb 					     enum ieee80211_sta_state state,
103*6b627f88SBjoern A. Zeeb 					     int link_id);
104*6b627f88SBjoern A. Zeeb 
105*6b627f88SBjoern A. Zeeb struct ieee80211_vif *
106*6b627f88SBjoern A. Zeeb iwlmld_kunit_setup_mlo_assoc(u16 valid_links,
107*6b627f88SBjoern A. Zeeb 			     struct iwl_mld_kunit_link *assoc_link);
108*6b627f88SBjoern A. Zeeb 
109*6b627f88SBjoern A. Zeeb struct ieee80211_vif *
110*6b627f88SBjoern A. Zeeb iwlmld_kunit_setup_non_mlo_assoc(struct iwl_mld_kunit_link *assoc_link);
111*6b627f88SBjoern A. Zeeb 
112*6b627f88SBjoern A. Zeeb struct iwl_rx_packet *
113*6b627f88SBjoern A. Zeeb _iwl_mld_kunit_create_pkt(const void *notif, size_t notif_sz);
114*6b627f88SBjoern A. Zeeb 
115*6b627f88SBjoern A. Zeeb #define iwl_mld_kunit_create_pkt(_notif)	\
116*6b627f88SBjoern A. Zeeb 	_iwl_mld_kunit_create_pkt(&(_notif), sizeof(_notif))
117*6b627f88SBjoern A. Zeeb 
118*6b627f88SBjoern A. Zeeb struct ieee80211_vif *
119*6b627f88SBjoern A. Zeeb iwlmld_kunit_assoc_emlsr(struct iwl_mld_kunit_link *link1,
120*6b627f88SBjoern A. Zeeb 			 struct iwl_mld_kunit_link *link2);
121*6b627f88SBjoern A. Zeeb 
122*6b627f88SBjoern A. Zeeb struct element *iwlmld_kunit_gen_element(u8 id, const void *data, size_t len);
123*6b627f88SBjoern A. Zeeb 
124*6b627f88SBjoern A. Zeeb /**
125*6b627f88SBjoern A. Zeeb  * iwlmld_kunit_get_phy_of_link - Get the phy of a link
126*6b627f88SBjoern A. Zeeb  *
127*6b627f88SBjoern A. Zeeb  * @vif: The vif to get the phy from.
128*6b627f88SBjoern A. Zeeb  * @link_id: The id of the link to get the phy for.
129*6b627f88SBjoern A. Zeeb  *
130*6b627f88SBjoern A. Zeeb  * given a vif and link id, return the phy pointer of that link.
131*6b627f88SBjoern A. Zeeb  * This assumes that the link exists, and that it had a chanctx
132*6b627f88SBjoern A. Zeeb  * assigned.
133*6b627f88SBjoern A. Zeeb  * If this is not the case, the test will fail.
134*6b627f88SBjoern A. Zeeb  *
135*6b627f88SBjoern A. Zeeb  * Return: phy pointer.
136*6b627f88SBjoern A. Zeeb  */
137*6b627f88SBjoern A. Zeeb struct iwl_mld_phy *iwlmld_kunit_get_phy_of_link(struct ieee80211_vif *vif,
138*6b627f88SBjoern A. Zeeb 						 u8 link_id);
139*6b627f88SBjoern A. Zeeb 
140*6b627f88SBjoern A. Zeeb #endif /* __iwl_mld_kunit_utils_h__ */
141