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