1 /*
2 * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18 /**
19 * DOC: declare internal API related to the mlme TWT functionality
20 */
21
22 #ifndef _WLAN_MLME_TWT_API_H_
23 #define _WLAN_MLME_TWT_API_H_
24
25 #include <wlan_mlme_public_struct.h>
26 #include <wlan_mlme_twt_public_struct.h>
27 #include <wlan_objmgr_psoc_obj.h>
28 #include <wlan_objmgr_global_obj.h>
29 #include <wlan_cmn.h>
30 #include <wlan_objmgr_vdev_obj.h>
31 #include <wlan_objmgr_peer_obj.h>
32 #include "wlan_cm_roam_public_struct.h"
33
34 #ifdef WLAN_SUPPORT_TWT
35 /**
36 * mlme_is_twt_setup_in_progress() - Get if TWT setup command is in progress
37 * for given dialog id
38 * @psoc: Pointer to global psoc object
39 * @peer_mac: Global peer mac address
40 * @dialog_id: Dialog ID
41 *
42 * Return: True if Setup is in progress
43 */
44 bool mlme_is_twt_setup_in_progress(struct wlan_objmgr_psoc *psoc,
45 struct qdf_mac_addr *peer_mac,
46 uint8_t dialog_id);
47
48 /**
49 * mlme_add_twt_session() - Add TWT session entry in the TWT context
50 * @psoc: Pointer to global psoc object
51 * @peer_mac: Global peer mac address
52 * @dialog_id: Dialog ID
53 *
54 * Return: None
55 */
56 void mlme_add_twt_session(struct wlan_objmgr_psoc *psoc,
57 struct qdf_mac_addr *peer_mac,
58 uint8_t dialog_id);
59
60 /**
61 * mlme_set_twt_setup_done() - Set TWT setup complete for given dialog ID
62 * @psoc: Pointer to psoc object
63 * @peer_mac: Pointer to peer mac address
64 * @dialog_id: Dialog id
65 * @is_set: Set or clear the setup done flag
66 *
67 * Return: None
68 */
69 void mlme_set_twt_setup_done(struct wlan_objmgr_psoc *psoc,
70 struct qdf_mac_addr *peer_mac,
71 uint8_t dialog_id, bool is_set);
72
73 /**
74 * mlme_is_twt_setup_done() - Get if TWT session is established for given
75 * dialog id.
76 * @psoc: Pointer to psoc object
77 * @peer_mac: Pointer to peer mac address
78 * @dialog_id: Dialog id
79 *
80 * Return: Return true if TWT session exists for given dialog ID.
81 */
82 bool mlme_is_twt_setup_done(struct wlan_objmgr_psoc *psoc,
83 struct qdf_mac_addr *peer_mac, uint8_t dialog_id);
84
85 /**
86 * mlme_set_twt_session_state() - Set the TWT session state for the given dialog
87 * id in TWT context
88 * @psoc: Pointer to psoc object
89 * @peer_mac: Pointer to peer mac address
90 * @dialog_id: Dialog id
91 * @state: TWT session state
92 *
93 * Return: None
94 */
95 void mlme_set_twt_session_state(struct wlan_objmgr_psoc *psoc,
96 struct qdf_mac_addr *peer_mac,
97 uint8_t dialog_id,
98 enum wlan_twt_session_state state);
99
100 /**
101 * mlme_get_twt_session_state() - Get TWT session state for given dialog id
102 * @psoc: Pointer to psoc object
103 * @peer_mac: Pointer to peer mac address
104 * @dialog_id: Dialog id
105 *
106 * Return: TWT session state.
107 */
108 enum wlan_twt_session_state
109 mlme_get_twt_session_state(struct wlan_objmgr_psoc *psoc,
110 struct qdf_mac_addr *peer_mac, uint8_t dialog_id);
111
112 /**
113 * mlme_get_twt_peer_capabilities - Get TWT peer capabilities
114 * @psoc: Pointer to psoc object
115 * @peer_mac: Pointer to peer mac address
116 *
117 * Return: Peer TWT capabilities
118 */
119 uint8_t mlme_get_twt_peer_capabilities(struct wlan_objmgr_psoc *psoc,
120 struct qdf_mac_addr *peer_mac);
121
122 /**
123 * mlme_set_twt_peer_capabilities() - Set the TWT peer capabilities in TWT
124 * context
125 * @psoc: Pointer to psoc object
126 * @peer_mac: Pointer to peer mac address
127 * @caps: Bitmap of enum wlan_twt_capabilities
128 */
129 void mlme_set_twt_peer_capabilities(struct wlan_objmgr_psoc *psoc,
130 struct qdf_mac_addr *peer_mac,
131 uint8_t caps);
132
133 /**
134 * mlme_twt_any_peer_cmd_in_progress() - Iterate through the list of peers
135 * and check if the given command is in progress
136 * @psoc: Pointer to psoc object
137 * @vdev_id: Vdev id
138 * @dialog_id: Dialog id
139 * @cmd: command
140 *
141 * This API is used to check for the given @dialog_id if the
142 * @cmd command is in progress for any of the peers.
143 *
144 * Return: true if command is in progress, false otherwise
145 */
146 bool
147 mlme_twt_any_peer_cmd_in_progress(struct wlan_objmgr_psoc *psoc,
148 uint8_t vdev_id,
149 uint8_t dialog_id,
150 enum wlan_twt_commands cmd);
151
152 /**
153 * mlme_sap_set_twt_all_peers_cmd_in_progress() - Iterate through the list
154 * of peers and set the command in the TWT session entry in the TWT context
155 * @psoc: Pointer to global psoc object
156 * @vdev_id: Vdev id
157 * @dialog_id: Dialog ID
158 * @cmd: Command
159 *
160 * This API iterates through the list of peers and updates the active
161 * command to @cmd for the given dialog_id.
162 *
163 * Return: QDF_STATUS
164 */
165 QDF_STATUS
166 mlme_sap_set_twt_all_peers_cmd_in_progress(struct wlan_objmgr_psoc *psoc,
167 uint8_t vdev_id,
168 uint8_t dialog_id,
169 enum wlan_twt_commands cmd);
170
171 /**
172 * mlme_init_all_peers_twt_context() - Iterate through the list
173 * of peers and initialize the TWT context structure
174 * @psoc: Pointer to global psoc object
175 * @vdev_id: Vdev id
176 * @dialog_id: Dialog ID
177 *
178 * This API iterates through the list of peers and initializes
179 * the TWT context structure
180 *
181 * Return: QDF_STATUS
182 */
183 QDF_STATUS
184 mlme_init_all_peers_twt_context(struct wlan_objmgr_psoc *psoc,
185 uint8_t vdev_id,
186 uint8_t dialog_id);
187 /**
188 * mlme_init_twt_context() - Initialize TWT context structure
189 * @psoc: Pointer to psoc object
190 * @peer_mac: Pointer to peer mac address
191 * @dialog_id: Dialog id
192 *
193 * This API will be called on disconnection from AP.
194 *
195 * Return: QDF_STATUS
196 */
197 QDF_STATUS mlme_init_twt_context(struct wlan_objmgr_psoc *psoc,
198 struct qdf_mac_addr *peer_mac,
199 uint8_t dialog_id);
200
201 /**
202 * mlme_twt_set_wait_for_notify() - Set wait for notify flag.
203 * @psoc: Pointer to psoc object
204 * @vdev_id: VDEV identifier
205 * @is_set: Set or clear notify flag
206 *
207 * Return: None
208 */
209 void mlme_twt_set_wait_for_notify(struct wlan_objmgr_psoc *psoc,
210 uint32_t vdev_id, bool is_set);
211
212 /**
213 * mlme_is_twt_notify_in_progress() - Get TWT notify in progress.
214 * @psoc: Pointer to psoc object
215 * @vdev_id: VDEV identifier
216 *
217 * Return: True if twt_notify is in progress.
218 */
219 bool mlme_is_twt_notify_in_progress(struct wlan_objmgr_psoc *psoc,
220 uint32_t vdev_id);
221
222 #ifdef WLAN_FEATURE_11AX
223 /**
224 * mlme_is_flexible_twt_enabled() - Check if flexible TWT is enabled.
225 * @psoc: Pointer to psoc object
226 *
227 * Return: True if flexible TWT is supported
228 */
229 bool mlme_is_flexible_twt_enabled(struct wlan_objmgr_psoc *psoc);
230 #else
231 static inline
mlme_is_flexible_twt_enabled(struct wlan_objmgr_psoc * psoc)232 bool mlme_is_flexible_twt_enabled(struct wlan_objmgr_psoc *psoc)
233 {
234 return false;
235 }
236 #endif /* WLAN_FEATURE_11AX */
237
238 /**
239 * mlme_set_twt_command_in_progress() - Set TWT command is in progress.
240 * @psoc: Pointer to psoc object
241 * @peer_mac: Pointer to peer mac address
242 * @dialog_id: Dialog id
243 * @cmd: TWT command
244 *
245 * Return: QDF_STATUS
246 */
247 QDF_STATUS mlme_set_twt_command_in_progress(struct wlan_objmgr_psoc *psoc,
248 struct qdf_mac_addr *peer_mac,
249 uint8_t dialog_id,
250 enum wlan_twt_commands cmd);
251
252 /**
253 * mlme_sap_twt_peer_is_cmd_in_progress() - For a given peer_mac check if
254 * the given command is in progress
255 * @psoc: Pointer to psoc object
256 * @peer_mac: Pointer to peer mac address
257 * @dialog_id: Dialog id
258 * @cmd: TWT command
259 *
260 * Return: True if given command is in progress.
261 */
262 bool mlme_sap_twt_peer_is_cmd_in_progress(struct wlan_objmgr_psoc *psoc,
263 struct qdf_mac_addr *peer_mac,
264 uint8_t dialog_id,
265 enum wlan_twt_commands cmd);
266
267
268 /**
269 * mlme_twt_is_command_in_progress() - Check if given command is in progress
270 * @psoc: Pointer to psoc object
271 * @peer_mac: Pointer to peer mac address
272 * @dialog_id: Dialog id
273 * @cmd: TWT command
274 * @active_cmd: Fill the active command in this output parameter
275 *
276 * Return: True if given command is in progress.
277 */
278 bool mlme_twt_is_command_in_progress(struct wlan_objmgr_psoc *psoc,
279 struct qdf_mac_addr *peer_mac,
280 uint8_t dialog_id,
281 enum wlan_twt_commands cmd,
282 enum wlan_twt_commands *active_cmd);
283
284 /**
285 * mlme_is_max_twt_sessions_reached() - Check if the maximum number of
286 * TWT sessions reached or not excluding the given dialog_id
287 * @psoc: Pointer to global PSOC object
288 * @peer_mac: Global peer mac address
289 * @dialog_id: dialog id
290 *
291 * Check if the number of active TWT sessions is equal to the maximum number
292 * of TWT sessions supported. Only count the TWT session slot if it not
293 * TWT_ALL_SESSIONS_DIALOG_ID and dialog id is different from input dialog_id,
294 * because if same dialog_id already exists in the TWT sessions, we should
295 * return false since re-negotiation is supported on existing dialog_id.
296 *
297 * Return: True if slot is available for dialog_id, false otherwise
298 */
299 bool mlme_is_max_twt_sessions_reached(struct wlan_objmgr_psoc *psoc,
300 struct qdf_mac_addr *peer_mac,
301 uint8_t dialog_id);
302
303 /**
304 * mlme_is_24ghz_twt_enabled() - Get if TWT is enabled on 2.4Ghz
305 * @psoc: Pointer to psoc object
306 *
307 * Return: True if TWT is allowed on 2.4Ghz connection.
308 */
309 bool mlme_is_24ghz_twt_enabled(struct wlan_objmgr_psoc *psoc);
310
311 #ifdef WLAN_TWT_CONV_SUPPORTED
312 /**
313 * mlme_is_twt_disable_info_frame() - Get if TWT info frame enabled/disabled
314 * @psoc: Pointer to psoc object
315 *
316 * Return: True if TWT info frame is disabled.
317 */
318 bool mlme_is_twt_disable_info_frame(struct wlan_objmgr_psoc *psoc);
319 #else
320 static inline bool
mlme_is_twt_disable_info_frame(struct wlan_objmgr_psoc * psoc)321 mlme_is_twt_disable_info_frame(struct wlan_objmgr_psoc *psoc)
322 {
323 return false;
324 }
325
326 #endif
327 #else
328 static inline
mlme_set_twt_peer_capabilities(struct wlan_objmgr_psoc * psoc,struct qdf_mac_addr * peer_mac,uint8_t caps)329 void mlme_set_twt_peer_capabilities(struct wlan_objmgr_psoc *psoc,
330 struct qdf_mac_addr *peer_mac,
331 uint8_t caps)
332 {}
333
334 static inline
mlme_init_twt_context(struct wlan_objmgr_psoc * psoc,struct qdf_mac_addr * peer_mac,uint8_t dialog_id)335 QDF_STATUS mlme_init_twt_context(struct wlan_objmgr_psoc *psoc,
336 struct qdf_mac_addr *peer_mac,
337 uint8_t dialog_id)
338 {
339 return QDF_STATUS_E_NOSUPPORT;
340 }
341
342 static inline
mlme_is_flexible_twt_enabled(struct wlan_objmgr_psoc * psoc)343 bool mlme_is_flexible_twt_enabled(struct wlan_objmgr_psoc *psoc)
344 {
345 return false;
346 }
347
348 static inline bool
mlme_is_24ghz_twt_enabled(struct wlan_objmgr_psoc * psoc)349 mlme_is_24ghz_twt_enabled(struct wlan_objmgr_psoc *psoc)
350 {
351 return false;
352 }
353
354 static inline bool
mlme_is_twt_disable_info_frame(struct wlan_objmgr_psoc * psoc)355 mlme_is_twt_disable_info_frame(struct wlan_objmgr_psoc *psoc)
356 {
357 return false;
358 }
359
360 #endif /* WLAN_SUPPORT_TWT */
361 #endif /* _WLAN_MLME_TWT_API_H_ */
362