qcacmn: per-peer protocol count tracking

Maintain packet counters for each peer based on protocol. Following 3
protocols are supported
* ICMP (IPv4)
* ARP (IPv4)
* EAP

Change-Id: I56dd9bbedd7b6698b7d155a524b242e8cabd76c3
CRs-Fixed: 2604877
This commit is contained in:
Adil Saeed Musthafa
2019-12-12 14:34:44 -08:00
کامیت شده توسط nshrivas
والد ab1127c636
کامیت bbc4de06d7
10فایلهای تغییر یافته به همراه538 افزوده شده و 1 حذف شده

مشاهده پرونده

@@ -4041,6 +4041,118 @@ void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag
qdf_mem_copy(dest_ptr, tag_buf, size);
}
#ifdef VDEV_PEER_PROTOCOL_COUNT
#ifdef VDEV_PEER_PROTOCOL_COUNT_TESTING
static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev,
bool is_egress,
bool is_rx)
{
int mask;
if (is_egress)
if (is_rx)
mask = VDEV_PEER_PROTOCOL_RX_EGRESS_MASK;
else
mask = VDEV_PEER_PROTOCOL_TX_EGRESS_MASK;
else
if (is_rx)
mask = VDEV_PEER_PROTOCOL_RX_INGRESS_MASK;
else
mask = VDEV_PEER_PROTOCOL_TX_INGRESS_MASK;
if (qdf_unlikely(vdev->peer_protocol_count_dropmask & mask)) {
dp_info("drop mask set %x", vdev->peer_protocol_count_dropmask);
return QDF_STATUS_SUCCESS;
}
return QDF_STATUS_E_FAILURE;
}
#else
static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev,
bool is_egress,
bool is_rx)
{
return QDF_STATUS_E_FAILURE;
}
#endif
void dp_vdev_peer_stats_update_protocol_cnt(struct dp_vdev *vdev,
qdf_nbuf_t nbuf,
struct dp_peer *peer,
bool is_egress,
bool is_rx)
{
struct cdp_peer_stats *peer_stats;
struct protocol_trace_count *protocol_trace_cnt;
enum cdp_protocol_trace prot;
struct dp_soc *soc;
struct ether_header *eh;
char *mac;
bool new_peer_ref = false;
if (qdf_likely(!vdev->peer_protocol_count_track))
return;
if (qdf_unlikely(dp_peer_stats_update_protocol_test_cnt(vdev,
is_egress,
is_rx) ==
QDF_STATUS_SUCCESS))
return;
soc = vdev->pdev->soc;
eh = (struct ether_header *)qdf_nbuf_data(nbuf);
if (is_rx)
mac = eh->ether_shost;
else
mac = eh->ether_dhost;
if (!peer) {
peer = dp_peer_find_hash_find(soc, mac, 0, vdev->vdev_id);
new_peer_ref = true;
if (!peer)
return;
}
peer_stats = &peer->stats;
if (qdf_nbuf_is_icmp_pkt(nbuf) == true)
prot = CDP_TRACE_ICMP;
else if (qdf_nbuf_is_ipv4_arp_pkt(nbuf) == true)
prot = CDP_TRACE_ARP;
else if (qdf_nbuf_is_ipv4_eapol_pkt(nbuf) == true)
prot = CDP_TRACE_EAP;
else
goto dp_vdev_peer_stats_update_protocol_cnt_free_peer;
if (is_rx)
protocol_trace_cnt = peer_stats->rx.protocol_trace_cnt;
else
protocol_trace_cnt = peer_stats->tx.protocol_trace_cnt;
if (is_egress)
protocol_trace_cnt[prot].egress_cnt++;
else
protocol_trace_cnt[prot].ingress_cnt++;
dp_vdev_peer_stats_update_protocol_cnt_free_peer:
if (new_peer_ref)
dp_peer_unref_delete(peer);
}
void dp_peer_stats_update_protocol_cnt(struct cdp_soc_t *soc,
int8_t vdev_id,
qdf_nbuf_t nbuf,
bool is_egress,
bool is_rx)
{
struct dp_vdev *vdev;
vdev = dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc,
vdev_id);
if (qdf_likely(!vdev->peer_protocol_count_track))
return;
dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL, is_egress,
is_rx);
}
#endif
QDF_STATUS dp_peer_stats_notify(struct dp_pdev *dp_pdev, struct dp_peer *peer)
{
struct cdp_interface_peer_stats peer_stats_intf;