xref: /wlan-driver/qcacld-3.0/components/tdls/dispatcher/src/wlan_tdls_tgt_api.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /**
21*5113495bSYour Name  * DOC: wlan_tdls_tgt_api.c
22*5113495bSYour Name  *
23*5113495bSYour Name  * TDLS south bound interface definitions
24*5113495bSYour Name  */
25*5113495bSYour Name 
26*5113495bSYour Name #include "qdf_status.h"
27*5113495bSYour Name #include <wlan_tdls_tgt_api.h>
28*5113495bSYour Name #include "../../core/src/wlan_tdls_main.h"
29*5113495bSYour Name #include "../../core/src/wlan_tdls_cmds_process.h"
30*5113495bSYour Name #include "../../core/src/wlan_tdls_mgmt.h"
31*5113495bSYour Name 
32*5113495bSYour Name static inline struct wlan_lmac_if_tdls_tx_ops *
wlan_psoc_get_tdls_txops(struct wlan_objmgr_psoc * psoc)33*5113495bSYour Name wlan_psoc_get_tdls_txops(struct wlan_objmgr_psoc *psoc)
34*5113495bSYour Name {
35*5113495bSYour Name 	return &psoc->soc_cb.tx_ops->tdls_tx_ops;
36*5113495bSYour Name }
37*5113495bSYour Name 
38*5113495bSYour Name static inline struct wlan_lmac_if_tdls_rx_ops *
wlan_psoc_get_tdls_rxops(struct wlan_objmgr_psoc * psoc)39*5113495bSYour Name wlan_psoc_get_tdls_rxops(struct wlan_objmgr_psoc *psoc)
40*5113495bSYour Name {
41*5113495bSYour Name 	return &psoc->soc_cb.rx_ops->tdls_rx_ops;
42*5113495bSYour Name }
43*5113495bSYour Name 
tgt_tdls_set_fw_state(struct wlan_objmgr_psoc * psoc,struct tdls_info * tdls_param)44*5113495bSYour Name QDF_STATUS tgt_tdls_set_fw_state(struct wlan_objmgr_psoc *psoc,
45*5113495bSYour Name 				 struct tdls_info *tdls_param)
46*5113495bSYour Name {
47*5113495bSYour Name 	struct wlan_lmac_if_tdls_tx_ops *tdls_ops = NULL;
48*5113495bSYour Name 
49*5113495bSYour Name 	tdls_ops = wlan_psoc_get_tdls_txops(psoc);
50*5113495bSYour Name 	if (tdls_ops && tdls_ops->update_fw_state)
51*5113495bSYour Name 		return tdls_ops->update_fw_state(psoc, tdls_param);
52*5113495bSYour Name 	else
53*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
54*5113495bSYour Name }
55*5113495bSYour Name 
tgt_tdls_set_peer_state(struct wlan_objmgr_psoc * psoc,struct tdls_peer_update_state * peer_param)56*5113495bSYour Name QDF_STATUS tgt_tdls_set_peer_state(struct wlan_objmgr_psoc *psoc,
57*5113495bSYour Name 				   struct tdls_peer_update_state *peer_param)
58*5113495bSYour Name {
59*5113495bSYour Name 	struct wlan_lmac_if_tdls_tx_ops *tdls_ops = NULL;
60*5113495bSYour Name 
61*5113495bSYour Name 	tdls_ops = wlan_psoc_get_tdls_txops(psoc);
62*5113495bSYour Name 	if (tdls_ops && tdls_ops->update_peer_state)
63*5113495bSYour Name 		return tdls_ops->update_peer_state(psoc, peer_param);
64*5113495bSYour Name 	else
65*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
66*5113495bSYour Name }
67*5113495bSYour Name 
tgt_tdls_set_offchan_mode(struct wlan_objmgr_psoc * psoc,struct tdls_channel_switch_params * param)68*5113495bSYour Name QDF_STATUS tgt_tdls_set_offchan_mode(struct wlan_objmgr_psoc *psoc,
69*5113495bSYour Name 				     struct tdls_channel_switch_params *param)
70*5113495bSYour Name {
71*5113495bSYour Name 	struct wlan_lmac_if_tdls_tx_ops *tdls_ops = NULL;
72*5113495bSYour Name 
73*5113495bSYour Name 	tdls_ops = wlan_psoc_get_tdls_txops(psoc);
74*5113495bSYour Name 	if (tdls_ops && tdls_ops->set_offchan_mode)
75*5113495bSYour Name 		return tdls_ops->set_offchan_mode(psoc, param);
76*5113495bSYour Name 	else
77*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
78*5113495bSYour Name }
79*5113495bSYour Name 
tgt_tdls_send_mgmt_tx_completion(struct scheduler_msg * pmsg)80*5113495bSYour Name QDF_STATUS tgt_tdls_send_mgmt_tx_completion(struct scheduler_msg *pmsg)
81*5113495bSYour Name {
82*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
83*5113495bSYour Name 
84*5113495bSYour Name 	if (!pmsg || !pmsg->bodyptr) {
85*5113495bSYour Name 		tdls_err("msg: 0x%pK", pmsg);
86*5113495bSYour Name 		QDF_ASSERT(0);
87*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
88*5113495bSYour Name 	}
89*5113495bSYour Name 
90*5113495bSYour Name 	status = tdls_send_mgmt_tx_completion(pmsg->bodyptr);
91*5113495bSYour Name 
92*5113495bSYour Name 	return status;
93*5113495bSYour Name }
94*5113495bSYour Name 
tgt_tdls_send_mgmt_rsp(struct scheduler_msg * pmsg)95*5113495bSYour Name QDF_STATUS tgt_tdls_send_mgmt_rsp(struct scheduler_msg *pmsg)
96*5113495bSYour Name {
97*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
98*5113495bSYour Name 
99*5113495bSYour Name 	if (!pmsg || !pmsg->bodyptr) {
100*5113495bSYour Name 		tdls_err("msg: 0x%pK", pmsg);
101*5113495bSYour Name 		QDF_ASSERT(0);
102*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
103*5113495bSYour Name 	}
104*5113495bSYour Name 
105*5113495bSYour Name 	status = tdls_process_send_mgmt_rsp(pmsg->bodyptr);
106*5113495bSYour Name 
107*5113495bSYour Name 	return status;
108*5113495bSYour Name }
109*5113495bSYour Name 
tgt_tdls_add_peer_rsp(struct scheduler_msg * pmsg)110*5113495bSYour Name QDF_STATUS tgt_tdls_add_peer_rsp(struct scheduler_msg *pmsg)
111*5113495bSYour Name {
112*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
113*5113495bSYour Name 
114*5113495bSYour Name 	if (!pmsg || !pmsg->bodyptr) {
115*5113495bSYour Name 		tdls_err("msg: 0x%pK", pmsg);
116*5113495bSYour Name 		QDF_ASSERT(0);
117*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
118*5113495bSYour Name 	}
119*5113495bSYour Name 
120*5113495bSYour Name 	status = tdls_process_add_peer_rsp(pmsg->bodyptr);
121*5113495bSYour Name 
122*5113495bSYour Name 	return status;
123*5113495bSYour Name }
124*5113495bSYour Name 
tgt_tdls_del_peer_rsp(struct scheduler_msg * pmsg)125*5113495bSYour Name QDF_STATUS tgt_tdls_del_peer_rsp(struct scheduler_msg *pmsg)
126*5113495bSYour Name {
127*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
128*5113495bSYour Name 
129*5113495bSYour Name 	if (!pmsg || !pmsg->bodyptr) {
130*5113495bSYour Name 		tdls_err("msg: 0x%pK", pmsg);
131*5113495bSYour Name 		QDF_ASSERT(0);
132*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
133*5113495bSYour Name 	}
134*5113495bSYour Name 
135*5113495bSYour Name 	status = tdls_process_del_peer_rsp(pmsg->bodyptr);
136*5113495bSYour Name 
137*5113495bSYour Name 	return status;
138*5113495bSYour Name }
139*5113495bSYour Name 
tgt_tdls_register_ev_handler(struct wlan_objmgr_psoc * psoc)140*5113495bSYour Name QDF_STATUS tgt_tdls_register_ev_handler(struct wlan_objmgr_psoc *psoc)
141*5113495bSYour Name {
142*5113495bSYour Name 	struct wlan_lmac_if_tdls_tx_ops *tdls_ops = NULL;
143*5113495bSYour Name 
144*5113495bSYour Name 	tdls_ops = wlan_psoc_get_tdls_txops(psoc);
145*5113495bSYour Name 	if (tdls_ops && tdls_ops->tdls_reg_ev_handler)
146*5113495bSYour Name 		return tdls_ops->tdls_reg_ev_handler(psoc, NULL);
147*5113495bSYour Name 	else
148*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
149*5113495bSYour Name }
150*5113495bSYour Name 
tgt_tdls_unregister_ev_handler(struct wlan_objmgr_psoc * psoc)151*5113495bSYour Name QDF_STATUS tgt_tdls_unregister_ev_handler(struct wlan_objmgr_psoc *psoc)
152*5113495bSYour Name {
153*5113495bSYour Name 	struct wlan_lmac_if_tdls_tx_ops *tdls_ops = NULL;
154*5113495bSYour Name 
155*5113495bSYour Name 	tdls_ops = wlan_psoc_get_tdls_txops(psoc);
156*5113495bSYour Name 	if (tdls_ops->tdls_unreg_ev_handler)
157*5113495bSYour Name 		return tdls_ops->tdls_unreg_ev_handler(psoc, NULL);
158*5113495bSYour Name 	else
159*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
160*5113495bSYour Name }
161*5113495bSYour Name 
tgt_tdls_event_flush_cb(struct scheduler_msg * msg)162*5113495bSYour Name static QDF_STATUS tgt_tdls_event_flush_cb(struct scheduler_msg *msg)
163*5113495bSYour Name {
164*5113495bSYour Name 	struct tdls_event_notify *notify;
165*5113495bSYour Name 
166*5113495bSYour Name 	notify = msg->bodyptr;
167*5113495bSYour Name 	if (notify && notify->vdev) {
168*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(notify->vdev, WLAN_TDLS_SB_ID);
169*5113495bSYour Name 		qdf_mem_free(notify);
170*5113495bSYour Name 	}
171*5113495bSYour Name 
172*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
173*5113495bSYour Name }
174*5113495bSYour Name 
175*5113495bSYour Name QDF_STATUS
tgt_tdls_event_handler(struct wlan_objmgr_psoc * psoc,struct tdls_event_info * info)176*5113495bSYour Name tgt_tdls_event_handler(struct wlan_objmgr_psoc *psoc,
177*5113495bSYour Name 		       struct tdls_event_info *info)
178*5113495bSYour Name {
179*5113495bSYour Name 	struct scheduler_msg msg = {0,};
180*5113495bSYour Name 	struct tdls_event_notify *notify;
181*5113495bSYour Name 	uint8_t vdev_id;
182*5113495bSYour Name 	QDF_STATUS status;
183*5113495bSYour Name 
184*5113495bSYour Name 	if (!psoc || !info) {
185*5113495bSYour Name 		tdls_err("psoc: 0x%pK, info: 0x%pK", psoc, info);
186*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
187*5113495bSYour Name 	}
188*5113495bSYour Name 	tdls_debug("vdev: %d, type: %d, reason: %d" QDF_MAC_ADDR_FMT,
189*5113495bSYour Name 		   info->vdev_id, info->message_type, info->peer_reason,
190*5113495bSYour Name 		   QDF_MAC_ADDR_REF(info->peermac.bytes));
191*5113495bSYour Name 	notify = qdf_mem_malloc(sizeof(*notify));
192*5113495bSYour Name 	if (!notify)
193*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
194*5113495bSYour Name 
195*5113495bSYour Name 	vdev_id = info->vdev_id;
196*5113495bSYour Name 	notify->vdev =
197*5113495bSYour Name 		wlan_objmgr_get_vdev_by_id_from_psoc(psoc,
198*5113495bSYour Name 						     vdev_id, WLAN_TDLS_SB_ID);
199*5113495bSYour Name 	if (!notify->vdev) {
200*5113495bSYour Name 		tdls_err("null vdev, vdev_id: %d, psoc: 0x%pK", vdev_id, psoc);
201*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
202*5113495bSYour Name 	}
203*5113495bSYour Name 	qdf_mem_copy(&notify->event, info, sizeof(*info));
204*5113495bSYour Name 
205*5113495bSYour Name 	msg.bodyptr = notify;
206*5113495bSYour Name 	msg.callback = tdls_process_evt;
207*5113495bSYour Name 	msg.flush_callback = tgt_tdls_event_flush_cb;
208*5113495bSYour Name 
209*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_TDLS,
210*5113495bSYour Name 					QDF_MODULE_ID_TDLS,
211*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF, &msg);
212*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
213*5113495bSYour Name 		tdls_err("can't post msg to handle tdls event");
214*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(notify->vdev, WLAN_TDLS_SB_ID);
215*5113495bSYour Name 		qdf_mem_free(notify);
216*5113495bSYour Name 	}
217*5113495bSYour Name 
218*5113495bSYour Name 	return status;
219*5113495bSYour Name }
220*5113495bSYour Name 
tgt_tdls_mgmt_frame_rx_flush_cb(struct scheduler_msg * msg)221*5113495bSYour Name static QDF_STATUS tgt_tdls_mgmt_frame_rx_flush_cb(struct scheduler_msg *msg)
222*5113495bSYour Name {
223*5113495bSYour Name 	struct tdls_rx_mgmt_event *rx_mgmt_event;
224*5113495bSYour Name 
225*5113495bSYour Name 	rx_mgmt_event = msg->bodyptr;
226*5113495bSYour Name 
227*5113495bSYour Name 	if (rx_mgmt_event) {
228*5113495bSYour Name 		if (rx_mgmt_event->rx_mgmt)
229*5113495bSYour Name 			qdf_mem_free(rx_mgmt_event->rx_mgmt);
230*5113495bSYour Name 
231*5113495bSYour Name 		qdf_mem_free(rx_mgmt_event);
232*5113495bSYour Name 	}
233*5113495bSYour Name 	msg->bodyptr = NULL;
234*5113495bSYour Name 
235*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
236*5113495bSYour Name }
237*5113495bSYour Name 
238*5113495bSYour Name static
tgt_tdls_mgmt_frame_process_rx_cb(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_peer * peer,qdf_nbuf_t buf,struct mgmt_rx_event_params * mgmt_rx_params,enum mgmt_frame_type frm_type)239*5113495bSYour Name QDF_STATUS tgt_tdls_mgmt_frame_process_rx_cb(
240*5113495bSYour Name 			struct wlan_objmgr_psoc *psoc,
241*5113495bSYour Name 			struct wlan_objmgr_peer *peer,
242*5113495bSYour Name 			qdf_nbuf_t buf,
243*5113495bSYour Name 			struct mgmt_rx_event_params *mgmt_rx_params,
244*5113495bSYour Name 			enum mgmt_frame_type frm_type)
245*5113495bSYour Name {
246*5113495bSYour Name 	struct tdls_rx_mgmt_frame *rx_mgmt;
247*5113495bSYour Name 	struct tdls_rx_mgmt_event *rx_mgmt_event;
248*5113495bSYour Name 	struct tdls_soc_priv_obj *tdls_soc_obj;
249*5113495bSYour Name 	struct scheduler_msg msg = {0};
250*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
251*5113495bSYour Name 	uint32_t vdev_id;
252*5113495bSYour Name 	uint8_t *pdata;
253*5113495bSYour Name 	QDF_STATUS status;
254*5113495bSYour Name 
255*5113495bSYour Name 	tdls_soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
256*5113495bSYour Name 			WLAN_UMAC_COMP_TDLS);
257*5113495bSYour Name 	if (!tdls_soc_obj) {
258*5113495bSYour Name 		tdls_err("tdls ctx is NULL, drop this frame");
259*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
260*5113495bSYour Name 	}
261*5113495bSYour Name 
262*5113495bSYour Name 	if (!peer) {
263*5113495bSYour Name 		vdev = tdls_get_vdev(psoc, WLAN_TDLS_SB_ID);
264*5113495bSYour Name 		if (!vdev) {
265*5113495bSYour Name 			tdls_err("current tdls vdev is null, can't get vdev id");
266*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
267*5113495bSYour Name 		}
268*5113495bSYour Name 		vdev_id = wlan_vdev_get_id(vdev);
269*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_TDLS_SB_ID);
270*5113495bSYour Name 	} else {
271*5113495bSYour Name 		vdev = wlan_peer_get_vdev(peer);
272*5113495bSYour Name 		if (!vdev) {
273*5113495bSYour Name 			tdls_err("vdev is NULL in peer, drop this frame");
274*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
275*5113495bSYour Name 		}
276*5113495bSYour Name 		vdev_id = wlan_vdev_get_id(vdev);
277*5113495bSYour Name 	}
278*5113495bSYour Name 
279*5113495bSYour Name 	rx_mgmt_event = qdf_mem_malloc_atomic(sizeof(*rx_mgmt_event));
280*5113495bSYour Name 	if (!rx_mgmt_event)
281*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
282*5113495bSYour Name 
283*5113495bSYour Name 	rx_mgmt = qdf_mem_malloc_atomic(sizeof(*rx_mgmt) +
284*5113495bSYour Name 			mgmt_rx_params->buf_len);
285*5113495bSYour Name 	if (!rx_mgmt) {
286*5113495bSYour Name 		tdls_debug_rl("Failed to allocate rx mgmt frame");
287*5113495bSYour Name 		qdf_mem_free(rx_mgmt_event);
288*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
289*5113495bSYour Name 	}
290*5113495bSYour Name 
291*5113495bSYour Name 	pdata = (uint8_t *)qdf_nbuf_data(buf);
292*5113495bSYour Name 	rx_mgmt->frame_len = mgmt_rx_params->buf_len;
293*5113495bSYour Name 	rx_mgmt->rx_freq = mgmt_rx_params->chan_freq;
294*5113495bSYour Name 	rx_mgmt->vdev_id = vdev_id;
295*5113495bSYour Name 	rx_mgmt->frm_type = frm_type;
296*5113495bSYour Name 	rx_mgmt->rx_rssi = mgmt_rx_params->rssi;
297*5113495bSYour Name 
298*5113495bSYour Name 	rx_mgmt_event->rx_mgmt = rx_mgmt;
299*5113495bSYour Name 	rx_mgmt_event->tdls_soc_obj = tdls_soc_obj;
300*5113495bSYour Name 	qdf_mem_copy(rx_mgmt->buf, pdata, mgmt_rx_params->buf_len);
301*5113495bSYour Name 	msg.type = TDLS_EVENT_RX_MGMT;
302*5113495bSYour Name 	msg.bodyptr = rx_mgmt_event;
303*5113495bSYour Name 	msg.callback = tdls_process_rx_frame;
304*5113495bSYour Name 	msg.flush_callback = tgt_tdls_mgmt_frame_rx_flush_cb;
305*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_TDLS,
306*5113495bSYour Name 					QDF_MODULE_ID_TDLS,
307*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF, &msg);
308*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
309*5113495bSYour Name 		qdf_mem_free(rx_mgmt);
310*5113495bSYour Name 		qdf_mem_free(rx_mgmt_event);
311*5113495bSYour Name 	}
312*5113495bSYour Name 
313*5113495bSYour Name 	qdf_nbuf_free(buf);
314*5113495bSYour Name 
315*5113495bSYour Name 	return status;
316*5113495bSYour Name }
317*5113495bSYour Name 
tgt_tdls_mgmt_frame_rx_cb(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_peer * peer,qdf_nbuf_t buf,struct mgmt_rx_event_params * mgmt_rx_params,enum mgmt_frame_type frm_type)318*5113495bSYour Name QDF_STATUS tgt_tdls_mgmt_frame_rx_cb(
319*5113495bSYour Name 			struct wlan_objmgr_psoc *psoc,
320*5113495bSYour Name 			struct wlan_objmgr_peer *peer,
321*5113495bSYour Name 			qdf_nbuf_t buf,
322*5113495bSYour Name 			struct mgmt_rx_event_params *mgmt_rx_params,
323*5113495bSYour Name 			enum mgmt_frame_type frm_type)
324*5113495bSYour Name {
325*5113495bSYour Name 	QDF_STATUS status;
326*5113495bSYour Name 
327*5113495bSYour Name 	tdls_debug("psoc:%pK, peer:%pK, type:%d", psoc, peer, frm_type);
328*5113495bSYour Name 
329*5113495bSYour Name 
330*5113495bSYour Name 	if (!buf) {
331*5113495bSYour Name 		tdls_err("rx frame buff is null buf:%pK", buf);
332*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
333*5113495bSYour Name 	}
334*5113495bSYour Name 
335*5113495bSYour Name 	if (!mgmt_rx_params || !psoc) {
336*5113495bSYour Name 		tdls_err("input is NULL mgmt_rx_params:%pK psoc:%pK, peer:%pK",
337*5113495bSYour Name 			  mgmt_rx_params, psoc, peer);
338*5113495bSYour Name 		status = QDF_STATUS_E_INVAL;
339*5113495bSYour Name 		goto release_nbuf;
340*5113495bSYour Name 	}
341*5113495bSYour Name 
342*5113495bSYour Name 	status = wlan_objmgr_peer_try_get_ref(peer, WLAN_TDLS_SB_ID);
343*5113495bSYour Name 	if (QDF_STATUS_SUCCESS != status)
344*5113495bSYour Name 		goto release_nbuf;
345*5113495bSYour Name 
346*5113495bSYour Name 	status = tgt_tdls_mgmt_frame_process_rx_cb(psoc, peer, buf,
347*5113495bSYour Name 						   mgmt_rx_params, frm_type);
348*5113495bSYour Name 
349*5113495bSYour Name 	wlan_objmgr_peer_release_ref(peer, WLAN_TDLS_SB_ID);
350*5113495bSYour Name 
351*5113495bSYour Name 	if (QDF_STATUS_SUCCESS != status)
352*5113495bSYour Name release_nbuf:
353*5113495bSYour Name 		qdf_nbuf_free(buf);
354*5113495bSYour Name 	return status;
355*5113495bSYour Name }
356*5113495bSYour Name 
tgt_tdls_peers_deleted_notification(struct wlan_objmgr_psoc * psoc,uint32_t session_id)357*5113495bSYour Name void tgt_tdls_peers_deleted_notification(struct wlan_objmgr_psoc *psoc,
358*5113495bSYour Name 					 uint32_t session_id)
359*5113495bSYour Name {
360*5113495bSYour Name 	tdls_peers_deleted_notification(psoc, session_id);
361*5113495bSYour Name }
362*5113495bSYour Name 
tgt_tdls_delete_all_peers_indication(struct wlan_objmgr_psoc * psoc,uint32_t session_id)363*5113495bSYour Name void tgt_tdls_delete_all_peers_indication(struct wlan_objmgr_psoc *psoc,
364*5113495bSYour Name 					  uint32_t session_id)
365*5113495bSYour Name {
366*5113495bSYour Name 	tdls_check_and_indicate_delete_all_peers(psoc, session_id);
367*5113495bSYour Name }
368