1
0

qcacmn: Handle zero duration management frames

Gracefully handle management frames with zero duration.

CRs-Fixed: 3525887
Change-Id: I60ef63f88b2c07d253679f54c9e9cb02d1d87860
Este cometimento está contido em:
Edayilliam Jayadev
2023-06-13 15:33:15 +05:30
cometido por Gerrit - the friendly Code Review server
ascendente dbcf99be3e
cometimento 8da0ec5f5a

Ver ficheiro

@@ -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;