Переглянути джерело

qcacmn: Add qdf utility functions for ARP debug stats

Implement QDF utility functions to operate on ARP data packet to
support ARP debug stats feature.

Change-Id: Idce70799bd3698dc8a8ecd8cfc8ef7d9bf1f5764
CRs-Fixed: 2019789
Sravan Kumar Kairam 8 роки тому
батько
коміт
68a824774c
3 змінених файлів з 141 додано та 0 видалено
  1. 59 0
      qdf/inc/qdf_nbuf.h
  2. 4 0
      qdf/linux/src/i_qdf_nbuf.h
  3. 78 0
      qdf/linux/src/qdf_nbuf.c

+ 59 - 0
qdf/inc/qdf_nbuf.h

@@ -92,6 +92,13 @@
 #define EAPOL_M3_BIT_MASK			0x8013
 #define EAPOL_M4_BIT_MASK			0x0003
 
+/* ARP Related MASK */
+#define QDF_NBUF_PKT_ARP_OPCODE_OFFSET	20
+#define QDF_NBUF_PKT_ARPOP_REQ		1
+#define QDF_NBUF_PKT_ARPOP_REPLY	2
+#define QDF_NBUF_PKT_ARP_SRC_IP_OFFSET	28
+#define QDF_NBUF_PKT_ARP_TGT_IP_OFFSET	38
+
 /* Tracked Packet types */
 #define QDF_NBUF_TX_PKT_INVALID              0
 #define QDF_NBUF_TX_PKT_DATA_TRACK           1
@@ -2068,6 +2075,58 @@ bool qdf_nbuf_data_is_ipv4_arp_pkt(uint8_t *data)
 	return __qdf_nbuf_data_is_ipv4_arp_pkt(data);
 }
 
+/**
+ * qdf_nbuf_data_is_arp_req() - check if ARP packet is request.
+ * @buf:  buffer
+ *
+ * This func. checks whether it is a ARP request or not.
+ *
+ * Return: true if it is a ARP request or FALSE if not
+ */
+static inline
+bool qdf_nbuf_data_is_arp_req(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_data_is_arp_req(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_is_arp_rsp() - check if ARP packet is response.
+ * @buf:  buffer
+ *
+ * This func. checks whether it is a ARP response or not.
+ *
+ * Return: true if it is a ARP response or FALSE if not
+ */
+static inline
+bool qdf_nbuf_data_is_arp_rsp(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_data_is_arp_rsp(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_get_arp_src_ip() - get ARP packet source IP gateway.
+ * @buf:  buffer
+ *
+ * Return: ARP packet source IP value.
+ */
+static inline
+uint32_t qdf_nbuf_get_arp_src_ip(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_get_arp_src_ip(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_get_arp_tgt_ip() - get ARP packet target IP gateway.
+ * @buf:  buffer
+ *
+ * Return: ARP packet target IP value.
+ */
+static inline
+uint32_t qdf_nbuf_get_arp_tgt_ip(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_get_arp_tgt_ip(qdf_nbuf_data(buf));
+}
+
 /**
  * qdf_nbuf_is_ipv6_pkt() - check if it is IPV6 packet.
  * @buf: Pointer to IPV6 packet buffer

+ 4 - 0
qdf/linux/src/i_qdf_nbuf.h

@@ -645,6 +645,10 @@ bool __qdf_nbuf_data_is_ipv6_dhcp_pkt(uint8_t *data);
 bool __qdf_nbuf_data_is_ipv4_eapol_pkt(uint8_t *data);
 bool __qdf_nbuf_data_is_ipv4_arp_pkt(uint8_t *data);
 bool __qdf_nbuf_is_bcast_pkt(__qdf_nbuf_t nbuf);
+bool __qdf_nbuf_data_is_arp_req(uint8_t *data);
+bool __qdf_nbuf_data_is_arp_rsp(uint8_t *data);
+uint32_t __qdf_nbuf_get_arp_src_ip(uint8_t *data);
+uint32_t __qdf_nbuf_get_arp_tgt_ip(uint8_t *data);
 enum qdf_proto_subtype  __qdf_nbuf_data_get_dhcp_subtype(uint8_t *data);
 enum qdf_proto_subtype  __qdf_nbuf_data_get_eapol_subtype(uint8_t *data);
 enum qdf_proto_subtype  __qdf_nbuf_data_get_arp_subtype(uint8_t *data);

+ 78 - 0
qdf/linux/src/qdf_nbuf.c

@@ -1430,6 +1430,84 @@ bool __qdf_nbuf_data_is_ipv4_arp_pkt(uint8_t *data)
 }
 EXPORT_SYMBOL(__qdf_nbuf_data_is_ipv4_arp_pkt);
 
+/**
+ * __qdf_nbuf_data_is_arp_req() - check if skb data is a arp request
+ * @data: Pointer to network data buffer
+ *
+ * This api is for ipv4 packet.
+ *
+ * Return: true if packet is ARP request
+ *	   false otherwise.
+ */
+bool __qdf_nbuf_data_is_arp_req(uint8_t *data)
+{
+	uint16_t op_code;
+
+	op_code = (uint16_t)(*(uint16_t *)(data +
+				QDF_NBUF_PKT_ARP_OPCODE_OFFSET));
+
+	if (op_code == QDF_SWAP_U16(QDF_NBUF_PKT_ARPOP_REQ))
+		return true;
+	return false;
+}
+
+/**
+ * __qdf_nbuf_data_is_arp_rsp() - check if skb data is a arp response
+ * @data: Pointer to network data buffer
+ *
+ * This api is for ipv4 packet.
+ *
+ * Return: true if packet is ARP response
+ *	   false otherwise.
+ */
+bool __qdf_nbuf_data_is_arp_rsp(uint8_t *data)
+{
+	uint16_t op_code;
+
+	op_code = (uint16_t)(*(uint16_t *)(data +
+				QDF_NBUF_PKT_ARP_OPCODE_OFFSET));
+
+	if (op_code == QDF_SWAP_U16(QDF_NBUF_PKT_ARPOP_REPLY))
+		return true;
+	return false;
+}
+
+/**
+ * __qdf_nbuf_data_get_arp_src_ip() - get arp src IP
+ * @data: Pointer to network data buffer
+ *
+ * This api is for ipv4 packet.
+ *
+ * Return: ARP packet source IP value.
+ */
+uint32_t  __qdf_nbuf_get_arp_src_ip(uint8_t *data)
+{
+	uint32_t src_ip;
+
+	src_ip = (uint32_t)(*(uint32_t *)(data +
+				QDF_NBUF_PKT_ARP_SRC_IP_OFFSET));
+
+	return src_ip;
+}
+
+/**
+ * __qdf_nbuf_data_get_arp_tgt_ip() - get arp target IP
+ * @data: Pointer to network data buffer
+ *
+ * This api is for ipv4 packet.
+ *
+ * Return: ARP packet target IP value.
+ */
+uint32_t  __qdf_nbuf_get_arp_tgt_ip(uint8_t *data)
+{
+	uint32_t tgt_ip;
+
+	tgt_ip = (uint32_t)(*(uint32_t *)(data +
+				QDF_NBUF_PKT_ARP_TGT_IP_OFFSET));
+
+	return tgt_ip;
+}
+
 /**
  * __qdf_nbuf_data_is_ipv6_pkt() - check if it is IPV6 packet.
  * @data: Pointer to IPV6 packet data buffer