xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlo_mgr/src/wlan_mlo_mgr_msgq.c (revision 2f4b444fb7e689b83a4ab0e7b3b38f0bf4def8e0)
1 /*
2  * Copyright (c) 2021, The Linux Foundation. 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 #include "wlan_mlo_mgr_main.h"
17 #include "qdf_types.h"
18 #include "wlan_cmn.h"
19 #include "wlan_mlo_mgr_cmn.h"
20 #include "wlan_mlo_mgr_msgq.h"
21 #include "wlan_mlo_mgr_peer.h"
22 
23 #ifndef MLO_MSGQ_SUPPORT
24 QDF_STATUS mlo_msgq_post(enum mlo_msg_type type,
25 			 struct wlan_mlo_dev_context *ml_dev,
26 			 void *payload)
27 {
28 	struct peer_create_notif_s *peer_create;
29 	struct peer_assoc_notify_s *peer_assoc;
30 	struct peer_assoc_fail_notify_s *peer_assoc_fail;
31 	struct peer_discon_notify_s *peer_disconn;
32 
33 	switch (type) {
34 	case MLO_PEER_CREATE:
35 		peer_create = (struct peer_create_notif_s *)payload;
36 
37 		mlo_mlme_peer_create(peer_create->vdev_link,
38 				     peer_create->ml_peer,
39 				     &peer_create->addr, peer_create->frm_buf);
40 		qdf_nbuf_free(peer_create->frm_buf);
41 		wlan_mlo_peer_release_ref(peer_create->ml_peer);
42 		wlan_objmgr_vdev_release_ref(peer_create->vdev_link,
43 					     WLAN_MLO_MGR_ID);
44 		break;
45 
46 	case MLO_PEER_ASSOC:
47 		peer_assoc = (struct peer_assoc_notify_s *)payload;
48 		mlo_mlme_peer_assoc(peer_assoc->peer);
49 		wlan_objmgr_peer_release_ref(peer_assoc->peer,
50 					     WLAN_MLO_MGR_ID);
51 		break;
52 
53 	case MLO_PEER_ASSOC_FAIL:
54 		peer_assoc_fail = (struct peer_assoc_fail_notify_s *)payload;
55 		mlo_mlme_peer_assoc_fail(peer_assoc_fail->peer);
56 		wlan_objmgr_peer_release_ref(peer_assoc_fail->peer,
57 					     WLAN_MLO_MGR_ID);
58 		break;
59 
60 	case MLO_PEER_DISCONNECT:
61 		peer_disconn = (struct peer_discon_notify_s *)payload;
62 		mlo_mlme_peer_delete(peer_disconn->peer);
63 		wlan_objmgr_peer_release_ref(peer_disconn->peer,
64 					     WLAN_MLO_MGR_ID);
65 		break;
66 
67 	default:
68 		break;
69 	}
70 
71 	return QDF_STATUS_SUCCESS;
72 }
73 #else
74 QDF_STATUS mlo_msgq_post(enum mlo_msg_type type,
75 			 struct wlan_mlo_dev_context *ml_dev,
76 			 void *payload)
77 {
78 	struct mlo_ctxt_switch_msg_s *msg;
79 	struct peer_create_notif_s *peer_create, *peer_create_l;
80 	struct peer_assoc_notify_s *peer_assoc, *peer_assoc_l;
81 	struct peer_assoc_fail_notify_s *peer_assoc_fail, *peer_assoc_fail_l;
82 	struct peer_discon_notify_s *peer_disconn, *peer_disconn_l;
83 
84 	msg = qdf_mem_malloc(sizeof(*msg));
85 	if (!msg)
86 		return QDF_STATUS_E_NOMEM;
87 
88 	msg->type = type;
89 	msg->ml_dev = ml_dev;
90 
91 	switch (type) {
92 	case MLO_PEER_CREATE:
93 		peer_create = &msg->m.peer_create;
94 		peer_create_l = (struct peer_create_notif_s *)payload;
95 		peer_create->frm_buf = peer_create_l->frm_buf;
96 		peer_create->ml_peer = peer_create_l->ml_peer;
97 		peer_create->vdev_link = peer_create_l->vdev_link;
98 		qdf_copy_macaddr(&peer_create->addr, &peer_create_l->addr);
99 		break;
100 
101 	case MLO_PEER_ASSOC:
102 		peer_assoc = &msg->m.peer_assoc;
103 		peer_assoc_l = (struct peer_assoc_notify_s *)payload;
104 		peer_assoc->peer = peer_assoc_l->peer;
105 		break;
106 
107 	case MLO_PEER_ASSOC_FAIL:
108 		peer_assoc_fail = &msg->m.peer_assoc_fail;
109 		peer_assoc_fail_l = (struct peer_assoc_fail_notify_s *)payload;
110 		peer_assoc_fail->peer = peer_assoc_fail_l->peer;
111 		break;
112 
113 	case MLO_PEER_DISCONNECT:
114 		peer_disconn = &msg->m.peer_disconn;
115 		peer_disconn_l = (struct peer_discon_notify_s *)payload;
116 		peer_disconn->peer = peer_disconn_l->peer;
117 		break;
118 
119 	default:
120 		break;
121 	}
122 	/* TODO queue message buffer to qdf_list */
123 
124 	return QDF_STATUS_SUCCESS;
125 }
126 
127 void mlo_msgq_msg_process_hdlr(struct mlo_ctxt_switch_msg_s *msg)
128 {
129 	enum mlo_msg_type type;
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 
135 	type = msg->type;
136 	switch (type) {
137 	case MLO_PEER_CREATE:
138 		peer_create = &msg->m.peer_create;
139 		mlo_mlme_peer_create(peer_create->vdev_link,
140 				     peer_create->ml_peer,
141 				     &peer_create->addr, peer_create->frm_buf);
142 		qdf_nbuf_free(peer_create->frm_buf);
143 		wlan_mlo_peer_release_ref(peer_create->ml_peer);
144 		wlan_objmgr_vdev_release_ref(peer_create->vdev_link,
145 					     WLAN_MLO_MGR_ID);
146 		break;
147 
148 	case MLO_PEER_ASSOC:
149 		peer_assoc = &msg->m.peer_assoc;
150 		mlo_mlme_peer_assoc(peer_assoc->peer);
151 		wlan_objmgr_peer_release_ref(peer_assoc->peer,
152 					     WLAN_MLO_MGR_ID);
153 		break;
154 
155 	case MLO_PEER_ASSOC_FAIL:
156 		peer_assoc_fail = &msg->m.peer_assoc_fail;
157 		mlo_mlme_peer_assoc_fail(peer_assoc_fail->peer);
158 		wlan_objmgr_peer_release_ref(peer_assoc_fail->peer,
159 					     WLAN_MLO_MGR_ID);
160 		break;
161 
162 	case MLO_PEER_DISCONNECT:
163 		peer_disconn = &msg->m.peer_disconn;
164 		mlo_mlme_peer_delete(peer_disconn->peer);
165 		wlan_objmgr_peer_release_ref(peer_disconn->peer,
166 					     WLAN_MLO_MGR_ID);
167 		break;
168 
169 	default:
170 		break;
171 	}
172 	qdf_mem_free(msg);
173 }
174 
175 void mlo_msgq_msg_flush_hdlr(struct mlo_ctxt_switch_msg_s *msg)
176 {
177 	enum mlo_msg_type type;
178 	struct peer_create_notif_s *peer_create;
179 	struct peer_assoc_notify_s *peer_assoc;
180 	struct peer_assoc_fail_notify_s *peer_assoc_fail;
181 	struct peer_discon_notify_s *peer_disconn;
182 
183 	type = msg->type;
184 	switch (type) {
185 	case MLO_PEER_CREATE:
186 		peer_create = &msg->m.peer_create;
187 		qdf_nbuf_free(peer_create->frm_buf);
188 		wlan_mlo_peer_release_ref(peer_create->ml_peer);
189 		wlan_objmgr_vdev_release_ref(peer_create->vdev_link,
190 					     WLAN_MLO_MGR_ID);
191 		break;
192 
193 	case MLO_PEER_ASSOC:
194 		peer_assoc = &msg->m.peer_assoc;
195 		wlan_objmgr_peer_release_ref(peer_assoc->peer,
196 					     WLAN_MLO_MGR_ID);
197 		break;
198 
199 	case MLO_PEER_ASSOC_FAIL:
200 		peer_assoc_fail = &msg->m.peer_assoc_fail;
201 		wlan_objmgr_peer_release_ref(peer_assoc_fail->peer,
202 					     WLAN_MLO_MGR_ID);
203 		break;
204 
205 	case MLO_PEER_DISCONNECT:
206 		peer_disconn = &msg->m.peer_disconn;
207 		wlan_objmgr_peer_release_ref(peer_disconn->peer,
208 					     WLAN_MLO_MGR_ID);
209 		break;
210 
211 	default:
212 		break;
213 	}
214 	qdf_mem_free(msg);
215 }
216 #endif
217