qca-wifi: filter by peer for prob_resp and disasoc

all probe responses and disassoc from bss peer will be accepted and
later filtered by
mac. Additionally retry queue is having a treshold for this new
mechanism to be able to flush queue in case it gets filled up.
this is meant to work for every control frame that has reached such a
state in its retry q.

Change-Id: Ie49d00d9b9422f02f5d9512a891ceb546cdd432d
This commit is contained in:
Ruben Columbus
2020-03-20 16:06:21 -07:00
父節點 929fa81a8b
當前提交 14818961ef

查看文件

@@ -107,6 +107,8 @@
(_a)[3] == 0x00 && \
(_a)[4] == 0x00 && \
(_a)[5] == 0x00)
/* Maximum number of retries */
#define MAX_RETRY_Q_COUNT 20
#ifdef WLAN_TX_PKT_CAPTURE_ENH
@@ -3391,7 +3393,6 @@ dp_send_mgmt_ctrl_to_stack(struct dp_pdev *pdev,
subtype = (ppdu_desc->frame_ctrl &
IEEE80211_FC0_SUBTYPE_MASK) >>
IEEE80211_FC0_SUBTYPE_SHIFT;
if (is_payload) {
wh = (struct ieee80211_frame *)qdf_nbuf_data(mgmt_ctl_nbuf);
@@ -3526,6 +3527,7 @@ dp_check_mgmt_ctrl_ppdu(struct dp_pdev *pdev,
uint64_t start_tsf;
uint64_t end_tsf;
uint16_t ppdu_desc_frame_ctrl;
struct dp_peer *peer;
ppdu_desc = (struct cdp_tx_completion_ppdu *)
qdf_nbuf_data(nbuf_ppdu_desc);
@@ -3571,12 +3573,33 @@ dp_check_mgmt_ctrl_ppdu(struct dp_pdev *pdev,
subtype = 0;
}
if (!dp_peer_or_pdev_tx_cap_enabled(pdev, NULL,
ppdu_desc->user[0].mac_addr)) {
qdf_nbuf_free(nbuf_ppdu_desc);
status = 0;
goto free_ppdu_desc;
peer = dp_tx_cap_peer_find_by_id(pdev->soc, ppdu_desc->user[0].peer_id);
if (peer && !peer->bss_peer) {
if (!dp_peer_or_pdev_tx_cap_enabled(pdev, peer,
ppdu_desc->user[0].mac_addr
)) {
qdf_nbuf_free(nbuf_ppdu_desc);
status = 0;
dp_tx_cap_peer_unref_del(peer);
goto free_ppdu_desc;
}
dp_tx_cap_peer_unref_del(peer);
} else {
if (peer)
dp_tx_cap_peer_unref_del(peer);
if (!(type == IEEE80211_FC0_TYPE_MGT &&
(subtype == MGMT_SUBTYPE_PROBE_RESP >> 4 ||
subtype == MGMT_SUBTYPE_DISASSOC >> 4))) {
if (!dp_peer_or_pdev_tx_cap_enabled(pdev, NULL,
ppdu_desc->user[0]
.mac_addr)) {
qdf_nbuf_free(nbuf_ppdu_desc);
status = 0;
goto free_ppdu_desc;
}
}
}
switch (ppdu_desc->htt_frame_type) {
case HTT_STATS_FTYPE_TIDQ_DATA_SU:
case HTT_STATS_FTYPE_TIDQ_DATA_MU:
@@ -3665,7 +3688,30 @@ get_mgmt_pkt_from_queue:
goto insert_mgmt_buf_to_queue;
}
/* check for max retry count */
if (qdf_nbuf_queue_len(retries_q) >=
MAX_RETRY_Q_COUNT) {
qdf_nbuf_t nbuf_retry_ppdu;
nbuf_retry_ppdu =
qdf_nbuf_queue_remove(retries_q);
qdf_nbuf_free(nbuf_retry_ppdu);
}
/*
* add the ppdu_desc into retry queue
*/
qdf_nbuf_queue_add(retries_q, nbuf_ppdu_desc);
/* flushing retry queue since completion status is
* in final state. meaning that even though ppdu_id are
* different there is a payload already.
*/
if (qdf_unlikely(ppdu_desc->user[0].completion_status ==
HTT_PPDU_STATS_USER_STATUS_OK)) {
qdf_nbuf_queue_free(retries_q);
}
status = 0;
insert_mgmt_buf_to_queue:
@@ -3707,6 +3753,33 @@ insert_mgmt_buf_to_queue:
goto free_ppdu_desc;
}
/* pull head based on sgen pkt or mgmt pkt */
if (NULL == qdf_nbuf_pull_head(mgmt_ctl_nbuf,
head_size)) {
QDF_TRACE(QDF_MODULE_ID_TX_CAPTURE,
QDF_TRACE_LEVEL_FATAL,
" No Head space to pull !!\n");
qdf_assert_always(0);
}
wh = (struct ieee80211_frame *)
(qdf_nbuf_data(mgmt_ctl_nbuf));
if (type == IEEE80211_FC0_TYPE_MGT &&
(subtype == MGMT_SUBTYPE_PROBE_RESP >> 4 ||
subtype == MGMT_SUBTYPE_DISASSOC >> 4)) {
if (!dp_peer_or_pdev_tx_cap_enabled(pdev,
NULL,
wh->i_addr1
)) {
qdf_nbuf_free(nbuf_ppdu_desc);
qdf_nbuf_free(mgmt_ctl_nbuf);
qdf_nbuf_queue_free(retries_q);
status = 0;
goto free_ppdu_desc;
}
}
while (qdf_nbuf_queue_len(retries_q)) {
/*
* send retried packet stored
@@ -3748,16 +3821,6 @@ insert_mgmt_buf_to_queue:
continue;
}
/* pull head based on sgen pkt or mgmt pkt */
if (NULL ==
qdf_nbuf_pull_head(tmp_mgmt_ctl_nbuf,
head_size)) {
QDF_TRACE(QDF_MODULE_ID_TX_CAPTURE,
QDF_TRACE_LEVEL_FATAL,
" No Head space to pull !!\n");
qdf_assert_always(0);
}
/*
* frame control from ppdu_desc has
* retry flag set
@@ -3795,14 +3858,6 @@ insert_mgmt_buf_to_queue:
tx_capture_info.mpdu_info.ppdu_id =
*(uint32_t *)qdf_nbuf_data(mgmt_ctl_nbuf);
/* pull head based on sgen pkt or mgmt pkt */
if (NULL == qdf_nbuf_pull_head(mgmt_ctl_nbuf,
head_size)) {
QDF_TRACE(QDF_MODULE_ID_TX_CAPTURE,
QDF_TRACE_LEVEL_FATAL,
" No Head space to pull !!\n");
qdf_assert_always(0);
}
/* frame control from ppdu_desc has retry flag set */
frame_ctrl_le = qdf_cpu_to_le16(ppdu_desc_frame_ctrl);
@@ -3831,10 +3886,31 @@ insert_mgmt_buf_to_queue:
status = 0;
goto free_ppdu_desc;
}
/* check for max retry count */
if (qdf_nbuf_queue_len(retries_q) >= MAX_RETRY_Q_COUNT) {
qdf_nbuf_t nbuf_retry_ppdu;
nbuf_retry_ppdu =
qdf_nbuf_queue_remove(retries_q);
qdf_nbuf_free(nbuf_retry_ppdu);
}
/*
* add the ppdu_desc into retry queue
*/
qdf_nbuf_queue_add(retries_q, nbuf_ppdu_desc);
/* flushing retry queue since completion status is
* in final state. meaning that even though ppdu_id are
* different there is a payload already.
*/
if (qdf_unlikely(ppdu_desc->user[0].completion_status ==
HTT_PPDU_STATS_USER_STATUS_OK)) {
qdf_nbuf_queue_free(retries_q);
}
status = 0;
} else if ((ppdu_desc_frame_ctrl &
IEEE80211_FC0_TYPE_MASK) ==