1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /******************************************************************************
4 * Copyright(c) 2009 - 2014 Intel Corporation. All rights reserved.
5 * Copyright(C) 2016 Intel Deutschland GmbH
6 * Copyright(c) 2018, 2023 Intel Corporation
7 *****************************************************************************/
9 #ifndef __IWLWIFI_DEVICE_TRACE
10 #define __IWLWIFI_DEVICE_TRACE
11 #include <linux/skbuff.h>
12 #include <linux/ieee80211.h>
13 #include <net/cfg80211.h>
14 #include <net/mac80211.h>
15 #include "iwl-trans.h"
16 static inline bool iwl_trace_data(struct sk_buff
*skb
)
18 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
19 struct ieee80211_hdr
*hdr
= (void *)skb
->data
;
20 __le16 fc
= hdr
->frame_control
;
21 int offs
= 24; /* start with normal header length */
23 if (!ieee80211_is_data(fc
))
26 /* If upper layers wanted TX status it's an important frame */
27 if (info
->flags
& IEEE80211_TX_CTL_REQ_TX_STATUS
)
30 /* Try to determine if the frame is EAPOL. This might have false
31 * positives (if there's no RFC 1042 header and we compare to some
32 * payload instead) but since we're only doing tracing that's not
36 if (ieee80211_has_a4(fc
))
38 if (ieee80211_is_data_qos(fc
))
40 /* don't account for crypto - these are unencrypted */
42 /* also account for the RFC 1042 header, of course */
45 return skb
->len
<= offs
+ 2 ||
46 *(__be16
*)(skb
->data
+ offs
) != cpu_to_be16(ETH_P_PAE
);
49 static inline size_t iwl_rx_trace_len(const struct iwl_trans
*trans
,
50 void *rxbuf
, size_t len
,
51 size_t *out_hdr_offset
)
53 struct iwl_cmd_header
*cmd
= (void *)((u8
*)rxbuf
+ sizeof(__le32
));
54 struct ieee80211_hdr
*hdr
= NULL
;
57 if (cmd
->cmd
!= trans
->rx_mpdu_cmd
)
60 hdr_offset
= sizeof(struct iwl_cmd_header
) +
61 trans
->rx_mpdu_cmd_hdr_size
;
64 *out_hdr_offset
= hdr_offset
;
66 hdr
= (void *)((u8
*)cmd
+ hdr_offset
);
67 if (!ieee80211_is_data(hdr
->frame_control
))
69 /* maybe try to identify EAPOL frames? */
70 return sizeof(__le32
) + sizeof(*cmd
) + trans
->rx_mpdu_cmd_hdr_size
+
71 ieee80211_hdrlen(hdr
->frame_control
);
74 #include <linux/tracepoint.h>
75 #include <linux/device.h>
78 #if !defined(CONFIG_IWLWIFI_DEVICE_TRACING) || defined(__CHECKER__)
80 #define TRACE_EVENT(name, proto, ...) \
81 static inline void trace_ ## name(proto) {}
82 #undef DECLARE_EVENT_CLASS
83 #define DECLARE_EVENT_CLASS(...)
85 #define DEFINE_EVENT(evt_class, name, proto, ...) \
86 static inline void trace_ ## name(proto) {}
89 #define DEV_ENTRY __string(dev, dev_name(dev))
90 #define DEV_ASSIGN __assign_str(dev)
92 #include "iwl-devtrace-io.h"
93 #include "iwl-devtrace-ucode.h"
94 #include "iwl-devtrace-msg.h"
95 #include "iwl-devtrace-data.h"
96 #include "iwl-devtrace-iwlwifi.h"
98 #ifdef CONFIG_IWLWIFI_DEVICE_TRACING
99 DECLARE_TRACEPOINT(iwlwifi_dev_rx
);
100 DECLARE_TRACEPOINT(iwlwifi_dev_rx_data
);
103 void __trace_iwlwifi_dev_rx(struct iwl_trans
*trans
, void *pkt
, size_t len
);
105 static inline void maybe_trace_iwlwifi_dev_rx(struct iwl_trans
*trans
,
106 void *pkt
, size_t len
)
108 #ifdef CONFIG_IWLWIFI_DEVICE_TRACING
109 if (tracepoint_enabled(iwlwifi_dev_rx
) ||
110 tracepoint_enabled(iwlwifi_dev_rx_data
))
111 __trace_iwlwifi_dev_rx(trans
, pkt
, len
);
114 #endif /* __IWLWIFI_DEVICE_TRACE */