xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_api.c (revision 97f44cd39e4ff816eaa1710279d28cf6b9e65ad9)
1 /*
2  * Copyright (c) 2012-2015, 2020, 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: wlan_cm_api.c
19  *
20  * This file maintains definitaions public apis.
21  */
22 
23 #include <wlan_cm_api.h>
24 #include "connection_mgr/core/src/wlan_cm_main_api.h"
25 
26 QDF_STATUS wlan_cm_start_connect(struct wlan_objmgr_vdev *vdev,
27 				 struct wlan_cm_connect_req *req)
28 {
29 	return cm_connect_start_req(vdev, req);
30 }
31 
32 QDF_STATUS wlan_cm_disconnect(struct wlan_objmgr_vdev *vdev,
33 			      enum wlan_cm_source source,
34 			      enum wlan_reason_code reason_code,
35 			      struct qdf_mac_addr *bssid)
36 {
37 	struct wlan_cm_disconnect_req req = {0};
38 
39 	req.vdev_id = wlan_vdev_get_id(vdev);
40 	req.source = source;
41 	req.reason_code = reason_code;
42 	if (bssid)
43 		qdf_copy_macaddr(&req.bssid, bssid);
44 
45 	return cm_disconnect_start_req(vdev, &req);
46 }
47 
48 QDF_STATUS wlan_cm_disconnect_sync(struct wlan_objmgr_vdev *vdev,
49 				   enum wlan_cm_source source,
50 				   enum wlan_reason_code reason_code)
51 {
52 	struct wlan_cm_disconnect_req req = {0};
53 
54 	req.vdev_id = wlan_vdev_get_id(vdev);
55 	req.source = source;
56 	req.reason_code = reason_code;
57 
58 	return cm_disconnect_start_req_sync(vdev, &req);
59 }
60 
61 QDF_STATUS wlan_cm_bss_select_ind_rsp(struct wlan_objmgr_vdev *vdev,
62 				      QDF_STATUS status)
63 {
64 	return cm_bss_select_ind_rsp(vdev, status);
65 }
66 
67 QDF_STATUS wlan_cm_bss_peer_create_rsp(struct wlan_objmgr_vdev *vdev,
68 				       QDF_STATUS status,
69 				       struct qdf_mac_addr *peer_mac)
70 {
71 	return cm_bss_peer_create_rsp(vdev, status, peer_mac);
72 }
73 
74 QDF_STATUS wlan_cm_connect_rsp(struct wlan_objmgr_vdev *vdev,
75 			       struct wlan_cm_connect_resp *resp)
76 {
77 	return cm_connect_rsp(vdev, resp);
78 }
79 
80 QDF_STATUS wlan_cm_bss_peer_delete_ind(struct wlan_objmgr_vdev *vdev,
81 				       struct qdf_mac_addr *peer_mac)
82 {
83 	return cm_bss_peer_delete_req(vdev, peer_mac);
84 }
85 
86 QDF_STATUS wlan_cm_bss_peer_delete_rsp(struct wlan_objmgr_vdev *vdev,
87 				       uint32_t status)
88 {
89 	return cm_vdev_down_req(vdev, status);
90 }
91 
92 QDF_STATUS wlan_cm_disconnect_rsp(struct wlan_objmgr_vdev *vdev,
93 				  struct wlan_cm_discon_rsp *resp)
94 {
95 	return cm_disconnect_rsp(vdev, resp);
96 }
97 
98 void wlan_cm_set_max_connect_attempts(struct wlan_objmgr_vdev *vdev,
99 				      uint8_t max_connect_attempts)
100 {
101 	cm_set_max_connect_attempts(vdev, max_connect_attempts);
102 }
103 
104 bool wlan_cm_is_vdev_connecting(struct wlan_objmgr_vdev *vdev)
105 {
106 	return cm_is_vdev_connecting(vdev);
107 }
108 
109 bool wlan_cm_is_vdev_connected(struct wlan_objmgr_vdev *vdev)
110 {
111 	return cm_is_vdev_connected(vdev);
112 }
113 
114 bool wlan_cm_is_vdev_disconnecting(struct wlan_objmgr_vdev *vdev)
115 {
116 	return cm_is_vdev_disconnecting(vdev);
117 }
118 
119 bool wlan_cm_is_vdev_disconnected(struct wlan_objmgr_vdev *vdev)
120 {
121 	return cm_is_vdev_disconnected(vdev);
122 }
123 
124 bool wlan_cm_is_vdev_roaming(struct wlan_objmgr_vdev *vdev)
125 {
126 	return cm_is_vdev_roaming(vdev);
127 }
128 
129 const char *wlan_cm_reason_code_to_str(enum wlan_reason_code reason)
130 {
131 	if (reason > REASON_PROP_START)
132 		return "";
133 
134 	switch (reason) {
135 	CASE_RETURN_STRING(REASON_UNSPEC_FAILURE);
136 	CASE_RETURN_STRING(REASON_PREV_AUTH_NOT_VALID);
137 	CASE_RETURN_STRING(REASON_DEAUTH_NETWORK_LEAVING);
138 	CASE_RETURN_STRING(REASON_DISASSOC_DUE_TO_INACTIVITY);
139 	CASE_RETURN_STRING(REASON_DISASSOC_AP_BUSY);
140 	CASE_RETURN_STRING(REASON_CLASS2_FRAME_FROM_NON_AUTH_STA);
141 	CASE_RETURN_STRING(REASON_CLASS3_FRAME_FROM_NON_ASSOC_STA);
142 	CASE_RETURN_STRING(REASON_DISASSOC_NETWORK_LEAVING);
143 	CASE_RETURN_STRING(REASON_STA_NOT_AUTHENTICATED);
144 	CASE_RETURN_STRING(REASON_BAD_PWR_CAPABILITY);
145 	CASE_RETURN_STRING(REASON_BAD_SUPPORTED_CHANNELS);
146 	CASE_RETURN_STRING(REASON_DISASSOC_BSS_TRANSITION);
147 	CASE_RETURN_STRING(REASON_INVALID_IE);
148 	CASE_RETURN_STRING(REASON_MIC_FAILURE);
149 	CASE_RETURN_STRING(REASON_4WAY_HANDSHAKE_TIMEOUT);
150 	CASE_RETURN_STRING(REASON_GROUP_KEY_UPDATE_TIMEOUT);
151 	CASE_RETURN_STRING(REASON_IN_4WAY_DIFFERS);
152 	CASE_RETURN_STRING(REASON_INVALID_GROUP_CIPHER);
153 	CASE_RETURN_STRING(REASON_INVALID_PAIRWISE_CIPHER);
154 	CASE_RETURN_STRING(REASON_INVALID_AKMP);
155 	CASE_RETURN_STRING(REASON_UNSUPPORTED_RSNE_VER);
156 	CASE_RETURN_STRING(REASON_INVALID_RSNE_CAPABILITIES);
157 	CASE_RETURN_STRING(REASON_1X_AUTH_FAILURE);
158 	CASE_RETURN_STRING(REASON_CIPHER_SUITE_REJECTED);
159 	CASE_RETURN_STRING(REASON_TDLS_PEER_UNREACHABLE);
160 	CASE_RETURN_STRING(REASON_TDLS_UNSPEC);
161 	CASE_RETURN_STRING(REASON_DISASSOC_SSP_REQUESTED);
162 	CASE_RETURN_STRING(REASON_NO_SSP_ROAMING_AGREEMENT);
163 	CASE_RETURN_STRING(REASON_BAD_CIPHER_OR_AKM);
164 	CASE_RETURN_STRING(REASON_LOCATION_NOT_AUTHORIZED);
165 	CASE_RETURN_STRING(REASON_SERVICE_CHANGE_PRECLUDES_TS);
166 	CASE_RETURN_STRING(REASON_QOS_UNSPECIFIED);
167 	CASE_RETURN_STRING(REASON_NO_BANDWIDTH);
168 	CASE_RETURN_STRING(REASON_XS_UNACKED_FRAMES);
169 	CASE_RETURN_STRING(REASON_EXCEEDED_TXOP);
170 	CASE_RETURN_STRING(REASON_STA_LEAVING);
171 	CASE_RETURN_STRING(REASON_END_TS_BA_DLS);
172 	CASE_RETURN_STRING(REASON_UNKNOWN_TS_BA);
173 	CASE_RETURN_STRING(REASON_TIMEDOUT);
174 	CASE_RETURN_STRING(REASON_PEERKEY_MISMATCH);
175 	CASE_RETURN_STRING(REASON_AUTHORIZED_ACCESS_LIMIT_REACHED);
176 	CASE_RETURN_STRING(REASON_EXTERNAL_SERVICE_REQUIREMENTS);
177 	CASE_RETURN_STRING(REASON_INVALID_FT_ACTION_FRAME_COUNT);
178 	CASE_RETURN_STRING(REASON_INVALID_PMKID);
179 	CASE_RETURN_STRING(REASON_INVALID_MDE);
180 	CASE_RETURN_STRING(REASON_INVALID_FTE);
181 	CASE_RETURN_STRING(REASON_MESH_PEERING_CANCELLED);
182 	CASE_RETURN_STRING(REASON_MESH_MAX_PEERS);
183 	CASE_RETURN_STRING(REASON_MESH_CONFIG_POLICY_VIOLATION);
184 	CASE_RETURN_STRING(REASON_MESH_CLOSE_RCVD);
185 	CASE_RETURN_STRING(REASON_MESH_MAX_RETRIES);
186 	CASE_RETURN_STRING(REASON_MESH_CONFIRM_TIMEOUT);
187 	CASE_RETURN_STRING(REASON_MESH_INVALID_GTK);
188 	CASE_RETURN_STRING(REASON_MESH_INCONSISTENT_PARAMS);
189 	CASE_RETURN_STRING(REASON_MESH_INVALID_SECURITY_CAP);
190 	CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_NO_PROXY_INFO);
191 	CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_NO_FORWARDING_INFO);
192 	CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_DEST_UNREACHABLE);
193 	CASE_RETURN_STRING(REASON_MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS);
194 	CASE_RETURN_STRING(REASON_MESH_CHANNEL_SWITCH_REGULATORY_REQ);
195 	CASE_RETURN_STRING(REASON_MESH_CHANNEL_SWITCH_UNSPECIFIED);
196 	CASE_RETURN_STRING(REASON_POOR_RSSI_CONDITIONS);
197 	default:
198 		return "Unknown";
199 	}
200 }
201 
202 #ifdef WLAN_POLICY_MGR_ENABLE
203 void wlan_cm_hw_mode_change_resp(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
204 				 wlan_cm_id cm_id, QDF_STATUS status)
205 {
206 	cm_hw_mode_change_resp(pdev, vdev_id, cm_id, status);
207 }
208 #endif /* ifdef POLICY_MGR_ENABLE */
209 
210 #ifdef SM_ENG_HIST_ENABLE
211 void wlan_cm_sm_history_print(struct wlan_objmgr_vdev *vdev)
212 {
213 	return cm_sm_history_print(vdev);
214 }
215 #endif
216