1 /*
2  * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /**
21  * DOC: wlan_dlm_main.c
22  *
23  * WLAN Denylist Mgr related APIs
24  *
25  */
26 
27 /* Include files */
28 
29 #include "target_if_dlm.h"
30 #include <wlan_dlm_ucfg_api.h>
31 #include "cfg_ucfg_api.h"
32 #include <wlan_dlm_core.h>
33 
34 struct dlm_pdev_priv_obj *
dlm_get_pdev_obj(struct wlan_objmgr_pdev * pdev)35 dlm_get_pdev_obj(struct wlan_objmgr_pdev *pdev)
36 {
37 	struct dlm_pdev_priv_obj *dlm_pdev_obj;
38 
39 	dlm_pdev_obj = wlan_objmgr_pdev_get_comp_private_obj(pdev,
40 						  WLAN_UMAC_COMP_DENYLIST_MGR);
41 
42 	return dlm_pdev_obj;
43 }
44 
45 struct dlm_psoc_priv_obj *
dlm_get_psoc_obj(struct wlan_objmgr_psoc * psoc)46 dlm_get_psoc_obj(struct wlan_objmgr_psoc *psoc)
47 {
48 	struct dlm_psoc_priv_obj *dlm_psoc_obj;
49 
50 	dlm_psoc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
51 						  WLAN_UMAC_COMP_DENYLIST_MGR);
52 
53 	return dlm_psoc_obj;
54 }
55 
56 QDF_STATUS
dlm_pdev_object_created_notification(struct wlan_objmgr_pdev * pdev,void * arg)57 dlm_pdev_object_created_notification(struct wlan_objmgr_pdev *pdev,
58 				     void *arg)
59 {
60 	struct dlm_pdev_priv_obj *dlm_ctx;
61 	QDF_STATUS status;
62 
63 	dlm_ctx = qdf_mem_malloc(sizeof(*dlm_ctx));
64 
65 	if (!dlm_ctx)
66 		return QDF_STATUS_E_FAILURE;
67 
68 	status = qdf_mutex_create(&dlm_ctx->reject_ap_list_lock);
69 
70 	if (QDF_IS_STATUS_ERROR(status)) {
71 		dlm_err("Failed to create mutex");
72 		qdf_mem_free(dlm_ctx);
73 		return status;
74 	}
75 	qdf_list_create(&dlm_ctx->reject_ap_list, MAX_BAD_AP_LIST_SIZE);
76 
77 	target_if_dlm_register_tx_ops(&dlm_ctx->dlm_tx_ops);
78 	status = wlan_objmgr_pdev_component_obj_attach(pdev,
79 						   WLAN_UMAC_COMP_DENYLIST_MGR,
80 						   dlm_ctx,
81 						   QDF_STATUS_SUCCESS);
82 	if (QDF_IS_STATUS_ERROR(status)) {
83 		dlm_err("Failed to attach pdev_ctx with pdev");
84 		qdf_list_destroy(&dlm_ctx->reject_ap_list);
85 		qdf_mutex_destroy(&dlm_ctx->reject_ap_list_lock);
86 		qdf_mem_free(dlm_ctx);
87 	}
88 
89 	return status;
90 }
91 
92 QDF_STATUS
dlm_pdev_object_destroyed_notification(struct wlan_objmgr_pdev * pdev,void * arg)93 dlm_pdev_object_destroyed_notification(struct wlan_objmgr_pdev *pdev,
94 				       void *arg)
95 {
96 	struct dlm_pdev_priv_obj *dlm_ctx;
97 
98 	dlm_ctx = dlm_get_pdev_obj(pdev);
99 
100 	if (!dlm_ctx) {
101 		dlm_err("DLM Pdev obj is NULL");
102 		return QDF_STATUS_E_FAILURE;
103 	}
104 	/* Clear away the memory allocated for the bad BSSIDs */
105 	dlm_flush_reject_ap_list(dlm_ctx);
106 	qdf_list_destroy(&dlm_ctx->reject_ap_list);
107 	qdf_mutex_destroy(&dlm_ctx->reject_ap_list_lock);
108 
109 	wlan_objmgr_pdev_component_obj_detach(pdev,
110 					      WLAN_UMAC_COMP_DENYLIST_MGR,
111 					      dlm_ctx);
112 	qdf_mem_free(dlm_ctx);
113 
114 	return QDF_STATUS_SUCCESS;
115 }
116 
117 QDF_STATUS
dlm_psoc_object_created_notification(struct wlan_objmgr_psoc * psoc,void * arg)118 dlm_psoc_object_created_notification(struct wlan_objmgr_psoc *psoc,
119 				     void *arg)
120 {
121 	struct dlm_psoc_priv_obj *dlm_psoc_obj;
122 	QDF_STATUS status;
123 
124 	dlm_psoc_obj = qdf_mem_malloc(sizeof(*dlm_psoc_obj));
125 
126 	if (!dlm_psoc_obj)
127 		return QDF_STATUS_E_FAILURE;
128 
129 	status = wlan_objmgr_psoc_component_obj_attach(psoc,
130 						   WLAN_UMAC_COMP_DENYLIST_MGR,
131 						   dlm_psoc_obj,
132 						   QDF_STATUS_SUCCESS);
133 	if (QDF_IS_STATUS_ERROR(status)) {
134 		dlm_err("Failed to attach psoc_ctx with psoc");
135 		qdf_mem_free(dlm_psoc_obj);
136 	}
137 
138 	return status;
139 }
140 
141 QDF_STATUS
dlm_psoc_object_destroyed_notification(struct wlan_objmgr_psoc * psoc,void * arg)142 dlm_psoc_object_destroyed_notification(struct wlan_objmgr_psoc *psoc, void *arg)
143 {
144 	struct dlm_psoc_priv_obj *dlm_psoc_obj;
145 
146 	dlm_psoc_obj = dlm_get_psoc_obj(psoc);
147 
148 	if (!dlm_psoc_obj) {
149 		dlm_err("DLM psoc obj NULL");
150 		return QDF_STATUS_E_FAILURE;
151 	}
152 	wlan_objmgr_psoc_component_obj_detach(psoc,
153 					      WLAN_UMAC_COMP_DENYLIST_MGR,
154 					      dlm_psoc_obj);
155 	qdf_mem_free(dlm_psoc_obj);
156 
157 	return QDF_STATUS_SUCCESS;
158 }
159 
160 static void
dlm_init_cfg(struct wlan_objmgr_psoc * psoc,struct dlm_config * dlm_cfg)161 dlm_init_cfg(struct wlan_objmgr_psoc *psoc, struct dlm_config *dlm_cfg)
162 {
163 	dlm_cfg->avoid_list_exipry_time =
164 				cfg_get(psoc, CFG_AVOID_LIST_EXPIRY_TIME);
165 	dlm_cfg->deny_list_exipry_time =
166 				cfg_get(psoc, CFG_DENY_LIST_EXPIRY_TIME);
167 	dlm_cfg->bad_bssid_counter_reset_time =
168 				cfg_get(psoc, CFG_BAD_BSSID_RESET_TIME);
169 	dlm_cfg->bad_bssid_counter_thresh =
170 				cfg_get(psoc, CFG_BAD_BSSID_COUNTER_THRESHOLD);
171 	dlm_cfg->delta_rssi =
172 				cfg_get(psoc, CFG_DENYLIST_RSSI_THRESHOLD);
173 }
174 
175 QDF_STATUS
dlm_cfg_psoc_open(struct wlan_objmgr_psoc * psoc)176 dlm_cfg_psoc_open(struct wlan_objmgr_psoc *psoc)
177 {
178 	struct dlm_psoc_priv_obj *dlm_psoc_obj;
179 
180 	dlm_psoc_obj = dlm_get_psoc_obj(psoc);
181 
182 	if (!dlm_psoc_obj) {
183 		dlm_err("DLM psoc obj NULL");
184 		return QDF_STATUS_E_FAILURE;
185 	}
186 
187 	dlm_init_cfg(psoc, &dlm_psoc_obj->dlm_cfg);
188 
189 	return QDF_STATUS_SUCCESS;
190 }
191