From 895c8bcde6a79d559910b13b72c2165bf59840dd Mon Sep 17 00:00:00 2001 From: Ruben Columbus Date: Tue, 7 Jun 2022 17:11:46 -0700 Subject: [PATCH] qcacmn: add tlv format to buffer along with debug mechanism use msdu_count and index to occupy buffer headroom within mpdu. new mechanism to debug buffer while using pf tags enabled Change-Id: I1b7d8a1d7ec93f51869119294d2f0b14e3909fe9 CRs-Fixed: 3217284 --- dp/inc/cdp_txrx_cmn_struct.h | 2 - dp/wifi3.0/dp_internal.h | 10 ++ dp/wifi3.0/dp_types.h | 5 +- dp/wifi3.0/monitor/2.0/dp_mon_2.0.c | 24 +++ dp/wifi3.0/monitor/2.0/dp_mon_2.0.h | 15 ++ dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c | 209 +++++++++++++++++++------ dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.h | 30 ++++ dp/wifi3.0/monitor/dp_rx_mon.c | 30 ++++ dp/wifi3.0/monitor/dp_rx_mon.h | 3 + 9 files changed, 275 insertions(+), 53 deletions(-) diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 6182e0d25a..1df7b7a923 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -2677,9 +2677,7 @@ struct cdp_flow_stats { */ struct cdp_flow_stats { uint32_t msdu_count; -#ifdef QCA_TEST_MON_PF_TAGS_STATS uint32_t mon_msdu_count; -#endif }; #endif diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index aa29592761..83972ab6c5 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -3049,6 +3049,16 @@ void dp_rx_fst_detach(struct dp_soc *soc, struct dp_pdev *pdev); */ QDF_STATUS dp_rx_flow_send_fst_fw_setup(struct dp_soc *soc, struct dp_pdev *pdev); + +/** dp_mon_rx_update_rx_flow_tag_stats() - Update a mon flow's statistics + * @pdev: pdev handle + * @flow_id: flow index (truncated hash) in the Rx FST + * + * Return: Success when flow statistcs is updated, error on failure + */ +QDF_STATUS +dp_mon_rx_update_rx_flow_tag_stats(struct dp_pdev *pdev, uint32_t flow_id); + #else /* !((WLAN_SUPPORT_RX_FLOW_TAG) || defined(WLAN_SUPPORT_RX_FISA)) */ /** diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 24b4f608f3..0032436d7f 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -2656,9 +2656,6 @@ struct rx_protocol_tag_map { #ifdef WLAN_SUPPORT_RX_TAG_STATISTICS struct rx_protocol_tag_stats { uint32_t tag_ctr; -#ifdef QCA_TEST_MON_PF_TAGS_STATS - uint32_t mon_tag_ctr; -#endif }; #endif /* WLAN_SUPPORT_RX_TAG_STATISTICS */ @@ -2978,6 +2975,8 @@ struct dp_pdev { /* Track msdus received from expection ring separately */ struct rx_protocol_tag_stats rx_err_proto_tag_stats[RX_PROTOCOL_TAG_MAX]; + struct rx_protocol_tag_stats + mon_proto_tag_stats[RX_PROTOCOL_TAG_MAX]; #endif /* WLAN_SUPPORT_RX_TAG_STATISTICS */ #endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */ diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c index 5db456bc72..7e2ba91766 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c @@ -1548,3 +1548,27 @@ void dp_mon_cdp_ops_register_2_0(struct cdp_ops *ops) ops->mon_ops = &dp_ops_mon_2_0; } #endif + +#if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) ||\ + defined(WLAN_SUPPORT_RX_FLOW_TAG) +#if QCA_TEST_MON_PF_TAGS_STATS +/** dp_mon_rx_update_rx_protocol_tag_stats() - Update mon protocols's + * statistics + * @pdev: pdev handle + * @protocol_index: Protocol index for which the stats should be incremented + * @ring_index: REO ring number from which this tag was received. + * + * Return: void + */ +void dp_mon_rx_update_rx_protocol_tag_stats(struct dp_pdev *pdev, + uint16_t protocol_index) +{ + pdev->mon_proto_tag_stats[protocol_index].tag_ctr++; +} +#else +void dp_mon_rx_update_rx_protocol_tag_stats(struct dp_pdev *pdev, + uint16_t protocol_index) +{ +} +#endif +#endif diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.h b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.h index af5520844a..db3876da2d 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.h +++ b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.h @@ -406,4 +406,19 @@ dp_rx_mon_add_frag_to_skb(struct hal_rx_ppdu_info *ppdu_info, qdf_assert_always(0); } } + +#if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) ||\ + defined(WLAN_SUPPORT_RX_FLOW_TAG) +/** dp_mon_rx_update_rx_err_protocol_tag_stats() - Update mon protocols's + * statistics from given protocol + * type + * @pdev: pdev handle + * @protocol_index: Protocol index for which the stats should be incremented + * + * Return: void + */ +void dp_mon_rx_update_rx_protocol_tag_stats(struct dp_pdev *pdev, + uint16_t protocol_index); +#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */ + #endif /* _DP_MON_2_0_H_ */ diff --git a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c index 51bf67aaf5..a9c99a367c 100644 --- a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c @@ -38,36 +38,55 @@ #endif #define F_MASK 0xFFFF +#define TEST_MASK 0xCBF + +#if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) ||\ + defined(WLAN_SUPPORT_RX_FLOW_TAG) #ifdef QCA_TEST_MON_PF_TAGS_STATS -/** - * dp_mon_rx_pf_update_stats() - update protocol flow tags stats - * - * @pdev: pdev - * @flow_idx: Protocol index for which the stats should be incremented - * @cce_metadata: Cached CCE metadata value received from MSDU_END TLV - * - * Return: void - */ -static void -dp_rx_mon_pf_update_stats(struct dp_pdev *dp_pdev, uint32_t flow_idx, - uint16_t cce_metadata) +static +void dp_rx_mon_print_tag_buf(uint8_t *buf, uint16_t test, uint16_t room) { - dp_mon_rx_update_rx_flow_tag_stats(pdev, flow_idx); - dp_mon_rx_update_rx_err_protocol_tag_stats(pdev, cce_metadata); - dp_mon_rx_update_rx_protocol_tag_stats(pdev, cce_metada, - MAX_REO_DEST_RINGS); + if (test != TEST_MASK) + return; + print_hex_dump(KERN_ERR, "TLV BUFFER: ", DUMP_PREFIX_NONE, + 32, 2, buf, room, false); +} + +static +void dp_rx_mon_enable_pf_test(uint16_t **nbuf) +{ + uint16_t *nbuf_head = *nbuf; + + *((uint16_t *)nbuf_head) = TEST_MASK; + nbuf_head += sizeof(uint16_t); + + *nbuf = nbuf_head; } #else -static void -dp_rx_mon_pf_update_stats(struct dp_pdev *dp_pdev, uint32_t flow_idx, - uint16_t cce_metadata) +static +void dp_rx_mon_print_tag_buf(uint8_t *buf, uint16_t test, uint16_t room) { } + +static +void dp_rx_mon_enable_pf_test(uint8_t **nbuf) +{ + uint8_t *nbuf_head = *nbuf; + + nbuf_head += sizeof(uint16_t); + *nbuf = nbuf_head; +} #endif +static +void dp_rx_mon_set_zero(qdf_nbuf_t nbuf) +{ + qdf_mem_zero(qdf_nbuf_head(nbuf), DP_RX_MON_TLV_ROOM); +} + /** * dp_rx_mon_nbuf_add_rx_frag () - Add frag to SKB * @@ -116,8 +135,17 @@ dp_mon_free_parent_nbuf(struct dp_mon_pdev *mon_pdev, } void -dp_rx_mon_shift_pf_tag_in_headroom(qdf_nbuf_t nbuf, struct dp_soc *soc) +dp_rx_mon_shift_pf_tag_in_headroom(qdf_nbuf_t nbuf, struct dp_soc *soc, + struct hal_rx_ppdu_info *ppdu_info) { + uint32_t test = 0; + uint32_t room = 0; + uint16_t msdu_count = 0; + uint16_t *dp = NULL; + uint16_t *hp = NULL; + uint16_t tlv_data_len, total_tlv_len; + uint32_t bytes = 0; + if (qdf_unlikely(!soc)) { dp_mon_err("Soc[%pK] Null. Can't update pftag to nbuf headroom", soc); @@ -130,17 +158,48 @@ dp_rx_mon_shift_pf_tag_in_headroom(qdf_nbuf_t nbuf, struct dp_soc *soc) if (qdf_unlikely(!nbuf)) return; - if (qdf_unlikely(qdf_nbuf_headroom(nbuf) < - (DP_RX_MON_TOT_PF_TAG_LEN * 2))) { - dp_mon_err("Headroom[%d] < 2 *DP_RX_MON_PF_TAG_TOT_LEN[%lu]", - qdf_nbuf_headroom(nbuf), DP_RX_MON_TOT_PF_TAG_LEN); + /* Headroom must be have enough space for tlv to be added*/ + if (qdf_unlikely(qdf_nbuf_headroom(nbuf) < DP_RX_MON_TLV_ROOM)) { + dp_mon_err("Headroom[%d] < DP_RX_MON_TLV_ROOM[%d]", + qdf_nbuf_headroom(nbuf), DP_RX_MON_TLV_ROOM); return; } - qdf_nbuf_push_head(nbuf, DP_RX_MON_TOT_PF_TAG_LEN); - qdf_mem_copy(qdf_nbuf_data(nbuf), qdf_nbuf_head(nbuf), - DP_RX_MON_TOT_PF_TAG_LEN); - qdf_nbuf_pull_head(nbuf, DP_RX_MON_TOT_PF_TAG_LEN); + hp = (uint16_t *)qdf_nbuf_head(nbuf); + test = *hp & F_MASK; + hp += sizeof(uint16_t); + msdu_count = *hp; + + if (qdf_unlikely(!msdu_count)) + return; + + dp_mon_debug("msdu_count: %d", msdu_count); + + room = DP_RX_MON_PF_TAG_LEN_PER_FRAG * msdu_count; + tlv_data_len = DP_RX_MON_TLV_MSDU_CNT + (room); + total_tlv_len = DP_RX_MON_TLV_HDR_LEN + tlv_data_len; + + //1. store space for MARKER + dp = (uint16_t *)qdf_nbuf_push_head(nbuf, sizeof(uint16_t)); + if (qdf_likely(dp)) { + *(uint16_t *)dp = DP_RX_MON_TLV_HDR_MARKER; + bytes += sizeof(uint16_t); + } + + //2. store space for total size + dp = (uint16_t *)qdf_nbuf_push_head(nbuf, sizeof(uint16_t)); + if (qdf_likely(dp)) { + *(uint16_t *)dp = total_tlv_len; + bytes += sizeof(uint16_t); + } + + //create TLV + bytes += dp_mon_rx_add_tlv(DP_RX_MON_TLV_PF_ID, tlv_data_len, hp, nbuf); + + dp_rx_mon_print_tag_buf(qdf_nbuf_data(nbuf), test, total_tlv_len); + + qdf_nbuf_pull_head(nbuf, bytes); + } void @@ -153,8 +212,9 @@ dp_rx_mon_pf_tag_to_buf_headroom_2_0(void *nbuf, struct hal_rx_mon_msdu_info *msdu_info; uint16_t flow_id; uint16_t cce_metadata; - uint16_t protocol_tag; + uint16_t protocol_tag = 0; uint32_t flow_tag; + uint8_t invalid_cce = 0, invalid_fse = 0; if (qdf_unlikely(!soc)) { dp_mon_err("Soc[%pK] Null. Can't update pftag to nbuf headroom", @@ -168,11 +228,10 @@ dp_rx_mon_pf_tag_to_buf_headroom_2_0(void *nbuf, if (qdf_unlikely(!nbuf)) return; - /* Headroom must be double of PF_TAG_SIZE as we copy it 1stly to head */ - if (qdf_unlikely(qdf_nbuf_headroom(nbuf) < - (DP_RX_MON_TOT_PF_TAG_LEN * 2))) { - dp_mon_err("Headroom[%d] < 2 * DP_RX_MON_PF_TAG_TOT_LEN[%lu]", - qdf_nbuf_headroom(nbuf), DP_RX_MON_TOT_PF_TAG_LEN); + /* Headroom must be have enough space for tlv to be added*/ + if (qdf_unlikely(qdf_nbuf_headroom(nbuf) < DP_RX_MON_TLV_ROOM)) { + dp_mon_err("Headroom[%d] < DP_RX_MON_TLV_ROOM[%d]", + qdf_nbuf_headroom(nbuf), DP_RX_MON_TLV_ROOM); return; } @@ -187,28 +246,76 @@ dp_rx_mon_pf_tag_to_buf_headroom_2_0(void *nbuf, cce_metadata = ppdu_info->rx_msdu_info[user_id].cce_metadata - RX_PROTOCOL_TAG_START_OFFSET; - if (qdf_unlikely(cce_metadata > RX_PROTOCOL_TAG_MAX - 1)) { - dp_mon_debug("Invalid user_id cce_metadata: %d pdev: %pK", cce_metadata, pdev); - return; - } - - protocol_tag = pdev->rx_proto_tag_map[cce_metadata].tag; flow_tag = ppdu_info->rx_msdu_info[user_id].fse_metadata & F_MASK; - if (msdu_info->msdu_index >= QDF_NBUF_MAX_FRAGS) { + if (qdf_unlikely((cce_metadata > RX_PROTOCOL_TAG_MAX - 1) || + (cce_metadata > 0 && cce_metadata < 4))) { + dp_mon_debug("Invalid user_id cce_metadata: %d pdev: %pK", cce_metadata, pdev); + invalid_cce = 1; + protocol_tag = cce_metadata; + } else { + protocol_tag = pdev->rx_proto_tag_map[cce_metadata].tag; + dp_mon_rx_update_rx_protocol_tag_stats(pdev, cce_metadata); + } + + if (flow_tag > 0) { + dp_mon_rx_update_rx_flow_tag_stats(pdev, flow_id); + } else { + dp_mon_debug("Invalid flow_tag: %d pdev: %pK ", flow_tag, pdev); + invalid_fse = 1; + } + + if (invalid_cce && invalid_fse) + return; + + if (msdu_info->msdu_index >= DP_RX_MON_MAX_MSDU) { dp_mon_err("msdu_index causes overflow in headroom"); return; } - dp_rx_mon_pf_update_stats(pdev, flow_id, cce_metadata); + dp_mon_debug("protocol_tag: %d, cce_metadata: %d, flow_tag: %d", + protocol_tag, cce_metadata, flow_tag); + + dp_mon_debug("msdu_index: %d", msdu_info->msdu_index); + nbuf_head = qdf_nbuf_head(nbuf); - nbuf_head += (msdu_info->msdu_index * DP_RX_MON_PF_TAG_SIZE); - *((uint16_t *)nbuf_head) = protocol_tag; + dp_rx_mon_enable_pf_test(&nbuf_head); + + *((uint16_t *)nbuf_head) = msdu_info->msdu_index + 1; + nbuf_head += DP_RX_MON_TLV_MSDU_CNT; + + nbuf_head += ((msdu_info->msdu_index) * DP_RX_MON_PF_TAG_SIZE); + if (!invalid_cce) + *((uint16_t *)nbuf_head) = protocol_tag; nbuf_head += sizeof(uint16_t); - *((uint16_t *)nbuf_head) = flow_tag; + if (!invalid_fse) + *((uint16_t *)nbuf_head) = flow_tag; } +#else + +static +void dp_rx_mon_set_zero(qdf_nbuf_t nbuf) +{ +} + +static +void dp_rx_mon_shift_pf_tag_in_headroom(qdf_nbuf_t nbuf, struct dp_soc *soc, + struct hal_rx_ppdu_info *ppdu_info) +{ +} + +static +void dp_rx_mon_pf_tag_to_buf_headroom_2_0(void *nbuf, + struct hal_rx_ppdu_info *ppdu_info, + struct dp_pdev *pdev, + struct dp_soc *soc) +{ +} + +#endif + /** * dp_rx_mon_free_ppdu_info () - Free PPDU info * @pdev: DP pdev @@ -374,7 +481,8 @@ dp_rx_mon_process_ppdu_info(struct dp_pdev *pdev, } dp_rx_mon_shift_pf_tag_in_headroom(mpdu, - pdev->soc); + pdev->soc, + ppdu_info); /* Deliver MPDU to osif layer */ status = dp_rx_mon_deliver_mpdu(mon_pdev, @@ -913,8 +1021,10 @@ uint8_t dp_rx_mon_process_tlv_status(struct dp_pdev *pdev, if (!ppdu_info->mpdu_info[user_id].mpdu_start_received) { nbuf = qdf_nbuf_alloc(pdev->soc->osdev, - DP_RX_MON_MAX_MONITOR_HEADER, - DP_RX_MON_MAX_MONITOR_HEADER, + DP_RX_MON_TLV_ROOM + + DP_RX_MON_MAX_RADIO_TAP_HDR, + DP_RX_MON_TLV_ROOM + + DP_RX_MON_MAX_RADIO_TAP_HDR, 4, FALSE); /* Set *head_msdu->next as NULL as all msdus are @@ -926,6 +1036,9 @@ uint8_t dp_rx_mon_process_tlv_status(struct dp_pdev *pdev, } mon_pdev->rx_mon_stats.parent_buf_alloc++; + + dp_rx_mon_set_zero(nbuf); + qdf_nbuf_set_next(nbuf, NULL); ppdu_info->mpdu_q[user_id][mpdu_idx] = nbuf; diff --git a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.h b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.h index 9da67c4e30..fd8f713b36 100644 --- a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.h +++ b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.h @@ -24,6 +24,23 @@ #define DP_RX_MON_PACKET_OFFSET 8 #define DP_RX_MON_RX_HDR_OFFSET 8 #define DP_GET_NUM_QWORDS(num) ((num) >> 3) +#define DP_RX_MON_TLV_HDR_MARKER 0xFEED +#define DP_RX_MON_TLV_HDR_MARKER_LEN 2 +#define DP_RX_MON_TLV_HDR_LEN 3 +#define DP_RX_MON_TLV_TOTAL_LEN 2 +#define DP_RX_MON_TLV_PF_ID 1 +#define DP_RX_MON_TLV_MSDU_CNT 2 +#define DP_RX_MON_MAX_MSDU 16 +#define DP_RX_MON_MAX_TLVS 1 +#define DP_RX_MON_PF_TLV_LEN (((DP_RX_MON_PF_TAG_LEN_PER_FRAG)\ + * (DP_RX_MON_MAX_MSDU) * 2)\ + + (DP_RX_MON_TLV_MSDU_CNT)) +#define DP_RX_MON_INDIV_TLV_LEN (DP_RX_MON_PF_TLV_LEN) +#define DP_RX_MON_TLV_ROOM ((DP_RX_MON_INDIV_TLV_LEN)\ + + ((DP_RX_MON_TLV_HDR_LEN) * (DP_RX_MON_MAX_TLVS))\ + + (DP_RX_MON_TLV_HDR_MARKER_LEN)\ + + (DP_RX_MON_TLV_TOTAL_LEN)) + /* * dp_rx_mon_buffers_alloc() - allocate rx monitor buffers * @soc: DP soc handle @@ -194,4 +211,17 @@ void dp_rx_mon_drain_wq(struct dp_pdev *pdev); void dp_mon_free_parent_nbuf(struct dp_mon_pdev *mon_pdev, qdf_nbuf_t nbuf); +#if !defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) &&\ + !defined(WLAN_SUPPORT_RX_FLOW_TAG) +void +dp_rx_mon_pf_tag_to_buf_headroom_2_0(void *nbuf, + struct hal_rx_ppdu_info *ppdu_info, + struct dp_pdev *pdev, struct dp_soc *soc) +{ +} + +void dp_rx_mon_shift_pf_tag_in_headroom(qdf_nbuf_t nbuf, struct dp_soc *soc) +{ +} +#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */ #endif /* _DP_RX_MON_2_0_H_ */ diff --git a/dp/wifi3.0/monitor/dp_rx_mon.c b/dp/wifi3.0/monitor/dp_rx_mon.c index 08e140cc76..8f04be59c2 100644 --- a/dp/wifi3.0/monitor/dp_rx_mon.c +++ b/dp/wifi3.0/monitor/dp_rx_mon.c @@ -1992,3 +1992,33 @@ dp_rx_process_peer_based_pktlog(struct dp_soc *soc, dp_peer_unref_delete(peer, DP_MOD_ID_RX_PPDU_STATS); } + +uint32_t +dp_mon_rx_add_tlv(uint8_t id, uint16_t len, void *value, qdf_nbuf_t mpdu_nbuf) +{ + uint8_t *dest = NULL; + uint32_t num_bytes_pushed = 0; + + /* Add tlv id field */ + dest = qdf_nbuf_push_head(mpdu_nbuf, sizeof(uint8_t)); + if (qdf_likely(dest)) { + *((uint8_t *)dest) = id; + num_bytes_pushed += sizeof(uint8_t); + } + + /* Add tlv len field */ + dest = qdf_nbuf_push_head(mpdu_nbuf, sizeof(uint16_t)); + if (qdf_likely(dest)) { + *((uint16_t *)dest) = len; + num_bytes_pushed += sizeof(uint16_t); + } + + /* Add tlv value field */ + dest = qdf_nbuf_push_head(mpdu_nbuf, len); + if (qdf_likely(dest)) { + qdf_mem_copy(dest, value, len); + num_bytes_pushed += len; + } + + return num_bytes_pushed; +} diff --git a/dp/wifi3.0/monitor/dp_rx_mon.h b/dp/wifi3.0/monitor/dp_rx_mon.h index 311f1be3dc..24d283752f 100644 --- a/dp/wifi3.0/monitor/dp_rx_mon.h +++ b/dp/wifi3.0/monitor/dp_rx_mon.h @@ -769,4 +769,7 @@ void dp_rx_process_peer_based_pktlog(struct dp_soc *soc, struct hal_rx_ppdu_info *ppdu_info, qdf_nbuf_t status_nbuf, uint32_t pdev_id); + +uint32_t dp_mon_rx_add_tlv(uint8_t id, uint16_t len, void *value, + qdf_nbuf_t mpdu_nbuf); #endif /* _DP_RX_MON_H_ */