1 /*
2  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 /*
18  * DOC: contains TID to Link mapping related functionality
19  */
20 #ifndef _WLAN_T2LM_API_H_
21 #define _WLAN_T2LM_API_H_
22 
23 #include "lim_types.h"
24 #include "lim_utils.h"
25 #include "lim_send_sme_rsp_messages.h"
26 #include "parser_api.h"
27 #include "lim_send_messages.h"
28 
29 /* T2LM IE Length =
30  * Size of header (2 bytes) +
31  * Length (1 bytes) + t2lm mapping control (2 bytes) +
32  * mapping switch time (2 bytes) + expected duration (3 bytes) +
33  * link mapping of tids (16 bytes)
34  */
35 #define T2LM_IE_ACTION_FRAME_MAX_LEN 26
36 
37 /**
38  * struct t2lm_event_data - TID to Link mapping event data
39  * @status: qdf status used to indicate if t2lm action frame status
40  * @data: event data
41  */
42 struct t2lm_event_data {
43 	QDF_STATUS status;
44 	void *data;
45 };
46 
47 /**
48  * enum wlan_t2lm_evt: T2LM manager events
49  * @WLAN_T2LM_EV_ACTION_FRAME_RX_REQ:Handle T2LM request frame received from AP
50  * @WLAN_T2LM_EV_ACTION_FRAME_TX_RESP:Handle T2LM response frame sent to AP
51  * @WLAN_T2LM_EV_ACTION_FRAME_TX_REQ:Handle T2LM request frame sent by STA
52  * @WLAN_T2LM_EV_ACTION_FRAME_RX_RESP:Handle T2LM response frame received from AP
53  * @WLAN_T2LM_EV_ACTION_FRAME_RX_TEARDOWN:Handle received teardown frame event
54  * @WLAN_T2LM_EV_ACTION_FRAME_TX_TEARDOWN:Handle sending teardown frame event
55  * @WLAN_T2LM_EV_ACTION_FRAME_MAX: Maximum T2LM action frame event value
56  */
57 enum wlan_t2lm_evt {
58 	WLAN_T2LM_EV_ACTION_FRAME_RX_REQ = 0,
59 	WLAN_T2LM_EV_ACTION_FRAME_TX_RESP = 1,
60 	WLAN_T2LM_EV_ACTION_FRAME_TX_REQ = 2,
61 	WLAN_T2LM_EV_ACTION_FRAME_RX_RESP = 3,
62 	WLAN_T2LM_EV_ACTION_FRAME_RX_TEARDOWN = 4,
63 	WLAN_T2LM_EV_ACTION_FRAME_TX_TEARDOWN = 5,
64 	WLAN_T2LM_EV_ACTION_FRAME_MAX = 6,
65 };
66 
67 #ifdef WLAN_FEATURE_11BE_MLO
68 /**
69  * t2lm_deliver_event - Handler to deliver T2LM event
70  * @vdev: vdev pointer
71  * @peer: pointer to peer
72  * @event: T2LM event
73  * @event_data: T2LM event data pointer
74  * @frame_len: Received T2LM Frame length
75  * @dialog_token: Dialog token
76  *
77  * This api will be called from lim  layers, to process T2LM event
78  *
79  * Return: qdf_status
80  */
81 QDF_STATUS t2lm_deliver_event(struct wlan_objmgr_vdev *vdev,
82 			      struct wlan_objmgr_peer *peer,
83 			      enum wlan_t2lm_evt event,
84 			      void *event_data,
85 			      uint32_t frame_len,
86 			      uint8_t *dialog_token);
87 
88 /**
89  * t2lm_handle_rx_req - Handler for parsing T2LM action frame
90  * @vdev: vdev pointer
91  * @peer: pointer to peer
92  * @event_data: T2LM event data pointer
93  * @frame_len: Received Frame length
94  * @token: Dialog token
95  *
96  * This api will be called from lim  layers, after T2LM action frame
97  * is received, the api will parse the T2LM request frame.
98  *
99  * Return: qdf_status
100  */
101 QDF_STATUS t2lm_handle_rx_req(struct wlan_objmgr_vdev *vdev,
102 			      struct wlan_objmgr_peer *peer,
103 			      void *event_data, uint32_t frame_len,
104 			      uint8_t *token);
105 
106 /**
107  * t2lm_handle_tx_resp - Handler for populating T2LM action frame
108  * @vdev: vdev pointer
109  * @event_data: T2LM event data pointer
110  * @token: Dialog token
111  *
112  * This api will be called to populate T2LM response action frame.
113  *
114  * Return: qdf_status
115  */
116 QDF_STATUS t2lm_handle_tx_resp(struct wlan_objmgr_vdev *vdev,
117 			       void *event_data, uint8_t *token);
118 
119 /**
120  * t2lm_handle_tx_req - Handler for populating T2LM action frame
121  * @vdev: vdev pointer
122  * @peer: pointer to peer
123  * @event_data: T2LM event data pointer
124  * @token: Dialog token
125  *
126  * This api will be called to populate T2LM request action frame.
127  *
128  * Return: qdf_status
129  */
130 QDF_STATUS t2lm_handle_tx_req(struct wlan_objmgr_vdev *vdev,
131 		   struct wlan_objmgr_peer *peer,
132 		   void *event_data, uint8_t *token);
133 
134 /**
135  * t2lm_handle_rx_resp - Handler for parsing T2LM action frame
136  * @vdev: vdev pointer
137  * @peer: peer pointer
138  * @event_data: T2LM event data pointer
139  * @frame_len: Frame length
140  * @token: Dialog token
141  *
142  * This api will be called to parsing T2LM response action frame.
143  *
144  * Return: qdf_status
145  */
146 QDF_STATUS t2lm_handle_rx_resp(struct wlan_objmgr_vdev *vdev,
147 			       struct wlan_objmgr_peer *peer,
148 			       void *event_data, uint32_t frame_len,
149 			       uint8_t *token);
150 
151 /**
152  * t2lm_handle_rx_teardown - Handler for parsing T2LM action frame
153  * @vdev: vdev pointer
154  * @peer: peer pointer
155  * @event_data: T2LM event data pointer
156  *
157  * This api will be called to parsing T2LM teardown action frame.
158  *
159  * Return: qdf_status
160  */
161 QDF_STATUS t2lm_handle_rx_teardown(struct wlan_objmgr_vdev *vdev,
162 				   struct wlan_objmgr_peer *peer,
163 				   void *event_data);
164 
165 /**
166  * t2lm_handle_tx_teardown - Handler for populating T2LM action frame
167  * @vdev: vdev pointer
168  * @event_data: T2LM event data pointer
169  *
170  * This api will be called to populate T2LM teardown action frame.
171  *
172  * Return: qdf_status
173  */
174 QDF_STATUS t2lm_handle_tx_teardown(struct wlan_objmgr_vdev *vdev,
175 				   void *event_data);
176 
177 /**
178  * wlan_t2lm_validate_candidate - Validate candidate based on T2LM IE
179  * @cm_ctx: connection manager context pointer
180  * @scan_entry: scan entry pointer
181  *
182  * This api will be called to validate candidate based on T2LM IE received
183  * in beacon or probe response
184  *
185  * Return: qdf_status
186  */
187 
188 QDF_STATUS
189 wlan_t2lm_validate_candidate(struct cnx_mgr *cm_ctx,
190 			     struct scan_cache_entry *scan_entry);
191 /**
192  * wlan_t2lm_deliver_event() - TID-to-link-mapping event handler
193  * @vdev: vdev object
194  * @peer: pointer to peer
195  * @event: T2LM event
196  * @event_data: T2LM event data
197  * @frame_len: received T2LM frame len
198  * @dialog_token: Dialog token
199  *
200  * Return: QDF_STATUS
201  */
202 QDF_STATUS wlan_t2lm_deliver_event(struct wlan_objmgr_vdev *vdev,
203 				   struct wlan_objmgr_peer *peer,
204 				   enum wlan_t2lm_evt event,
205 				   void *event_data,
206 				   uint32_t frame_len,
207 				   uint8_t *dialog_token);
208 
209 /**
210  * wlan_t2lm_clear_ongoing_negotiation - Clear ongoing
211  * negotiation peer level TID-to-link-mapping.
212  * @peer: pointer to peer
213  *
214  * Return: none
215  */
216 void
217 wlan_t2lm_clear_ongoing_negotiation(struct wlan_objmgr_peer *peer);
218 
219 /**
220  * wlan_t2lm_clear_peer_negotiation - Clear previously
221  * negotiated peer level TID-to-link-mapping.
222  * @peer: pointer to peer
223  *
224  * Return: none
225  */
226 void
227 wlan_t2lm_clear_peer_negotiation(struct wlan_objmgr_peer *peer);
228 
229 /**
230  * wlan_t2lm_clear_all_tid_mapping - Clear all tid mapping
231  * @vdev: pointer to vdev
232  *
233  * This api will clear peer level and beacon t2lm mapping.
234  * Return: none
235  */
236 void
237 wlan_t2lm_clear_all_tid_mapping(struct wlan_objmgr_vdev *vdev);
238 
239 /**
240  * wlan_populate_link_disable_t2lm_frame - Populate link disable t2lm frame
241  * @vdev: pointer to vdev
242  * @params: link disable params
243  *
244  * Return: none
245  */
246 QDF_STATUS
247 wlan_populate_link_disable_t2lm_frame(struct wlan_objmgr_vdev *vdev,
248 				      struct mlo_link_disable_request_evt_params *params);
249 
250 /**
251  * wlan_update_t2lm_mapping - Update t2lm mapping to fw
252  * @vdev: pointer to vdev
253  * @rx_t2lm: received t2lm mapping from beacon
254  * @tsf: timing sync function value
255  *
256  * Return: qdf status
257  */
258 QDF_STATUS wlan_update_t2lm_mapping(
259 		struct wlan_objmgr_vdev *vdev,
260 		struct wlan_t2lm_context *rx_t2lm,
261 		uint64_t tsf);
262 
263 /**
264  * wlan_t2lm_init_default_mapping - Initialize t2lm to default mapping
265  * @t2lm_ctx: t2lm ctx stored in ml dev ctx
266  *
267  * Return: qdf status
268  */
269 QDF_STATUS
270 wlan_t2lm_init_default_mapping(struct wlan_t2lm_context *t2lm_ctx);
271 
272 #else
273 static inline QDF_STATUS
wlan_t2lm_init_default_mapping(struct wlan_t2lm_context * t2lm_ctx)274 wlan_t2lm_init_default_mapping(struct wlan_t2lm_context *t2lm_ctx)
275 {
276 	return QDF_STATUS_E_NOSUPPORT;
277 }
278 
wlan_update_t2lm_mapping(struct wlan_objmgr_vdev * vdev,struct wlan_t2lm_context * rx_t2lm,uint64_t tsf)279 static inline QDF_STATUS wlan_update_t2lm_mapping(
280 		struct wlan_objmgr_vdev *vdev,
281 		struct wlan_t2lm_context *rx_t2lm,
282 		uint64_t tsf)
283 {
284 	return QDF_STATUS_E_NOSUPPORT;
285 }
286 
287 static inline QDF_STATUS
wlan_populate_link_disable_t2lm_frame(struct wlan_objmgr_vdev * vdev,struct mlo_link_disable_request_evt_params * params)288 wlan_populate_link_disable_t2lm_frame(struct wlan_objmgr_vdev *vdev,
289 				      struct mlo_link_disable_request_evt_params *params)
290 {
291 	return QDF_STATUS_E_NOSUPPORT;
292 }
293 
294 static inline QDF_STATUS
t2lm_handle_rx_req(struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_peer * peer,void * event_data,uint32_t frame_len,uint8_t * token)295 t2lm_handle_rx_req(struct wlan_objmgr_vdev *vdev,
296 		   struct wlan_objmgr_peer *peer,
297 		   void *event_data, uint32_t frame_len, uint8_t *token)
298 {
299 	return QDF_STATUS_E_NOSUPPORT;
300 }
301 
302 static inline QDF_STATUS
t2lm_handle_tx_resp(struct wlan_objmgr_vdev * vdev,void * event_data,uint8_t * token)303 t2lm_handle_tx_resp(struct wlan_objmgr_vdev *vdev,
304 		    void *event_data, uint8_t *token)
305 {
306 	return QDF_STATUS_E_NOSUPPORT;
307 }
308 
309 static inline QDF_STATUS
t2lm_handle_tx_req(struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_peer * peer,void * event_data,uint8_t * token)310 t2lm_handle_tx_req(struct wlan_objmgr_vdev *vdev,
311 		   struct wlan_objmgr_peer *peer,
312 		   void *event_data, uint8_t *token)
313 {
314 	return QDF_STATUS_E_NOSUPPORT;
315 }
316 
317 static inline QDF_STATUS
t2lm_handle_rx_resp(struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_peer * peer,void * event_data,uint32_t frame_len,uint8_t * token)318 t2lm_handle_rx_resp(struct wlan_objmgr_vdev *vdev,
319 		    struct wlan_objmgr_peer *peer,
320 		    void *event_data, uint32_t frame_len, uint8_t *token)
321 {
322 	return QDF_STATUS_E_NOSUPPORT;
323 }
324 
325 static inline QDF_STATUS
t2lm_handle_rx_teardown(struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_peer * peer,void * event_data)326 t2lm_handle_rx_teardown(struct wlan_objmgr_vdev *vdev,
327 			struct wlan_objmgr_peer *peer,
328 			void *event_data)
329 {
330 	return QDF_STATUS_E_NOSUPPORT;
331 }
332 
333 static inline QDF_STATUS
t2lm_handle_tx_teardown(struct wlan_objmgr_vdev * vdev,void * event_data)334 t2lm_handle_tx_teardown(struct wlan_objmgr_vdev *vdev,
335 			void *event_data)
336 {
337 	return QDF_STATUS_E_NOSUPPORT;
338 }
339 
340 static inline QDF_STATUS
wlan_t2lm_validate_candidate(struct cnx_mgr * cm_ctx,struct scan_cache_entry * scan_entry)341 wlan_t2lm_validate_candidate(struct cnx_mgr *cm_ctx,
342 			     struct scan_cache_entry *scan_entry)
343 {
344 	return QDF_STATUS_E_NOSUPPORT;
345 }
346 
347 static inline void
wlan_t2lm_clear_ongoing_negotiation(struct wlan_objmgr_peer * peer)348 wlan_t2lm_clear_ongoing_negotiation(struct wlan_objmgr_peer *peer)
349 {}
350 
351 static inline void
wlan_t2lm_clear_peer_negotiation(struct wlan_objmgr_peer * peer)352 wlan_t2lm_clear_peer_negotiation(struct wlan_objmgr_peer *peer)
353 {}
354 
355 static inline void
wlan_t2lm_clear_all_tid_mapping(struct wlan_objmgr_vdev * vdev)356 wlan_t2lm_clear_all_tid_mapping(struct wlan_objmgr_vdev *vdev)
357 {}
358 
359 static inline
wlan_t2lm_deliver_event(struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_peer * peer,enum wlan_t2lm_evt event,void * event_data,uint32_t frame_len,uint8_t * dialog_token)360 QDF_STATUS wlan_t2lm_deliver_event(struct wlan_objmgr_vdev *vdev,
361 				   struct wlan_objmgr_peer *peer,
362 				   enum wlan_t2lm_evt event,
363 				   void *event_data,
364 				   uint32_t frame_len,
365 				   uint8_t *dialog_token)
366 {
367 	return QDF_STATUS_E_NOSUPPORT;
368 }
369 #endif
370 #endif
371