Преглед на файлове

qcacmn: Add support to log ICMP packet seq no and ID

Add support to log ICMP seq no and ID in DPTRACE.
Other protcols can use this private proto data to record
there private data accordingly. Currently it is set to 0.
Increase the record entry from 40 bytes to 50 bytes.

Change-Id: Ief5fb26a97408a364af486f3eaec2e108de71d52
CRs-Fixed: 2951916
sandhu преди 4 години
родител
ревизия
81272da21e
променени са 3 файла, в които са добавени 35 реда и са изтрити 13 реда
  1. 1 0
      qdf/inc/qdf_nbuf.h
  2. 11 3
      qdf/inc/qdf_trace.h
  3. 23 10
      qdf/linux/src/qdf_trace.c

+ 1 - 0
qdf/inc/qdf_nbuf.h

@@ -509,6 +509,7 @@ struct qdf_radiotap_vendor_ns_ath {
 #define IPV4_DST_PORT_OFFSET          36
 
 /* IPV4 ICMP Related Mask */
+#define ICMP_ID_OFFSET                38
 #define ICMP_SEQ_NUM_OFFSET           40
 #define ICMP_SUBTYPE_OFFSET           34
 #define ICMP_REQUEST                  0x08

+ 11 - 3
qdf/inc/qdf_trace.h

@@ -186,7 +186,7 @@ typedef struct s_qdf_trace_data {
 #define MAX_QDF_DP_TRACE_RECORDS       2000
 #endif
 
-#define QDF_DP_TRACE_RECORD_SIZE       40
+#define QDF_DP_TRACE_RECORD_SIZE       50 /* bytes */
 #define INVALID_QDF_DP_TRACE_ADDR      0xffffffff
 #define QDF_DP_TRACE_VERBOSITY_HIGH		4
 #define QDF_DP_TRACE_VERBOSITY_MEDIUM		3
@@ -350,6 +350,8 @@ struct qdf_dp_trace_ptr_buf {
  * @type: packet type
  * @subtype: packet subtype
  * @dir: direction
+ * @proto_priv_data: protocol private data
+ * can be stored in this.
  */
 struct qdf_dp_trace_proto_buf {
 	struct qdf_mac_addr sa;
@@ -358,6 +360,11 @@ struct qdf_dp_trace_proto_buf {
 	uint8_t type;
 	uint8_t subtype;
 	uint8_t dir;
+	/* for ICMP priv data is bit offset 38 to 42
+	 * 38-40 ICMP_ICMP_ID and
+	 * 40-42 ICMP_SEQ_NUM_OFFSET
+	 */
+	uint32_t proto_priv_data;
 };
 
 /**
@@ -901,14 +908,15 @@ uint8_t qdf_dp_get_no_of_record(void);
  * @dir: direction
  * @pdev_id: pdev id
  * @print: to print this proto pkt or not
- *
+ * @proto_priv_data: protocol specific private
+ * data.
  * Return: none
  */
 void
 qdf_dp_trace_proto_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
 	uint8_t *sa, uint8_t *da, enum qdf_proto_type type,
 	enum qdf_proto_subtype subtype, enum qdf_proto_dir dir,
-	uint8_t pdev_id, bool print);
+	uint8_t pdev_id, bool print, uint32_t proto_priv_data);
 
 void qdf_dp_trace_disable_live_mode(void);
 void qdf_dp_trace_enable_live_mode(void);

+ 23 - 10
qdf/linux/src/qdf_trace.c

@@ -1631,7 +1631,7 @@ static bool qdf_log_icmpv6_pkt(uint8_t vdev_id, struct sk_buff *skb,
 			QDF_DP_TRACE_ICMPv6_PACKET_RECORD,
 			vdev_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET),
 			(skb->data + QDF_NBUF_DEST_MAC_OFFSET),
-			QDF_PROTO_TYPE_ICMPv6, subtype, dir, pdev_id, false));
+			QDF_PROTO_TYPE_ICMPv6, subtype, dir, pdev_id, false, 0));
 
 		switch (subtype) {
 		case QDF_PROTO_ICMPV6_REQ:
@@ -1674,6 +1674,10 @@ static bool qdf_log_icmp_pkt(uint8_t vdev_id, struct sk_buff *skb,
 			     enum qdf_proto_dir dir, uint8_t pdev_id)
 {
 	enum qdf_proto_subtype proto_subtype;
+	uint8_t *data = NULL;
+	uint16_t seq_num = 0;
+	uint16_t icmp_id = 0;
+	uint32_t proto_priv_data = 0;
 
 	if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_ICMP) &&
 	    (qdf_nbuf_is_icmp_pkt(skb) == true)) {
@@ -1681,6 +1685,13 @@ static bool qdf_log_icmp_pkt(uint8_t vdev_id, struct sk_buff *skb,
 		QDF_NBUF_CB_DP_TRACE_PRINT(skb) = false;
 		proto_subtype = qdf_nbuf_get_icmp_subtype(skb);
 
+		data = qdf_nbuf_data(skb);
+		icmp_id = qdf_cpu_to_be16(*(uint16_t *)(data + ICMP_ID_OFFSET));
+		seq_num = qdf_cpu_to_be16(*(uint16_t *)(data + ICMP_SEQ_NUM_OFFSET));
+
+		proto_priv_data |= ((proto_priv_data | ((uint32_t)icmp_id)) << 16);
+		proto_priv_data |= (uint32_t)seq_num;
+
 		if (QDF_TX == dir)
 			QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
 		else if (QDF_RX == dir)
@@ -1694,7 +1705,7 @@ static bool qdf_log_icmp_pkt(uint8_t vdev_id, struct sk_buff *skb,
 					       QDF_NBUF_DEST_MAC_OFFSET,
 					       QDF_PROTO_TYPE_ICMP,
 					       proto_subtype, dir, pdev_id,
-					       false));
+					       false, proto_priv_data));
 
 		if (proto_subtype == QDF_PROTO_ICMP_REQ)
 			g_qdf_dp_trace_data.icmp_req++;
