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
This commit is contained in:

committed by
Madan Koyyalamudi

parent
c515aa874b
commit
81272da21e
@@ -509,6 +509,7 @@ struct qdf_radiotap_vendor_ns_ath {
|
|||||||
#define IPV4_DST_PORT_OFFSET 36
|
#define IPV4_DST_PORT_OFFSET 36
|
||||||
|
|
||||||
/* IPV4 ICMP Related Mask */
|
/* IPV4 ICMP Related Mask */
|
||||||
|
#define ICMP_ID_OFFSET 38
|
||||||
#define ICMP_SEQ_NUM_OFFSET 40
|
#define ICMP_SEQ_NUM_OFFSET 40
|
||||||
#define ICMP_SUBTYPE_OFFSET 34
|
#define ICMP_SUBTYPE_OFFSET 34
|
||||||
#define ICMP_REQUEST 0x08
|
#define ICMP_REQUEST 0x08
|
||||||
|
@@ -186,7 +186,7 @@ typedef struct s_qdf_trace_data {
|
|||||||
#define MAX_QDF_DP_TRACE_RECORDS 2000
|
#define MAX_QDF_DP_TRACE_RECORDS 2000
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define QDF_DP_TRACE_RECORD_SIZE 40
|
#define QDF_DP_TRACE_RECORD_SIZE 50 /* bytes */
|
||||||
#define INVALID_QDF_DP_TRACE_ADDR 0xffffffff
|
#define INVALID_QDF_DP_TRACE_ADDR 0xffffffff
|
||||||
#define QDF_DP_TRACE_VERBOSITY_HIGH 4
|
#define QDF_DP_TRACE_VERBOSITY_HIGH 4
|
||||||
#define QDF_DP_TRACE_VERBOSITY_MEDIUM 3
|
#define QDF_DP_TRACE_VERBOSITY_MEDIUM 3
|
||||||
@@ -350,6 +350,8 @@ struct qdf_dp_trace_ptr_buf {
|
|||||||
* @type: packet type
|
* @type: packet type
|
||||||
* @subtype: packet subtype
|
* @subtype: packet subtype
|
||||||
* @dir: direction
|
* @dir: direction
|
||||||
|
* @proto_priv_data: protocol private data
|
||||||
|
* can be stored in this.
|
||||||
*/
|
*/
|
||||||
struct qdf_dp_trace_proto_buf {
|
struct qdf_dp_trace_proto_buf {
|
||||||
struct qdf_mac_addr sa;
|
struct qdf_mac_addr sa;
|
||||||
@@ -358,6 +360,11 @@ struct qdf_dp_trace_proto_buf {
|
|||||||
uint8_t type;
|
uint8_t type;
|
||||||
uint8_t subtype;
|
uint8_t subtype;
|
||||||
uint8_t dir;
|
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
|
* @dir: direction
|
||||||
* @pdev_id: pdev id
|
* @pdev_id: pdev id
|
||||||
* @print: to print this proto pkt or not
|
* @print: to print this proto pkt or not
|
||||||
*
|
* @proto_priv_data: protocol specific private
|
||||||
|
* data.
|
||||||
* Return: none
|
* Return: none
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
qdf_dp_trace_proto_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
|
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,
|
uint8_t *sa, uint8_t *da, enum qdf_proto_type type,
|
||||||
enum qdf_proto_subtype subtype, enum qdf_proto_dir dir,
|
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_disable_live_mode(void);
|
||||||
void qdf_dp_trace_enable_live_mode(void);
|
void qdf_dp_trace_enable_live_mode(void);
|
||||||
|
@@ -1631,7 +1631,7 @@ static bool qdf_log_icmpv6_pkt(uint8_t vdev_id, struct sk_buff *skb,
|
|||||||
QDF_DP_TRACE_ICMPv6_PACKET_RECORD,
|
QDF_DP_TRACE_ICMPv6_PACKET_RECORD,
|
||||||
vdev_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET),
|
vdev_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET),
|
||||||
(skb->data + QDF_NBUF_DEST_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) {
|
switch (subtype) {
|
||||||
case QDF_PROTO_ICMPV6_REQ:
|
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_dir dir, uint8_t pdev_id)
|
||||||
{
|
{
|
||||||
enum qdf_proto_subtype proto_subtype;
|
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) &&
|
if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_ICMP) &&
|
||||||
(qdf_nbuf_is_icmp_pkt(skb) == true)) {
|
(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;
|
QDF_NBUF_CB_DP_TRACE_PRINT(skb) = false;
|
||||||
proto_subtype = qdf_nbuf_get_icmp_subtype(skb);
|
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)
|
if (QDF_TX == dir)
|
||||||
QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
|
QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
|
||||||
else if (QDF_RX == dir)
|
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_NBUF_DEST_MAC_OFFSET,
|
||||||
QDF_PROTO_TYPE_ICMP,
|
QDF_PROTO_TYPE_ICMP,
|
||||||
proto_subtype, dir, pdev_id,
|
proto_subtype, dir, pdev_id,
|
||||||
false));
|
false, proto_priv_data));
|
||||||
|
|
||||||
if (proto_subtype == QDF_PROTO_ICMP_REQ)
|
if (proto_subtype == QDF_PROTO_ICMP_REQ)
|
||||||
g_qdf_dp_trace_data.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 +
|
skb->data +
|
||||||
QDF_NBUF_DEST_MAC_OFFSET,
|
QDF_NBUF_DEST_MAC_OFFSET,
|
||||||
QDF_PROTO_TYPE_EAPOL, subtype,
|
QDF_PROTO_TYPE_EAPOL, subtype,
|
||||||
dir, pdev_id, true));
|
dir, pdev_id, true, 0));
|
||||||
|
|
||||||
switch (subtype) {
|
switch (subtype) {
|
||||||
case QDF_PROTO_EAPOL_M1:
|
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 +
|
skb->data +
|
||||||
QDF_NBUF_DEST_MAC_OFFSET,
|
QDF_NBUF_DEST_MAC_OFFSET,
|
||||||
QDF_PROTO_TYPE_DHCP, subtype,
|
QDF_PROTO_TYPE_DHCP, subtype,
|
||||||
dir, pdev_id, true));
|
dir, pdev_id, true, 0));
|
||||||
|
|
||||||
switch (subtype) {
|
switch (subtype) {
|
||||||
case QDF_PROTO_DHCP_DISCOVER:
|
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_NBUF_DEST_MAC_OFFSET,
|
||||||
QDF_PROTO_TYPE_ARP,
|
QDF_PROTO_TYPE_ARP,
|
||||||
proto_subtype, dir, pdev_id,
|
proto_subtype, dir, pdev_id,
|
||||||
true));
|
true, 0));
|
||||||
|
|
||||||
if (QDF_PROTO_ARP_REQ == proto_subtype)
|
if (QDF_PROTO_ARP_REQ == proto_subtype)
|
||||||
g_qdf_dp_trace_data.arp_req++;
|
g_qdf_dp_trace_data.arp_req++;
|
||||||
@@ -2116,23 +2127,24 @@ void qdf_dp_display_proto_pkt(struct qdf_dp_trace_record_s *record,
|
|||||||
index, info, record);
|
index, info, record);
|
||||||
DPTRACE_PRINT("%s [%d] [%s] SA: "
|
DPTRACE_PRINT("%s [%d] [%s] SA: "
|
||||||
QDF_MAC_ADDR_FMT " %s DA:"
|
QDF_MAC_ADDR_FMT " %s DA:"
|
||||||
QDF_MAC_ADDR_FMT,
|
QDF_MAC_ADDR_FMT " proto priv data = %08x",
|
||||||
prepend_str,
|
prepend_str,
|
||||||
buf->vdev_id,
|
buf->vdev_id,
|
||||||
qdf_dp_subtype_to_str(buf->subtype),
|
qdf_dp_subtype_to_str(buf->subtype),
|
||||||
QDF_MAC_ADDR_REF(buf->sa.bytes),
|
QDF_MAC_ADDR_REF(buf->sa.bytes),
|
||||||
qdf_dp_dir_to_str(buf->dir),
|
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);
|
qdf_export_symbol(qdf_dp_display_proto_pkt);
|
||||||
|
|
||||||
void qdf_dp_trace_proto_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
|
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,
|
uint8_t *sa, uint8_t *da, enum qdf_proto_type type,
|
||||||
enum qdf_proto_subtype subtype, enum qdf_proto_dir dir,
|
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;
|
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)
|
if (qdf_dp_enable_check(NULL, code, dir) == false)
|
||||||
return;
|
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.type = type;
|
||||||
buf.subtype = subtype;
|
buf.subtype = subtype;
|
||||||
buf.vdev_id = vdev_id;
|
buf.vdev_id = vdev_id;
|
||||||
|
buf.proto_priv_data = proto_priv_data;
|
||||||
qdf_dp_add_record(code, pdev_id,
|
qdf_dp_add_record(code, pdev_id,
|
||||||
(uint8_t *)&buf, buf_size, NULL, 0, print);
|
(uint8_t *)&buf, buf_size, NULL, 0, print);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user