1 /*
2  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 /**
20  * DOC: Define the peer data structure of UMAC
21  *	Public APIs to perform operations on Global objects
22  */
23 #ifndef _WLAN_OBJMGR_PEER_OBJ_H_
24 #define _WLAN_OBJMGR_PEER_OBJ_H_
25 
26 #include <qdf_types.h>
27 #include <qdf_atomic.h>
28 #include "wlan_objmgr_vdev_obj.h"
29 #ifdef WLAN_FEATURE_11BE_MLO
30 #include "wlan_mlo_mgr_public_structs.h"
31 #endif
32 
33 /* peer flags */
34 /* authorized for data */
35 #define WLAN_PEER_F_AUTH                            0x00000001
36 /* QoS enabled */
37 #define WLAN_PEER_F_QOS                             0x00000002
38 /* ERP enabled */
39 #define WLAN_PEER_F_ERP                             0x00000004
40 /* HT enabled */
41 #define WLAN_PEER_F_HT                              0x00000008
42 /* NB: tWLANhave the same value as IEEE80211_FC1_PWR_MGT */
43 /* power save mode enabled */
44 #define WLAN_PEER_F_PWR_MGT                         0x00000010
45 /* keytsc for node has already been updated */
46 #define WLAN_PEER_F_TSC_SET                         0x00000020
47 /* U-APSD power save enabled */
48 #define WLAN_PEER_F_UAPSD                           0x00000040
49 /* U-APSD triggerable state */
50 #define WLAN_PEER_F_UAPSD_TRIG                      0x00000080
51 /* U-APSD SP in progress */
52 #define WLAN_PEER_F_UAPSD_SP                        0x00000100
53 /* Atheros Owl or follow-on device */
54 #define WLAN_PEER_F_ATH                             0x00000200
55 /* Owl WDS workaround needed*/
56 #define WLAN_PEER_F_OWL_WDSWAR                      0x00000400
57 /* WDS link */
58 #define WLAN_PEER_F_WDS                             0x00000800
59 /* No AMPDU support */
60 #define WLAN_PEER_F_NOAMPDU                         0x00001000
61 /* wep/tkip aggregation support */
62 #define WLAN_PEER_F_WEPTKIPAGGR                     0x00002000
63 #define WLAN_PEER_F_WEPTKIP                         0x00004000
64 /* temp node (not in the node table) */
65 #define WLAN_PEER_F_TEMP                            0x00008000
66 /* 2.4ng VHT interop AMSDU disabled */
67 #define WLAN_PEER_F_11NG_VHT_INTEROP_AMSDU_DISABLE  0x00010000
68 /* 40 MHz Intolerant  */
69 #define WLAN_PEER_F_40MHZ_INTOLERANT                0x00020000
70 /* node is  paused*/
71 #define WLAN_PEER_F_PAUSED                          0x00040000
72 #define WLAN_PEER_F_EXTRADELIMWAR                   0x00080000
73 /* 20 MHz requesting node */
74 #define WLAN_PEER_F_REQ_20MHZ                       0x00100000
75 /* all the tid queues in ath layer are paused*/
76 #define WLAN_PEER_F_ATH_PAUSED                      0x00200000
77 /*Require credit update*/
78 #define WLAN_PEER_F_UAPSD_CREDIT_UPDATE             0x00400000
79 /*Require send deauth when h/w queue no data*/
80 #define WLAN_PEER_F_KICK_OUT_DEAUTH                 0x00800000
81 /* RRM enabled node */
82 #define WLAN_PEER_F_RRM                             0x01000000
83 /* Wakeup node */
84 #define WLAN_PEER_F_WAKEUP                          0x02000000
85 /* VHT enabled node */
86 #define WLAN_PEER_F_VHT                             0x04000000
87 /* deauth/Disassoc wait for node cleanup till frame goes on
88    air and tx feedback received */
89 #define WLAN_PEER_F_DELAYED_CLEANUP                 0x08000000
90 /* Extended stats enabled node */
91 #define WLAN_PEER_F_EXT_STATS                       0x10000000
92 /* Prevent _ieee80211_node_leave() from reentry */
93 #define WLAN_PEER_F_LEAVE_ONGOING                   0x20000000
94 /* band steering is enabled for this node */
95 #define WLAN_PEER_F_BSTEERING_CAPABLE               0x40000000
96 /* node is a local mesh peer */
97 #define WLAN_PEER_F_LOCAL_MESH_PEER                 0x80000000
98 
99 /* MLO enabled peer */
100 #define WLAN_PEER_FEXT_MLO                          0x00000001
101 /* Peer is QCN Node */
102 #define WLAN_PEER_QCN_NODE                          0x00000010
103 /* Peer is 4 Address node */
104 #define WLAN_PEER_MESH_NODE                         0x00000020
105 
106 /**
107  * enum wlan_peer_state  - peer state
108  * @WLAN_INIT_STATE:       Default state
109  * @WLAN_JOIN_STATE:       Station mode, STA is waiting for Join
110  * @WLAN_AUTH_STATE:       AUTH in progress
111  * @WLAN_ASSOC_STATE:      ASSOC in progress
112  * @WLAN_WAITKEY_STATE:    4-way KEY handshake is in progress
113  * @WLAN_CONNECTED_STATE:  Connected state
114  * @WLAN_PREAUTH_STATE:    Station mode: Preauth
115  * @WLAN_DISCONNECT_STATE: Disconnect is in progress
116  */
117 enum wlan_peer_state {
118 	WLAN_INIT_STATE       = 1,
119 	WLAN_JOIN_STATE       = 2,
120 	WLAN_AUTH_STATE       = 3,
121 	WLAN_ASSOC_STATE      = 4,
122 	WLAN_WAITKEY_STATE    = 5,
123 	WLAN_CONNECTED_STATE  = 6,
124 	WLAN_PREAUTH_STATE    = 7,
125 	WLAN_DISCONNECT_STATE = 8,
126 };
127 
128 /**
129  * struct wlan_objmgr_peer_mlme - mlme common data of peer
130  * @peer_capinfo:    protocol cap info
131  * @peer_flags:      PEER OP flags
132  * @peer_ext_flags:  PEER OP ext flags
133  * @peer_type:       Type of PEER, (STA/AP/etc.)
134  * @phymode:         phy mode of station
135  * @max_rate:        Max Rate supported
136  * @state:           State of the peer
137  * @seq_num:         Sequence number
138  * @rssi:            Last received RSSI value
139  * @is_authenticated: true if peer is authenticated
140  * @assoc_peer:      assoc req/response is handled in this peer
141  */
142 struct wlan_objmgr_peer_mlme {
143 	uint32_t peer_capinfo;
144 	uint32_t peer_flags;
145 	uint32_t peer_ext_flags;
146 	enum wlan_peer_type peer_type;
147 	enum wlan_phymode phymode;
148 	uint32_t max_rate;
149 	enum wlan_peer_state state;
150 	uint16_t seq_num;
151 	int8_t rssi;
152 	bool is_authenticated;
153 #ifdef WLAN_FEATURE_11BE_MLO
154 	bool assoc_peer;
155 #endif
156 };
157 
158 /**
159  * struct wlan_objmgr_peer_objmgr - object manager data of peer
160  * @vdev:              VDEV pointer to which it is associated
161  * @ref_cnt:           Ref count
162  * @ref_id_dbg:        Array to track Ref count
163  * @print_cnt:         Count to throttle Logical delete prints
164  * @trace:             Trace ref and deref
165  */
166 struct wlan_objmgr_peer_objmgr {
167 	struct wlan_objmgr_vdev *vdev;
168 	qdf_atomic_t ref_cnt;
169 #ifdef WLAN_OBJMGR_REF_ID_DEBUG
170 	qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX];
171 #endif
172 	uint8_t print_cnt;
173 #ifdef WLAN_OBJMGR_REF_ID_TRACE
174 	struct wlan_objmgr_trace trace;
175 #endif
176 };
177 
178 /**
179  * struct wlan_objmgr_peer -  PEER common object
180  * @psoc_peer:        peer list node for psoc's qdf list
181  * @vdev_peer:        peer list node for vdev's qdf list
182  * @free_node:        peer list node for free in a delayed work
183  * @macaddr:          Peer MAC address
184  * @peer_mlme:	      Peer MLME common structure
185  * @peer_objmgr:      Peer Object manager common structure
186  * @peer_comp_priv_obj:  Component's private object pointers
187  * @obj_status:       status of each component object
188  * @obj_state:        Status of Peer object
189  * @pdev_id:          Pdev ID
190  * @peer_lock:        Lock for access/update peer contents
191  * @mlo_peer_ctx:     Reference to MLO Peer context
192  * @mldaddr:          Peer MLD MAC address
193  * @mlo_bridge_peer:  Indicates bridge peer
194  * @peer_flags:        QCN flag and 4 address mode flag
195  */
196 struct wlan_objmgr_peer {
197 	qdf_list_node_t psoc_peer;
198 	qdf_list_node_t vdev_peer;
199 #ifdef FEATURE_DELAYED_PEER_OBJ_DESTROY
200 	qdf_list_node_t free_node;
201 #endif
202 	uint8_t macaddr[QDF_MAC_ADDR_SIZE];
203 	uint8_t pdev_id;
204 	struct wlan_objmgr_peer_mlme peer_mlme;
205 	struct wlan_objmgr_peer_objmgr peer_objmgr;
206 	void *peer_comp_priv_obj[WLAN_UMAC_MAX_COMPONENTS];
207 	QDF_STATUS obj_status[WLAN_UMAC_MAX_COMPONENTS];
208 	WLAN_OBJ_STATE obj_state;
209 	qdf_spinlock_t peer_lock;
210 #ifdef WLAN_FEATURE_11BE_MLO
211 	struct wlan_mlo_peer_context *mlo_peer_ctx;
212 	uint8_t mldaddr[QDF_MAC_ADDR_SIZE];
213 	u_int32_t peer_flags;
214 	bool mlo_bridge_peer;
215 #endif
216 };
217 
218 /*
219  * APIs to Create/Delete Global object APIs
220  */
221 /**
222  * wlan_objmgr_peer_obj_create() - peer object create
223  * @vdev: VDEV object on which this peer gets created
224  * @type: peer type (AP/STA)
225  * @macaddr: MAC address
226  *
227  * Creates Peer object, initializes with default values
228  * Attaches to psoc and vdev objects
229  * Invokes the registered notifiers to create component object
230  *
231  * Return: Handle to struct wlan_objmgr_peer on successful creation,
232  *         NULL on Failure (on Mem alloc failure and Component objects
233  *         Failure)
234  */
235 struct wlan_objmgr_peer *wlan_objmgr_peer_obj_create(
236 			struct wlan_objmgr_vdev *vdev,
237 			enum wlan_peer_type type,
238 			uint8_t macaddr[]);
239 
240 /**
241  * wlan_objmgr_peer_obj_delete() - peer object delete
242  * @peer: PEER object
243  *
244  * Deletes PEER object, removes it from PSOC's, VDEV's peer list
245  * Invokes the registered notifiers to destroy component objects
246  *
247  * Return: SUCCESS/FAILURE
248  */
249 QDF_STATUS wlan_objmgr_peer_obj_delete(struct wlan_objmgr_peer *peer);
250 
251 #ifdef FEATURE_DELAYED_PEER_OBJ_DESTROY
252 /**
253  * wlan_delayed_peer_obj_free_init() - Init for delayed peer obj freed queue
254  * @data: PDEV object
255  *
256  * Initialize main data structures to process peer obj destroy in a delayed
257  * workqueue.
258  *
259  * Return: QDF_STATUS_SUCCESS on success else a QDF error.
260  */
261 QDF_STATUS wlan_delayed_peer_obj_free_init(void *data);
262 
263 /**
264  * wlan_delayed_peer_obj_free_deinit() - De-Init delayed peer freed processing
265  * @data: PDEV object
266  *
267  * De-initialize main data structures to process peer obj freed in a delayed
268  * workqueue.
269  *
270  * Return: QDF_STATUS_SUCCESS on success else a QDF error.
271  */
272 QDF_STATUS wlan_delayed_peer_obj_free_deinit(void *data);
273 #else
wlan_delayed_peer_obj_free_init(void * data)274 static inline QDF_STATUS wlan_delayed_peer_obj_free_init(void *data)
275 {
276 	return QDF_STATUS_SUCCESS;
277 }
278 
wlan_delayed_peer_obj_free_deinit(void * data)279 static inline QDF_STATUS wlan_delayed_peer_obj_free_deinit(void *data)
280 {
281 	return QDF_STATUS_SUCCESS;
282 }
283 #endif
284 
285 /*
286  * APIs to attach/detach component objects
287  */
288 /**
289  * wlan_objmgr_peer_component_obj_attach() - attach comp object to peer
290  * @peer: PEER object
291  * @id: Component id
292  * @comp_priv_obj: component's private object pointer
293  * @status: Component's private object creation status
294  *
295  * API to be used for attaching component object with PEER common object
296  *
297  * Return: SUCCESS on successful storing of component's object in common object
298  *         On FAILURE (appropriate failure codes are returned)
299  */
300 QDF_STATUS wlan_objmgr_peer_component_obj_attach(
301 		struct wlan_objmgr_peer *peer,
302 		enum wlan_umac_comp_id id,
303 		void *comp_priv_obj,
304 		QDF_STATUS status);
305 
306 /**
307  * wlan_objmgr_peer_component_obj_detach() - detach comp object from peer
308  * @peer: PEER object
309  * @id: Component id
310  * @comp_priv_obj: component's private object pointer
311  *
312  * API to be used for detaching component object with PEER common object
313  *
314  * Return: SUCCESS on successful removal of component's object from common
315  *         object
316  *         On FAILURE (appropriate failure codes are returned)
317  */
318 QDF_STATUS wlan_objmgr_peer_component_obj_detach(
319 		struct wlan_objmgr_peer *peer,
320 		enum wlan_umac_comp_id id,
321 		void *comp_priv_obj);
322 
323 /*
324  * APIs to operations on peer objects
325  */
326 
327 /**
328  * wlan_objmgr_trigger_peer_comp_priv_object_creation() - create
329  * peer comp object
330  * @peer: PEER object
331  * @id: Component id
332  *
333  * API to create component private object in run time, this would
334  * be used for features which gets enabled in run time
335  *
336  * Return: SUCCESS on successful creation
337  *         On FAILURE (appropriate failure codes are returned)
338  */
339 QDF_STATUS wlan_objmgr_trigger_peer_comp_priv_object_creation(
340 		struct wlan_objmgr_peer *peer,
341 		enum wlan_umac_comp_id id);
342 
343 /**
344  * wlan_objmgr_trigger_peer_comp_priv_object_deletion() - destroy
345  * peer comp object
346  * @peer: PEER object
347  * @id: Component id
348  *
349  * API to destroy component private object in run time, this would
350  * be used for features which gets disabled in run time
351  *
352  * Return: SUCCESS on successful deletion
353  *         On FAILURE (appropriate failure codes are returned)
354  */
355 QDF_STATUS wlan_objmgr_trigger_peer_comp_priv_object_deletion(
356 		struct wlan_objmgr_peer *peer,
357 		enum wlan_umac_comp_id id);
358 
359 /**
360  * wlan_objmgr_peer_get_comp_private_obj() - get peer component private object
361  * @peer: PEER object
362  * @id: Component id
363  *
364  * API to get component private object
365  *
366  * Return: void *ptr on SUCCESS
367  *         NULL on Failure
368  */
369 void *wlan_objmgr_peer_get_comp_private_obj(
370 		struct wlan_objmgr_peer *peer,
371 		enum wlan_umac_comp_id id);
372 
373 /**
374  * wlan_peer_obj_lock() - Acquire PEER spinlock
375  * @peer: PEER object
376  *
377  * API to acquire PEER spin lock
378  * Parent lock should not be taken in child lock context
379  * but child lock can be taken in parent lock context
380  * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context)
381  *
382  * Return: void
383  */
wlan_peer_obj_lock(struct wlan_objmgr_peer * peer)384 static inline void wlan_peer_obj_lock(struct wlan_objmgr_peer *peer)
385 {
386 	qdf_spin_lock_bh(&peer->peer_lock);
387 }
388 
389 /**
390  * wlan_peer_obj_unlock() - Release PEER spinlock
391  * @peer: PEER object
392  *
393  * API to Release PEER spin lock
394  *
395  * Return: void
396  */
wlan_peer_obj_unlock(struct wlan_objmgr_peer * peer)397 static inline void wlan_peer_obj_unlock(struct wlan_objmgr_peer *peer)
398 {
399 	qdf_spin_unlock_bh(&peer->peer_lock);
400 }
401 
402 /**
403  * DOC: Examples to use PEER ref count APIs
404  *
405  * In all the scenarios, the pair of API should be followed
406  * other it lead to memory leak
407  *
408  *  scenario 1:
409  *
410  *     wlan_objmgr_peer_obj_create()
411  *     ----
412  *     wlan_objmgr_peer_obj_delete()
413  *
414  *  scenario 2:
415  *
416  *     wlan_objmgr_peer_get_ref()
417  *     ----
418  *     the operations which are done on
419  *     peer object
420  *     ----
421  *     wlan_objmgr_peer_release_ref()
422  *
423  *  scenario 3:
424  *
425  *     API to retrieve peer (xxx_get_peer_xxx())
426  *     ----
427  *     the operations which are done on
428  *     peer object
429  *     ----
430  *     wlan_objmgr_peer_release_ref()
431  */
432 
433 /**
434  * wlan_objmgr_peer_get_ref() - increment ref count
435  * @peer: PEER object
436  * @id:   Object Manager ref debug id
437  *
438  * API to increment ref count of peer
439  *
440  * Return: void
441  */
442 #ifdef WLAN_OBJMGR_REF_ID_TRACE
443 #define wlan_objmgr_peer_get_ref(peer, id) \
444 		wlan_objmgr_peer_get_ref_debug(peer, id, __func__, __LINE__)
445 
446 void wlan_objmgr_peer_get_ref_debug(struct wlan_objmgr_peer *peer,
447 				    wlan_objmgr_ref_dbgid id,
448 				    const char *func, int line);
449 #else
450 void wlan_objmgr_peer_get_ref(struct wlan_objmgr_peer *peer,
451 					wlan_objmgr_ref_dbgid id);
452 #endif
453 
454 /**
455  * wlan_objmgr_peer_try_get_ref() - increment ref count, if allowed
456  * @peer: PEER object
457  * @id:   Object Manager ref debug id
458  *
459  * API to increment ref count of peer, if object state is valid
460  *
461  * Return: void
462  */
463 #ifdef WLAN_OBJMGR_REF_ID_TRACE
464 #define wlan_objmgr_peer_try_get_ref(peer, id) \
465 		wlan_objmgr_peer_try_get_ref_debug(peer, id, \
466 		__func__, __LINE__)
467 
468 QDF_STATUS wlan_objmgr_peer_try_get_ref_debug(struct wlan_objmgr_peer *peer,
469 					      wlan_objmgr_ref_dbgid id,
470 					      const char *func, int line);
471 #else
472 QDF_STATUS wlan_objmgr_peer_try_get_ref(struct wlan_objmgr_peer *peer,
473 						 wlan_objmgr_ref_dbgid id);
474 #endif
475 
476 /**
477  * wlan_objmgr_peer_release_ref() - decrement ref count
478  * @peer: PEER object
479  * @id:   Object Manager ref debug id
480  *
481  * API to decrement ref count of peer, if ref count is 1, it initiates the
482  * peer deletion
483  *
484  * Return: void
485  */
486 #ifdef WLAN_OBJMGR_REF_ID_TRACE
487 #define wlan_objmgr_peer_release_ref(peer, id) \
488 		wlan_objmgr_peer_release_ref_debug(peer, id, \
489 		__func__, __LINE__)
490 
491 void wlan_objmgr_peer_release_ref_debug(struct wlan_objmgr_peer *peer,
492 					wlan_objmgr_ref_dbgid id,
493 					const char *func, int line);
494 #else
495 void wlan_objmgr_peer_release_ref(struct wlan_objmgr_peer *peer,
496 						 wlan_objmgr_ref_dbgid id);
497 #endif
498 
499 /**
500  * wlan_peer_get_next_peer_of_psoc_ref() - get next peer to psoc peer list
501  *                                         with lock and ref taken
502  * @peer_list: Peer list
503  * @hash_index: peer list hash index
504  * @peer: PEER object
505  * @dbg_id: Ref count debug module id
506  *
507  * API to get the next peer of given peer (of psoc's peer list)
508  *
509  * Return: PEER object
510  */
511 #ifdef WLAN_OBJMGR_REF_ID_TRACE
512 #define wlan_peer_get_next_peer_of_psoc_ref(peer_list, hash_index, peer, \
513 	dbg_id) \
514 		wlan_peer_get_next_peer_of_psoc_ref_debug(peer_list, \
515 		hash_index, peer, dbg_id, __func__, __LINE__)
516 
517 struct wlan_objmgr_peer *wlan_peer_get_next_peer_of_psoc_ref_debug(
518 				struct wlan_peer_list *peer_list,
519 				uint8_t hash_index,
520 				struct wlan_objmgr_peer *peer,
521 				wlan_objmgr_ref_dbgid dbg_id,
522 				const char *func, int line);
523 #else
524 struct wlan_objmgr_peer *wlan_peer_get_next_peer_of_psoc_ref(
525 				struct wlan_peer_list *peer_list,
526 				uint8_t hash_index,
527 				struct wlan_objmgr_peer *peer,
528 				wlan_objmgr_ref_dbgid dbg_id);
529 #endif
530 
531 /**
532  * wlan_peer_get_next_active_peer_of_psoc() - get next active peer to psoc peer
533  *                                            list
534  * @peer_list: Peer list
535  * @hash_index: peer list hash index
536  * @peer: PEER object
537  * @dbg_id: Ref count debug module id
538  *
539  * API to get the next peer of given peer (of psoc's peer list)
540  *
541  * Return: PEER object
542  */
543 #ifdef WLAN_OBJMGR_REF_ID_TRACE
544 #define wlan_peer_get_next_active_peer_of_psoc(peer_list, hash_index, \
545 	peer, dbg_id) \
546 		wlan_peer_get_next_active_peer_of_psoc_debug(peer_list, \
547 		hash_index, peer, dbg_id, __func__, __LINE__)
548 
549 struct wlan_objmgr_peer *wlan_peer_get_next_active_peer_of_psoc_debug(
550 					struct wlan_peer_list *peer_list,
551 					uint8_t hash_index,
552 					struct wlan_objmgr_peer *peer,
553 					wlan_objmgr_ref_dbgid dbg_id,
554 					const char *func, int line);
555 #else
556 struct wlan_objmgr_peer *wlan_peer_get_next_active_peer_of_psoc(
557 					struct wlan_peer_list *peer_list,
558 					uint8_t hash_index,
559 					struct wlan_objmgr_peer *peer,
560 					wlan_objmgr_ref_dbgid dbg_id);
561 #endif
562 
563 /**
564  * wlan_peer_get_next_active_peer_of_vdev() - get next active_peer of vdev list
565  * @vdev: VDEV object
566  * @peer_list: Peer object list
567  * @peer: PEER object
568  * @dbg_id: Ref count debug module id
569  *
570  * API to get the next active peer of given peer (of vdev's peer list)
571  *
572  * Return: PEER object
573  */
574 #ifdef WLAN_OBJMGR_REF_ID_TRACE
575 #define wlan_peer_get_next_active_peer_of_vdev(vdev, peer_list, peer, dbg_id) \
576 		wlan_peer_get_next_active_peer_of_vdev_debug(vdev, peer_list, \
577 		peer, dbg_id, __func__, __LINE__)
578 
579 struct wlan_objmgr_peer *wlan_peer_get_next_active_peer_of_vdev_debug(
580 				struct wlan_objmgr_vdev *vdev,
581 				qdf_list_t *peer_list,
582 				struct wlan_objmgr_peer *peer,
583 				wlan_objmgr_ref_dbgid dbg_id,
584 				const char *func, int line);
585 #else
586 struct wlan_objmgr_peer *wlan_peer_get_next_active_peer_of_vdev(
587 				struct wlan_objmgr_vdev *vdev,
588 				qdf_list_t *peer_list,
589 				struct wlan_objmgr_peer *peer,
590 				wlan_objmgr_ref_dbgid dbg_id);
591 #endif
592 
593 /**
594  * wlan_vdev_peer_list_peek_active_head() - get active head of vdev peer list
595  * @vdev: VDEV object
596  * @peer_list: qdf_list_t
597  * @dbg_id: Ref count debug module id
598  *
599  * API to get the active head peer of given peer (of vdev's peer list)
600  *
601  * Return: active head peer
602  */
603 #ifdef WLAN_OBJMGR_REF_ID_TRACE
604 #define wlan_vdev_peer_list_peek_active_head(vdev, peer_list, dbg_id) \
605 		wlan_vdev_peer_list_peek_active_head_debug(vdev, peer_list, \
606 		dbg_id, __func__, __LINE__)
607 
608 struct wlan_objmgr_peer *wlan_vdev_peer_list_peek_active_head_debug(
609 				struct wlan_objmgr_vdev *vdev,
610 				qdf_list_t *peer_list,
611 				wlan_objmgr_ref_dbgid dbg_id,
612 				const char *func, int line);
613 #else
614 struct wlan_objmgr_peer *wlan_vdev_peer_list_peek_active_head(
615 				struct wlan_objmgr_vdev *vdev,
616 				qdf_list_t *peer_list,
617 				wlan_objmgr_ref_dbgid dbg_id);
618 #endif
619 
620 /**
621  * wlan_psoc_peer_list_peek_head_ref() - get head of psoc peer list
622  *                                            with ref and lock protected
623  * @peer_list: wlan_peer_list
624  * @hash_index: peer list hash index
625  * @dbg_id: Ref count debug module id
626  *
627  * API to get the head peer of given peer (of psoc's peer list)
628  *
629  * Return: head peer
630  */
631 #ifdef WLAN_OBJMGR_REF_ID_TRACE
632 #define wlan_psoc_peer_list_peek_head_ref(peer_list, hash_index, dbg_id) \
633 		wlan_psoc_peer_list_peek_head_ref_debug(peer_list, hash_index, \
634 		dbg_id, __func__, __LINE__)
635 
636 struct wlan_objmgr_peer *wlan_psoc_peer_list_peek_head_ref_debug(
637 					struct wlan_peer_list *peer_list,
638 					uint8_t hash_index,
639 					wlan_objmgr_ref_dbgid dbg_id,
640 					const char *func, int line);
641 
642 #else
643 struct wlan_objmgr_peer *wlan_psoc_peer_list_peek_head_ref(
644 					struct wlan_peer_list *peer_list,
645 					uint8_t hash_index,
646 					wlan_objmgr_ref_dbgid dbg_id);
647 #endif
648 
649 /**
650  * wlan_psoc_peer_list_peek_active_head() - get active head of psoc peer list
651  * @peer_list: wlan_peer_list
652  * @hash_index: peer list hash index
653  * @dbg_id: Ref count debug module id
654  *
655  * API to get the head peer of given peer (of psoc's peer list)
656  *
657  * Return: head peer
658  */
659 #ifdef WLAN_OBJMGR_REF_ID_TRACE
660 #define wlan_psoc_peer_list_peek_active_head(peer_list, hash_index, dbg_id) \
661 		wlan_psoc_peer_list_peek_active_head_debug(peer_list, \
662 		hash_index, dbg_id, __func__, __LINE__)
663 
664 struct wlan_objmgr_peer *wlan_psoc_peer_list_peek_active_head_debug(
665 					struct wlan_peer_list *peer_list,
666 					uint8_t hash_index,
667 					wlan_objmgr_ref_dbgid dbg_id,
668 					const char *func, int line);
669 #else
670 struct wlan_objmgr_peer *wlan_psoc_peer_list_peek_active_head(
671 					struct wlan_peer_list *peer_list,
672 					uint8_t hash_index,
673 					wlan_objmgr_ref_dbgid dbg_id);
674 #endif
675 
676 /**
677  * wlan_psoc_peer_list_peek_head() - get head of psoc peer list
678  * @peer_list: qdf_list_t
679  *
680  * API to get the head peer of given peer (of psoc's peer list)
681  *
682  * Caller need to acquire lock with wlan_peer_obj_lock()
683  *
684  * Return: head peer
685  */
wlan_psoc_peer_list_peek_head(qdf_list_t * peer_list)686 static inline struct wlan_objmgr_peer *wlan_psoc_peer_list_peek_head(
687 					qdf_list_t *peer_list)
688 {
689 	struct wlan_objmgr_peer *peer;
690 	qdf_list_node_t *psoc_node = NULL;
691 
692 	/* This API is invoked with lock acquired, do not add log prints */
693 	if (qdf_list_peek_front(peer_list, &psoc_node) != QDF_STATUS_SUCCESS)
694 		return NULL;
695 
696 	peer = qdf_container_of(psoc_node, struct wlan_objmgr_peer, psoc_peer);
697 	return peer;
698 }
699 
700 /**
701  * wlan_vdev_peer_list_peek_head() - get head of vdev peer list
702  * @peer_list: qdf_list_t
703  *
704  * API to get the head peer of given peer (of vdev's peer list)
705  *
706  * Caller need to acquire lock with wlan_peer_obj_lock()
707  *
708  * Return: head peer
709  */
wlan_vdev_peer_list_peek_head(qdf_list_t * peer_list)710 static inline struct wlan_objmgr_peer *wlan_vdev_peer_list_peek_head(
711 					qdf_list_t *peer_list)
712 {
713 	struct wlan_objmgr_peer *peer;
714 	qdf_list_node_t *vdev_node = NULL;
715 
716 	/* This API is invoked with lock acquired, do not add log prints */
717 	if (qdf_list_peek_front(peer_list, &vdev_node) != QDF_STATUS_SUCCESS)
718 		return NULL;
719 
720 	peer = qdf_container_of(vdev_node, struct wlan_objmgr_peer, vdev_peer);
721 	return peer;
722 }
723 
724 /**
725  * wlan_peer_get_next_peer_of_vdev() - get next peer of vdev list
726  * @peer_list: PEER object list
727  * @peer: PEER object
728  *
729  * API to get the next peer of given peer (of vdev's peer list)
730  *
731  * Caller need to acquire lock with wlan_peer_obj_lock()
732  *
733  * Return: PEER object
734  */
wlan_peer_get_next_peer_of_vdev(qdf_list_t * peer_list,struct wlan_objmgr_peer * peer)735 static inline struct wlan_objmgr_peer *wlan_peer_get_next_peer_of_vdev(
736 			qdf_list_t *peer_list, struct wlan_objmgr_peer *peer)
737 {
738 	struct wlan_objmgr_peer *peer_next;
739 	qdf_list_node_t *node;
740 	qdf_list_node_t *next_node = NULL;
741 
742 	/* This API is invoked with lock acquired, do not add log prints */
743 	if (!peer)
744 		return NULL;
745 
746 	node = &peer->vdev_peer;
747 	if (qdf_list_peek_next(peer_list, node, &next_node) !=
748 						QDF_STATUS_SUCCESS)
749 		return NULL;
750 
751 	peer_next = qdf_container_of(next_node, struct wlan_objmgr_peer,
752 					vdev_peer);
753 	return peer_next;
754 }
755 
756 /**
757  * wlan_peer_set_next_peer_of_vdev() - add peer to vdev peer list
758  * @peer_list: PEER object list
759  * @new_peer: PEER object
760  *
761  * API to set as the next peer to given peer (of vdev's peer list)
762  *
763  * Caller need to acquire lock with wlan_peer_obj_lock()
764  *
765  * Return: void
766  */
wlan_peer_set_next_peer_of_vdev(qdf_list_t * peer_list,struct wlan_objmgr_peer * new_peer)767 static inline void wlan_peer_set_next_peer_of_vdev(qdf_list_t *peer_list,
768 				struct wlan_objmgr_peer *new_peer)
769 {
770 	/* This API is invoked with lock acquired, do not add log prints */
771 	/* set next peer with new peer */
772 	qdf_list_insert_back(peer_list, &new_peer->vdev_peer);
773 	return;
774 }
775 
776 /**
777  * wlan_peer_get_next_peer_of_psoc() - get next peer to psoc peer list
778  * @peer_list: Peer list
779  * @peer: PEER object
780  *
781  * API to get the next peer of given peer (of psoc's peer list)
782  *
783  * Caller need to acquire lock with wlan_peer_obj_lock()
784  *
785  * Return: PEER object
786  */
wlan_peer_get_next_peer_of_psoc(qdf_list_t * peer_list,struct wlan_objmgr_peer * peer)787 static inline struct wlan_objmgr_peer *wlan_peer_get_next_peer_of_psoc(
788 			qdf_list_t *peer_list, struct wlan_objmgr_peer *peer)
789 {
790 	struct wlan_objmgr_peer *peer_next;
791 	qdf_list_node_t *node = NULL;
792 	qdf_list_node_t *next_node = NULL;
793 
794 	/* This API is invoked with lock acquired, do not add log prints */
795 	if (!peer)
796 		return NULL;
797 
798 	node = &peer->psoc_peer;
799 	if (qdf_list_peek_next(peer_list, node, &next_node) !=
800 						QDF_STATUS_SUCCESS)
801 		return NULL;
802 
803 	peer_next = qdf_container_of(next_node, struct wlan_objmgr_peer,
804 					psoc_peer);
805 	return peer_next;
806 }
807 
808 /**
809  * wlan_peer_set_next_peer_of_psoc() - add peer to psoc peer list
810  * @peer_list: PEER object list
811  * @new_peer: PEER object
812  *
813  * API to set as the next peer to given peer (of psoc's peer list)
814  *
815  * Caller need to acquire lock with wlan_peer_obj_lock()
816  *
817  * Return: void
818  */
wlan_peer_set_next_peer_of_psoc(qdf_list_t * peer_list,struct wlan_objmgr_peer * new_peer)819 static inline void wlan_peer_set_next_peer_of_psoc(qdf_list_t *peer_list,
820 					struct wlan_objmgr_peer *new_peer)
821 {
822 	/* This API is invoked with lock acquired, do not add log prints */
823 	/* set next peer with new peer */
824 	qdf_list_insert_back(peer_list, &new_peer->psoc_peer);
825 	return;
826 }
827 
828 /**
829  * wlan_peer_set_peer_type() - set peer type
830  * @peer: PEER object
831  * @type: type of PEER
832  *
833  * API to set peer type
834  *
835  * Return: void
836  */
wlan_peer_set_peer_type(struct wlan_objmgr_peer * peer,enum wlan_peer_type type)837 static inline void wlan_peer_set_peer_type(struct wlan_objmgr_peer *peer,
838 			enum wlan_peer_type type)
839 {
840 	peer->peer_mlme.peer_type = type;
841 }
842 
843 /**
844  * wlan_peer_get_peer_type() - get peer type
845  * @peer: PEER object
846  *
847  * API to get peer type
848  *
849  * Return: type of PEER
850  */
wlan_peer_get_peer_type(struct wlan_objmgr_peer * peer)851 static inline enum wlan_peer_type wlan_peer_get_peer_type(
852 				struct wlan_objmgr_peer *peer)
853 {
854 	return peer->peer_mlme.peer_type;
855 }
856 
857 /**
858  * wlan_peer_set_phymode() - set phymode
859  * @peer: PEER object
860  * @phymode: phymode of peer
861  *
862  * API to set phymode
863  *
864  * Return: void
865  */
wlan_peer_set_phymode(struct wlan_objmgr_peer * peer,enum wlan_phymode phymode)866 static inline void wlan_peer_set_phymode(struct wlan_objmgr_peer *peer,
867 					 enum wlan_phymode phymode)
868 {
869 	peer->peer_mlme.phymode = phymode;
870 }
871 
872 /**
873  * wlan_peer_get_phymode() - get phymode
874  * @peer: PEER object
875  *
876  * API to get phymode
877  *
878  * Return: phymode of PEER
879  */
wlan_peer_get_phymode(struct wlan_objmgr_peer * peer)880 static inline enum wlan_phymode wlan_peer_get_phymode(
881 				struct wlan_objmgr_peer *peer)
882 {
883 	return peer->peer_mlme.phymode;
884 }
885 
886 /**
887  * wlan_peer_set_rssi() - set RSSI
888  * @peer: PEER object
889  * @rssi: RSSI
890  *
891  * API to set rssi
892  *
893  * Return: void
894  */
wlan_peer_set_rssi(struct wlan_objmgr_peer * peer,int8_t rssi)895 static inline void wlan_peer_set_rssi(struct wlan_objmgr_peer *peer,
896 				      int8_t rssi)
897 {
898 	peer->peer_mlme.rssi = rssi;
899 }
900 
901 /**
902  * wlan_peer_get_rssi() - get RSSI
903  * @peer: PEER object
904  *
905  * API to get RSSI
906  *
907  * Return: RSSI of PEER
908  */
wlan_peer_get_rssi(struct wlan_objmgr_peer * peer)909 static inline int8_t wlan_peer_get_rssi(
910 				struct wlan_objmgr_peer *peer)
911 {
912 	return peer->peer_mlme.rssi;
913 }
914 
915 /**
916  * wlan_peer_set_macaddr() - set mac addr
917  * @peer: PEER object
918  * @macaddr: MAC address
919  *
920  * API to set peer mac address
921  *
922  * Caller need to acquire lock with wlan_peer_obj_lock()
923  *
924  * Return: void
925  */
wlan_peer_set_macaddr(struct wlan_objmgr_peer * peer,uint8_t * macaddr)926 static inline void wlan_peer_set_macaddr(struct wlan_objmgr_peer *peer,
927 			uint8_t *macaddr)
928 {
929 	/* This API is invoked with lock acquired, do not add log prints */
930 	WLAN_ADDR_COPY(peer->macaddr, macaddr);
931 }
932 
933 #ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
934 /**
935  * wlan_peer_update_macaddr() - Update peer MAC address
936  * @peer: PEER object
937  * @new_macaddr: New MAC address
938  *
939  * API to update peer MAC address and corresponding peer hash entry in PSOC
940  * peer list.
941  *
942  * Return: SUCCESS/FAILURE
943  */
944 QDF_STATUS wlan_peer_update_macaddr(struct wlan_objmgr_peer *peer,
945 				    uint8_t *new_macaddr);
946 #endif
947 
948 /**
949  * wlan_peer_get_macaddr() - get mac addr
950  * @peer: PEER object
951  *
952  * API to get peer mac address
953  *
954  * Caller need to acquire lock with wlan_peer_obj_lock()
955  *
956  * Return: MAC address
957  */
wlan_peer_get_macaddr(struct wlan_objmgr_peer * peer)958 static inline uint8_t *wlan_peer_get_macaddr(struct wlan_objmgr_peer *peer)
959 {
960 	/* This API is invoked with lock acquired, do not add log prints */
961 	return peer->macaddr;
962 }
963 
964 /**
965  * wlan_peer_get_vdev() - get vdev
966  * @peer: PEER object
967  *
968  * API to get peer's vdev
969  *
970  * Return: VDEV object
971  */
wlan_peer_get_vdev(struct wlan_objmgr_peer * peer)972 static inline struct wlan_objmgr_vdev *wlan_peer_get_vdev(
973 			struct wlan_objmgr_peer *peer)
974 {
975 	return peer->peer_objmgr.vdev;
976 }
977 
978 /**
979  * wlan_peer_set_vdev() - set vdev
980  * @peer: PEER object
981  * @vdev: VDEV object
982  *
983  * API to set peer's vdev
984  *
985  * Return: void
986  */
wlan_peer_set_vdev(struct wlan_objmgr_peer * peer,struct wlan_objmgr_vdev * vdev)987 static inline void wlan_peer_set_vdev(struct wlan_objmgr_peer *peer,
988 		struct wlan_objmgr_vdev *vdev)
989 {
990 	peer->peer_objmgr.vdev = vdev;
991 }
992 
993 /**
994  * wlan_peer_mlme_flag_set() - mlme flag set
995  * @peer: PEER object
996  * @flag: flag to be set
997  *
998  * API to set flag in peer
999  *
1000  * Return: void
1001  */
wlan_peer_mlme_flag_set(struct wlan_objmgr_peer * peer,uint32_t flag)1002 static inline void wlan_peer_mlme_flag_set(struct wlan_objmgr_peer *peer,
1003 					   uint32_t flag)
1004 {
1005 	peer->peer_mlme.peer_flags |= flag;
1006 }
1007 
1008 /**
1009  * wlan_peer_mlme_flag_clear() - mlme flag clear
1010  * @peer: PEER object
1011  * @flag: flag to be cleared
1012  *
1013  * API to clear flag in peer
1014  *
1015  * Return: void
1016  */
wlan_peer_mlme_flag_clear(struct wlan_objmgr_peer * peer,uint32_t flag)1017 static inline void wlan_peer_mlme_flag_clear(struct wlan_objmgr_peer *peer,
1018 				uint32_t flag)
1019 {
1020 	peer->peer_mlme.peer_flags &= ~flag;
1021 }
1022 
1023 /**
1024  * wlan_peer_mlme_flag_get() - mlme flag get
1025  * @peer: PEER object
1026  * @flag: flag to be checked
1027  *
1028  * API to know, whether particular flag is set in peer
1029  *
1030  * Return: 1 (for set) or 0 (for not set)
1031  */
wlan_peer_mlme_flag_get(struct wlan_objmgr_peer * peer,uint32_t flag)1032 static inline uint8_t wlan_peer_mlme_flag_get(struct wlan_objmgr_peer *peer,
1033 				uint32_t flag)
1034 {
1035 	return (peer->peer_mlme.peer_flags & flag) ? 1 : 0;
1036 }
1037 
1038 /**
1039  * wlan_peer_mlme_flag_ext_set() - mlme ext flag set
1040  * @peer: PEER object
1041  * @flag: ext flag to be set
1042  *
1043  * API to set ext flag in peer
1044  *
1045  * Return: void
1046  */
wlan_peer_mlme_flag_ext_set(struct wlan_objmgr_peer * peer,uint32_t flag)1047 static inline void wlan_peer_mlme_flag_ext_set(struct wlan_objmgr_peer *peer,
1048 					       uint32_t flag)
1049 {
1050 	peer->peer_mlme.peer_ext_flags |= flag;
1051 }
1052 
1053 /**
1054  * wlan_peer_mlme_flag_ext_clear() - mlme ext flag clear
1055  * @peer: PEER object
1056  * @flag: ext flag to be cleared
1057  *
1058  * API to clear ext flag in peer
1059  *
1060  * Return: void
1061  */
wlan_peer_mlme_flag_ext_clear(struct wlan_objmgr_peer * peer,uint32_t flag)1062 static inline void wlan_peer_mlme_flag_ext_clear(struct wlan_objmgr_peer *peer,
1063 						 uint32_t flag)
1064 {
1065 	peer->peer_mlme.peer_ext_flags &= ~flag;
1066 }
1067 
1068 /**
1069  * wlan_peer_mlme_flag_ext_get() - mlme ext flag get
1070  * @peer: PEER object
1071  * @flag: ext flag to be checked
1072  *
1073  * API to know, whether particular ext flag is set in peer
1074  *
1075  * Return: 1 (for set) or 0 (for not set)
1076  */
wlan_peer_mlme_flag_ext_get(struct wlan_objmgr_peer * peer,uint32_t flag)1077 static inline uint8_t wlan_peer_mlme_flag_ext_get(struct wlan_objmgr_peer *peer,
1078 						  uint32_t flag)
1079 {
1080 	return (peer->peer_mlme.peer_ext_flags & flag) ? 1 : 0;
1081 }
1082 
1083 /**
1084  * wlan_peer_mlme_set_state() - peer mlme state
1085  * @peer: PEER object
1086  * @state: enum wlan_peer_state
1087  *
1088  * API to update the current peer state
1089  *
1090  * Return: void
1091  */
wlan_peer_mlme_set_state(struct wlan_objmgr_peer * peer,enum wlan_peer_state state)1092 static inline void wlan_peer_mlme_set_state(
1093 				struct wlan_objmgr_peer *peer,
1094 				enum wlan_peer_state state)
1095 {
1096 	peer->peer_mlme.state = state;
1097 }
1098 
1099 #ifdef WLAN_FEATURE_11BE_MLO
1100 /**
1101  * wlan_peer_mlme_get_mldaddr() - get peer mldaddr
1102  * @peer: PEER object
1103  *
1104  * API to get MLD address from peer object
1105  *
1106  * Return: mld address
1107  */
wlan_peer_mlme_get_mldaddr(struct wlan_objmgr_peer * peer)1108 static inline uint8_t *wlan_peer_mlme_get_mldaddr(struct wlan_objmgr_peer *peer)
1109 {
1110 	return peer->mldaddr;
1111 }
1112 
1113 /**
1114  * wlan_peer_mlme_set_mldaddr() - set peer mldaddr
1115  * @peer: PEER object
1116  * @mldaddr: MLD address
1117  *
1118  * API to set MLD addr in peer object
1119  *
1120  * Return: void
1121  */
wlan_peer_mlme_set_mldaddr(struct wlan_objmgr_peer * peer,uint8_t * mldaddr)1122 static inline void wlan_peer_mlme_set_mldaddr(struct wlan_objmgr_peer *peer,
1123 					      uint8_t *mldaddr)
1124 {
1125 	WLAN_ADDR_COPY(peer->mldaddr, mldaddr);
1126 }
1127 
1128 /**
1129  * wlan_peer_mlme_set_assoc_peer() - assoc frames is received on this peer
1130  * @peer: PEER object
1131  * @is_assoc_link: whether assoc frames is received on this peer or not
1132  *
1133  * API to update assoc peer
1134  *
1135  * Return: void
1136  */
wlan_peer_mlme_set_assoc_peer(struct wlan_objmgr_peer * peer,bool is_assoc_link)1137 static inline void wlan_peer_mlme_set_assoc_peer(
1138 				struct wlan_objmgr_peer *peer,
1139 				bool is_assoc_link)
1140 {
1141 	peer->peer_mlme.assoc_peer = is_assoc_link;
1142 }
1143 
1144 /**
1145  * wlan_peer_mlme_is_assoc_peer() - check peer is assoc peer or not
1146  * @peer: PEER object
1147  *
1148  * API to get assoc peer info
1149  *
1150  * Return: whether assoc frames is received on this peer or not
1151  */
wlan_peer_mlme_is_assoc_peer(struct wlan_objmgr_peer * peer)1152 static inline bool wlan_peer_mlme_is_assoc_peer(
1153 				struct wlan_objmgr_peer *peer)
1154 {
1155 	return peer->peer_mlme.assoc_peer;
1156 }
1157 #else
1158 
wlan_peer_mlme_get_mldaddr(struct wlan_objmgr_peer * peer)1159 static inline uint8_t *wlan_peer_mlme_get_mldaddr(struct wlan_objmgr_peer *peer)
1160 {
1161 	return NULL;
1162 }
1163 
wlan_peer_mlme_set_mldaddr(struct wlan_objmgr_peer * peer,uint8_t * mldaddr)1164 static inline void wlan_peer_mlme_set_mldaddr(struct wlan_objmgr_peer *peer,
1165 					      uint8_t *mldaddr)
1166 {
1167 }
1168 
wlan_peer_mlme_set_assoc_peer(struct wlan_objmgr_peer * peer,bool is_assoc_link)1169 static inline void wlan_peer_mlme_set_assoc_peer(
1170 				struct wlan_objmgr_peer *peer,
1171 				bool is_assoc_link)
1172 {
1173 }
1174 
wlan_peer_mlme_is_assoc_peer(struct wlan_objmgr_peer * peer)1175 static inline bool wlan_peer_mlme_is_assoc_peer(
1176 				struct wlan_objmgr_peer *peer)
1177 {
1178 	return true;
1179 }
1180 #endif
1181 
1182 /**
1183  * wlan_peer_mlme_set_auth_state() - peer mlme auth state
1184  * @peer: PEER object
1185  * @is_authenticated: true or false
1186  *
1187  * API to update the current peer auth state
1188  *
1189  * Return: void
1190  */
wlan_peer_mlme_set_auth_state(struct wlan_objmgr_peer * peer,bool is_authenticated)1191 static inline void wlan_peer_mlme_set_auth_state(
1192 				struct wlan_objmgr_peer *peer,
1193 				bool is_authenticated)
1194 {
1195 	peer->peer_mlme.is_authenticated = is_authenticated;
1196 }
1197 
1198 /**
1199  * wlan_peer_mlme_get_state() - peer mlme state
1200  * @peer: PEER object
1201  *
1202  * API to get peer state
1203  *
1204  * Return: enum wlan_peer_state
1205  */
wlan_peer_mlme_get_state(struct wlan_objmgr_peer * peer)1206 static inline enum wlan_peer_state wlan_peer_mlme_get_state(
1207 				struct wlan_objmgr_peer *peer)
1208 {
1209 	return peer->peer_mlme.state;
1210 }
1211 
1212 /**
1213  * wlan_peer_mlme_get_auth_state() - peer mlme auth state
1214  * @peer: PEER object
1215  *
1216  * API to get peer auth state
1217  *
1218  * Return: auth state true/false
1219  */
wlan_peer_mlme_get_auth_state(struct wlan_objmgr_peer * peer)1220 static inline bool wlan_peer_mlme_get_auth_state(
1221 				struct wlan_objmgr_peer *peer)
1222 {
1223 	return peer->peer_mlme.is_authenticated;
1224 }
1225 
1226 /**
1227  * wlan_peer_mlme_get_next_seq_num() - get peer mlme next sequence number
1228  * @peer: PEER object
1229  *
1230  * API to get mlme peer next sequence number
1231  *
1232  * Caller need to acquire lock with wlan_peer_obj_lock()
1233  *
1234  * Return: peer mlme next sequence number
1235  */
wlan_peer_mlme_get_next_seq_num(struct wlan_objmgr_peer * peer)1236 static inline uint32_t wlan_peer_mlme_get_next_seq_num(
1237 				struct wlan_objmgr_peer *peer)
1238 {
1239 	/* This API is invoked with lock acquired, do not add log prints */
1240 	if (peer->peer_mlme.seq_num < WLAN_MAX_SEQ_NUM)
1241 		peer->peer_mlme.seq_num++;
1242 	else
1243 		peer->peer_mlme.seq_num = 0;
1244 
1245 	return peer->peer_mlme.seq_num;
1246 }
1247 
1248 /**
1249  * wlan_peer_mlme_get_seq_num() - get peer mlme sequence number
1250  * @peer: PEER object
1251  *
1252  * API to get mlme peer sequence number
1253  *
1254  * Caller need to acquire lock with wlan_peer_obj_lock()
1255  *
1256  * Return: peer mlme sequence number
1257  */
wlan_peer_mlme_get_seq_num(struct wlan_objmgr_peer * peer)1258 static inline uint32_t wlan_peer_mlme_get_seq_num(
1259 				struct wlan_objmgr_peer *peer)
1260 {
1261 	/* This API is invoked with lock acquired, do not add log prints */
1262 	return peer->peer_mlme.seq_num;
1263 }
1264 
1265 /**
1266  * wlan_peer_mlme_reset_seq_num() - reset peer mlme sequence number
1267  * @peer: PEER object
1268  *
1269  * API to reset peer sequence number
1270  *
1271  * Caller need to acquire lock with wlan_peer_obj_lock()
1272  *
1273  * Return: void
1274  */
wlan_peer_mlme_reset_seq_num(struct wlan_objmgr_peer * peer)1275 static inline void wlan_peer_mlme_reset_seq_num(
1276 				struct wlan_objmgr_peer *peer)
1277 {
1278 	/* This API is invoked with lock acquired, do not add log prints */
1279 	peer->peer_mlme.seq_num = 0;
1280 }
1281 
1282 /**
1283  * wlan_peer_get_psoc() - get psoc
1284  * @peer: PEER object
1285  *
1286  * API to get peer's psoc
1287  *
1288  * Return: PSOC object or NULL if the psoc can not be found
1289  */
wlan_peer_get_psoc(struct wlan_objmgr_peer * peer)1290 static inline struct wlan_objmgr_psoc *wlan_peer_get_psoc(
1291 			struct wlan_objmgr_peer *peer)
1292 {
1293 	struct wlan_objmgr_vdev *vdev;
1294 	struct wlan_objmgr_psoc *psoc;
1295 
1296 	vdev = wlan_peer_get_vdev(peer);
1297 	if (!vdev)
1298 		return NULL;
1299 
1300 	psoc = wlan_vdev_get_psoc(vdev);
1301 
1302 	return psoc;
1303 }
1304 
1305 /**
1306  * wlan_peer_get_psoc_id() - get psoc id
1307  * @peer: PEER object
1308  *
1309  * API to get peer's psoc id
1310  *
1311  * Return: @psoc_id: psoc id
1312  */
wlan_peer_get_psoc_id(struct wlan_objmgr_peer * peer)1313 static inline uint8_t wlan_peer_get_psoc_id(struct wlan_objmgr_peer *peer)
1314 {
1315 	struct wlan_objmgr_psoc *psoc;
1316 
1317 	psoc = wlan_peer_get_psoc(peer);
1318 
1319 	return wlan_psoc_get_id(psoc);
1320 }
1321 
1322 /*
1323  * wlan_peer_get_pdev_id() - get pdev id
1324  * @peer: peer object pointer
1325  *
1326  * Return: pdev id
1327  */
wlan_peer_get_pdev_id(struct wlan_objmgr_peer * peer)1328 static inline uint8_t wlan_peer_get_pdev_id(struct wlan_objmgr_peer *peer)
1329 {
1330 	return peer->pdev_id;
1331 }
1332 
1333 /**
1334  * wlan_peer_set_pdev_id() - set pdev id
1335  * @peer: peer object pointer
1336  * @pdev_id: pdev id
1337  *
1338  * Return: void
1339  */
wlan_peer_set_pdev_id(struct wlan_objmgr_peer * peer,uint8_t pdev_id)1340 static inline void wlan_peer_set_pdev_id(struct wlan_objmgr_peer *peer,
1341 					 uint8_t pdev_id)
1342 {
1343 	peer->pdev_id = pdev_id;
1344 }
1345 
1346 /**
1347  * wlan_objmgr_print_peer_ref_ids() - print peer object refs
1348  * @peer: peer object pointer
1349  * @log_level: log level
1350  *
1351  * Return: void
1352  */
1353 void wlan_objmgr_print_peer_ref_ids(struct wlan_objmgr_peer *peer,
1354 				    QDF_TRACE_LEVEL log_level);
1355 
1356 /**
1357  * wlan_objmgr_peer_get_comp_ref_cnt() - get component ref count for a peer
1358  * @peer: peer object pointer
1359  * @id: component id
1360  *
1361  * Return: uint32_t
1362  */
1363 uint32_t
1364 wlan_objmgr_peer_get_comp_ref_cnt(struct wlan_objmgr_peer *peer,
1365 				  enum wlan_umac_comp_id id);
1366 
1367 /**
1368  * wlan_objmgr_peer_trace_init_lock() - Initialize peer trace lock
1369  * @peer: peer object pointer
1370  *
1371  * Return: void
1372  */
1373 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1374 static inline void
wlan_objmgr_peer_trace_init_lock(struct wlan_objmgr_peer * peer)1375 wlan_objmgr_peer_trace_init_lock(struct wlan_objmgr_peer *peer)
1376 {
1377 	wlan_objmgr_trace_init_lock(&peer->peer_objmgr.trace);
1378 }
1379 #else
1380 static inline void
wlan_objmgr_peer_trace_init_lock(struct wlan_objmgr_peer * peer)1381 wlan_objmgr_peer_trace_init_lock(struct wlan_objmgr_peer *peer)
1382 {
1383 }
1384 #endif
1385 
1386 /**
1387  * wlan_objmgr_peer_trace_deinit_lock() - Deinitialize peer trace lock
1388  * @peer: peer object pointer
1389  *
1390  * Return: void
1391  */
1392 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1393 static inline void
wlan_objmgr_peer_trace_deinit_lock(struct wlan_objmgr_peer * peer)1394 wlan_objmgr_peer_trace_deinit_lock(struct wlan_objmgr_peer *peer)
1395 {
1396 	wlan_objmgr_trace_deinit_lock(&peer->peer_objmgr.trace);
1397 }
1398 #else
1399 static inline void
wlan_objmgr_peer_trace_deinit_lock(struct wlan_objmgr_peer * peer)1400 wlan_objmgr_peer_trace_deinit_lock(struct wlan_objmgr_peer *peer)
1401 {
1402 }
1403 #endif
1404 
1405 /**
1406  * wlan_objmgr_peer_trace_del_ref_list() - Delete peer trace reference list
1407  * @peer: peer object pointer
1408  *
1409  * Return: void
1410  */
1411 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1412 static inline void
wlan_objmgr_peer_trace_del_ref_list(struct wlan_objmgr_peer * peer)1413 wlan_objmgr_peer_trace_del_ref_list(struct wlan_objmgr_peer *peer)
1414 {
1415 	wlan_objmgr_trace_del_ref_list(&peer->peer_objmgr.trace);
1416 }
1417 #else
1418 static inline void
wlan_objmgr_peer_trace_del_ref_list(struct wlan_objmgr_peer * peer)1419 wlan_objmgr_peer_trace_del_ref_list(struct wlan_objmgr_peer *peer)
1420 {
1421 }
1422 #endif
1423 
1424 #endif /* _WLAN_OBJMGR_PEER_OBJ_H_*/
1425