qcacld-3.0: Add vdev validity check before sending vdev set param

If vdev is deleted FW can assert if host sends any vdev set param command.
Add vdev validity sanity check and reject vdev param set request after
vdev is deleted.

Change-Id: I65c303ef2e2a941cb2629f3fbc0862acf6e306d3
CRs-Fixed: 2079273
This commit is contained in:
Rajeev Kumar 2017-07-19 14:55:42 -07:00
commit d9a43cfbe4
2 changed files with 22 additions and 9 deletions

View file

@ -1113,6 +1113,16 @@ int wma_vdev_start_resp_handler(void *handle, uint8_t *cmd_param_info,
return 0;
}
static bool wma_is_vdev_valid(uint32_t vdev_id)
{
tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
if (NULL == wma_handle)
return false;
return wma_handle->interfaces[vdev_id].vdev_active;
}
/**
* wma_vdev_set_param() - set per vdev params in fw
* @wmi_handle: wmi handle
@ -1128,6 +1138,13 @@ wma_vdev_set_param(wmi_unified_t wmi_handle, uint32_t if_id,
{
struct vdev_set_params param = {0};
if (!wma_is_vdev_valid(if_id)) {
WMA_LOGE(FL("vdev_id: %d is not active reject the req: param id %d val %d"),
if_id, param_id, param_value);
QDF_ASSERT(0);
return QDF_STATUS_E_INVAL;
}
param.if_id = if_id;
param.param_id = param_id;
param.param_value = param_value;

View file

@ -973,10 +973,9 @@ void wma_add_bss_ndi_mode(tp_wma_handle wma, tpAddBssParams add_bss)
struct wma_target_req *msg;
uint8_t vdev_id, peer_id;
QDF_STATUS status;
struct vdev_set_params param = {0};
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
WMA_LOGI("%s: enter", __func__);
WMA_LOGD("%s: enter", __func__);
if (NULL == wma_find_vdev_by_addr(wma, add_bss->bssId, &vdev_id)) {
WMA_LOGE("%s: Failed to find vdev", __func__);
goto send_fail_resp;
@ -1029,17 +1028,14 @@ void wma_add_bss_ndi_mode(tp_wma_handle wma, tpAddBssParams add_bss)
WMA_TARGET_REQ_TYPE_VDEV_START);
goto send_fail_resp;
}
WMA_LOGI("%s: vdev start request for NDI sent to target", __func__);
WMA_LOGD("%s: vdev start request for NDI sent to target", __func__);
/* Initialize protection mode to no protection */
param.if_id = vdev_id;
param.param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
param.param_value = IEEE80211_PROT_NONE;
if (wmi_unified_vdev_set_param_send(wma->wmi_handle, &param))
WMA_LOGE("Failed to initialize protection mode");
wma_vdev_set_param(wma->wmi_handle, vdev_id,
WMI_VDEV_PARAM_PROTECTION_MODE, IEEE80211_PROT_NONE);
return;
send_fail_resp:
add_bss->status = QDF_STATUS_E_FAILURE;
wma_send_msg(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);