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