Эх сурвалжийг харах

qcacmn: Add APIs to get data packets info

Add APIs to get TCP fin/fin-ack/rst packets information.

Change-Id: Ia1150c81076fa47ae7f34d14bc73efc82003258a
CRs-Fixed: 3046235
Vulupala Shashank Reddy 3 жил өмнө
parent
commit
2da40899eb

+ 39 - 0
qdf/inc/qdf_nbuf.h

@@ -3011,6 +3011,32 @@ bool qdf_nbuf_data_is_dns_response(qdf_nbuf_t buf)
 	return __qdf_nbuf_data_is_dns_response(qdf_nbuf_data(buf));
 }
 
+/**
+ * qdf_nbuf_data_is_tcp_fin() - check if skb data is a tcp fin
+ * @buf:  buffer
+ *
+ * Return: true if packet is tcp fin packet.
+ *	   false otherwise.
+ */
+static inline
+bool qdf_nbuf_data_is_tcp_fin(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_data_is_tcp_fin(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_is_tcp_fin_ack() - check if skb data is a tcp fin ack
+ * @buf:  buffer
+ *
+ * Return: true if packet is tcp fin ack packet.
+ *	   false otherwise.
+ */
+static inline
+bool qdf_nbuf_data_is_tcp_fin_ack(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_data_is_tcp_fin_ack(qdf_nbuf_data(buf));
+}
+
 /**
  * qdf_nbuf_data_is_tcp_syn() - check if skb data is a tcp syn
  * @buf:  buffer
@@ -3037,6 +3063,19 @@ bool qdf_nbuf_data_is_tcp_syn_ack(qdf_nbuf_t buf)
 	return __qdf_nbuf_data_is_tcp_syn_ack(qdf_nbuf_data(buf));
 }
 
+/**
+ * qdf_nbuf_data_is_tcp_rst() - check if skb data is a tcp rst
+ * @buf:  buffer
+ *
+ * Return: true if packet is tcp rst packet.
+ *	   false otherwise.
+ */
+static inline
+bool qdf_nbuf_data_is_tcp_rst(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_data_is_tcp_rst(qdf_nbuf_data(buf));
+}
+
 /**
  * qdf_nbuf_data_is_tcp_ack() - check if skb data is a tcp ack
  * @buf:  buffer

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

@@ -82,6 +82,11 @@ typedef struct sk_buff_head __qdf_nbuf_queue_head_t;
 /* mark the first packet after wow wakeup */
 #define QDF_MARK_FIRST_WAKEUP_PACKET   0x80000000
 
+/* TCP Related MASK */
+#define QDF_NBUF_PKT_TCPOP_FIN			0x01
+#define QDF_NBUF_PKT_TCPOP_FIN_ACK		0x11
+#define QDF_NBUF_PKT_TCPOP_RST			0x04
+
 /*
  * Make sure that qdf_dma_addr_t in the cb block is always 64 bit aligned
  */
@@ -862,8 +867,11 @@ uint32_t __qdf_nbuf_get_arp_tgt_ip(uint8_t *data);
 uint8_t *__qdf_nbuf_get_dns_domain_name(uint8_t *data, uint32_t len);
 bool __qdf_nbuf_data_is_dns_query(uint8_t *data);
 bool __qdf_nbuf_data_is_dns_response(uint8_t *data);
+bool __qdf_nbuf_data_is_tcp_fin(uint8_t *data);
+bool __qdf_nbuf_data_is_tcp_fin_ack(uint8_t *data);
 bool __qdf_nbuf_data_is_tcp_syn(uint8_t *data);
 bool __qdf_nbuf_data_is_tcp_syn_ack(uint8_t *data);
+bool __qdf_nbuf_data_is_tcp_rst(uint8_t *data);
 bool __qdf_nbuf_data_is_tcp_ack(uint8_t *data);
 uint16_t __qdf_nbuf_data_get_tcp_src_port(uint8_t *data);
 uint16_t __qdf_nbuf_data_get_tcp_dst_port(uint8_t *data);

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

@@ -1810,6 +1810,50 @@ bool __qdf_nbuf_data_is_dns_response(uint8_t *data)
 	return false;
 }
 
+/**
+ * __qdf_nbuf_data_is_tcp_fin() - check if skb data is a tcp fin
+ * @data: Pointer to network data buffer
+ *
+ * This api is to check if the packet is tcp fin.
+ *
+ * Return: true if packet is tcp fin packet.
+ *         false otherwise.
+ */
+bool __qdf_nbuf_data_is_tcp_fin(uint8_t *data)
+{
+	uint8_t op_code;
+
+	op_code = (uint8_t)(*(uint8_t *)(data +
+				QDF_NBUF_PKT_TCP_OPCODE_OFFSET));
+
+	if (op_code == QDF_NBUF_PKT_TCPOP_FIN)
+		return true;
+
+	return false;
+}
+
+/**
+ * __qdf_nbuf_data_is_tcp_fin_ack() - check if skb data is a tcp fin ack
+ * @data: Pointer to network data buffer
+ *
+ * This api is to check if the tcp packet is fin ack.
+ *
+ * Return: true if packet is tcp fin ack packet.
+ *         false otherwise.
+ */
+bool __qdf_nbuf_data_is_tcp_fin_ack(uint8_t *data)
+{
+	uint8_t op_code;
+
+	op_code = (uint8_t)(*(uint8_t *)(data +
+				QDF_NBUF_PKT_TCP_OPCODE_OFFSET));
+
+	if (op_code == QDF_NBUF_PKT_TCPOP_FIN_ACK)
+		return true;
+
+	return false;
+}
+
 /**
  * __qdf_nbuf_data_is_tcp_syn() - check if skb data is a tcp syn
  * @data: Pointer to network data buffer
@@ -1852,6 +1896,28 @@ bool __qdf_nbuf_data_is_tcp_syn_ack(uint8_t *data)
 	return false;
 }
 
+/**
+ * __qdf_nbuf_data_is_tcp_rst() - check if skb data is a tcp rst
+ * @data: Pointer to network data buffer
+ *
+ * This api is to check if the tcp packet is rst.
+ *
+ * Return: true if packet is tcp rst packet.
+ *         false otherwise.
+ */
+bool __qdf_nbuf_data_is_tcp_rst(uint8_t *data)
+{
+	uint8_t op_code;
+
+	op_code = (uint8_t)(*(uint8_t *)(data +
+				QDF_NBUF_PKT_TCP_OPCODE_OFFSET));
+
+	if (op_code == QDF_NBUF_PKT_TCPOP_RST)
+		return true;
+
+	return false;
+}
+
 /**
  * __qdf_nbuf_data_is_tcp_ack() - check if skb data is a tcp ack
  * @data: Pointer to network data buffer