@@ -1757,7 +1768,7 @@ static bool qdf_log_eapol_pkt(uint8_t vdev_id, struct sk_buff *skb,
 					       skb->data +
 					       QDF_NBUF_DEST_MAC_OFFSET,
 					       QDF_PROTO_TYPE_EAPOL, subtype,
-					       dir, pdev_id, true));
+					       dir, pdev_id, true, 0));
 
 		switch (subtype) {
 		case QDF_PROTO_EAPOL_M1:
@@ -1832,7 +1843,7 @@ static bool qdf_log_dhcp_pkt(uint8_t vdev_id, struct sk_buff *skb,
 					       skb->data +
 					       QDF_NBUF_DEST_MAC_OFFSET,
 					       QDF_PROTO_TYPE_DHCP, subtype,
-					       dir, pdev_id, true));
+					       dir, pdev_id, true, 0));
 
 		switch (subtype) {
 		case QDF_PROTO_DHCP_DISCOVER:
@@ -1893,7 +1904,7 @@ static bool qdf_log_arp_pkt(uint8_t vdev_id, struct sk_buff *skb,
 					       QDF_NBUF_DEST_MAC_OFFSET,
 					       QDF_PROTO_TYPE_ARP,
 					       proto_subtype, dir, pdev_id,
-					       true));
+					       true, 0));
 
 		if (QDF_PROTO_ARP_REQ == proto_subtype)
 			g_qdf_dp_trace_data.arp_req++;
@@ -2115,24 +2126,25 @@ void qdf_dp_display_proto_pkt(struct qdf_dp_trace_record_s *record,
 	loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
 					 index, info, record);
 	DPTRACE_PRINT("%s [%d] [%s] SA: "
-		      QDF_MAC_ADDR_FMT " %s DA: "
-		      QDF_MAC_ADDR_FMT,
+		      QDF_MAC_ADDR_FMT " %s DA:"
+		      QDF_MAC_ADDR_FMT " proto priv data = %08x",
 		      prepend_str,
 		      buf->vdev_id,
 		      qdf_dp_subtype_to_str(buf->subtype),
 		      QDF_MAC_ADDR_REF(buf->sa.bytes),
 		      qdf_dp_dir_to_str(buf->dir),
-		      QDF_MAC_ADDR_REF(buf->da.bytes));
+		      QDF_MAC_ADDR_REF(buf->da.bytes),
+		      buf->proto_priv_data);
 }
 qdf_export_symbol(qdf_dp_display_proto_pkt);
 
 void qdf_dp_trace_proto_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
 		uint8_t *sa, uint8_t *da, enum qdf_proto_type type,
 		enum qdf_proto_subtype subtype, enum qdf_proto_dir dir,
-		uint8_t pdev_id, bool print)
+		uint8_t pdev_id, bool print, uint32_t proto_priv_data)
 {
 	struct qdf_dp_trace_proto_buf buf;
-	int buf_size = sizeof(struct qdf_dp_trace_ptr_buf);
+	int buf_size = sizeof(struct qdf_dp_trace_proto_buf);
 
 	if (qdf_dp_enable_check(NULL, code, dir) == false)
 		return;
@@ -2146,6 +2158,7 @@ void qdf_dp_trace_proto_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
 	buf.type = type;
 	buf.subtype = subtype;
 	buf.vdev_id = vdev_id;
+	buf.proto_priv_data = proto_priv_data;
 	qdf_dp_add_record(code, pdev_id,
 			  (uint8_t *)&buf, buf_size, NULL, 0, print);
 }