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
This commit is contained in:
Harsh Kumar Bijlani
2022-12-13 12:42:22 +05:30
committed by Madan Koyyalamudi
parent 336315bdd2
commit e94a73784a
6 changed files with 54 additions and 2 deletions

View File

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

View File

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

View File

@@ -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: case CDP_SET_MCAST_VDEV:
soc->arch_ops.txrx_get_vdev_mcast_param(soc, vdev, val); soc->arch_ops.txrx_get_vdev_mcast_param(soc, vdev, val);
break; break;
#ifdef QCA_SUPPORT_WDS_EXTENDED
case CDP_DROP_TX_MCAST:
val->cdp_drop_tx_mcast = vdev->drop_tx_mcast;
break;
#endif
default: default:
dp_cdp_err("%pK: param value %d is wrong", dp_cdp_err("%pK: param value %d is wrong",
soc, param); 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) if (vdev->opmode == wlan_op_mode_ap)
vdev->wds_ext_enabled = val.cdp_vdev_param_wds_ext; vdev->wds_ext_enabled = val.cdp_vdev_param_wds_ext;
break; 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 #endif
case CDP_ENABLE_PEER_AUTHORIZE: case CDP_ENABLE_PEER_AUTHORIZE:
vdev->peer_authorize = val.cdp_vdev_param_peer_authorize; vdev->peer_authorize = val.cdp_vdev_param_peer_authorize;

View File

@@ -7488,6 +7488,8 @@ dp_print_pdev_tx_stats(struct dp_pdev *pdev)
pdev->stats.tx_i.dropped.drop_ingress); pdev->stats.tx_i.dropped.drop_ingress);
DP_PRINT_STATS(" invalid peer id in exception path = %u", DP_PRINT_STATS(" invalid peer id in exception path = %u",
pdev->stats.tx_i.dropped.invalid_peer_id_in_exc_path); 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", DP_PRINT_STATS("Tx failed = %u",
pdev->stats.tx.tx_failed); pdev->stats.tx.tx_failed);
DP_PRINT_STATS(" FW removed Pkts = %u", 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.res_full +
tgtobj->stats.tx_i.dropped.drop_ingress + tgtobj->stats.tx_i.dropped.drop_ingress +
tgtobj->stats.tx_i.dropped.headroom_insufficient + 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, 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.drop_ingress);
DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.headroom_insufficient); 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.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);
DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified_raw); DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified_raw);
DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sniffer_rcvd); 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.res_full +
tgtobj->stats.tx_i.dropped.drop_ingress + tgtobj->stats.tx_i.dropped.drop_ingress +
tgtobj->stats.tx_i.dropped.headroom_insufficient + 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, QDF_STATUS dp_txrx_get_soc_stats(struct cdp_soc_t *soc_hdl,

View File

@@ -3088,6 +3088,34 @@ static inline bool dp_tx_mcast_enhance(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
} }
#endif #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 * dp_tx_per_pkt_vdev_id_check() - vdev id check for frame
* @nbuf: qdf_nbuf_t * @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))) if (qdf_unlikely(!dp_tx_mcast_enhance(vdev, nbuf)))
return NULL; return NULL;
if (qdf_unlikely(dp_tx_mcast_drop(vdev, nbuf)))
return nbuf;
/* RAW */ /* RAW */
if (qdf_unlikely(vdev->tx_encap_type == htt_cmn_pkt_type_raw)) { if (qdf_unlikely(vdev->tx_encap_type == htt_cmn_pkt_type_raw)) {
struct dp_tx_seg_info_s seg_info = {0}; struct dp_tx_seg_info_s seg_info = {0};

View File

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