diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index e48759c4ebfb..c54ad46cdd68 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -32,6 +32,7 @@ #include #define IPA_NBUF_OWNER_ID 0xaa55aa55 +#define QDF_NBUF_PKT_TRAC_TYPE_DNS 0x01 #define QDF_NBUF_PKT_TRAC_TYPE_EAPOL 0x02 #define QDF_NBUF_PKT_TRAC_TYPE_DHCP 0x04 #define QDF_NBUF_PKT_TRAC_TYPE_MGMT_ACTION 0x08 @@ -580,14 +581,15 @@ struct qdf_radiotap_vendor_ns_ath { #define QDF_MON_STATUS_STA_CODING_KNOWN 0x80 /** - * qdf_proto_type - protocol type + * enum qdf_proto_type - protocol type * @QDF_PROTO_TYPE_DHCP - DHCP * @QDF_PROTO_TYPE_EAPOL - EAPOL * @QDF_PROTO_TYPE_ARP - ARP * @QDF_PROTO_TYPE_MGMT - MGMT * @QDF_PROTO_TYPE_ICMP - ICMP * @QDF_PROTO_TYPE_ICMPv6 - ICMPv6 - * QDF_PROTO_TYPE_EVENT - EVENT + * @QDF_PROTO_TYPE_EVENT - EVENT + * @QDF_PROTO_TYPE_DNS - DNS */ enum qdf_proto_type { QDF_PROTO_TYPE_DHCP, @@ -597,6 +599,7 @@ enum qdf_proto_type { QDF_PROTO_TYPE_ICMP, QDF_PROTO_TYPE_ICMPv6, QDF_PROTO_TYPE_EVENT, + QDF_PROTO_TYPE_DNS, QDF_PROTO_TYPE_MAX }; @@ -641,7 +644,7 @@ enum cb_ftype { }; /** - * qdf_proto_subtype - subtype of packet + * enum qdf_proto_subtype - subtype of packet * @QDF_PROTO_EAPOL_M1 - EAPOL 1/4 * @QDF_PROTO_EAPOL_M2 - EAPOL 2/4 * @QDF_PROTO_EAPOL_M3 - EAPOL 3/4 @@ -672,9 +675,11 @@ enum cb_ftype { * @QDF_PROTO_MGMT_DISASSOC - disassoc * @QDF_PROTO_MGMT_AUTH - auth * @QDF_PROTO_MGMT_DEAUTH - deauth - * QDF_ROAM_SYNCH - roam synch indication from fw - * QDF_ROAM_COMPLETE - roam complete cmd to fw - * QDF_ROAM_EVENTID - roam eventid from fw + * @QDF_ROAM_SYNCH - roam synch indication from fw + * @QDF_ROAM_COMPLETE - roam complete cmd to fw + * @QDF_ROAM_EVENTID - roam eventid from fw + * @QDF_PROTO_DNS_QUERY - dns query + * @QDF_PROTO_DNS_RES -dns response */ enum qdf_proto_subtype { QDF_PROTO_INVALID, @@ -711,6 +716,8 @@ enum qdf_proto_subtype { QDF_ROAM_SYNCH, QDF_ROAM_COMPLETE, QDF_ROAM_EVENTID, + QDF_PROTO_DNS_QUERY, + QDF_PROTO_DNS_RES, QDF_PROTO_SUBTYPE_MAX }; diff --git a/qdf/inc/qdf_trace.h b/qdf/inc/qdf_trace.h index f8bcb8d789e8..b05645775503 100644 --- a/qdf/inc/qdf_trace.h +++ b/qdf/inc/qdf_trace.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -74,6 +74,14 @@ typedef int (qdf_abstract_print)(void *priv, const char *fmt, ...); #define QDF_DEBUG_ERROR 0x20 #define QDF_DEBUG_CFG 0x40 +/* + * Rate limit based on pkt prototype + */ +#define QDF_MAX_DHCP_PKTS_PER_SEC (10) +#define QDF_MAX_EAPOL_PKTS_PER_SEC (10) +#define QDF_MAX_ARP_PKTS_PER_SEC (5) +#define QDF_MAX_DNS_PKTS_PER_SEC (5) +#define QDF_MAX_OTHER_PKTS_PER_SEC (1) /* DP Trace Implementation */ #ifdef CONFIG_DP_TRACE @@ -105,6 +113,7 @@ typedef int (qdf_abstract_print)(void *priv, const char *fmt, ...); #define QDF_TRACE_DEFAULT_PDEV_ID 0xff #define INVALID_QDF_TRACE_ADDR 0xffffffff #define DEFAULT_QDF_TRACE_DUMP_COUNT 0 +#define QDF_TRACE_DEFAULT_MSDU_ID 0 /* * first parameter to iwpriv command - dump_dp_trace @@ -459,6 +468,9 @@ struct qdf_dp_trace_record_s { * @icmpv6_na: stats for icmpv6 nas * @icmpv6_rs: stats for icmpv6 rss * @icmpv6_ra: stats for icmpv6 ras + * @proto_event_bitmap: defines which protocol to be diag logged. + * refer QDF_NBUF_PKT_TRAC_TYPE_DNS to QDF_NBUF_PKT_TRAC_TYPE_ARP + * for bitmap. */ struct s_qdf_dp_trace_data { uint32_t head; @@ -504,6 +516,7 @@ struct s_qdf_dp_trace_data { u16 icmpv6_na; u16 icmpv6_rs; u16 icmpv6_ra; + uint32_t proto_event_bitmap; }; /** @@ -880,6 +893,35 @@ void qdf_dp_display_event_record(struct qdf_dp_trace_record_s *record, void qdf_dp_trace_record_event(enum QDF_DP_TRACE_ID code, uint8_t vdev_id, uint8_t pdev_id, enum qdf_proto_type type, enum qdf_proto_subtype subtype); + +/** + * qdf_dp_set_proto_event_bitmap() - Set the protocol event bitmap + * @value: proto event bitmap value. + * + * QDF_NBUF_PKT_TRAC_TYPE_DNS 0x01 + * QDF_NBUF_PKT_TRAC_TYPE_EAPOL 0x02 + * QDF_NBUF_PKT_TRAC_TYPE_DHCP 0x04 + * QDF_NBUF_PKT_TRAC_TYPE_ARP 0x10 + * + * Return: none + */ +void qdf_dp_set_proto_event_bitmap(uint32_t value); + +/** + * qdf_dp_log_proto_pkt_info() - Send diag log event + * @sa: source MAC address + * @da: destination MAC address + * @type: pkt type + * @subtype: pkt subtype + * @dir: tx or rx + * @msdu_id: msdu id + * @status: status + * + * Return: none + */ +void qdf_dp_log_proto_pkt_info(uint8_t *sa, uint8_t *da, uint8_t type, + uint8_t subtype, uint8_t dir, uint8_t msdu_id, + uint8_t status); #else static inline bool qdf_dp_trace_log_pkt(uint8_t vdev_id, struct sk_buff *skb, @@ -969,6 +1011,13 @@ void qdf_dp_trace_data_pkt(qdf_nbuf_t nbuf, uint8_t pdev_id, enum qdf_proto_dir dir) { } + +static inline +void qdf_dp_log_proto_pkt_info(uint8_t *sa, uint8_t *da, uint8_t type, + uint8_t subtype, uint8_t dir, uint8_t msdu_id, + uint8_t status) +{ +} #endif void qdf_trace_display(void); diff --git a/qdf/inc/qdf_types.h b/qdf/inc/qdf_types.h index 2e159fc6bf43..4cb0797eadc6 100644 --- a/qdf/inc/qdf_types.h +++ b/qdf/inc/qdf_types.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -1253,4 +1253,20 @@ enum qdf_context_mode { QDF_CONTEXT_TASKLET = 1, }; +/** + * enum qdf_dp_tx_rx_status - TX/RX packet status + * @QDF_TX_RX_STATUS_INVALID: default invalid status + * @QDF_TX_RX_STATUS_OK: successfully sent + acked + * @QDF_TX_RX_STATUS_FW_DISCARD: packet not sent + * @QDF_TX_RX_STATUS_NO_ACK: packet sent but no ack + * @QDF_TX_RX_STATUS_DROP: packet dropped in host + */ +enum qdf_dp_tx_rx_status { + QDF_TX_RX_STATUS_INVALID, + QDF_TX_RX_STATUS_OK, + QDF_TX_RX_STATUS_FW_DISCARD, + QDF_TX_RX_STATUS_NO_ACK, + QDF_TX_RX_STATUS_DROP, +}; + #endif /* __QDF_TYPES_H */ diff --git a/qdf/linux/src/qdf_trace.c b/qdf/linux/src/qdf_trace.c index 822784dfb5e2..7a0e41d3ba94 100644 --- a/qdf/linux/src/qdf_trace.c +++ b/qdf/linux/src/qdf_trace.c @@ -42,6 +42,7 @@ qdf_declare_param(qdf_log_flush_timer_period, uint); #include "qdf_time.h" #include "qdf_mc_timer.h" +#include /* Global qdf print id */ @@ -814,6 +815,18 @@ void qdf_dp_set_proto_bitmap(uint32_t val) } qdf_export_symbol(qdf_dp_set_proto_bitmap); +void qdf_dp_set_proto_event_bitmap(uint32_t value) +{ + g_qdf_dp_trace_data.proto_event_bitmap = value; +} + +qdf_export_symbol(qdf_dp_set_proto_event_bitmap); + +static uint32_t qdf_dp_get_proto_event_bitmap(void) +{ + return g_qdf_dp_trace_data.proto_event_bitmap; +} + /** * qdf_dp_set_no_of_record() - set dp trace no_of_record * @@ -1400,6 +1413,134 @@ static void qdf_dp_add_record(enum QDF_DP_TRACE_ID code, uint8_t pdev_id, QDF_TRACE_DEFAULT_PDEV_ID, info); } +/** + * qdf_get_rate_limit_by_type() - Get the rate limit by pkt type + * @type: packet type + * + * Return: Rate limit value for a particular packet type + */ +static inline +uint8_t qdf_get_rate_limit_by_type(uint8_t type) +{ + switch (type) { + case QDF_PROTO_TYPE_DHCP: + return QDF_MAX_DHCP_PKTS_PER_SEC; + case QDF_PROTO_TYPE_EAPOL: + return QDF_MAX_EAPOL_PKTS_PER_SEC; + case QDF_PROTO_TYPE_ARP: + return QDF_MAX_ARP_PKTS_PER_SEC; + case QDF_PROTO_TYPE_DNS: + return QDF_MAX_DNS_PKTS_PER_SEC; + default: + return QDF_MAX_OTHER_PKTS_PER_SEC; + } +} + +/** + * qdf_get_pkt_type_string() - Get the string based on pkt type + * @subtype: packet type + * + * Return: String based on pkt type + */ +static +uint8_t *qdf_get_pkt_type_string(uint8_t subtype) +{ + switch (subtype) { + case QDF_PROTO_EAPOL_M1: + return "EAPOL-1"; + case QDF_PROTO_EAPOL_M2: + return "EAPOL-2"; + case QDF_PROTO_EAPOL_M3: + return "EAPOL-3"; + case QDF_PROTO_EAPOL_M4: + return "EAPOL-4"; + case QDF_PROTO_DHCP_DISCOVER: + return "DHCP-D"; + case QDF_PROTO_DHCP_REQUEST: + return "DHCP-R"; + case QDF_PROTO_DHCP_OFFER: + return "DHCP-O"; + case QDF_PROTO_DHCP_ACK: + return "DHCP-A"; + case QDF_PROTO_DHCP_NACK: + return "DHCP-NA"; + case QDF_PROTO_ARP_REQ: + return "ARP-RQ"; + case QDF_PROTO_ARP_RES: + return "ARP-RS"; + case QDF_PROTO_DNS_QUERY: + return "DNS_Q"; + case QDF_PROTO_DNS_RES: + return "DNS_RS"; + default: + return "UNKNOWN"; + } +} + +/** + * qdf_get_pkt_status_string() - Get the string based on pkt status + * @status: packet status + * + * Return: String based on pkt status + */ +static +uint8_t *qdf_get_pkt_status_string(uint8_t status) +{ + switch (status) { + case QDF_TX_RX_STATUS_INVALID: + return "inv"; + case QDF_TX_RX_STATUS_OK: + return "succ"; + case QDF_TX_RX_STATUS_FW_DISCARD: + return "disc"; + case QDF_TX_RX_STATUS_NO_ACK: + return "nack"; + case QDF_TX_RX_STATUS_DROP: + return "drop"; + default: + return "unknown"; + } +} + +/** + * qdf_dp_log_proto_pkt_info() - Send diag log with pkt info + * @sa: Source MAC address + * @da: Destination MAC address + * @type: packet type + * @subtype: packet subtype + * @dir: tx or rx + * @msdu_id: MSDU id + * @status: status code + * + * Return: none + */ +void qdf_dp_log_proto_pkt_info(uint8_t *sa, uint8_t *da, uint8_t type, + uint8_t subtype, uint8_t dir, uint8_t msdu_id, + uint8_t status) +{ + uint8_t pkt_rate_limit; + static ulong last_ticks[QDF_PROTO_SUBTYPE_MAX] = {0}; + ulong curr_ticks = jiffies; + + pkt_rate_limit = qdf_get_rate_limit_by_type(type); + + if (!time_after(curr_ticks, last_ticks[subtype] + HZ / pkt_rate_limit)) + return; + + last_ticks[subtype] = curr_ticks; + + if (status == QDF_TX_RX_STATUS_INVALID) + qdf_nofl_info("%s %s: SA:%pM DA:%pM", + qdf_get_pkt_type_string(subtype), dir ? "RX":"TX", + sa, da); + else + qdf_nofl_info("%s %s: SA:%pM DA:%pM msdu_id:%d status: %s", + qdf_get_pkt_type_string(subtype), dir ? "RX":"TX", + sa, da, msdu_id, + qdf_get_pkt_status_string(status)); +} + +qdf_export_symbol(qdf_dp_log_proto_pkt_info); /** * qdf_log_icmpv6_pkt() - log ICMPv6 packet @@ -1520,13 +1661,31 @@ static bool qdf_log_eapol_pkt(uint8_t vdev_id, struct sk_buff *skb, enum qdf_proto_dir dir, uint8_t pdev_id) { enum qdf_proto_subtype subtype; + uint32_t dp_eap_trace; + uint32_t dp_eap_event; - if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_EAPOL) && - ((dir == QDF_TX && QDF_NBUF_CB_PACKET_TYPE_EAPOL == - QDF_NBUF_CB_GET_PACKET_TYPE(skb)) || - (dir == QDF_RX && qdf_nbuf_is_ipv4_eapol_pkt(skb) == true))) { + dp_eap_trace = qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_EAPOL; + dp_eap_event = qdf_dp_get_proto_event_bitmap() & + QDF_NBUF_PKT_TRAC_TYPE_EAPOL; - subtype = qdf_nbuf_get_eapol_subtype(skb); + if (!dp_eap_trace && !dp_eap_event) + return false; + + if (!((dir == QDF_TX && QDF_NBUF_CB_PACKET_TYPE_EAPOL == + QDF_NBUF_CB_GET_PACKET_TYPE(skb)) || + (dir == QDF_RX && qdf_nbuf_is_ipv4_eapol_pkt(skb) == true))) + return false; + + subtype = qdf_nbuf_get_eapol_subtype(skb); + + if (dp_eap_event && dir == QDF_RX) + qdf_dp_log_proto_pkt_info(skb->data + QDF_NBUF_SRC_MAC_OFFSET, + skb->data + QDF_NBUF_DEST_MAC_OFFSET, + QDF_PROTO_TYPE_EAPOL, subtype, dir, + QDF_TRACE_DEFAULT_MSDU_ID, + QDF_TX_RX_STATUS_INVALID); + + if (dp_eap_trace) { QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true; if (QDF_TX == dir) QDF_NBUF_CB_TX_DP_TRACE(skb) = 1; @@ -1559,9 +1718,9 @@ static bool qdf_log_eapol_pkt(uint8_t vdev_id, struct sk_buff *skb, g_qdf_dp_trace_data.eapol_others++; break; } - return true; } - return false; + + return true; } /** @@ -1577,13 +1736,31 @@ static bool qdf_log_dhcp_pkt(uint8_t vdev_id, struct sk_buff *skb, enum qdf_proto_dir dir, uint8_t pdev_id) { enum qdf_proto_subtype subtype = QDF_PROTO_INVALID; + uint32_t dp_dhcp_trace; + uint32_t dp_dhcp_event; - if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_DHCP) && - ((dir == QDF_TX && QDF_NBUF_CB_PACKET_TYPE_DHCP == - QDF_NBUF_CB_GET_PACKET_TYPE(skb)) || - (dir == QDF_RX && qdf_nbuf_is_ipv4_dhcp_pkt(skb) == true))) { + dp_dhcp_trace = qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_DHCP; + dp_dhcp_event = qdf_dp_get_proto_event_bitmap() & + QDF_NBUF_PKT_TRAC_TYPE_DHCP; - subtype = qdf_nbuf_get_dhcp_subtype(skb); + if (!dp_dhcp_trace && !dp_dhcp_event) + return false; + + if (!((dir == QDF_TX && QDF_NBUF_CB_PACKET_TYPE_DHCP == + QDF_NBUF_CB_GET_PACKET_TYPE(skb)) || + (dir == QDF_RX && qdf_nbuf_is_ipv4_dhcp_pkt(skb) == true))) + return false; + + subtype = qdf_nbuf_get_dhcp_subtype(skb); + + if (dp_dhcp_event && dir == QDF_RX) + qdf_dp_log_proto_pkt_info(skb->data + QDF_NBUF_SRC_MAC_OFFSET, + skb->data + QDF_NBUF_DEST_MAC_OFFSET, + QDF_PROTO_TYPE_DHCP, subtype, dir, + QDF_TRACE_DEFAULT_MSDU_ID, + QDF_TX_RX_STATUS_INVALID); + + if (dp_dhcp_trace) { QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true; if (QDF_TX == dir) QDF_NBUF_CB_TX_DP_TRACE(skb) = 1; @@ -1619,10 +1796,9 @@ static bool qdf_log_dhcp_pkt(uint8_t vdev_id, struct sk_buff *skb, g_qdf_dp_trace_data.eapol_others++; break; } - - return true; } - return false; + + return true; } /** @@ -1675,7 +1851,7 @@ static bool qdf_log_arp_pkt(uint8_t vdev_id, struct sk_buff *skb, bool qdf_dp_trace_log_pkt(uint8_t vdev_id, struct sk_buff *skb, enum qdf_proto_dir dir, uint8_t pdev_id) { - if (!qdf_dp_get_proto_bitmap()) + if (!qdf_dp_get_proto_bitmap() && !qdf_dp_get_proto_event_bitmap()) return false; if (qdf_log_arp_pkt(vdev_id, skb, dir, pdev_id)) return true; @@ -1951,6 +2127,82 @@ void qdf_dp_display_ptr_record(struct qdf_dp_trace_record_s *record, } qdf_export_symbol(qdf_dp_display_ptr_record); +static +enum qdf_proto_type qdf_dp_get_pkt_proto_type(qdf_nbuf_t nbuf) +{ + uint8_t pkt_type; + + if (!nbuf) + return QDF_PROTO_TYPE_MAX; + + if (qdf_nbuf_data_is_dns_query(nbuf) || + qdf_nbuf_data_is_dns_response(nbuf)) + return QDF_PROTO_TYPE_DNS; + + pkt_type = QDF_NBUF_CB_GET_PACKET_TYPE(nbuf); + + switch (pkt_type) { + case QDF_NBUF_CB_PACKET_TYPE_EAPOL: + return QDF_PROTO_TYPE_EAPOL; + case QDF_NBUF_CB_PACKET_TYPE_ARP: + return QDF_PROTO_TYPE_ARP; + case QDF_NBUF_CB_PACKET_TYPE_DHCP: + return QDF_PROTO_TYPE_DHCP; + default: + return QDF_PROTO_TYPE_MAX; + } +} + +static +enum qdf_proto_subtype qdf_dp_get_pkt_subtype(qdf_nbuf_t nbuf, + enum qdf_proto_type pkt_type) +{ + switch (pkt_type) { + case QDF_PROTO_TYPE_EAPOL: + return qdf_nbuf_get_eapol_subtype(nbuf); + case QDF_PROTO_TYPE_ARP: + return qdf_nbuf_get_arp_subtype(nbuf); + case QDF_PROTO_TYPE_DHCP: + return qdf_nbuf_get_dhcp_subtype(nbuf); + case QDF_PROTO_TYPE_DNS: + return (qdf_nbuf_data_is_dns_query(nbuf)) ? + QDF_PROTO_DNS_QUERY : QDF_PROTO_DNS_RES; + default: + return QDF_PROTO_INVALID; + } +} + +static +bool qdf_dp_proto_log_enable_check(enum qdf_proto_type pkt_type, + uint16_t status) +{ + if (pkt_type == QDF_PROTO_TYPE_MAX) + return false; + + switch (pkt_type) { + case QDF_PROTO_TYPE_EAPOL: + return qdf_dp_get_proto_event_bitmap() & + QDF_NBUF_PKT_TRAC_TYPE_EAPOL; + case QDF_PROTO_TYPE_DHCP: + return qdf_dp_get_proto_event_bitmap() & + QDF_NBUF_PKT_TRAC_TYPE_DHCP; + case QDF_PROTO_TYPE_ARP: + if (status == QDF_TX_RX_STATUS_OK) + return false; + else + return qdf_dp_get_proto_event_bitmap() & + QDF_NBUF_PKT_TRAC_TYPE_ARP; + case QDF_PROTO_TYPE_DNS: + if (status == QDF_TX_RX_STATUS_OK) + return false; + else + return qdf_dp_get_proto_event_bitmap() & + QDF_NBUF_PKT_TRAC_TYPE_DNS; + default: + return false; + } +} + /** * qdf_dp_trace_ptr() - record dptrace * @code: dptrace code @@ -1968,6 +2220,17 @@ void qdf_dp_trace_ptr(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code, { struct qdf_dp_trace_ptr_buf buf; int buf_size = sizeof(struct qdf_dp_trace_ptr_buf); + enum qdf_proto_type pkt_type; + + pkt_type = qdf_dp_get_pkt_proto_type(nbuf); + if ((code == QDF_DP_TRACE_FREE_PACKET_PTR_RECORD || + code == QDF_DP_TRACE_LI_DP_FREE_PACKET_PTR_RECORD) && + qdf_dp_proto_log_enable_check(pkt_type, status + 1)) + qdf_dp_log_proto_pkt_info(nbuf->data + QDF_NBUF_SRC_MAC_OFFSET, + nbuf->data + QDF_NBUF_DEST_MAC_OFFSET, + pkt_type, + qdf_dp_get_pkt_subtype(nbuf, pkt_type), + QDF_TX, msdu_id, status + 1); if (qdf_dp_enable_check(nbuf, code, QDF_TX) == false) return; @@ -1988,6 +2251,17 @@ void qdf_dp_trace_data_pkt(qdf_nbuf_t nbuf, uint8_t pdev_id, enum qdf_proto_dir dir) { struct qdf_dp_trace_data_buf buf; + enum qdf_proto_type pkt_type; + + pkt_type = qdf_dp_get_pkt_proto_type(nbuf); + if (code == QDF_DP_TRACE_DROP_PACKET_RECORD && + qdf_dp_proto_log_enable_check(pkt_type, QDF_TX_RX_STATUS_DROP)) + qdf_dp_log_proto_pkt_info(nbuf->data + QDF_NBUF_SRC_MAC_OFFSET, + nbuf->data + QDF_NBUF_DEST_MAC_OFFSET, + pkt_type, + qdf_dp_get_pkt_subtype(nbuf, pkt_type), + QDF_TX, msdu_id, + QDF_TX_RX_STATUS_DROP); buf.msdu_id = msdu_id; if (!qdf_dp_enable_check(nbuf, code, dir))