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