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