qcacmn: Drop 3 addr multicast in rx
Drop 3 address multicast packet on rx when vdev is has drop_3addr_mcast enabled. Change-Id: I726bdc9383ea6e5a052a5d754e8f48c98f9ce874 CRs-Fixed: 3163011
This commit is contained in:

committed by
Madan Koyyalamudi

parent
207111647e
commit
f9424745bb
@@ -1383,6 +1383,7 @@ typedef union cdp_config_param_t {
|
||||
bool cdp_psoc_param_vdev_stats_hw_offload;
|
||||
bool cdp_pdev_param_undecoded_metadata_enable;
|
||||
bool cdp_sawf_enabled;
|
||||
bool cdp_drop_3addr_mcast;
|
||||
} cdp_config_param_type;
|
||||
|
||||
/**
|
||||
@@ -1500,6 +1501,7 @@ enum cdp_vdev_param_type {
|
||||
#endif
|
||||
CDP_UPDATE_DSCP_TO_TID_MAP,
|
||||
CDP_SET_MCAST_VDEV,
|
||||
CDP_DROP_3ADDR_MCAST,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@@ -1658,6 +1658,7 @@ struct cdp_rx_stats {
|
||||
struct cdp_pkt_type mu_be_ppdu_cnt[TXRX_TYPE_MU_MAX];
|
||||
uint32_t punc_bw[MAX_PUNCTURED_MODE];
|
||||
#endif
|
||||
uint32_t mcast_3addr_drop;
|
||||
};
|
||||
|
||||
/* struct cdp_tx_ingress_stats - Tx ingress Stats
|
||||
|
@@ -1598,6 +1598,7 @@ void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
|
||||
_tgtobj->rx.raw.num += _srcobj->rx.raw.num; \
|
||||
_tgtobj->rx.raw.bytes += _srcobj->rx.raw.bytes; \
|
||||
_tgtobj->rx.nawds_mcast_drop += _srcobj->rx.nawds_mcast_drop; \
|
||||
_tgtobj->rx.mcast_3addr_drop += _srcobj->rx.mcast_3addr_drop; \
|
||||
_tgtobj->rx.mec_drop.num += _srcobj->rx.mec_drop.num; \
|
||||
_tgtobj->rx.mec_drop.bytes += _srcobj->rx.mec_drop.bytes; \
|
||||
_tgtobj->rx.intra_bss.pkts.num += \
|
||||
|
@@ -8897,7 +8897,8 @@ static QDF_STATUS dp_vdev_getstats(struct cdp_vdev *vdev_handle,
|
||||
vdev_stats->rx.multipass_rx_pkt_drop +
|
||||
vdev_stats->rx.peer_unauth_rx_pkt_drop +
|
||||
vdev_stats->rx.policy_check_drop +
|
||||
vdev_stats->rx.nawds_mcast_drop;
|
||||
vdev_stats->rx.nawds_mcast_drop +
|
||||
vdev_stats->rx.mcast_3addr_drop;
|
||||
|
||||
qdf_mem_free(vdev_stats);
|
||||
|
||||
@@ -8961,7 +8962,8 @@ static void dp_pdev_getstats(struct cdp_pdev *pdev_handle,
|
||||
pdev->stats.rx.multipass_rx_pkt_drop +
|
||||
pdev->stats.rx.peer_unauth_rx_pkt_drop +
|
||||
pdev->stats.rx.policy_check_drop +
|
||||
pdev->stats.rx.nawds_mcast_drop;
|
||||
pdev->stats.rx.nawds_mcast_drop +
|
||||
pdev->stats.rx.mcast_3addr_drop;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -10220,6 +10222,11 @@ dp_set_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,
|
||||
vdev->skip_bar_update_last_ts = 0;
|
||||
break;
|
||||
#endif
|
||||
case CDP_DROP_3ADDR_MCAST:
|
||||
dp_info("vdev_id %d drop 3 addr mcast :%d", vdev_id,
|
||||
val.cdp_drop_3addr_mcast);
|
||||
vdev->drop_3addr_mcast = val.cdp_drop_3addr_mcast;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@@ -1116,6 +1116,32 @@ int dp_rx_err_match_dhost(qdf_ether_header_t *eh, struct dp_vdev *vdev)
|
||||
|
||||
#ifndef QCA_HOST_MODE_WIFI_DISABLED
|
||||
|
||||
/**
|
||||
* dp_rx_err_drop_3addr_mcast() - Check if feature drop_3ddr_mcast is enabled
|
||||
* If so, drop the multicast frame.
|
||||
* @vdev: datapath vdev
|
||||
* @rx_tlv_hdr: TLV header
|
||||
*
|
||||
* Return: true if packet is to be dropped,
|
||||
* false, if packet is not dropped.
|
||||
*/
|
||||
static bool
|
||||
dp_rx_err_drop_3addr_mcast(struct dp_vdev *vdev, uint8_t *rx_tlv_hdr)
|
||||
{
|
||||
struct dp_soc *soc = vdev->pdev->soc;
|
||||
|
||||
if (!vdev->drop_3addr_mcast)
|
||||
return false;
|
||||
|
||||
if (vdev->opmode != wlan_op_mode_sta)
|
||||
return false;
|
||||
|
||||
if (hal_rx_msdu_end_da_is_mcbc_get(soc->hal_soc, rx_tlv_hdr))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_rx_err_is_pn_check_needed() - Check if the packet number check is needed
|
||||
* for this frame received in REO error ring.
|
||||
@@ -1277,6 +1303,11 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, qdf_nbuf_t nbuf,
|
||||
|
||||
dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL, 0, 1);
|
||||
|
||||
if (dp_rx_err_drop_3addr_mcast(vdev, rx_tlv_hdr)) {
|
||||
DP_PEER_PER_PKT_STATS_INC(txrx_peer, rx.mcast_3addr_drop, 1);
|
||||
goto drop_nbuf;
|
||||
}
|
||||
|
||||
if (hal_rx_msdu_end_sa_is_valid_get(soc->hal_soc, rx_tlv_hdr)) {
|
||||
sa_idx = hal_rx_msdu_end_sa_idx_get(soc->hal_soc, rx_tlv_hdr);
|
||||
|
||||
@@ -1306,7 +1337,6 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, qdf_nbuf_t nbuf,
|
||||
goto drop_nbuf;
|
||||
}
|
||||
|
||||
|
||||
if (qdf_unlikely(txrx_peer->nawds_enabled &&
|
||||
hal_rx_msdu_end_da_is_mcbc_get(soc->hal_soc,
|
||||
rx_tlv_hdr))) {
|
||||
|
@@ -6445,6 +6445,8 @@ void dp_print_peer_stats(struct dp_peer *peer,
|
||||
DP_PRINT_STATS("NAWDS : ");
|
||||
DP_PRINT_STATS(" Nawds multicast Drop Rx Packet = %d",
|
||||
peer_stats->rx.nawds_mcast_drop);
|
||||
DP_PRINT_STATS(" 3address multicast Drop Rx Packet = %d",
|
||||
peer_stats->rx.mcast_3addr_drop);
|
||||
DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
|
||||
peer_stats->rx.sgi_count[0],
|
||||
peer_stats->rx.sgi_count[1],
|
||||
@@ -7969,6 +7971,7 @@ void dp_update_pdev_stats(struct dp_pdev *tgtobj,
|
||||
tgtobj->stats.rx.non_amsdu_cnt += srcobj->rx.non_amsdu_cnt;
|
||||
tgtobj->stats.rx.amsdu_cnt += srcobj->rx.amsdu_cnt;
|
||||
tgtobj->stats.rx.nawds_mcast_drop += srcobj->rx.nawds_mcast_drop;
|
||||
tgtobj->stats.rx.mcast_3addr_drop += srcobj->rx.mcast_3addr_drop;
|
||||
tgtobj->stats.rx.to_stack.num += srcobj->rx.to_stack.num;
|
||||
tgtobj->stats.rx.to_stack.bytes += srcobj->rx.to_stack.bytes;
|
||||
|
||||
|
@@ -2939,7 +2939,7 @@ struct dp_vdev {
|
||||
#ifdef QCA_SUPPORT_WDS_EXTENDED
|
||||
bool wds_ext_enabled;
|
||||
#endif /* QCA_SUPPORT_WDS_EXTENDED */
|
||||
|
||||
bool drop_3addr_mcast;
|
||||
#ifdef WLAN_VENDOR_SPECIFIC_BAR_UPDATE
|
||||
bool skip_bar_update;
|
||||
unsigned long skip_bar_update_last_ts;
|
||||
@@ -3657,6 +3657,7 @@ struct dp_peer_per_pkt_rx_stats {
|
||||
#ifdef VDEV_PEER_PROTOCOL_COUNT
|
||||
struct protocol_trace_count protocol_trace_cnt[CDP_TRACE_MAX];
|
||||
#endif
|
||||
uint32_t mcast_3addr_drop;
|
||||
};
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user