1 /*
2 * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3 * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18 /*
19 * DOC: wlan_hdd_connectivity_logging.c
20 *
21 * Implementation for the Common connectivity and roam logging api.
22 */
23
24 #include "wlan_hdd_connectivity_logging.h"
25
26 #define GET_ATTR_OFFSET(member) \
27 qdf_offsetof(struct wlan_log_record, member)
28
29 #define ATTR_GET_VALUE(type, record, field_offset) \
30 (*(type *)((uint8_t *)record + field_offset))
31
32 /**
33 * struct connectivity_log_attr - Connectivity logging attribute info
34 * @attribute_id: Vendor attribute ID. Defined by enum qca_wlan_vendor_attr_diag
35 * @attribute_type: NL type of the attribute
36 * @attribute_length: Length of the attribute
37 * @field_offset: Field offset
38 */
39 struct connectivity_log_attr {
40 enum qca_wlan_vendor_attr_diag attribute_id;
41 uint8_t attribute_type;
42 uint16_t attribute_length;
43 uint16_t field_offset;
44 };
45
46 static const enum qca_vendor_attr_diag_event_type
47 hdd_connectivity_log_attr_table[WLAN_TAG_MAX] = {
48 [WLAN_CONNECTING] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_CONNECTING,
49 [WLAN_CONNECTING_FAIL] =
50 QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_CONNECTING_FAIL,
51 [WLAN_AUTH_REQ] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_AUTH_REQ,
52 [WLAN_AUTH_RESP] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_AUTH_RESP,
53 [WLAN_ASSOC_REQ] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_ASSOC_REQ,
54 [WLAN_ASSOC_RSP] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_ASSOC_RESP,
55 [WLAN_REASSOC_REQ] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_REASSOC_REQ,
56 [WLAN_REASSOC_RSP] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_REASSOC_RES,
57 [WLAN_DEAUTH_RX] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_DEAUTH_RX,
58 [WLAN_DEAUTH_TX] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_DEAUTH_TX,
59 [WLAN_DISASSOC_RX] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_DISASSOC_RX,
60 [WLAN_DISASSOC_TX] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_DISASSOC_TX,
61 [WLAN_DISCONN_BMISS] =
62 QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_BEACON_LOSS_DISCONN,
63 [WLAN_ROAM_SCAN_START] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_ROAM_SCAN_START,
64 [WLAN_ROAM_SCAN_DONE] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_ROAM_SCAN_DONE,
65 [WLAN_ROAM_SCORE_CURR_AP] =
66 QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_ROAM_SCORE_CURR_AP,
67 [WLAN_ROAM_SCORE_CAND_AP] =
68 QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_ROAM_SCORE_CAND_AP,
69 [WLAN_ROAM_RESULT] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_ROAM_RESULT,
70 [WLAN_ROAM_CANCEL] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_ROAM_CANCEL,
71 [WLAN_BTM_REQ] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_BTM_REQ,
72 [WLAN_BTM_QUERY] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_BTM_QUERY,
73 [WLAN_BTM_RESP] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_BTM_RESP,
74 [WLAN_BTM_REQ_CANDI] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_BTM_REQ_CANDI,
75 [WLAN_ROAM_WTC] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_BTM_WTC,
76 [WLAN_DHCP_DISCOVER] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_DHCP_DISCOVER,
77 [WLAN_DHCP_OFFER] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_DHCP_OFFER,
78 [WLAN_DHCP_REQUEST] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_DHCP_REQUEST,
79 [WLAN_DHCP_ACK] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_DHCP_ACK,
80 [WLAN_DHCP_NACK] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_DHCP_NACK,
81 [WLAN_EAPOL_M1] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_EAPOL_M1,
82 [WLAN_EAPOL_M2] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_EAPOL_M2,
83 [WLAN_EAPOL_M3] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_EAPOL_M3,
84 [WLAN_EAPOL_M4] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_EAPOL_M4,
85 [WLAN_GTK_M1] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_GTK_M1,
86 [WLAN_GTK_M2] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_GTK_M2,
87 [WLAN_EAP_REQUEST] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_EAP_REQUEST,
88 [WLAN_EAP_RESPONSE] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_EAP_RESPONSE,
89 [WLAN_EAP_SUCCESS] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_EAP_SUCCESS,
90 [WLAN_EAP_FAILURE] = QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_EAP_FAILURE,
91 };
92
93 #define WLAN_CONNECTIVITY_ATTR_END (QCA_WLAN_VENDOR_ATTR_DIAG_MAX + 1)
94
95 static const struct connectivity_log_attr
96 connectivity_attr_table[QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_MAX + 1]
97 [WLAN_CONNECTIVITY_ATTR_END] = {
98 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_CONNECTING] = {
99 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
100 GET_ATTR_OFFSET(log_subtype)},
101 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
102 GET_ATTR_OFFSET(timestamp_us)},
103 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
104 GET_ATTR_OFFSET(ktime_us)},
105 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
106 GET_ATTR_OFFSET(vdev_id)},
107 {QCA_WLAN_VENDOR_ATTR_DIAG_SSID, NLA_BINARY,
108 GET_ATTR_OFFSET(conn_info.ssid_len), GET_ATTR_OFFSET(conn_info.ssid)},
109 {QCA_WLAN_VENDOR_ATTR_DIAG_BSSID, NLA_BINARY, QDF_MAC_ADDR_SIZE,
110 GET_ATTR_OFFSET(bssid)},
111 {QCA_WLAN_VENDOR_ATTR_DIAG_BSSID_HINT, NLA_BINARY, QDF_MAC_ADDR_SIZE,
112 GET_ATTR_OFFSET(conn_info.bssid_hint)},
113 {QCA_WLAN_VENDOR_ATTR_DIAG_FREQ, NLA_U16, sizeof(uint16_t),
114 GET_ATTR_OFFSET(conn_info.freq)},
115 {QCA_WLAN_VENDOR_ATTR_DIAG_FREQ_HINT, NLA_U16, sizeof(uint16_t),
116 GET_ATTR_OFFSET(conn_info.freq_hint)},
117 {QCA_WLAN_VENDOR_ATTR_DIAG_PAIRWISE_SUITE, NLA_U32, sizeof(uint32_t),
118 GET_ATTR_OFFSET(conn_info.pairwise)},
119 {QCA_WLAN_VENDOR_ATTR_DIAG_AKM, NLA_U32, sizeof(uint32_t),
120 GET_ATTR_OFFSET(conn_info.akm)},
121 {QCA_WLAN_VENDOR_ATTR_DIAG_GROUP_SUITE, NLA_U32, sizeof(uint32_t),
122 GET_ATTR_OFFSET(conn_info.group)},
123 {QCA_WLAN_VENDOR_ATTR_DIAG_GROUP_MGMT_SUITE, NLA_U32, sizeof(uint32_t),
124 GET_ATTR_OFFSET(conn_info.group_mgmt)},
125 {QCA_WLAN_VENDOR_ATTR_DIAG_AUTH_ALGO, NLA_U8, sizeof(uint8_t),
126 GET_ATTR_OFFSET(conn_info.auth_type)},
127 {QCA_WLAN_VENDOR_ATTR_DIAG_BT_COEX_ACTIVE, NLA_FLAG, sizeof(uint8_t),
128 GET_ATTR_OFFSET(conn_info.is_bt_coex_active)},
129 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
130 },
131
132 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_CONNECTING_FAIL] = {
133 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
134 GET_ATTR_OFFSET(log_subtype)},
135 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
136 GET_ATTR_OFFSET(timestamp_us)},
137 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
138 GET_ATTR_OFFSET(ktime_us)},
139 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
140 GET_ATTR_OFFSET(vdev_id)},
141 {QCA_WLAN_VENDOR_ATTR_DIAG_BSSID, NLA_BINARY, QDF_MAC_ADDR_SIZE,
142 GET_ATTR_OFFSET(bssid)},
143 {QCA_WLAN_VENDOR_ATTR_DIAG_FREQ, NLA_U16, sizeof(uint16_t),
144 GET_ATTR_OFFSET(conn_info.freq)},
145 {QCA_WLAN_VENDOR_ATTR_DIAG_REASON_CODE, NLA_U16, sizeof(uint16_t),
146 GET_ATTR_OFFSET(conn_info.conn_status)},
147 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
148 },
149
150 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_AUTH_REQ] = {
151 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
152 GET_ATTR_OFFSET(log_subtype)},
153 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
154 GET_ATTR_OFFSET(timestamp_us)},
155 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
156 GET_ATTR_OFFSET(ktime_us)},
157 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
158 GET_ATTR_OFFSET(vdev_id)},
159 {QCA_WLAN_VENDOR_ATTR_DIAG_BSSID, NLA_BINARY, QDF_MAC_ADDR_SIZE,
160 GET_ATTR_OFFSET(bssid)},
161 {QCA_WLAN_VENDOR_ATTR_DIAG_RSSI, NLA_S32, sizeof(int32_t),
162 GET_ATTR_OFFSET(pkt_info.rssi)},
163 {QCA_WLAN_VENDOR_ATTR_DIAG_AUTH_ALGO, NLA_U8, sizeof(uint8_t),
164 GET_ATTR_OFFSET(pkt_info.auth_algo)},
165 {QCA_WLAN_VENDOR_ATTR_DIAG_SAE_AUTH_FRAME_TYPE, NLA_U8, sizeof(uint8_t),
166 GET_ATTR_OFFSET(pkt_info.auth_type)},
167 {QCA_WLAN_VENDOR_ATTR_DIAG_SEQUENCE_NUMBER, NLA_U16, sizeof(uint16_t),
168 GET_ATTR_OFFSET(pkt_info.seq_num)},
169 {QCA_WLAN_VENDOR_ATTR_DIAG_STATUS_CODE, NLA_U8, sizeof(uint8_t),
170 GET_ATTR_OFFSET(pkt_info.frame_status_code)},
171 {QCA_WLAN_VENDOR_ATTR_DIAG_FRAME_TX_STATUS, NLA_U8, sizeof(uint8_t),
172 GET_ATTR_OFFSET(pkt_info.tx_status)},
173 {QCA_WLAN_VENDOR_ATTR_DIAG_IS_RETRY_FRAME, NLA_FLAG, sizeof(uint8_t),
174 GET_ATTR_OFFSET(pkt_info.is_retry_frame)},
175 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
176 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
177 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
178 },
179
180 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_AUTH_RESP] = {
181 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
182 GET_ATTR_OFFSET(log_subtype)},
183 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
184 GET_ATTR_OFFSET(timestamp_us)},
185 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
186 GET_ATTR_OFFSET(ktime_us)},
187 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
188 GET_ATTR_OFFSET(vdev_id)},
189 {QCA_WLAN_VENDOR_ATTR_DIAG_BSSID, NLA_BINARY, QDF_MAC_ADDR_SIZE,
190 GET_ATTR_OFFSET(bssid)},
191 {QCA_WLAN_VENDOR_ATTR_DIAG_AUTH_ALGO, NLA_U8, sizeof(uint8_t),
192 GET_ATTR_OFFSET(pkt_info.auth_algo)},
193 {QCA_WLAN_VENDOR_ATTR_DIAG_SAE_AUTH_FRAME_TYPE, NLA_U8, sizeof(uint8_t),
194 GET_ATTR_OFFSET(pkt_info.auth_type)},
195 {QCA_WLAN_VENDOR_ATTR_DIAG_SEQUENCE_NUMBER, NLA_U16, sizeof(uint16_t),
196 GET_ATTR_OFFSET(pkt_info.seq_num)},
197 {QCA_WLAN_VENDOR_ATTR_DIAG_STATUS_CODE, NLA_U8, sizeof(uint8_t),
198 GET_ATTR_OFFSET(pkt_info.frame_status_code)},
199 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
200 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
201 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
202 },
203
204 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_ASSOC_REQ] = {
205 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
206 GET_ATTR_OFFSET(log_subtype)},
207 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
208 GET_ATTR_OFFSET(timestamp_us)},
209 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
210 GET_ATTR_OFFSET(ktime_us)},
211 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
212 GET_ATTR_OFFSET(vdev_id)},
213 {QCA_WLAN_VENDOR_ATTR_DIAG_BSSID, NLA_BINARY, QDF_MAC_ADDR_SIZE,
214 GET_ATTR_OFFSET(bssid)},
215 {QCA_WLAN_VENDOR_ATTR_DIAG_RSSI, NLA_S32, sizeof(int32_t),
216 GET_ATTR_OFFSET(pkt_info.rssi)},
217 {QCA_WLAN_VENDOR_ATTR_DIAG_SEQUENCE_NUMBER, NLA_U16, sizeof(uint16_t),
218 GET_ATTR_OFFSET(pkt_info.seq_num)},
219 {QCA_WLAN_VENDOR_ATTR_DIAG_FRAME_TX_STATUS, NLA_U8, sizeof(uint8_t),
220 GET_ATTR_OFFSET(pkt_info.tx_status)},
221 {QCA_WLAN_VENDOR_ATTR_DIAG_IS_RETRY_FRAME, NLA_FLAG, sizeof(uint8_t),
222 GET_ATTR_OFFSET(pkt_info.is_retry_frame)},
223 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
224 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
225 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
226 },
227
228 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_ASSOC_RESP] = {
229 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
230 GET_ATTR_OFFSET(log_subtype)},
231 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
232 GET_ATTR_OFFSET(timestamp_us)},
233 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
234 GET_ATTR_OFFSET(ktime_us)},
235 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
236 GET_ATTR_OFFSET(vdev_id)},
237 {QCA_WLAN_VENDOR_ATTR_DIAG_BSSID, NLA_BINARY, QDF_MAC_ADDR_SIZE,
238 GET_ATTR_OFFSET(bssid)},
239 {QCA_WLAN_VENDOR_ATTR_DIAG_SEQUENCE_NUMBER, NLA_U16, sizeof(uint16_t),
240 GET_ATTR_OFFSET(pkt_info.seq_num)},
241 {QCA_WLAN_VENDOR_ATTR_DIAG_STATUS_CODE, NLA_U8, sizeof(uint8_t),
242 GET_ATTR_OFFSET(pkt_info.frame_status_code)},
243 {QCA_WLAN_VENDOR_ATTR_DIAG_ASSOC_ID, NLA_U16, sizeof(uint16_t),
244 GET_ATTR_OFFSET(pkt_info.assoc_id)},
245 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
246 },
247
248 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_REASSOC_REQ] = {
249 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
250 GET_ATTR_OFFSET(log_subtype)},
251 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
252 GET_ATTR_OFFSET(timestamp_us)},
253 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
254 GET_ATTR_OFFSET(ktime_us)},
255 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
256 GET_ATTR_OFFSET(vdev_id)},
257 {QCA_WLAN_VENDOR_ATTR_DIAG_BSSID, NLA_BINARY, QDF_MAC_ADDR_SIZE,
258 GET_ATTR_OFFSET(bssid)},
259 {QCA_WLAN_VENDOR_ATTR_DIAG_RSSI, NLA_S32, sizeof(int32_t),
260 GET_ATTR_OFFSET(pkt_info.rssi)},
261 {QCA_WLAN_VENDOR_ATTR_DIAG_SEQUENCE_NUMBER, NLA_U16, sizeof(uint16_t),
262 GET_ATTR_OFFSET(pkt_info.seq_num)},
263 {QCA_WLAN_VENDOR_ATTR_DIAG_FRAME_TX_STATUS, NLA_U8, sizeof(uint8_t),
264 GET_ATTR_OFFSET(pkt_info.tx_status)},
265 {QCA_WLAN_VENDOR_ATTR_DIAG_IS_RETRY_FRAME, NLA_FLAG, sizeof(uint8_t),
266 GET_ATTR_OFFSET(pkt_info.is_retry_frame)},
267 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
268 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
269 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
270 },
271
272 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_REASSOC_RES] = {
273 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
274 GET_ATTR_OFFSET(log_subtype)},
275 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
276 GET_ATTR_OFFSET(timestamp_us)},
277 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
278 GET_ATTR_OFFSET(ktime_us)},
279 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
280 GET_ATTR_OFFSET(vdev_id)},
281 {QCA_WLAN_VENDOR_ATTR_DIAG_BSSID, NLA_BINARY, QDF_MAC_ADDR_SIZE,
282 GET_ATTR_OFFSET(bssid)},
283 {QCA_WLAN_VENDOR_ATTR_DIAG_SEQUENCE_NUMBER, NLA_U16, sizeof(uint16_t),
284 GET_ATTR_OFFSET(pkt_info.seq_num)},
285 {QCA_WLAN_VENDOR_ATTR_DIAG_STATUS_CODE, NLA_U8, sizeof(uint8_t),
286 GET_ATTR_OFFSET(pkt_info.frame_status_code)},
287 {QCA_WLAN_VENDOR_ATTR_DIAG_ASSOC_ID, NLA_U16, sizeof(uint16_t),
288 GET_ATTR_OFFSET(pkt_info.assoc_id)},
289 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
290 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
291 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
292 },
293
294 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_DEAUTH_RX] = {
295 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
296 GET_ATTR_OFFSET(log_subtype)},
297 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
298 GET_ATTR_OFFSET(timestamp_us)},
299 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
300 GET_ATTR_OFFSET(ktime_us)},
301 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
302 GET_ATTR_OFFSET(vdev_id)},
303 {QCA_WLAN_VENDOR_ATTR_DIAG_BSSID, NLA_BINARY, QDF_MAC_ADDR_SIZE,
304 GET_ATTR_OFFSET(bssid)},
305 {QCA_WLAN_VENDOR_ATTR_DIAG_RSSI, NLA_S32, sizeof(int32_t),
306 GET_ATTR_OFFSET(pkt_info.rssi)},
307 {QCA_WLAN_VENDOR_ATTR_DIAG_SEQUENCE_NUMBER, NLA_U16, sizeof(uint16_t),
308 GET_ATTR_OFFSET(pkt_info.seq_num)},
309 {QCA_WLAN_VENDOR_ATTR_DIAG_REASON_CODE, NLA_U16, sizeof(uint16_t),
310 GET_ATTR_OFFSET(pkt_info.frame_status_code)},
311 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
312 },
313
314 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_DEAUTH_TX] = {
315 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
316 GET_ATTR_OFFSET(log_subtype)},
317 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
318 GET_ATTR_OFFSET(timestamp_us)},
319 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
320 GET_ATTR_OFFSET(ktime_us)},
321 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
322 GET_ATTR_OFFSET(vdev_id)},
323 {QCA_WLAN_VENDOR_ATTR_DIAG_BSSID, NLA_BINARY, QDF_MAC_ADDR_SIZE,
324 GET_ATTR_OFFSET(bssid)},
325 {QCA_WLAN_VENDOR_ATTR_DIAG_RSSI, NLA_S32, sizeof(int32_t),
326 GET_ATTR_OFFSET(pkt_info.rssi)},
327 {QCA_WLAN_VENDOR_ATTR_DIAG_SEQUENCE_NUMBER, NLA_U16, sizeof(uint16_t),
328 GET_ATTR_OFFSET(pkt_info.seq_num)},
329 {QCA_WLAN_VENDOR_ATTR_DIAG_REASON_CODE, NLA_U16, sizeof(uint16_t),
330 GET_ATTR_OFFSET(pkt_info.frame_status_code)},
331 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
332 },
333
334 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_DISASSOC_RX] = {
335 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
336 GET_ATTR_OFFSET(log_subtype)},
337 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
338 GET_ATTR_OFFSET(timestamp_us)},
339 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
340 GET_ATTR_OFFSET(ktime_us)},
341 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
342 GET_ATTR_OFFSET(vdev_id)},
343 {QCA_WLAN_VENDOR_ATTR_DIAG_BSSID, NLA_BINARY, QDF_MAC_ADDR_SIZE,
344 GET_ATTR_OFFSET(bssid)},
345 {QCA_WLAN_VENDOR_ATTR_DIAG_RSSI, NLA_S32, sizeof(int32_t),
346 GET_ATTR_OFFSET(pkt_info.rssi)},
347 {QCA_WLAN_VENDOR_ATTR_DIAG_SEQUENCE_NUMBER, NLA_U16, sizeof(uint16_t),
348 GET_ATTR_OFFSET(pkt_info.seq_num)},
349 {QCA_WLAN_VENDOR_ATTR_DIAG_REASON_CODE, NLA_U16, sizeof(uint16_t),
350 GET_ATTR_OFFSET(pkt_info.frame_status_code)},
351 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
352 },
353
354 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_DISASSOC_TX] = {
355 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
356 GET_ATTR_OFFSET(log_subtype)},
357 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
358 GET_ATTR_OFFSET(timestamp_us)},
359 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
360 GET_ATTR_OFFSET(ktime_us)},
361 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
362 GET_ATTR_OFFSET(vdev_id)},
363 {QCA_WLAN_VENDOR_ATTR_DIAG_BSSID, NLA_BINARY, QDF_MAC_ADDR_SIZE,
364 GET_ATTR_OFFSET(bssid)},
365 {QCA_WLAN_VENDOR_ATTR_DIAG_RSSI, NLA_S32, sizeof(int32_t),
366 GET_ATTR_OFFSET(pkt_info.rssi)},
367 {QCA_WLAN_VENDOR_ATTR_DIAG_SEQUENCE_NUMBER, NLA_U16, sizeof(uint16_t),
368 GET_ATTR_OFFSET(pkt_info.seq_num)},
369 {QCA_WLAN_VENDOR_ATTR_DIAG_REASON_CODE, NLA_U16, sizeof(uint16_t),
370 GET_ATTR_OFFSET(pkt_info.frame_status_code)},
371 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
372 },
373
374 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_BEACON_LOSS_DISCONN] = {
375 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
376 GET_ATTR_OFFSET(log_subtype)},
377 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
378 GET_ATTR_OFFSET(timestamp_us)},
379 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
380 GET_ATTR_OFFSET(ktime_us)},
381 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
382 GET_ATTR_OFFSET(vdev_id)},
383 {QCA_WLAN_VENDOR_ATTR_DIAG_BSSID, NLA_BINARY, QDF_MAC_ADDR_SIZE,
384 GET_ATTR_OFFSET(bssid)},
385 {QCA_WLAN_VENDOR_ATTR_DIAG_RSSI, NLA_S32, sizeof(int32_t),
386 GET_ATTR_OFFSET(pkt_info.rssi)},
387 {QCA_WLAN_VENDOR_ATTR_DIAG_REASON_CODE, NLA_U16, sizeof(uint16_t),
388 GET_ATTR_OFFSET(pkt_info.frame_status_code)},
389 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
390 },
391
392 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_ROAM_SCAN_START] = {
393 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
394 GET_ATTR_OFFSET(log_subtype)},
395 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
396 GET_ATTR_OFFSET(timestamp_us)},
397 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
398 GET_ATTR_OFFSET(ktime_us)},
399 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
400 GET_ATTR_OFFSET(vdev_id)},
401 {QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_TRIGGER_REASON, NLA_U8,
402 sizeof(uint8_t), GET_ATTR_OFFSET(roam_trig.trigger_reason)},
403 {QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_TRIGGER_SUB_REASON, NLA_U8,
404 sizeof(uint8_t), GET_ATTR_OFFSET(roam_trig.trigger_sub_reason)},
405 {QCA_WLAN_VENDOR_ATTR_DIAG_RSSI, NLA_S32, sizeof(int32_t),
406 GET_ATTR_OFFSET(roam_trig.current_rssi)},
407 {QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_CU, NLA_U8, sizeof(uint8_t),
408 GET_ATTR_OFFSET(roam_trig.cu_load)},
409 {QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_SCAN_TYPE, NLA_U8, sizeof(uint8_t),
410 GET_ATTR_OFFSET(roam_trig.is_full_scan)},
411 {QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_RSSI_THRESHOLD, NLA_S32,
412 sizeof(int32_t), GET_ATTR_OFFSET(roam_trig.rssi_threshold)},
413 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
414 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
415 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
416 },
417
418 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_ROAM_SCAN_DONE] = {
419 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
420 GET_ATTR_OFFSET(log_subtype)},
421 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
422 GET_ATTR_OFFSET(timestamp_us)},
423 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
424 GET_ATTR_OFFSET(ktime_us)},
425 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
426 GET_ATTR_OFFSET(vdev_id)},
427 {QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_AP_COUNT, NLA_U8, sizeof(uint8_t),
428 GET_ATTR_OFFSET(roam_scan.cand_ap_count)},
429 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
430 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
431 {QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_FREQ_LIST, NLA_NESTED, sizeof(uint16_t),
432 GET_ATTR_OFFSET(roam_scan.scan_freq)},
433 {QCA_WLAN_VENDOR_ATTR_DIAG_BT_COEX_ACTIVE, NLA_FLAG, sizeof(uint8_t),
434 GET_ATTR_OFFSET(roam_scan.is_btcoex_active)},
435 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
436 },
437
438 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_ROAM_SCORE_CURR_AP] = {
439 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
440 GET_ATTR_OFFSET(log_subtype)},
441 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64,
442 sizeof(uint64_t), GET_ATTR_OFFSET(timestamp_us)},
443 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
444 GET_ATTR_OFFSET(ktime_us)},
445 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
446 GET_ATTR_OFFSET(vdev_id)},
447 {QCA_WLAN_VENDOR_ATTR_DIAG_BSSID, NLA_BINARY, QDF_MAC_ADDR_SIZE,
448 GET_ATTR_OFFSET(ap.cand_bssid)},
449 {QCA_WLAN_VENDOR_ATTR_DIAG_FREQ, NLA_U16, sizeof(uint16_t),
450 GET_ATTR_OFFSET(ap.freq)},
451 {QCA_WLAN_VENDOR_ATTR_DIAG_RSSI, NLA_S32, sizeof(int32_t),
452 GET_ATTR_OFFSET(ap.rssi)},
453 {QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_CU, NLA_U8, sizeof(uint8_t),
454 GET_ATTR_OFFSET(ap.cu_load)},
455 {QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_SCORE, NLA_U16, sizeof(uint16_t),
456 GET_ATTR_OFFSET(ap.total_score)},
457 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
458 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
459 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
460 },
461
462 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_ROAM_SCORE_CAND_AP] = {
463 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
464 GET_ATTR_OFFSET(log_subtype)},
465 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
466 GET_ATTR_OFFSET(timestamp_us)},
467 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
468 GET_ATTR_OFFSET(ktime_us)},
469 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
470 GET_ATTR_OFFSET(vdev_id)},
471 {QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_AP_RANK, NLA_U8, sizeof(uint8_t),
472 GET_ATTR_OFFSET(ap.idx)},
473 {QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_CU, NLA_U8, sizeof(uint8_t),
474 GET_ATTR_OFFSET(ap.cu_load)},
475 {QCA_WLAN_VENDOR_ATTR_DIAG_BSSID, NLA_BINARY, QDF_MAC_ADDR_SIZE,
476 GET_ATTR_OFFSET(ap.cand_bssid)},
477 {QCA_WLAN_VENDOR_ATTR_DIAG_FREQ, NLA_U16, sizeof(uint16_t),
478 GET_ATTR_OFFSET(ap.freq)},
479 {QCA_WLAN_VENDOR_ATTR_DIAG_RSSI, NLA_S32, sizeof(int32_t),
480 GET_ATTR_OFFSET(ap.rssi)},
481 {QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_SCORE, NLA_U16, sizeof(uint16_t),
482 GET_ATTR_OFFSET(ap.total_score)},
483 {QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_AP_ETP, NLA_U32, sizeof(uint32_t),
484 GET_ATTR_OFFSET(ap.etp)},
485 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
486 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
487 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
488 },
489
490 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_ROAM_RESULT] = {
491 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
492 GET_ATTR_OFFSET(log_subtype)},
493 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
494 GET_ATTR_OFFSET(timestamp_us)},
495 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
496 GET_ATTR_OFFSET(ktime_us)},
497 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
498 GET_ATTR_OFFSET(vdev_id)},
499 {QCA_WLAN_VENDOR_ATTR_DIAG_BSSID, NLA_BINARY, QDF_MAC_ADDR_SIZE,
500 GET_ATTR_OFFSET(bssid)},
501 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
502 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
503 {QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_SUCCESSFUL, NLA_FLAG,
504 sizeof(uint8_t), GET_ATTR_OFFSET(roam_result.is_roam_successful)},
505 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
506 },
507
508 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_ROAM_CANCEL] = {
509 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
510 GET_ATTR_OFFSET(log_subtype)},
511 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
512 GET_ATTR_OFFSET(timestamp_us)},
513 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
514 GET_ATTR_OFFSET(ktime_us)},
515 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
516 GET_ATTR_OFFSET(vdev_id)},
517 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
518 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
519 {QCA_WLAN_VENDOR_ATTR_DIAG_REASON_CODE, NLA_U16, sizeof(uint16_t),
520 GET_ATTR_OFFSET(roam_result.roam_fail_reason)},
521 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
522 },
523
524 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_BTM_QUERY] = {
525 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
526 GET_ATTR_OFFSET(log_subtype)},
527 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
528 GET_ATTR_OFFSET(timestamp_us)},
529 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
530 GET_ATTR_OFFSET(ktime_us)},
531 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
532 GET_ATTR_OFFSET(vdev_id)},
533 {QCA_WLAN_VENDOR_ATTR_DIAG_BTM_TOKEN, NLA_U8, sizeof(uint8_t),
534 GET_ATTR_OFFSET(btm_info.token)},
535 {QCA_WLAN_VENDOR_ATTR_DIAG_BTM_QUERY_REASON, NLA_U8, sizeof(uint8_t),
536 GET_ATTR_OFFSET(btm_info.reason)},
537 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
538 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
539 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
540 },
541
542 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_BTM_REQ] = {
543 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
544 GET_ATTR_OFFSET(log_subtype)},
545 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
546 GET_ATTR_OFFSET(timestamp_us)},
547 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
548 GET_ATTR_OFFSET(ktime_us)},
549 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
550 GET_ATTR_OFFSET(vdev_id)},
551 {QCA_WLAN_VENDOR_ATTR_DIAG_BTM_TOKEN, NLA_U8, sizeof(uint8_t),
552 GET_ATTR_OFFSET(btm_info.token)},
553 {QCA_WLAN_VENDOR_ATTR_DIAG_BTM_MODE, NLA_U8, sizeof(uint8_t),
554 GET_ATTR_OFFSET(btm_info.mode)},
555 {QCA_WLAN_VENDOR_ATTR_DIAG_BTM_DISASSOC_TIMER, NLA_U16,
556 sizeof(uint16_t), GET_ATTR_OFFSET(btm_info.disassoc_timer)},
557 {QCA_WLAN_VENDOR_ATTR_DIAG_BTM_VALIDITY_INTERVAL, NLA_U8,
558 sizeof(uint8_t), GET_ATTR_OFFSET(btm_info.validity_timer)},
559 {QCA_WLAN_VENDOR_ATTR_DIAG_BTM_CANDIDATE_LIST_COUNT, NLA_U8,
560 sizeof(uint8_t), GET_ATTR_OFFSET(btm_info.candidate_list_count)},
561 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
562 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
563 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
564 },
565
566 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_BTM_WTC] = {
567 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
568 GET_ATTR_OFFSET(log_subtype)},
569 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
570 GET_ATTR_OFFSET(timestamp_us)},
571 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
572 GET_ATTR_OFFSET(ktime_us)},
573 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
574 GET_ATTR_OFFSET(vdev_id)},
575 {QCA_WLAN_VENDOR_ATTR_DIAG_REASON_CODE, NLA_U16, sizeof(uint16_t),
576 GET_ATTR_OFFSET(btm_info.reason)},
577 {QCA_WLAN_VENDOR_ATTR_DIAG_BTM_WTC_SUB_REASON_CODE, NLA_U8,
578 sizeof(uint8_t), GET_ATTR_OFFSET(btm_info.sub_reason)},
579 {QCA_WLAN_VENDOR_ATTR_DIAG_BTM_WTC_DURATION, NLA_U32, sizeof(uint32_t),
580 GET_ATTR_OFFSET(btm_info.wtc_duration)},
581 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
582 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
583 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
584 },
585
586 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_BTM_REQ_CANDI] = {
587 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
588 GET_ATTR_OFFSET(log_subtype)},
589 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
590 GET_ATTR_OFFSET(timestamp_us)},
591 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
592 GET_ATTR_OFFSET(ktime_us)},
593 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
594 GET_ATTR_OFFSET(vdev_id)},
595 {QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_AP_RANK, NLA_U8, sizeof(uint8_t),
596 GET_ATTR_OFFSET(btm_cand.idx)},
597 {QCA_WLAN_VENDOR_ATTR_DIAG_BSSID, NLA_BINARY, QDF_MAC_ADDR_SIZE,
598 GET_ATTR_OFFSET(btm_cand.bssid)},
599 {QCA_WLAN_VENDOR_ATTR_DIAG_BTM_PREFERENCE, NLA_U8, sizeof(uint8_t),
600 GET_ATTR_OFFSET(btm_cand.preference)},
601 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
602 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
603 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
604 },
605
606 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_BTM_RESP] = {
607 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
608 GET_ATTR_OFFSET(log_subtype)},
609 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
610 GET_ATTR_OFFSET(timestamp_us)},
611 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
612 GET_ATTR_OFFSET(ktime_us)},
613 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
614 GET_ATTR_OFFSET(vdev_id)},
615 {QCA_WLAN_VENDOR_ATTR_DIAG_BTM_TOKEN, NLA_U8, sizeof(uint8_t),
616 GET_ATTR_OFFSET(btm_info.token)},
617 {QCA_WLAN_VENDOR_ATTR_DIAG_BTM_STATUS_CODE, NLA_U8, sizeof(uint8_t),
618 GET_ATTR_OFFSET(btm_info.btm_status_code)},
619 {QCA_WLAN_VENDOR_ATTR_DIAG_BTM_DELAY, NLA_U8, sizeof(uint8_t),
620 GET_ATTR_OFFSET(btm_info.btm_delay)},
621 {QCA_WLAN_VENDOR_ATTR_DIAG_BTM_TARGET_BSSID, NLA_BINARY,
622 QDF_MAC_ADDR_SIZE, GET_ATTR_OFFSET(btm_info.target_bssid)},
623 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
624 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
625 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
626 },
627
628 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_DHCP_DISCOVER] = {
629 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
630 GET_ATTR_OFFSET(log_subtype)},
631 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
632 GET_ATTR_OFFSET(timestamp_us)},
633 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
634 GET_ATTR_OFFSET(ktime_us)},
635 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
636 GET_ATTR_OFFSET(vdev_id)},
637 {QCA_WLAN_VENDOR_ATTR_DIAG_FRAME_TX_STATUS, NLA_U8, sizeof(uint8_t),
638 GET_ATTR_OFFSET(pkt_info.tx_status)},
639 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
640 },
641
642 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_DHCP_OFFER] = {
643 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
644 GET_ATTR_OFFSET(log_subtype)},
645 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
646 GET_ATTR_OFFSET(timestamp_us)},
647 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
648 GET_ATTR_OFFSET(ktime_us)},
649 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
650 GET_ATTR_OFFSET(vdev_id)},
651 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
652 },
653
654 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_DHCP_REQUEST] = {
655 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
656 GET_ATTR_OFFSET(log_subtype)},
657 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
658 GET_ATTR_OFFSET(timestamp_us)},
659 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
660 GET_ATTR_OFFSET(ktime_us)},
661 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
662 GET_ATTR_OFFSET(vdev_id)},
663 {QCA_WLAN_VENDOR_ATTR_DIAG_FRAME_TX_STATUS, NLA_U8, sizeof(uint8_t),
664 GET_ATTR_OFFSET(pkt_info.tx_status)},
665 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
666 },
667
668 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_DHCP_ACK] = {
669 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
670 GET_ATTR_OFFSET(log_subtype)},
671 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
672 GET_ATTR_OFFSET(timestamp_us)},
673 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
674 GET_ATTR_OFFSET(ktime_us)},
675 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
676 GET_ATTR_OFFSET(vdev_id)},
677 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
678 },
679
680 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_DHCP_NACK] = {
681 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
682 GET_ATTR_OFFSET(log_subtype)},
683 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
684 GET_ATTR_OFFSET(timestamp_us)},
685 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
686 GET_ATTR_OFFSET(ktime_us)},
687 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
688 GET_ATTR_OFFSET(vdev_id)},
689 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
690 },
691
692 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_EAPOL_M1] = {
693 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
694 GET_ATTR_OFFSET(log_subtype)},
695 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
696 GET_ATTR_OFFSET(timestamp_us)},
697 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
698 GET_ATTR_OFFSET(ktime_us)},
699 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
700 GET_ATTR_OFFSET(vdev_id)},
701 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
702 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
703 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
704 },
705
706 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_EAPOL_M2] = {
707 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
708 GET_ATTR_OFFSET(log_subtype)},
709 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
710 GET_ATTR_OFFSET(timestamp_us)},
711 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
712 GET_ATTR_OFFSET(ktime_us)},
713 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
714 GET_ATTR_OFFSET(vdev_id)},
715 {QCA_WLAN_VENDOR_ATTR_DIAG_FRAME_TX_STATUS, NLA_U8, sizeof(uint8_t),
716 GET_ATTR_OFFSET(pkt_info.tx_status)},
717 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
718 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
719 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
720 },
721
722 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_EAPOL_M3] = {
723 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
724 GET_ATTR_OFFSET(log_subtype)},
725 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
726 GET_ATTR_OFFSET(timestamp_us)},
727 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
728 GET_ATTR_OFFSET(ktime_us)},
729 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
730 GET_ATTR_OFFSET(vdev_id)},
731 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
732 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
733 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
734 },
735
736 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_EAPOL_M4] = {
737 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
738 GET_ATTR_OFFSET(log_subtype)},
739 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
740 GET_ATTR_OFFSET(timestamp_us)},
741 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
742 GET_ATTR_OFFSET(ktime_us)},
743 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
744 GET_ATTR_OFFSET(vdev_id)},
745 {QCA_WLAN_VENDOR_ATTR_DIAG_FRAME_TX_STATUS, NLA_U8, sizeof(uint8_t),
746 GET_ATTR_OFFSET(pkt_info.tx_status)},
747 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
748 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
749 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
750 },
751
752 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_GTK_M1] = {
753 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
754 GET_ATTR_OFFSET(log_subtype)},
755 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
756 GET_ATTR_OFFSET(timestamp_us)},
757 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
758 GET_ATTR_OFFSET(ktime_us)},
759 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
760 GET_ATTR_OFFSET(vdev_id)},
761 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
762 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
763 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
764 },
765
766 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_GTK_M2] = {
767 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
768 GET_ATTR_OFFSET(log_subtype)},
769 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
770 GET_ATTR_OFFSET(timestamp_us)},
771 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
772 GET_ATTR_OFFSET(ktime_us)},
773 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
774 GET_ATTR_OFFSET(vdev_id)},
775 {QCA_WLAN_VENDOR_ATTR_DIAG_FRAME_TX_STATUS, NLA_U8, sizeof(uint8_t),
776 GET_ATTR_OFFSET(pkt_info.tx_status)},
777 {QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP, NLA_U64,
778 sizeof(uint64_t), GET_ATTR_OFFSET(fw_timestamp_us)},
779 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
780 },
781
782 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_EAP_REQUEST] = {
783 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
784 GET_ATTR_OFFSET(log_subtype)},
785 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
786 GET_ATTR_OFFSET(timestamp_us)},
787 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
788 GET_ATTR_OFFSET(ktime_us)},
789 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
790 GET_ATTR_OFFSET(vdev_id)},
791 {QCA_WLAN_VENDOR_ATTR_DIAG_EAP_TYPE, NLA_U8, sizeof(uint8_t),
792 GET_ATTR_OFFSET(pkt_info.eap_type)},
793 {QCA_WLAN_VENDOR_ATTR_DIAG_EAP_LEN, NLA_U16, sizeof(uint16_t),
794 GET_ATTR_OFFSET(pkt_info.eap_len)},
795 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
796 },
797
798 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_EAP_RESPONSE] = {
799 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
800 GET_ATTR_OFFSET(log_subtype)},
801 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
802 GET_ATTR_OFFSET(timestamp_us)},
803 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
804 GET_ATTR_OFFSET(ktime_us)},
805 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
806 GET_ATTR_OFFSET(vdev_id)},
807 {QCA_WLAN_VENDOR_ATTR_DIAG_EAP_TYPE, NLA_U8, sizeof(uint8_t),
808 GET_ATTR_OFFSET(pkt_info.eap_type)},
809 {QCA_WLAN_VENDOR_ATTR_DIAG_EAP_LEN, NLA_U16, sizeof(uint16_t),
810 GET_ATTR_OFFSET(pkt_info.eap_len)},
811 {QCA_WLAN_VENDOR_ATTR_DIAG_FRAME_TX_STATUS, NLA_U8, sizeof(uint8_t),
812 GET_ATTR_OFFSET(pkt_info.tx_status)},
813 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
814 },
815
816 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_EAP_SUCCESS] = {
817 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
818 GET_ATTR_OFFSET(log_subtype)},
819 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
820 GET_ATTR_OFFSET(timestamp_us)},
821 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
822 GET_ATTR_OFFSET(ktime_us)},
823 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
824 GET_ATTR_OFFSET(vdev_id)},
825 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
826 },
827
828 [QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_EAP_FAILURE] = {
829 {QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE, NLA_U32, sizeof(uint32_t),
830 GET_ATTR_OFFSET(log_subtype)},
831 {QCA_WLAN_VENDOR_ATTR_DIAG_HOST_TIMESTAMP, NLA_U64, sizeof(uint64_t),
832 GET_ATTR_OFFSET(timestamp_us)},
833 {QCA_WLAN_VENDOR_ATTR_DIAG_KERNEL_TIMESTAMP, NLA_U64, sizeof(uint64_t),
834 GET_ATTR_OFFSET(ktime_us)},
835 {QCA_WLAN_VENDOR_ATTR_DIAG_IFINDEX, NLA_U8, sizeof(uint8_t),
836 GET_ATTR_OFFSET(vdev_id)},
837 {WLAN_CONNECTIVITY_ATTR_END, 0, 0, 0},
838 },
839 };
840
841 #ifdef WLAN_FEATURE_CONNECTIVITY_LOGGING
842 static enum qca_roam_reason
wlan_hdd_convert_roam_reason(enum roam_trigger_reason roam_reason)843 wlan_hdd_convert_roam_reason(enum roam_trigger_reason roam_reason)
844 {
845 switch (roam_reason) {
846 case ROAM_TRIGGER_REASON_PER:
847 return QCA_ROAM_REASON_PER;
848 case ROAM_TRIGGER_REASON_BMISS:
849 return QCA_ROAM_REASON_BEACON_MISS;
850 case ROAM_TRIGGER_REASON_LOW_RSSI:
851 return QCA_ROAM_REASON_POOR_RSSI;
852 case ROAM_TRIGGER_REASON_HIGH_RSSI:
853 return QCA_ROAM_REASON_BETTER_RSSI;
854 case ROAM_TRIGGER_REASON_PERIODIC:
855 return QCA_ROAM_REASON_PERIODIC_TIMER;
856 case ROAM_TRIGGER_REASON_DENSE:
857 return QCA_ROAM_REASON_CONGESTION;
858 case ROAM_TRIGGER_REASON_BACKGROUND:
859 return QCA_ROAM_REASON_BACKGROUND_SCAN;
860 case ROAM_TRIGGER_REASON_FORCED:
861 return QCA_ROAM_REASON_USER_TRIGGER;
862 case ROAM_TRIGGER_REASON_BTM:
863 return QCA_ROAM_REASON_BTM;
864 case ROAM_TRIGGER_REASON_BSS_LOAD:
865 return QCA_ROAM_REASON_BSS_LOAD;
866 case ROAM_TRIGGER_REASON_DEAUTH:
867 return QCA_ROAM_REASON_DISCONNECTION;
868 case ROAM_TRIGGER_REASON_IDLE:
869 return QCA_ROAM_REASON_IDLE;
870 case ROAM_TRIGGER_REASON_WTC_BTM:
871 return QCA_ROAM_REASON_WTC;
872 case ROAM_TRIGGER_REASON_BTC:
873 return QCA_ROAM_REASON_BT_ACTIVITY;
874 default:
875 break;
876 }
877
878 return QCA_ROAM_REASON_UNKNOWN;
879 }
880
881 static enum qca_roam_scan_scheme
wlan_hdd_convert_roam_scan_type(uint8_t roam_scan_type)882 wlan_hdd_convert_roam_scan_type(uint8_t roam_scan_type)
883 {
884 if (roam_scan_type)
885 return QCA_ROAM_SCAN_SCHEME_FULL_SCAN;
886
887 return QCA_ROAM_SCAN_SCHEME_PARTIAL_SCAN;
888 }
889
890 static enum qca_roam_sub_reason
wlan_hdd_get_converted_roam_sub_reason(enum roam_trigger_sub_reason sub_reason)891 wlan_hdd_get_converted_roam_sub_reason(enum roam_trigger_sub_reason sub_reason)
892 {
893 switch (sub_reason) {
894 case ROAM_TRIGGER_SUB_REASON_PERIODIC_TIMER:
895 return QCA_ROAM_SUB_REASON_PERIODIC_TIMER;
896
897 case ROAM_TRIGGER_SUB_REASON_INACTIVITY_TIMER_LOW_RSSI:
898 return QCA_ROAM_SUB_REASON_INACTIVITY_TIMER_LOW_RSSI;
899
900 case ROAM_TRIGGER_SUB_REASON_BTM_DI_TIMER:
901 return QCA_ROAM_SUB_REASON_BTM_DI_TIMER;
902
903 case ROAM_TRIGGER_SUB_REASON_FULL_SCAN:
904 return QCA_ROAM_SUB_REASON_FULL_SCAN;
905
906 case ROAM_TRIGGER_SUB_REASON_LOW_RSSI_PERIODIC:
907 return QCA_ROAM_SUB_REASON_LOW_RSSI_PERIODIC;
908
909 case ROAM_TRIGGER_SUB_REASON_CU_PERIODIC:
910 return QCA_ROAM_SUB_REASON_CU_PERIODIC;
911
912 case ROAM_TRIGGER_SUB_REASON_PERIODIC_TIMER_AFTER_INACTIVITY:
913 return QCA_ROAM_SUB_REASON_PERIODIC_TIMER_AFTER_INACTIVITY_LOW_RSSI;
914
915 case ROAM_TRIGGER_SUB_REASON_PERIODIC_TIMER_AFTER_INACTIVITY_CU:
916 return QCA_ROAM_SUB_REASON_PERIODIC_TIMER_AFTER_INACTIVITY_CU;
917
918 case ROAM_TRIGGER_SUB_REASON_INACTIVITY_TIMER_CU:
919 return QCA_ROAM_SUB_REASON_INACTIVITY_TIMER_CU;
920
921 default:
922 break;
923 }
924
925 return 0;
926 }
927
928 static enum qca_wlan_vendor_tx_status
wlan_hdd_get_converted_tx_status(uint8_t tx_status)929 wlan_hdd_get_converted_tx_status(uint8_t tx_status)
930 {
931 switch (tx_status) {
932 case QDF_TX_RX_STATUS_FW_DISCARD:
933 case QDF_TX_RX_STATUS_INVALID:
934 case QDF_TX_RX_STATUS_DROP:
935 case QDF_TX_RX_STATUS_DOWNLOAD_SUCC:
936 case QDF_TX_RX_STATUS_DEFAULT:
937 default:
938 return QCA_WLAN_VENDOR_TX_STATUS_FAIL;
939 case QDF_TX_RX_STATUS_NO_ACK:
940 return QCA_WLAN_VENDOR_TX_STATUS_NO_ACK;
941 case QDF_TX_RX_STATUS_OK:
942 return QCA_WLAN_VENDOR_TX_STATUS_ACK;
943 }
944
945 return QCA_WLAN_VENDOR_TX_STATUS_FAIL;
946 }
947
948 static uint16_t
wlan_hdd_get_connectivity_log_tlv_len(struct wlan_log_record * rec)949 wlan_hdd_get_connectivity_log_tlv_len(struct wlan_log_record *rec)
950 {
951 uint16_t j, log_evt_type, len = 0;
952 enum qca_wlan_vendor_attr_diag attr_id;
953
954 log_evt_type = hdd_connectivity_log_attr_table[rec->log_subtype];
955 if (log_evt_type >= (QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_MAX + 1))
956 return 0;
957
958 for (j = 0; j < WLAN_CONNECTIVITY_ATTR_END; j++) {
959 attr_id =
960 connectivity_attr_table[log_evt_type][j].attribute_id;
961 if (attr_id == WLAN_CONNECTIVITY_ATTR_END)
962 break;
963
964 if (log_evt_type ==
965 QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_CONNECTING &&
966 attr_id == QCA_WLAN_VENDOR_ATTR_DIAG_FREQ &&
967 !rec->conn_info.freq)
968 continue;
969
970 if (log_evt_type ==
971 QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_CONNECTING &&
972 attr_id == QCA_WLAN_VENDOR_ATTR_DIAG_FREQ_HINT &&
973 !rec->conn_info.freq_hint)
974 continue;
975
976 if (attr_id == QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP &&
977 !rec->fw_timestamp_us)
978 continue;
979
980 if (log_evt_type ==
981 QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_ROAM_SCAN_DONE &&
982 attr_id == QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_FREQ_LIST) {
983 len += nla_total_size(
984 NLMSG_HDRLEN +
985 (rec->roam_scan.num_scanned_freq *
986 sizeof(rec->roam_scan.scan_freq[0])));
987 } else {
988 len += nla_total_size(connectivity_attr_table[
989 log_evt_type][j].attribute_length);
990 }
991 }
992
993 return len;
994 }
995
996 static uint16_t
wlan_hdd_get_connectivity_log_event_len(struct wlan_log_record * rec,uint8_t num_records)997 wlan_hdd_get_connectivity_log_event_len(struct wlan_log_record *rec,
998 uint8_t num_records)
999 {
1000 uint16_t len = 0;
1001 uint8_t i;
1002
1003 for (i = 0; i < num_records; i++)
1004 len += wlan_hdd_get_connectivity_log_tlv_len(&rec[i]);
1005
1006 return len;
1007 }
1008
1009 static QDF_STATUS
wlan_hdd_put_connectivity_logging_data(struct sk_buff * skb,struct wlan_log_record * rec,struct connectivity_log_attr * attribute)1010 wlan_hdd_put_connectivity_logging_data(struct sk_buff *skb,
1011 struct wlan_log_record *rec,
1012 struct connectivity_log_attr *attribute)
1013 {
1014 int errno = 0;
1015 struct qdf_mac_addr bssid = {0};
1016 enum qca_wlan_vendor_attr_diag attribute_id =
1017 attribute->attribute_id;
1018 uint16_t field_offset = attribute->field_offset;
1019
1020 switch (attribute_id) {
1021 case QCA_WLAN_VENDOR_ATTR_DIAG_SSID:
1022 errno = nla_put(skb, attribute_id, rec->conn_info.ssid_len,
1023 rec->conn_info.ssid);
1024
1025 break;
1026 case QCA_WLAN_VENDOR_ATTR_DIAG_BSSID:
1027 bssid = ATTR_GET_VALUE(struct qdf_mac_addr, rec, field_offset);
1028 if (qdf_is_macaddr_zero(&bssid) ||
1029 qdf_is_macaddr_broadcast(&bssid))
1030 break;
1031
1032 errno = nla_put(skb, attribute_id, QDF_MAC_ADDR_SIZE,
1033 bssid.bytes);
1034 break;
1035 case QCA_WLAN_VENDOR_ATTR_DIAG_BSSID_HINT:
1036 if (qdf_is_macaddr_zero(&rec->conn_info.bssid_hint) ||
1037 qdf_is_macaddr_broadcast(&rec->conn_info.bssid_hint))
1038 break;
1039
1040 errno = nla_put(skb, attribute_id, QDF_MAC_ADDR_SIZE,
1041 rec->conn_info.bssid_hint.bytes);
1042 break;
1043 case QCA_WLAN_VENDOR_ATTR_DIAG_BTM_TARGET_BSSID:
1044 bssid = ATTR_GET_VALUE(struct qdf_mac_addr, rec, field_offset);
1045 if (qdf_is_macaddr_zero(&bssid) ||
1046 qdf_is_macaddr_broadcast(&bssid))
1047 break;
1048
1049 errno = nla_put(skb, attribute_id, QDF_MAC_ADDR_SIZE,
1050 bssid.bytes);
1051 break;
1052 default:
1053 break;
1054 }
1055
1056 if (errno) {
1057 hdd_err_rl("Failed to put attribute_id:%d",
1058 attribute->attribute_id);
1059 return QDF_STATUS_E_FAILURE;
1060 }
1061
1062 return QDF_STATUS_SUCCESS;
1063 }
1064
1065 static QDF_STATUS
wlan_hdd_fill_roam_scan_frequencies(struct sk_buff * skb,struct wlan_log_record * rec)1066 wlan_hdd_fill_roam_scan_frequencies(struct sk_buff *skb,
1067 struct wlan_log_record *rec)
1068 {
1069 int errno;
1070 struct nlattr *attr, *attr1;
1071 uint8_t i;
1072 QDF_STATUS status = QDF_STATUS_SUCCESS;
1073
1074 attr = nla_nest_start(
1075 skb, QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_FREQ_LIST);
1076 if (!attr)
1077 return QDF_STATUS_E_FAILURE;
1078
1079 for (i = 0; i < rec->roam_scan.num_scanned_freq; i++) {
1080 attr1 = nla_nest_start(skb, i);
1081 if (!attr1) {
1082 status = QDF_STATUS_E_FAILURE;
1083 break;
1084 }
1085
1086 errno = nla_put_u16(skb, QCA_WLAN_VENDOR_ATTR_DIAG_FREQ,
1087 rec->roam_scan.scan_freq[i]);
1088 if (errno) {
1089 status = qdf_status_from_os_return(errno);
1090 break;
1091 }
1092
1093 nla_nest_end(skb, attr1);
1094 }
1095
1096 nla_nest_end(skb, attr);
1097
1098 return status;
1099 }
1100
1101 static QDF_STATUS
wlan_hdd_fill_connectivity_logging_data(struct sk_buff * skb,struct wlan_log_record * rec)1102 wlan_hdd_fill_connectivity_logging_data(struct sk_buff *skb,
1103 struct wlan_log_record *rec)
1104 {
1105 uint8_t i, val8, attr_val8;
1106 enum qca_wlan_vendor_attr_diag attr_id;
1107 enum qca_vendor_attr_diag_event_type evt_type;
1108 struct connectivity_log_attr attr;
1109 QDF_STATUS status;
1110 int errno;
1111
1112 /*
1113 * Continue to the next event if the Event type is invalid
1114 */
1115 evt_type = hdd_connectivity_log_attr_table[rec->log_subtype];
1116 if (evt_type >= (QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_MAX + 1))
1117 return QDF_STATUS_SUCCESS;
1118
1119 errno = nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE,
1120 evt_type);
1121 if (errno)
1122 return QDF_STATUS_E_FAILURE;
1123
1124 /*
1125 * zeroth index in the attribute table is always
1126 * QCA_WLAN_VENDOR_ATTR_DIAG_EVENT_TYPE. So
1127 * start the loop from first index.
1128 */
1129 for (i = 1; i < WLAN_CONNECTIVITY_ATTR_END; i++) {
1130 attr = connectivity_attr_table[evt_type][i];
1131 attr_id = attr.attribute_id;
1132 if (attr_id == WLAN_CONNECTIVITY_ATTR_END)
1133 break;
1134
1135 if (evt_type == QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_CONNECTING &&
1136 attr_id == QCA_WLAN_VENDOR_ATTR_DIAG_FREQ &&
1137 !rec->conn_info.freq)
1138 continue;
1139
1140 if (evt_type == QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_CONNECTING &&
1141 attr_id == QCA_WLAN_VENDOR_ATTR_DIAG_FREQ_HINT &&
1142 !rec->conn_info.freq_hint)
1143 continue;
1144
1145 if (attr_id == QCA_WLAN_VENDOR_ATTR_DIAG_FIRMWARE_TIMESTAMP &&
1146 !rec->fw_timestamp_us)
1147 continue;
1148
1149 if (evt_type ==
1150 QCA_WLAN_VENDOR_DIAG_EVENT_TYPE_ROAM_SCAN_DONE &&
1151 attr_id == QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_FREQ_LIST) {
1152 status = wlan_hdd_fill_roam_scan_frequencies(skb, rec);
1153 if (QDF_IS_STATUS_ERROR(status))
1154 continue;
1155 }
1156
1157 switch (attr.attribute_type) {
1158 case NLA_U8:
1159 val8 = ATTR_GET_VALUE(uint8_t, rec, attr.field_offset);
1160 attr_val8 = val8;
1161 if (attr.attribute_id ==
1162 QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_TRIGGER_SUB_REASON)
1163 attr_val8 = wlan_hdd_get_converted_roam_sub_reason(val8);
1164 else if (attr.attribute_id ==
1165 QCA_WLAN_VENDOR_ATTR_DIAG_FRAME_TX_STATUS)
1166 attr_val8 = wlan_hdd_get_converted_tx_status(val8);
1167 else if (attr.attribute_id ==
1168 QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_TRIGGER_REASON)
1169 attr_val8 = wlan_hdd_convert_roam_reason(val8);
1170 else if (attr.attribute_id ==
1171 QCA_WLAN_VENDOR_ATTR_DIAG_ROAM_SCAN_TYPE)
1172 attr_val8 = wlan_hdd_convert_roam_scan_type(val8);
1173
1174 errno = nla_put_u8(skb, attr.attribute_id, attr_val8);
1175 break;
1176 case NLA_U16:
1177 errno = nla_put_u16(skb, attr.attribute_id,
1178 ATTR_GET_VALUE(uint16_t, rec,
1179 attr.field_offset));
1180 break;
1181 case NLA_U32:
1182 errno = nla_put_u32(skb, attr.attribute_id,
1183 ATTR_GET_VALUE(uint32_t, rec,
1184 attr.field_offset));
1185 break;
1186 case NLA_S32:
1187 errno = nla_put_s32(skb, attr.attribute_id,
1188 ATTR_GET_VALUE(int32_t, rec,
1189 attr.field_offset));
1190 break;
1191 case NLA_U64:
1192 errno = wlan_cfg80211_nla_put_u64(
1193 skb, attr.attribute_id,
1194 ATTR_GET_VALUE(uint64_t, rec, attr.field_offset));
1195 break;
1196 case NLA_FLAG:
1197 if (ATTR_GET_VALUE(bool, rec, attr.field_offset))
1198 errno = nla_put_flag(skb, attr.attribute_id);
1199 break;
1200 case NLA_BINARY:
1201 status = wlan_hdd_put_connectivity_logging_data(
1202 skb, rec, &attr);
1203 if (QDF_IS_STATUS_ERROR(status))
1204 return status;
1205 break;
1206 default:
1207 break;
1208 }
1209 }
1210
1211 if (errno) {
1212 hdd_err_rl("NLA put failed for attr:%d",
1213 attr.attribute_id);
1214 return QDF_STATUS_E_FAILURE;
1215 }
1216
1217 return QDF_STATUS_SUCCESS;
1218 }
1219
1220 /**
1221 * wlan_hdd_send_connectivity_log_to_user - Send the connectivity log buffer
1222 * to userspace
1223 * @rec: Pointer to the log record
1224 * @hdd_context: HDD global context
1225 * @num_records: Number of records
1226 *
1227 * Return: QDF_STATUS
1228 */
1229 static QDF_STATUS
wlan_hdd_send_connectivity_log_to_user(struct wlan_log_record * rec,void * hdd_context,uint8_t num_records)1230 wlan_hdd_send_connectivity_log_to_user(struct wlan_log_record *rec,
1231 void *hdd_context,
1232 uint8_t num_records)
1233 {
1234 struct hdd_context *hdd_ctx;
1235 struct nlattr *attr, *attr1;
1236 struct sk_buff *vendor_event;
1237 uint16_t len, i = 0;
1238 QDF_STATUS status;
1239
1240 hdd_enter();
1241
1242 hdd_ctx = hdd_context;
1243 if (wlan_hdd_validate_context(hdd_ctx))
1244 return QDF_STATUS_E_FAILURE;
1245
1246 len = wlan_hdd_get_connectivity_log_event_len(rec, num_records);
1247
1248 vendor_event = wlan_cfg80211_vendor_event_alloc(
1249 hdd_ctx->wiphy, NULL, len + NLMSG_HDRLEN,
1250 QCA_NL80211_VENDOR_SUBCMD_DIAG_EVENT_INDEX,
1251 GFP_ATOMIC);
1252 if (!vendor_event) {
1253 hdd_err("wlan_cfg80211_vendor_event_alloc failed");
1254 return QDF_STATUS_E_NOMEM;
1255 }
1256
1257 attr = nla_nest_start(vendor_event,
1258 QCA_WLAN_VENDOR_ATTR_DIAG_EVENT);
1259 if (!attr)
1260 goto failure;
1261
1262 for (i = 0; i < num_records; i++) {
1263 attr1 = nla_nest_start(vendor_event, i);
1264 if (!attr1)
1265 goto failure;
1266
1267 status = wlan_hdd_fill_connectivity_logging_data(vendor_event,
1268 &rec[i]);
1269 if (QDF_IS_STATUS_ERROR(status)) {
1270 hdd_err_rl("Failed to fill fat idx:%d subtype:%d",
1271 i, rec[i].log_subtype);
1272 goto failure;
1273 }
1274
1275 nla_nest_end(vendor_event, attr1);
1276 }
1277
1278 nla_nest_end(vendor_event, attr);
1279 wlan_cfg80211_vendor_event(vendor_event, GFP_ATOMIC);
1280
1281 hdd_exit();
1282
1283 return QDF_STATUS_SUCCESS;
1284 failure:
1285 hdd_err("NLA fill failed num_records:%d", num_records);
1286 wlan_cfg80211_vendor_free_skb(vendor_event);
1287
1288 return QDF_STATUS_E_FAILURE;
1289 }
1290
wlan_hdd_start_connectivity_logging(struct hdd_context * hdd_ctx)1291 void wlan_hdd_start_connectivity_logging(struct hdd_context *hdd_ctx)
1292 {
1293 struct wlan_cl_osif_cbks hdd_cb;
1294
1295 hdd_cb.wlan_connectivity_log_send_to_usr =
1296 wlan_hdd_send_connectivity_log_to_user;
1297 wlan_connectivity_logging_start(hdd_ctx->psoc, &hdd_cb, hdd_ctx);
1298 }
1299 #endif
1300
1301 #ifdef CONNECTIVITY_DIAG_EVENT
1302 static enum wlan_diag_connect_fail_reason
wlan_hdd_convert_con_fail_reason_to_diag_reason(enum wlan_cm_connect_fail_reason reason)1303 wlan_hdd_convert_con_fail_reason_to_diag_reason(
1304 enum wlan_cm_connect_fail_reason reason)
1305 {
1306 switch (reason) {
1307 case CM_NO_CANDIDATE_FOUND:
1308 return WLAN_DIAG_NO_CANDIDATE_FOUND;
1309 case CM_ABORT_DUE_TO_NEW_REQ_RECVD:
1310 return WLAN_DIAG_ABORT_DUE_TO_NEW_REQ_RECVD;
1311 case CM_BSS_SELECT_IND_FAILED:
1312 return WLAN_DIAG_BSS_SELECT_IND_FAILED;
1313 case CM_PEER_CREATE_FAILED:
1314 return WLAN_DIAG_PEER_CREATE_FAILED;
1315 case CM_JOIN_FAILED:
1316 return WLAN_DIAG_JOIN_FAILED;
1317 case CM_JOIN_TIMEOUT:
1318 return WLAN_DIAG_JOIN_TIMEOUT;
1319 case CM_AUTH_FAILED:
1320 return WLAN_DIAG_AUTH_FAILED;
1321 case CM_AUTH_TIMEOUT:
1322 return WLAN_DIAG_AUTH_TIMEOUT;
1323 case CM_ASSOC_FAILED:
1324 return WLAN_DIAG_ASSOC_FAILED;
1325 case CM_ASSOC_TIMEOUT:
1326 return WLAN_DIAG_ASSOC_TIMEOUT;
1327 case CM_HW_MODE_FAILURE:
1328 return WLAN_DIAG_HW_MODE_FAILURE;
1329 case CM_SER_FAILURE:
1330 return WLAN_DIAG_SER_FAILURE;
1331 case CM_SER_TIMEOUT:
1332 return WLAN_DIAG_SER_TIMEOUT;
1333 case CM_GENERIC_FAILURE:
1334 return WLAN_DIAG_GENERIC_FAILURE;
1335 case CM_VALID_CANDIDATE_CHECK_FAIL:
1336 return WLAN_DIAG_VALID_CANDIDATE_CHECK_FAIL;
1337 default:
1338 hdd_err("Invalid connect fail reason code");
1339 }
1340
1341 return WLAN_DIAG_UNSPECIFIC_REASON;
1342 }
1343
1344 void
wlan_hdd_connectivity_fail_event(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_resp * rsp)1345 wlan_hdd_connectivity_fail_event(struct wlan_objmgr_vdev *vdev,
1346 struct wlan_cm_connect_resp *rsp)
1347 {
1348 WLAN_HOST_DIAG_EVENT_DEF(wlan_diag_event, struct wlan_diag_connect);
1349
1350 qdf_mem_zero(&wlan_diag_event, sizeof(struct wlan_diag_connect));
1351
1352 if (wlan_vdev_mlme_get_opmode(vdev) != QDF_STA_MODE)
1353 return;
1354
1355 if (wlan_vdev_mlme_is_mlo_vdev(vdev) &&
1356 (wlan_vdev_mlme_is_mlo_link_switch_in_progress(vdev) ||
1357 wlan_vdev_mlme_is_mlo_link_vdev(vdev)))
1358 return;
1359
1360 wlan_diag_event.diag_cmn.vdev_id = wlan_vdev_get_id(vdev);
1361
1362 wlan_diag_event.diag_cmn.timestamp_us = qdf_get_time_of_the_day_us();
1363 wlan_diag_event.diag_cmn.ktime_us = qdf_ktime_to_us(qdf_ktime_get());
1364 wlan_diag_event.subtype = WLAN_CONN_DIAG_CONNECT_FAIL_EVENT;
1365 qdf_mem_copy(wlan_diag_event.diag_cmn.bssid, rsp->bssid.bytes,
1366 QDF_MAC_ADDR_SIZE);
1367
1368 wlan_diag_event.version = DIAG_CONN_VERSION;
1369 wlan_diag_event.freq = rsp->freq;
1370 wlan_diag_event.reason =
1371 wlan_hdd_convert_con_fail_reason_to_diag_reason(rsp->reason);
1372
1373 WLAN_HOST_DIAG_EVENT_REPORT(&wlan_diag_event, EVENT_WLAN_CONN);
1374 }
1375 #endif
1376