qcacmn: Add peer filter support for tx monitor

Add peer filter support for tx monitor. Add changes to filter frames
in SW

Change-Id: Ie4f2f261976d3b173a417942e36a6aaccea18e47
CRs-Fixed: 3300747
Цей коміт міститься в:
Nandha Kishore Easwaran
2022-08-29 19:26:04 +05:30
зафіксовано Madan Koyyalamudi
джерело 3363e11e08
коміт 9f3dd70ae9

Переглянути файл

@@ -696,20 +696,45 @@ dp_lite_mon_filter_ppdu(uint8_t mpdu_count, uint8_t level)
}
/**
* dp_lite_mon_filter_subtype() - filter frames with subtype
* @tx_ppdu_info: pointer to dp_tx_ppdu_info structure
* dp_lite_mon_filter_peer() - filter frames with peer
* @config: Lite monitor configuration
* @wh: Pointer to ieee80211_frame
*
* Return: QDF_STATUS
*/
static inline QDF_STATUS
dp_lite_mon_filter_subtype(struct dp_tx_ppdu_info *tx_ppdu_info,
struct dp_lite_mon_tx_config *config, qdf_nbuf_t buf)
dp_lite_mon_filter_peer(struct dp_lite_mon_tx_config *config,
struct ieee80211_frame_min_one *wh)
{
struct dp_lite_mon_peer *peer;
/* Return here if peer filtering is not required */
if (!config->tx_config.peer_count)
return QDF_STATUS_SUCCESS;
TAILQ_FOREACH(peer, &config->tx_config.peer_list, peer_list_elem) {
if (!qdf_mem_cmp(&peer->peer_mac.raw[0],
&wh->i_addr1[0], QDF_MAC_ADDR_SIZE)) {
return QDF_STATUS_SUCCESS;
}
}
return QDF_STATUS_E_ABORTED;
}
/**
* dp_lite_mon_filter_subtype() - filter frames with subtype
* @config: Lite monitor configuration
* @wh: Pointer to ieee80211_frame
*
* Return: QDF_STATUS
*/
static inline QDF_STATUS
dp_lite_mon_filter_subtype(struct dp_lite_mon_tx_config *config,
struct ieee80211_frame_min_one *wh)
{
uint16_t mgmt_filter, ctrl_filter, data_filter, type, subtype;
struct ieee80211_frame_min_one *wh;
uint8_t is_mcast = 0;
qdf_nbuf_t nbuf;
/* Return here if subtype filtering is not required */
if (!config->subtype_filtering)
@@ -719,16 +744,6 @@ dp_lite_mon_filter_subtype(struct dp_tx_ppdu_info *tx_ppdu_info,
ctrl_filter = config->tx_config.ctrl_filter[DP_MON_FRM_FILTER_MODE_FP];
data_filter = config->tx_config.data_filter[DP_MON_FRM_FILTER_MODE_FP];
if (dp_tx_mon_nbuf_get_num_frag(buf)) {
wh = (struct ieee80211_frame_min_one *)qdf_nbuf_get_frag_addr(buf, 0);
} else {
nbuf = qdf_nbuf_get_ext_list(buf);
if (nbuf)
wh = (struct ieee80211_frame_min_one *)qdf_nbuf_data(nbuf);
else
return QDF_STATUS_E_INVAL;
}
type = (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK);
subtype = ((wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) >>
IEEE80211_FC0_SUBTYPE_SHIFT);
@@ -755,6 +770,46 @@ dp_lite_mon_filter_subtype(struct dp_tx_ppdu_info *tx_ppdu_info,
}
}
/**
* dp_lite_mon_filter_peer_subtype() - filter frames with subtype and peer
* @config: Lite monitor configuration
* @buf: Pointer to nbuf
*
* Return: QDF_STATUS
*/
static inline QDF_STATUS
dp_lite_mon_filter_peer_subtype(struct dp_lite_mon_tx_config *config,
qdf_nbuf_t buf)
{
struct ieee80211_frame_min_one *wh;
qdf_nbuf_t nbuf;
QDF_STATUS ret;
/* Return here if subtype and peer filtering is not required */
if (!config->subtype_filtering && !config->tx_config.peer_count)
return QDF_STATUS_SUCCESS;
if (dp_tx_mon_nbuf_get_num_frag(buf)) {
wh = (struct ieee80211_frame_min_one *)qdf_nbuf_get_frag_addr(buf, 0);
} else {
nbuf = qdf_nbuf_get_ext_list(buf);
if (nbuf)
wh = (struct ieee80211_frame_min_one *)qdf_nbuf_data(nbuf);
else
return QDF_STATUS_E_INVAL;
}
ret = dp_lite_mon_filter_subtype(config, wh);
if (ret)
return ret;
ret = dp_lite_mon_filter_peer(config, wh);
if (ret)
return ret;
return QDF_STATUS_SUCCESS;
}
/**
* dp_tx_lite_mon_filtering() - Additional filtering for lite monitor
* @pdev: Pointer to physical device
@@ -784,8 +839,8 @@ dp_tx_lite_mon_filtering(struct dp_pdev *pdev,
if (ret)
return ret;
/* Subtype filtering */
ret = dp_lite_mon_filter_subtype(tx_ppdu_info, config, buf);
/* Subtype and peer filtering */
ret = dp_lite_mon_filter_peer_subtype(config, buf);
if (ret)
return ret;