1 /* 2 * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021 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 interface manager public api 20 */ 21 #include "wlan_if_mgr_public_struct.h" 22 #include "wlan_if_mgr_api.h" 23 #include "wlan_if_mgr_sta.h" 24 #include "wlan_if_mgr_ap.h" 25 #include "wlan_if_mgr_main.h" 26 #if !defined WLAN_MBSS 27 #include "wlan_if_mgr_roam.h" 28 #endif 29 30 const char *if_mgr_get_event_str(enum wlan_if_mgr_evt event) 31 { 32 if (event > WLAN_IF_MGR_EV_MAX) 33 return ""; 34 35 switch (event) { 36 CASE_RETURN_STRING(WLAN_IF_MGR_EV_CONNECT_START); 37 CASE_RETURN_STRING(WLAN_IF_MGR_EV_CONNECT_COMPLETE); 38 CASE_RETURN_STRING(WLAN_IF_MGR_EV_DISCONNECT_START); 39 CASE_RETURN_STRING(WLAN_IF_MGR_EV_DISCONNECT_COMPLETE); 40 CASE_RETURN_STRING(WLAN_IF_MGR_EV_VALIDATE_CANDIDATE); 41 CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_START_BSS); 42 CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_START_BSS_COMPLETE); 43 CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_STOP_BSS); 44 CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_STOP_BSS_COMPLETE); 45 CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_START_ACS); 46 CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_STOP_ACS); 47 CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_DONE_ACS); 48 CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_CANCEL_ACS); 49 CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_START_HT40); 50 CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_STOP_HT40); 51 CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_DONE_HT40); 52 CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_CANCEL_HT40); 53 CASE_RETURN_STRING(WLAN_IF_MGR_EV_CSA_COMPLETE); 54 default: 55 return "Unknown"; 56 } 57 } 58 59 #if defined WLAN_MBSS 60 QDF_STATUS if_mgr_deliver_mbss_event(struct wlan_objmgr_vdev *vdev, 61 enum wlan_if_mgr_evt event, 62 struct if_mgr_event_data *event_data) 63 { 64 QDF_STATUS status; 65 66 switch (event) { 67 case WLAN_IF_MGR_EV_AP_START_ACS: 68 status = if_mgr_ap_start_acs(vdev, event_data); 69 break; 70 case WLAN_IF_MGR_EV_AP_STOP_ACS: 71 status = if_mgr_ap_stop_acs(vdev, event_data); 72 break; 73 case WLAN_IF_MGR_EV_AP_CANCEL_ACS: 74 status = if_mgr_ap_cancel_acs(vdev, event_data); 75 break; 76 case WLAN_IF_MGR_EV_AP_DONE_ACS: 77 status = if_mgr_ap_done_acs(vdev, event_data); 78 break; 79 case WLAN_IF_MGR_EV_AP_START_HT40: 80 status = if_mgr_ap_start_ht40(vdev, event_data); 81 break; 82 case WLAN_IF_MGR_EV_AP_STOP_HT40: 83 status = if_mgr_ap_stop_ht40(vdev, event_data); 84 break; 85 case WLAN_IF_MGR_EV_AP_DONE_HT40: 86 status = if_mgr_ap_done_ht40(vdev, event_data); 87 break; 88 case WLAN_IF_MGR_EV_AP_CANCEL_HT40: 89 status = if_mgr_ap_cancel_ht40(vdev, event_data); 90 break; 91 default: 92 status = QDF_STATUS_E_INVAL; 93 ifmgr_err("Invalid event"); 94 break; 95 } 96 return status; 97 } 98 #else 99 QDF_STATUS if_mgr_deliver_mbss_event(struct wlan_objmgr_vdev *vdev, 100 enum wlan_if_mgr_evt event, 101 struct if_mgr_event_data *event_data) 102 { 103 QDF_STATUS status; 104 105 switch (event) { 106 default: 107 status = QDF_STATUS_E_INVAL; 108 ifmgr_err("Invalid event"); 109 break; 110 } 111 112 return status; 113 } 114 #endif 115 116 QDF_STATUS if_mgr_deliver_event(struct wlan_objmgr_vdev *vdev, 117 enum wlan_if_mgr_evt event, 118 struct if_mgr_event_data *event_data) 119 { 120 struct wlan_objmgr_psoc *psoc; 121 QDF_STATUS status; 122 123 psoc = wlan_vdev_get_psoc(vdev); 124 if (!psoc) 125 return QDF_STATUS_E_FAILURE; 126 127 ifmgr_debug("IF MGR event received: %s(%d)", 128 if_mgr_get_event_str(event), event); 129 130 switch (event) { 131 case WLAN_IF_MGR_EV_CONNECT_START: 132 status = if_mgr_connect_start(vdev, event_data); 133 break; 134 case WLAN_IF_MGR_EV_CONNECT_COMPLETE: 135 status = if_mgr_connect_complete(vdev, event_data); 136 break; 137 case WLAN_IF_MGR_EV_AP_START_BSS: 138 status = if_mgr_ap_start_bss(vdev, event_data); 139 break; 140 case WLAN_IF_MGR_EV_AP_START_BSS_COMPLETE: 141 status = if_mgr_ap_start_bss_complete(vdev, event_data); 142 break; 143 case WLAN_IF_MGR_EV_AP_STOP_BSS: 144 status = if_mgr_ap_stop_bss(vdev, event_data); 145 break; 146 case WLAN_IF_MGR_EV_AP_STOP_BSS_COMPLETE: 147 status = if_mgr_ap_stop_bss_complete(vdev, event_data); 148 break; 149 case WLAN_IF_MGR_EV_DISCONNECT_START: 150 status = if_mgr_disconnect_start(vdev, event_data); 151 break; 152 case WLAN_IF_MGR_EV_DISCONNECT_COMPLETE: 153 status = if_mgr_disconnect_complete(vdev, event_data); 154 break; 155 case WLAN_IF_MGR_EV_VALIDATE_CANDIDATE: 156 status = if_mgr_validate_candidate(vdev, event_data); 157 break; 158 case WLAN_IF_MGR_EV_CSA_COMPLETE: 159 status = if_mgr_csa_complete(vdev, event_data); 160 break; 161 default: 162 status = if_mgr_deliver_mbss_event(vdev, event, event_data); 163 } 164 165 return status; 166 } 167