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
This commit is contained in:
Ruben Columbus
2022-06-07 17:11:46 -07:00
committed by Madan Koyyalamudi
parent 8641a158f3
commit 895c8bcde6
9 changed files with 275 additions and 53 deletions

View File

@@ -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

View File

@@ -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)) */
/**

View File

@@ -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 */

View File

@@ -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

View File

@@ -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_ */

View File

@@ -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);
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);
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;

View File

@@ -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_ */

View File

@@ -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;
}

View File

@@ -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_ */