qcacmn: Handle zero duration management frames
Gracefully handle management frames with zero duration. CRs-Fixed: 3525887 Change-Id: I60ef63f88b2c07d253679f54c9e9cb02d1d87860
Este cometimento está contido em:

cometido por
Gerrit - the friendly Code Review server

ascendente
dbcf99be3e
cometimento
8da0ec5f5a
@@ -130,6 +130,48 @@ mgmt_rx_reo_compare_global_timestamps_gte(uint32_t ts1, uint32_t ts2)
|
||||
}
|
||||
|
||||
#ifdef WLAN_MGMT_RX_REO_ERROR_HANDLING
|
||||
/**
|
||||
* check_and_handle_zero_frame_duration() - Check and handle zero duration error
|
||||
* @desc: Pointer to frame descriptor
|
||||
*
|
||||
* API to check for zero duration management frames. Host will be able to
|
||||
* reorder such frames with the limitation that parallel rx detection may fail.
|
||||
* Hence don't drop management frames with zero duration.
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
static QDF_STATUS
|
||||
check_and_handle_zero_frame_duration(struct mgmt_rx_reo_frame_descriptor *desc)
|
||||
{
|
||||
struct mgmt_rx_reo_params *reo_params;
|
||||
|
||||
if (!desc) {
|
||||
mgmt_rx_reo_err("Mgmt Rx REO frame descriptor is null");
|
||||
return QDF_STATUS_E_NULL_VALUE;
|
||||
}
|
||||
|
||||
if (!desc->rx_params) {
|
||||
mgmt_rx_reo_err("Mgmt Rx params is null");
|
||||
return QDF_STATUS_E_NULL_VALUE;
|
||||
}
|
||||
|
||||
reo_params = desc->rx_params->reo_params;
|
||||
if (!reo_params) {
|
||||
mgmt_rx_reo_err("Mgmt Rx REO params is NULL");
|
||||
return QDF_STATUS_E_NULL_VALUE;
|
||||
}
|
||||
|
||||
if (desc->type == MGMT_RX_REO_FRAME_DESC_HOST_CONSUMED_FRAME &&
|
||||
!mgmt_rx_reo_get_duration_us(desc->rx_params)) {
|
||||
mgmt_rx_reo_debug_rl("0 dur: link= %u,valid= %u,ctr= %u,ts= %u",
|
||||
reo_params->link_id, reo_params->valid,
|
||||
reo_params->mgmt_pkt_ctr,
|
||||
reo_params->global_timestamp);
|
||||
}
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* check_and_handle_invalid_reo_params() - Check and handle invalid reo
|
||||
* parameters error
|
||||
@@ -175,6 +217,49 @@ check_and_handle_invalid_reo_params(struct mgmt_rx_reo_frame_descriptor *desc)
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
#else
|
||||
/**
|
||||
* check_and_handle_zero_frame_duration() - Check and handle zero duration error
|
||||
* @desc: Pointer to frame descriptor
|
||||
*
|
||||
* API to check for zero duration management frames and assert.
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
static QDF_STATUS
|
||||
check_and_handle_zero_frame_duration(struct mgmt_rx_reo_frame_descriptor *desc)
|
||||
{
|
||||
struct mgmt_rx_reo_params *reo_params;
|
||||
|
||||
if (!desc) {
|
||||
mgmt_rx_reo_err("Mgmt Rx REO frame descriptor is null");
|
||||
return QDF_STATUS_E_NULL_VALUE;
|
||||
}
|
||||
|
||||
if (!desc->rx_params) {
|
||||
mgmt_rx_reo_err("Mgmt Rx params is null");
|
||||
return QDF_STATUS_E_NULL_VALUE;
|
||||
}
|
||||
|
||||
reo_params = desc->rx_params->reo_params;
|
||||
if (!reo_params) {
|
||||
mgmt_rx_reo_err("Mgmt Rx REO params is NULL");
|
||||
return QDF_STATUS_E_NULL_VALUE;
|
||||
}
|
||||
|
||||
if (desc->type == MGMT_RX_REO_FRAME_DESC_HOST_CONSUMED_FRAME &&
|
||||
!mgmt_rx_reo_get_duration_us(desc->rx_params)) {
|
||||
mgmt_rx_reo_err_rl("0 dur: link= %u,valid= %u,ctr= %u,ts= %u",
|
||||
reo_params->link_id, reo_params->valid,
|
||||
reo_params->mgmt_pkt_ctr,
|
||||
reo_params->global_timestamp);
|
||||
qdf_assert_always(0);
|
||||
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* check_and_handle_invalid_reo_params() - Check and handle invalid reo
|
||||
* parameters error
|
||||
@@ -3978,6 +4063,7 @@ mgmt_rx_reo_egress_list_init(struct mgmt_rx_reo_egress_list *egress_list)
|
||||
* following errors.
|
||||
*
|
||||
* 1. Invalid management rx reo parameters
|
||||
* 2. Host consumed management frames with zero duration
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
@@ -3997,6 +4083,12 @@ check_frame_sanity(struct mgmt_rx_reo_frame_descriptor *desc)
|
||||
return status;
|
||||
}
|
||||
|
||||
status = check_and_handle_zero_frame_duration(desc);
|
||||
if (QDF_IS_STATUS_ERROR(status)) {
|
||||
mgmt_rx_reo_warn_rl("Drop frame with zero duration");
|
||||
return status;
|
||||
}
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -5001,9 +5093,6 @@ wlan_mgmt_rx_reo_algo_entry(struct wlan_objmgr_pdev *pdev,
|
||||
cur_link = mgmt_rx_reo_get_link_id(desc->rx_params);
|
||||
qdf_assert_always(desc->frame_type == IEEE80211_FC0_TYPE_MGT);
|
||||
|
||||
if (desc->type == MGMT_RX_REO_FRAME_DESC_HOST_CONSUMED_FRAME)
|
||||
qdf_assert_always(desc->rx_params->reo_params->duration_us);
|
||||
|
||||
ret = log_ingress_frame_entry(reo_ctx, desc);
|
||||
if (QDF_IS_STATUS_ERROR(ret))
|
||||
goto failure;
|
||||
|
Criar uma nova questão referindo esta
Bloquear um utilizador