qcacmn: Maintain peer object refernce during frame delay

Maintain the peer object reference while delaying the processing
of peer frames.

Change-Id: Ia3df18f1281403c6ed36bfbc307b6928d3db9040
CRs-Fixed: 2769113
This commit is contained in:
Jayachandran Sreekumaran
2020-09-03 12:49:16 +05:30
committed by snandini
parent 107f53c315
commit c886b4c527
3 changed files with 51 additions and 2 deletions

View File

@@ -25,6 +25,7 @@
#include <wmi_unified_param.h>
#include <wlan_iot_sim_utils_api.h>
#include <wlan_lmac_if_api.h>
#include <wlan_objmgr_peer_obj.h>
/*
* iot_sim_oper_to_str - function to return iot sim operation string
@@ -803,6 +804,11 @@ iot_sim_del_rule(struct iot_sim_rule_per_seq **s_e,
qdf_mem_free((*f_e)->dwork);
qdf_nbuf_free((*f_e)->nbuf_list[0]);
(*f_e)->nbuf_list[0] = NULL;
if ((*f_e)->peer) {
wlan_objmgr_peer_release_ref((*f_e)->peer,
WLAN_IOT_SIM_ID);
(*f_e)->peer = NULL;
}
qdf_nbuf_free((*f_e)->nbuf_list[1]);
(*f_e)->nbuf_list[1] = NULL;
(*f_e)->sec_buf = NULL;
@@ -921,6 +927,11 @@ static void iot_sim_delay_cb(void *ctxt)
{
struct wlan_objmgr_psoc *psoc = NULL;
struct iot_sim_cb_context *context = ctxt;
uint8_t *buf;
struct ieee80211_frame *wh;
struct qdf_mac_addr *mac_addr;
struct mgmt_rx_event_params *param = context->piot_sim_rule->rx_param;
struct wlan_objmgr_peer **peer = &context->piot_sim_rule->peer;
qdf_spin_lock_bh(&context->piot_sim_rule->iot_sim_delay_lock);
qdf_spin_lock_bh(&context->isc->iot_sim_lock);
@@ -930,14 +941,30 @@ static void iot_sim_delay_cb(void *ctxt)
mgmt_txrx_rx_handler(psoc, context->piot_sim_rule->sec_buf,
context->piot_sim_rule->rx_param);
qdf_spin_lock_bh(&context->isc->iot_sim_lock);
if (*peer) {
wlan_objmgr_peer_release_ref(*peer, WLAN_IOT_SIM_ID);
*peer = NULL;
}
if (context->piot_sim_rule->nbuf_list[1]) {
context->piot_sim_rule->nbuf_list[0] =
context->piot_sim_rule->nbuf_list[1];
buf = qdf_nbuf_data(context->piot_sim_rule->nbuf_list[0]);
wh = (struct ieee80211_frame *)buf;
mac_addr = (struct qdf_mac_addr *)wh->i_addr2;
*peer = wlan_objmgr_get_peer(psoc, param->pdev_id,
(uint8_t *)mac_addr,
WLAN_IOT_SIM_ID);
if (!qdf_delayed_work_start(context->piot_sim_rule->dwork,
context->
piot_sim_rule->delay_dur)) {
iot_sim_err("delayed_work_start failed");
qdf_nbuf_free(context->piot_sim_rule->nbuf_list[0]);
if (*peer) {
wlan_objmgr_peer_release_ref(*peer,
WLAN_IOT_SIM_ID);
*peer = NULL;
}
qdf_mem_free(context->piot_sim_rule->
rx_param->rx_params);
qdf_mem_free(context->piot_sim_rule->rx_param);
@@ -1023,6 +1050,7 @@ iot_sim_add_rule(struct iot_sim_rule_per_seq **s_e,
(*f_e)->nbuf_list[0] = NULL;
(*f_e)->nbuf_list[1] = NULL;
(*f_e)->peer = NULL;
iot_sim_err("delayed_work_created");
qdf_spinlock_create(&((*f_e)->iot_sim_delay_lock));
}

View File

@@ -123,6 +123,7 @@ struct iot_sim_rule {
uint16_t delay_dur;
uint8_t rule_bitmap;
qdf_nbuf_t nbuf_list[2];
struct wlan_objmgr_peer *peer;
qdf_nbuf_t sec_buf;
struct qdf_delayed_work *dwork;
struct mgmt_rx_event_params *rx_param;

View File

@@ -20,6 +20,7 @@
#include "../../core/iot_sim_cmn_api_i.h"
#include <wlan_objmgr_pdev_obj.h>
#include <wlan_objmgr_vdev_obj.h>
#include <wlan_objmgr_peer_obj.h>
#define IEEE80211_FRAME_BODY_OFFSET 0x18
#define IEEE80211_TSF_LEN (8)
@@ -215,9 +216,13 @@ iot_sim_apply_content_change_rule(struct wlan_objmgr_pdev *pdev,
QDF_STATUS
iot_sim_apply_delay_drop_rule(struct iot_sim_rule *piot_sim_rule,
qdf_nbuf_t nbuf,
struct mgmt_rx_event_params *param)
struct mgmt_rx_event_params *param,
struct iot_sim_context *isc,
struct qdf_mac_addr *mac_addr)
{
struct mgmt_rx_event_params *rx_param;
struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(isc->pdev_obj);
struct wlan_objmgr_peer **peer = &piot_sim_rule->peer;
if (!piot_sim_rule->drop &&
!piot_sim_rule->delay_dur)
@@ -239,6 +244,12 @@ iot_sim_apply_delay_drop_rule(struct iot_sim_rule *piot_sim_rule,
return QDF_STATUS_SUCCESS;
}
if (*peer) {
wlan_objmgr_peer_release_ref(*peer,
WLAN_IOT_SIM_ID);
*peer = NULL;
}
qdf_nbuf_free(piot_sim_rule->nbuf_list[0]);
qdf_mem_free(piot_sim_rule->rx_param->rx_params);
qdf_mem_free(piot_sim_rule->rx_param);
@@ -259,6 +270,9 @@ iot_sim_apply_delay_drop_rule(struct iot_sim_rule *piot_sim_rule,
return QDF_STATUS_E_NOSUPPORT;
}
*peer = wlan_objmgr_get_peer(psoc, param->pdev_id,
(uint8_t *)mac_addr,
WLAN_IOT_SIM_ID);
qdf_mem_copy(rx_param->rx_params,
param->rx_params, RX_STATUS_SIZE);
piot_sim_rule->rx_param = rx_param;
@@ -268,6 +282,11 @@ iot_sim_apply_delay_drop_rule(struct iot_sim_rule *piot_sim_rule,
iot_sim_err("delayed_work_start failed");
qdf_mem_free(rx_param->rx_params);
qdf_mem_free(rx_param);
if (*peer) {
wlan_objmgr_peer_release_ref(*peer,
WLAN_IOT_SIM_ID);
*peer = NULL;
}
return QDF_STATUS_E_NOSUPPORT;
}
@@ -414,7 +433,8 @@ QDF_STATUS iot_sim_frame_update(struct wlan_objmgr_pdev *pdev, qdf_nbuf_t nbuf,
}
} else {
status = iot_sim_apply_delay_drop_rule(piot_sim_rule,
nbuf, rx_param);
nbuf, rx_param,
isc, mac_addr);
if (QDF_IS_STATUS_SUCCESS(status))
status = QDF_STATUS_E_NULL_VALUE;
else