qcacmn: Fix ppdu stats for disassoc frame
For Disassoc frame, fw send ppdu stats to host with peer_id of the previous associated client. peer id is valid and peer structure is NULL making framectrl as zero for disassoc frame. with the fix frame ctrl are populated before checking for invalid peer. Change-Id: I5960685a4c90f00a850f4f1fa2b3d883117fb443
This commit is contained in:
@@ -2201,24 +2201,8 @@ static void dp_process_ppdu_stats_user_common_tlv(
|
||||
peer_id, ppdu_info);
|
||||
ppdu_user_desc = &ppdu_desc->user[curr_user_index];
|
||||
|
||||
if (peer_id == DP_SCAN_PEER_ID) {
|
||||
ppdu_desc->vdev_id =
|
||||
HTT_PPDU_STATS_USER_COMMON_TLV_VAP_ID_GET(*tag_buf);
|
||||
vdev =
|
||||
dp_get_vdev_from_soc_vdev_id_wifi3(pdev->soc,
|
||||
ppdu_desc->vdev_id);
|
||||
if (!vdev)
|
||||
return;
|
||||
qdf_mem_copy(ppdu_user_desc->mac_addr, vdev->mac_addr.raw,
|
||||
QDF_MAC_ADDR_SIZE);
|
||||
} else {
|
||||
peer = dp_peer_find_by_id(pdev->soc, peer_id);
|
||||
if (!peer)
|
||||
return;
|
||||
qdf_mem_copy(ppdu_user_desc->mac_addr,
|
||||
peer->mac_addr.raw, QDF_MAC_ADDR_SIZE);
|
||||
dp_peer_unref_del_find_by_id(peer);
|
||||
}
|
||||
ppdu_desc->vdev_id =
|
||||
HTT_PPDU_STATS_USER_COMMON_TLV_VAP_ID_GET(*tag_buf);
|
||||
|
||||
ppdu_user_desc->peer_id = peer_id;
|
||||
|
||||
@@ -2257,6 +2241,39 @@ static void dp_process_ppdu_stats_user_common_tlv(
|
||||
HTT_PPDU_STATS_HOST_OPAQUE_COOKIE_GET(*tag_buf);
|
||||
ppdu_user_desc->is_ppdu_cookie_valid = 1;
|
||||
}
|
||||
|
||||
/* returning earlier causes other feilds unpopulated */
|
||||
if (peer_id == DP_SCAN_PEER_ID) {
|
||||
vdev =
|
||||
dp_get_vdev_from_soc_vdev_id_wifi3(pdev->soc,
|
||||
ppdu_desc->vdev_id);
|
||||
if (!vdev)
|
||||
return;
|
||||
qdf_mem_copy(ppdu_user_desc->mac_addr, vdev->mac_addr.raw,
|
||||
QDF_MAC_ADDR_SIZE);
|
||||
} else {
|
||||
peer = dp_peer_find_by_id(pdev->soc, peer_id);
|
||||
if (!peer) {
|
||||
/*
|
||||
* fw sends peer_id which is about to removed but
|
||||
* it was already removed in host.
|
||||
* eg: for disassoc, fw send ppdu stats
|
||||
* with peer id equal to previously associated
|
||||
* peer's peer_id but it was removed
|
||||
*/
|
||||
vdev =
|
||||
dp_get_vdev_from_soc_vdev_id_wifi3(pdev->soc,
|
||||
ppdu_desc->vdev_id);
|
||||
if (!vdev)
|
||||
return;
|
||||
qdf_mem_copy(ppdu_user_desc->mac_addr,
|
||||
vdev->mac_addr.raw, QDF_MAC_ADDR_SIZE);
|
||||
return;
|
||||
}
|
||||
qdf_mem_copy(ppdu_user_desc->mac_addr,
|
||||
peer->mac_addr.raw, QDF_MAC_ADDR_SIZE);
|
||||
dp_peer_unref_del_find_by_id(peer);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user