From b49539b149bbc6204d2841237991bbbd1a152811 Mon Sep 17 00:00:00 2001 From: Kai Chen Date: Tue, 14 Jan 2020 17:36:44 -0800 Subject: [PATCH] qca-wifi: fix the issue in block ack/ack for tx capture mode 1. Hanndle BAR frame. 2. set rate for ACK frame. 3. Check block ack session and use block ack if block ack session is established. 4. no ACK for broadcast probe request. 5. no ack if the ack policy is set to no ack in qos control. Change-Id: Id42b0e95fc7ea043d35c8d7d5686f15140acdea6 --- dp/wifi3.0/dp_tx_capture.c | 64 ++++++++++++++++++++++++++++++++------ dp/wifi3.0/dp_tx_capture.h | 3 ++ 2 files changed, 58 insertions(+), 9 deletions(-) diff --git a/dp/wifi3.0/dp_tx_capture.c b/dp/wifi3.0/dp_tx_capture.c index a2756f1065..80032c5ac8 100644 --- a/dp/wifi3.0/dp_tx_capture.c +++ b/dp/wifi3.0/dp_tx_capture.c @@ -2995,6 +2995,8 @@ static void set_mpdu_info( mpdu_info->preamble = DOT11_B; else mpdu_info->preamble = DOT11_A; + + mpdu_info->mcs = CDP_LEGACY_MCS3; } static void dp_gen_ack_frame(struct hal_rx_ppdu_info *ppdu_info, @@ -3026,13 +3028,36 @@ static void dp_gen_ack_frame(struct hal_rx_ppdu_info *ppdu_info, static void dp_gen_block_ack_frame( struct mon_rx_user_status *rx_user_status, + struct mon_rx_user_info *rx_user_info, struct dp_peer *peer, qdf_nbuf_t mpdu_nbuf) { struct dp_vdev *vdev = NULL; + uint32_t tid; + struct dp_tx_tid *tx_tid; struct ieee80211_ctlframe_addr2 *wh_addr2; uint8_t *frm; + tid = rx_user_status->tid; + tx_tid = &peer->tx_capture.tx_tid[tid]; + if (!rx_user_info->bar_frame) { + tx_tid->first_data_seq_ctrl = + rx_user_status->first_data_seq_ctrl; + tx_tid->mpdu_cnt = rx_user_status->mpdu_cnt_fcs_ok + + rx_user_status->mpdu_cnt_fcs_err; + if (tx_tid->mpdu_cnt > DP_MAX_MPDU_64) + qdf_mem_copy(tx_tid->mpdu_fcs_ok_bitmap, + rx_user_status->mpdu_fcs_ok_bitmap, + HAL_RX_NUM_WORDS_PER_PPDU_BITMAP * sizeof( + rx_user_status->mpdu_fcs_ok_bitmap[0])); + else + qdf_mem_copy(tx_tid->mpdu_fcs_ok_bitmap, + rx_user_status->mpdu_fcs_ok_bitmap, + DP_NUM_WORDS_PER_PPDU_BITMAP_64 * sizeof( + rx_user_status->mpdu_fcs_ok_bitmap[0])); + } + + wh_addr2 = (struct ieee80211_ctlframe_addr2 *) qdf_nbuf_data(mpdu_nbuf); @@ -3059,19 +3084,17 @@ static void dp_gen_block_ack_frame( DP_IEEE80211_BAR_CTL_COMBA); frm += 2; *((uint16_t *)frm) = - rx_user_status->first_data_seq_ctrl; + tx_tid->first_data_seq_ctrl; frm += 2; - if ((rx_user_status->mpdu_cnt_fcs_ok + - rx_user_status->mpdu_cnt_fcs_err) - > DP_MAX_MPDU_64) { + if (tx_tid->mpdu_cnt > DP_MAX_MPDU_64) { qdf_mem_copy(frm, - rx_user_status->mpdu_fcs_ok_bitmap, + tx_tid->mpdu_fcs_ok_bitmap, HAL_RX_NUM_WORDS_PER_PPDU_BITMAP * sizeof(rx_user_status->mpdu_fcs_ok_bitmap[0])); frm += DP_NUM_BYTES_PER_PPDU_BITMAP; } else { qdf_mem_copy(frm, - rx_user_status->mpdu_fcs_ok_bitmap, + tx_tid->mpdu_fcs_ok_bitmap, DP_NUM_WORDS_PER_PPDU_BITMAP_64 * sizeof(rx_user_status->mpdu_fcs_ok_bitmap[0])); frm += DP_NUM_BYTES_PER_PPDU_BITMAP_64; @@ -3099,8 +3122,10 @@ QDF_STATUS dp_send_ack_frame_to_stack(struct dp_soc *soc, uint32_t peer_id; struct mon_rx_status *rx_status; struct mon_rx_user_status *rx_user_status; + struct mon_rx_user_info *rx_user_info; uint32_t ast_index; uint32_t i; + bool bar_frame; rx_status = &ppdu_info->rx_status; @@ -3111,11 +3136,30 @@ QDF_STATUS dp_send_ack_frame_to_stack(struct dp_soc *soc, HAL_MPDU_SW_FRAME_GROUP_MGMT_BEACON) return QDF_STATUS_SUCCESS; + if (ppdu_info->sw_frame_group_id == HAL_MPDU_SW_FRAME_GROUP_MGMT_PROBE_REQ && + (ppdu_info->rx_info.mac_addr1[0] & 1)) { + return QDF_STATUS_SUCCESS; + } + + if (ppdu_info->sw_frame_group_id == HAL_MPDU_SW_FRAME_GROUP_CTRL_BAR) + bar_frame = true; + else + bar_frame = false; + for (i = 0; i < ppdu_info->com_info.num_users; i++) { if (i > OFDMA_NUM_USERS) return QDF_STATUS_E_FAULT; rx_user_status = &ppdu_info->rx_user_status[i]; + rx_user_info = &ppdu_info->rx_user_info[i]; + + rx_user_info->bar_frame = bar_frame; + + if (rx_user_info->qos_control_info_valid && + ((rx_user_info->qos_control & + IEEE80211_QOS_ACKPOLICY) >> IEEE80211_QOS_ACKPOLICY_S) + == IEEE80211_BAR_CTL_NOACK) + continue; ast_index = rx_user_status->ast_index; if (ast_index >= @@ -3178,9 +3222,11 @@ QDF_STATUS dp_send_ack_frame_to_stack(struct dp_soc *soc, return QDF_STATUS_E_NOMEM; } - if (rx_status->rs_flags & IEEE80211_AMPDU_FLAG) { - dp_gen_block_ack_frame( - rx_user_status, peer, + if (peer->rx_tid[rx_user_status->tid].ba_status == + DP_RX_BA_ACTIVE) { + dp_gen_block_ack_frame(rx_user_status, + rx_user_info, + peer, tx_capture_info.mpdu_nbuf); tx_capture_info.mpdu_info.tid = rx_user_status->tid; diff --git a/dp/wifi3.0/dp_tx_capture.h b/dp/wifi3.0/dp_tx_capture.h index e4718ec5c7..3801e9f73f 100644 --- a/dp/wifi3.0/dp_tx_capture.h +++ b/dp/wifi3.0/dp_tx_capture.h @@ -73,6 +73,9 @@ struct dp_tx_tid { qdf_nbuf_queue_t msdu_comp_q; qdf_nbuf_queue_t pending_ppdu_q; struct cdp_tx_completion_ppdu xretry_ppdu; + uint16_t first_data_seq_ctrl; + uint32_t mpdu_cnt; + uint32_t mpdu_fcs_ok_bitmap[QDF_MON_STATUS_MPDU_FCS_BMAP_NWORDS]; }; struct dp_peer_tx_capture {