1 /*
2  * Copyright (c) 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 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: contains mlo manager msgq structure definitions
20  */
21 
22 #ifndef __MLO_MGR_MSGQ_H
23 #define __MLO_MGR_MSGQ_H
24 
25 /*
26  * struct ctxt_switch_mgr - MLO context switch manager
27  * @ctxt_mgr_timer: Timer to process messages
28  * @msgq_list: list to hold pending messages
29  * @ctxt_lock: Lock to have atomic context
30  * @timer_started: indicates whether timer is running
31  * @max_messages_procd: Max messages can be stored
32  */
33 struct ctxt_switch_mgr {
34 	qdf_timer_t ctxt_mgr_timer;
35 	qdf_list_t msgq_list;
36 	qdf_spinlock_t ctxt_lock;
37 	bool timer_started;
38 	bool allow_msg;
39 	uint16_t max_messages_procd;
40 };
41 
42 /*
43  * enum mlo_msg_type – MLO partner peer message type
44  * @MLO_PEER_CREATE:   Partner peer create
45  * @MLO_PEER_ASSOC:    Partner peer ASSOC
46  * @MLO_PEER_ASSOC_FAIL:  Partner peer ASSOC failure
47  * @MLO_PEER_DISCONNECT:  Partner peer Disconnect
48  * @MLO_PEER_DEAUTH:  Initiate Deauth for ML connection
49  * @MLO_PEER_PENDING_AUTH:  Initiate process of pending auth
50  * @MLO_BRIDGE_PEER_CREATE:   Bridge peer create
51  * @MLO_PEER_REASSOC:  Partner peer reassoc
52  */
53 enum mlo_msg_type {
54 	MLO_PEER_CREATE,
55 	MLO_PEER_ASSOC,
56 	MLO_PEER_ASSOC_FAIL,
57 	MLO_PEER_DISCONNECT,
58 	MLO_PEER_DEAUTH,
59 	MLO_PEER_PENDING_AUTH,
60 	MLO_BRIDGE_PEER_CREATE,
61 	MLO_PEER_REASSOC,
62 };
63 
64 /*
65  * struct peer_create_notif_s - MLO partner peer create notification
66  * @vdev_link: Link VDEV
67  * @ml_peer: ML peer to attached
68  * @addr: Link MAC address
69  * @frm_buf: Assoc request buffer
70  */
71 struct peer_create_notif_s {
72 	struct wlan_objmgr_vdev *vdev_link;
73 	struct wlan_mlo_peer_context *ml_peer;
74 	struct qdf_mac_addr addr;
75 	qdf_nbuf_t frm_buf;
76 };
77 
78 /*
79  * struct peer_assoc_notify_s - MLO partner peer assoc notification
80  * @peer: Link peer on which Peer ASSOC to be sent
81  */
82 struct peer_assoc_notify_s {
83 	struct wlan_objmgr_peer *peer;
84 };
85 
86 /*
87  * struct peer_assoc_fail_notify_s - MLO partner peer assoc fail notification
88  * @peer: Link peer on which Peer assoc resp failure to be sent
89  */
90 struct peer_assoc_fail_notify_s {
91 	struct wlan_objmgr_peer *peer;
92 };
93 
94 /*
95  * struct peer_discon_notify_s - MLO partner peer disconnect notification
96  * @peer: Link peer on which Peer disconnect to be sent
97  */
98 struct peer_discon_notify_s {
99 	struct wlan_objmgr_peer *peer;
100 };
101 
102 /*
103  * struct peer_deauth_notify_s - MLO partner peer deauth notification
104  * @peer: Link peer on which Peer deauth to be sent
105  * @is_disassoc: flag indicates that disassoc frame needs to be sent
106  */
107 struct peer_deauth_notify_s {
108 	struct wlan_objmgr_peer *peer;
109 	uint8_t is_disassoc;
110 };
111 
112 /*
113  * struct peer_auth_process_notif_s - MLO peer pending auth notification
114  * @auth_params: Auth param structure
115  */
116 struct peer_auth_process_notif_s {
117 	struct mlpeer_auth_params *auth_params;
118 };
119 
120 /*
121  * union msg_payload - MLO message payload
122  * @peer_create: peer create notification structure
123  * @peer_assoc: peer assoc notification structure
124  * @peer_assoc_fail: peer assoc fail notification structure
125  * @peer_disconn: peer disconnect notification structure
126  * @peer_deauth: peer deauth notification structure
127  * @peer_auth_process: Peer Auth process notification structure
128  */
129 union msg_payload {
130 	struct peer_create_notif_s peer_create;
131 	struct peer_assoc_notify_s peer_assoc;
132 	struct peer_assoc_fail_notify_s peer_assoc_fail;
133 	struct peer_discon_notify_s peer_disconn;
134 	struct peer_deauth_notify_s peer_deauth;
135 	struct peer_auth_process_notif_s peer_auth;
136 };
137 
138 #define MLO_MAX_MSGQ_SIZE 256
139 /*
140  * struct mlo_ctxt_switch_msg_s - MLO ctxt switch message
141  * @type: peer create notification structure
142  * @peer_assoc: peer assoc notification structure
143  * @peer_assoc_fail: peer assoc fail notification structure
144  * @peer_disconn: peer disconnect notification structure
145  */
146 struct mlo_ctxt_switch_msg_s {
147 	qdf_list_node_t node;
148 	enum mlo_msg_type type;
149 	struct wlan_mlo_dev_context *ml_dev;
150 	union msg_payload m;
151 };
152 
153 /**
154  * mlo_msgq_post() - Posts message to defer context
155  * @type: msg tupe
156  * @ml_dev: MLO dev context
157  * @payload: msg buf
158  *
159  * This function post message to defer context queue for defer processing
160  *
161  * Return: SUCCESS if msg is posted
162  */
163 QDF_STATUS mlo_msgq_post(enum mlo_msg_type type,
164 			 struct wlan_mlo_dev_context *ml_dev,
165 			 void *payload);
166 
167 /**
168  * mlo_msgq_init() - Init MLO message queue
169  *
170  * This function initializes MLO msg queue module
171  *
172  * Return: void
173  */
174 void mlo_msgq_init(void);
175 
176 /**
177  * mlo_msgq_free() - Free MLO message queue
178  *
179  * This function frees MLO msg queue module
180  *
181  * Return: void
182  */
183 void mlo_msgq_free(void);
184 #endif
185