qcacmn: Add support to drop tx mcast frames in WDS extended mode

Add support to drop tx mcast frames in WDS extended mode

Change-Id: Ia5af3b31c95393eb9c8af6b92ddeced6ac7a8d3d
CRs-Fixed: 3359296
Bu işleme şunda yer alıyor:
Harsh Kumar Bijlani
2022-12-13 12:42:22 +05:30
işlemeyi yapan: Madan Koyyalamudi
ebeveyn 336315bdd2
işleme e94a73784a
6 değiştirilmiş dosya ile 54 ekleme ve 2 silme

Dosyayı Görüntüle

@@ -1421,6 +1421,7 @@ enum cdp_pdev_param_type {
* @cdp_sawf_stats: SAWF stats config
* @cdp_vdev_param_traffic_end_ind: Traffic end indication enable/disable
* @cdp_skel_enable : Enable/Disable skeleton code for Umac reset debug
* @cdp_drop_tx_mcast: Enable/Disable tx mcast drop
*/
typedef union cdp_config_param_t {
/* peer params */
@@ -1510,6 +1511,7 @@ typedef union cdp_config_param_t {
bool cdp_drop_3addr_mcast;
bool cdp_vdev_param_traffic_end_ind;
bool cdp_umac_rst_skel;
bool cdp_drop_tx_mcast;
} cdp_config_param_type;
/**
@@ -1587,6 +1589,7 @@ enum cdp_pdev_bpr_param {
* @CDP_ENABLE_IGMP_MCAST_EN: enable/disable igmp multicast enhancement
* @CDP_ENABLE_HLOS_TID_OVERRIDE: set hlos tid override flag
* @CDP_CFG_WDS_EXT: enable/disable wds ext feature
* @CDP_DROP_TX_MCAST: enable/disable tx mcast drop
* @CDP_ENABLE_PEER_AUTHORIZE: enable peer authorize flag
* @CDP_ENABLE_PEER_TID_LATENCY: set peer tid latency enable flag
* @CDP_SET_VAP_MESH_TID: Set latency tid in vap
@@ -1626,6 +1629,7 @@ enum cdp_vdev_param_type {
CDP_ENABLE_HLOS_TID_OVERRIDE,
#ifdef QCA_SUPPORT_WDS_EXTENDED
CDP_CFG_WDS_EXT,
CDP_DROP_TX_MCAST,
#endif /* QCA_SUPPORT_WDS_EXTENDED */
CDP_ENABLE_PEER_AUTHORIZE,
#ifdef WLAN_SUPPORT_MESH_LATENCY

Dosyayı Görüntüle

@@ -1840,6 +1840,7 @@ struct cdp_tx_ingress_stats {
uint32_t fail_per_pkt_vdev_id_check;
uint32_t drop_ingress;
uint32_t invalid_peer_id_in_exc_path;
uint32_t tx_mcast_drop;
} dropped;
/* Mesh packets info */

Dosyayı Görüntüle

@@ -10885,6 +10885,11 @@ static QDF_STATUS dp_get_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,
case CDP_SET_MCAST_VDEV:
soc->arch_ops.txrx_get_vdev_mcast_param(soc, vdev, val);
break;
#ifdef QCA_SUPPORT_WDS_EXTENDED
case CDP_DROP_TX_MCAST:
val->cdp_drop_tx_mcast = vdev->drop_tx_mcast;
break;
#endif
default:
dp_cdp_err("%pK: param value %d is wrong",
soc, param);
@@ -11007,6 +11012,11 @@ dp_set_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,
if (vdev->opmode == wlan_op_mode_ap)
vdev->wds_ext_enabled = val.cdp_vdev_param_wds_ext;
break;
case CDP_DROP_TX_MCAST:
dp_info("vdev_id %d drop tx mcast :%d", vdev_id,
val.cdp_drop_tx_mcast);
vdev->drop_tx_mcast = val.cdp_drop_tx_mcast;
break;
#endif
case CDP_ENABLE_PEER_AUTHORIZE:
vdev->peer_authorize = val.cdp_vdev_param_peer_authorize;

Dosyayı Görüntüle

@@ -7488,6 +7488,8 @@ dp_print_pdev_tx_stats(struct dp_pdev *pdev)
pdev->stats.tx_i.dropped.drop_ingress);
DP_PRINT_STATS(" invalid peer id in exception path = %u",
pdev->stats.tx_i.dropped.invalid_peer_id_in_exc_path);
DP_PRINT_STATS(" Tx Mcast Drop = %u",
pdev->stats.tx_i.dropped.tx_mcast_drop);
DP_PRINT_STATS("Tx failed = %u",
pdev->stats.tx.tx_failed);
DP_PRINT_STATS(" FW removed Pkts = %u",
@@ -8814,7 +8816,8 @@ void dp_update_vdev_ingress_stats(struct dp_vdev *tgtobj)
tgtobj->stats.tx_i.dropped.res_full +
tgtobj->stats.tx_i.dropped.drop_ingress +
tgtobj->stats.tx_i.dropped.headroom_insufficient +
tgtobj->stats.tx_i.dropped.invalid_peer_id_in_exc_path;
tgtobj->stats.tx_i.dropped.invalid_peer_id_in_exc_path +
tgtobj->stats.tx_i.dropped.tx_mcast_drop;
}
void dp_update_vdev_rate_stats(struct cdp_vdev_stats *tgtobj,
@@ -8866,6 +8869,7 @@ void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj,
DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.drop_ingress);
DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.headroom_insufficient);
DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.invalid_peer_id_in_exc_path);
DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.tx_mcast_drop);
DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified);
DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified_raw);
DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sniffer_rcvd);
@@ -8885,7 +8889,8 @@ void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj,
tgtobj->stats.tx_i.dropped.res_full +
tgtobj->stats.tx_i.dropped.drop_ingress +
tgtobj->stats.tx_i.dropped.headroom_insufficient +
tgtobj->stats.tx_i.dropped.invalid_peer_id_in_exc_path;
tgtobj->stats.tx_i.dropped.invalid_peer_id_in_exc_path +
tgtobj->stats.tx_i.dropped.tx_mcast_drop;
}
QDF_STATUS dp_txrx_get_soc_stats(struct cdp_soc_t *soc_hdl,

Dosyayı Görüntüle

@@ -3088,6 +3088,34 @@ static inline bool dp_tx_mcast_enhance(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
}
#endif
#ifdef QCA_SUPPORT_WDS_EXTENDED
/**
* dp_tx_mcast_drop() - Drop mcast frame if drop_tx_mcast is set in WDS_EXT
* @vdev: vdev handle
* @nbuf: skb
*
* Return: true if frame is dropped, false otherwise
*/
static inline bool dp_tx_mcast_drop(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
{
/* Drop tx mcast and WDS Extended feature check */
if (qdf_unlikely((vdev->drop_tx_mcast) && (vdev->wds_ext_enabled))) {
qdf_ether_header_t *eh = (qdf_ether_header_t *)
qdf_nbuf_data(nbuf);
if (DP_FRAME_IS_MULTICAST((eh)->ether_dhost)) {
DP_STATS_INC(vdev, tx_i.dropped.tx_mcast_drop, 1);
return true;
}
}
return false;
}
#else
static inline bool dp_tx_mcast_drop(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
{
return false;
}
#endif
/**
* dp_tx_per_pkt_vdev_id_check() - vdev id check for frame
* @nbuf: qdf_nbuf_t
@@ -3699,6 +3727,9 @@ qdf_nbuf_t dp_tx_send(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
if (qdf_unlikely(!dp_tx_mcast_enhance(vdev, nbuf)))
return NULL;
if (qdf_unlikely(dp_tx_mcast_drop(vdev, nbuf)))
return nbuf;
/* RAW */
if (qdf_unlikely(vdev->tx_encap_type == htt_cmn_pkt_type_raw)) {
struct dp_tx_seg_info_s seg_info = {0};

Dosyayı Görüntüle

@@ -3258,6 +3258,7 @@ struct dp_vdev {
#ifdef QCA_SUPPORT_WDS_EXTENDED
bool wds_ext_enabled;
bool drop_tx_mcast;
#endif /* QCA_SUPPORT_WDS_EXTENDED */
bool drop_3addr_mcast;
#ifdef WLAN_VENDOR_SPECIFIC_BAR_UPDATE