瀏覽代碼

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
Ruben Columbus 3 年之前
父節點
當前提交
895c8bcde6

+ 0 - 2
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
 

+ 10 - 0
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)) */
 
 /**

+ 2 - 3
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 */
 

+ 24 - 0
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

+ 15 - 0
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_ */

+ 159 - 46
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)
+{
+	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)
 {
-	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);
+	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;
+	}
+
+	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);
 	}
 
-	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);
+	//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)) {
+	flow_tag = ppdu_info->rx_msdu_info[user_id].fse_metadata & F_MASK;
+
+	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);
-		return;
+		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);
 	}
 
-	protocol_tag = pdev->rx_proto_tag_map[cce_metadata].tag;
-	flow_tag = ppdu_info->rx_msdu_info[user_id].fse_metadata & F_MASK;
+	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 >= QDF_NBUF_MAX_FRAGS) {
+	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;

+ 30 - 0
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_ */

+ 30 - 0
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;
+}

+ 3 - 0
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_ */