summaryrefslogtreecommitdiff
path: root/CORE/VOSS/src
diff options
context:
space:
mode:
authorLeo Chang <schang@qca.qualcomm.com>2014-02-21 15:22:49 -0800
committerAkash Patel <c_akashp@qca.qualcomm.com>2014-03-03 21:02:46 -0800
commit5651136e012bf132f2a6050bcadef4bde99c1eb5 (patch)
treed110e4e0db459af282d02a0458f1f778944a9b2a /CORE/VOSS/src
parent72a9e187336a7354c234f4ca33b566ce64879506 (diff)
wlan: cld, add protocol specific packet tracking
For debugging purpose, outstanding protocol tracking capability is needed. Current requirement is EAPOL and DHCP protocol. WLAN kernel driver will track EAPOL and DHCP packet and display at kernel log. For performance reason, as default feature will be disabled, and may enabled with configuration file. Change-Id: I1a22444cd38a41a9c6181676889c2b436ee00d8b CRs-fixed: 607504
Diffstat (limited to 'CORE/VOSS/src')
-rw-r--r--CORE/VOSS/src/vos_packet.c201
1 files changed, 201 insertions, 0 deletions
diff --git a/CORE/VOSS/src/vos_packet.c b/CORE/VOSS/src/vos_packet.c
index 78c556469739..8bb6bfae99b6 100644
--- a/CORE/VOSS/src/vos_packet.c
+++ b/CORE/VOSS/src/vos_packet.c
@@ -50,6 +50,31 @@
#include "vos_memory.h"
#include "adf_os_mem.h"
+#ifdef QCA_PKT_PROTO_TRACE
+/* Protocol specific packet tracking feature */
+#define VOS_PKT_TRAC_ETH_TYPE_OFFSET 12
+#define VOS_PKT_TRAC_IP_OFFSET 14
+#define VOS_PKT_TRAC_IP_HEADER_SIZE 20
+#define VOS_PKT_TRAC_DHCP_SRV_PORT 67
+#define VOS_PKT_TRAC_DHCP_CLI_PORT 68
+#define VOS_PKT_TRAC_EAPOL_ETH_TYPE 0x888E
+#define VOS_PKT_TRAC_MAX_STRING_LEN 12
+#define VOS_PKT_TRAC_MAX_TRACE_BUF 50
+#define VOS_PKT_TRAC_MAX_STRING_BUF 64
+
+/* protocol Storage Structure */
+typedef struct
+{
+ v_U32_t order;
+ v_TIME_t event_time;
+ char event_string[VOS_PKT_TRAC_MAX_STRING_LEN];
+} vos_pkt_proto_trace_t;
+
+vos_pkt_proto_trace_t *trace_buffer = NULL;
+unsigned int trace_buffer_order = 0;
+vos_spin_lock_t trace_buffer_lock;
+#endif /* QCA_PKT_PROTO_TRACE */
+
/**
* vos_pkt_return_packet Free the voss Packet
* @ vos Packet
@@ -212,6 +237,182 @@ VOS_STATUS vos_pkt_extract_data( vos_pkt_t *pPacket,
return VOS_STATUS_SUCCESS;
}
+#ifdef QCA_PKT_PROTO_TRACE
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_get_proto_type() -
+ Find protoco type from packet contents
+
+ * skb Packet Pointer
+ * tracking_map packet type want to track
+
+---------------------------------------------------------------------------*/
+v_U8_t vos_pkt_get_proto_type
+(
+ struct sk_buff *skb,
+ v_U8_t tracking_map
+)
+{
+ v_U8_t pkt_proto_type = 0;
+ v_U16_t ether_type;
+ v_U16_t SPort;
+ v_U16_t DPort;
+
+ /* EAPOL Tracking enabled */
+ if (VOS_PKT_TRAC_TYPE_EAPOL & tracking_map)
+ {
+ ether_type = (v_U16_t)(*(v_U16_t *)(skb->data + VOS_PKT_TRAC_ETH_TYPE_OFFSET));
+ if (VOS_PKT_TRAC_EAPOL_ETH_TYPE == VOS_SWAP_U16(ether_type))
+ {
+ pkt_proto_type |= VOS_PKT_TRAC_TYPE_EAPOL;
+ }
+ }
+
+ /* DHCP Tracking enabled */
+ if (VOS_PKT_TRAC_TYPE_DHCP & tracking_map)
+ {
+ SPort = (v_U16_t)(*(v_U16_t *)(skb->data + VOS_PKT_TRAC_IP_OFFSET +
+ VOS_PKT_TRAC_IP_HEADER_SIZE));
+ DPort = (v_U16_t)(*(v_U16_t *)(skb->data + VOS_PKT_TRAC_IP_OFFSET +
+ VOS_PKT_TRAC_IP_HEADER_SIZE + sizeof(v_U16_t)));
+ if (((VOS_PKT_TRAC_DHCP_SRV_PORT == VOS_SWAP_U16(SPort)) &&
+ (VOS_PKT_TRAC_DHCP_CLI_PORT == VOS_SWAP_U16(DPort))) ||
+ ((VOS_PKT_TRAC_DHCP_CLI_PORT == VOS_SWAP_U16(SPort)) &&
+ (VOS_PKT_TRAC_DHCP_SRV_PORT == VOS_SWAP_U16(DPort))))
+ {
+ pkt_proto_type |= VOS_PKT_TRAC_TYPE_DHCP;
+ }
+ }
+
+ /* Protocol type map */
+ return pkt_proto_type;
+}
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_trace_buf_update() -
+ Update storage buffer with interest event string
+
+ * event_string Event String may packet type or outstanding event
+
+---------------------------------------------------------------------------*/
+void vos_pkt_trace_buf_update
+(
+ char *event_string
+)
+{
+ v_U32_t slot;
+
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
+ "%s %d, %s", __func__, __LINE__, event_string);
+ vos_spin_lock_acquire(&trace_buffer_lock);
+ slot = trace_buffer_order % VOS_PKT_TRAC_MAX_TRACE_BUF;
+ trace_buffer[slot].order = trace_buffer_order;
+ trace_buffer[slot].event_time = vos_timer_get_system_time();
+ vos_mem_copy(trace_buffer[slot].event_string,
+ event_string,
+ (VOS_PKT_TRAC_MAX_STRING_LEN < strlen(event_string))?
+ VOS_PKT_TRAC_MAX_STRING_LEN:strlen(event_string));
+ trace_buffer_order++;
+ vos_spin_lock_release(&trace_buffer_lock);
+
+ return;
+}
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_trace_buf_dump() -
+ Dump stored information into kernel log
+
+---------------------------------------------------------------------------*/
+void vos_pkt_trace_buf_dump
+(
+ void
+)
+{
+ v_U32_t slot, idx;
+
+ vos_spin_lock_acquire(&trace_buffer_lock);
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "PACKET TRACE DUMP START Current Timestamp %u",
+ (unsigned int)vos_timer_get_system_time());
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "ORDER : TIME : EVT");
+ if (VOS_PKT_TRAC_MAX_TRACE_BUF > trace_buffer_order)
+ {
+ for (slot = 0 ; slot < trace_buffer_order; slot++)
+ {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%5d :%12u : %s",
+ trace_buffer[slot].order,
+ (unsigned int)trace_buffer[slot].event_time,
+ trace_buffer[slot].event_string);
+ }
+ }
+ else
+ {
+ for (idx = 0 ; idx < VOS_PKT_TRAC_MAX_TRACE_BUF; idx++)
+ {
+ slot = (trace_buffer_order + idx) % VOS_PKT_TRAC_MAX_TRACE_BUF;
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%5d :%12u : %s",
+ trace_buffer[slot].order,
+ (unsigned int)trace_buffer[slot].event_time,
+ trace_buffer[slot].event_string);
+ }
+ }
+
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "PACKET TRACE DUMP END");
+ vos_spin_lock_release(&trace_buffer_lock);
+
+ return;
+}
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_proto_trace_init() -
+ Initialize protocol trace functionality, allocate required resource
+
+---------------------------------------------------------------------------*/
+void vos_pkt_proto_trace_init
+(
+ void
+)
+{
+ /* Init spin lock to protect global memory */
+ vos_spin_lock_init(&trace_buffer_lock);
+ trace_buffer_order = 0;
+ trace_buffer = vos_mem_malloc(
+ VOS_PKT_TRAC_MAX_TRACE_BUF * sizeof(vos_pkt_proto_trace_t));
+ vos_mem_zero((void *)trace_buffer,
+ VOS_PKT_TRAC_MAX_TRACE_BUF * sizeof(vos_pkt_proto_trace_t));
+
+ /* Register callback function to NBUF
+ * Lower layer event also will be reported to here */
+ adf_nbuf_reg_trace_cb(vos_pkt_trace_buf_update);
+ return;
+}
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_proto_trace_close() -
+ Free required resource
+
+---------------------------------------------------------------------------*/
+void vos_pkt_proto_trace_close
+(
+ void
+)
+{
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s %d", __func__, __LINE__);
+ vos_mem_free(trace_buffer);
+ vos_spin_lock_destroy(&trace_buffer_lock);
+
+ return;
+}
+#endif /* QCA_PKT_PROTO_TRACE */
#else
/*--------------------------------------------------------------------------