tzh
2024-08-15 d4a1bd480003f3e1a0590bc46fbcb24f05652ca7
android/hardware/aic/wlan/wifi_hal/wifi_logger.cpp
....@@ -59,9 +59,16 @@
5959 LOGGER_START_PKT_FATE_MONITORING,
6060 LOGGER_GET_TX_PKT_FATES,
6161 LOGGER_GET_RX_PKT_FATES,
62
+ LOGGER_GET_WAKE_REASON_STATS,
63
+ LOGGER_DEBUG_GET_DUMP,
64
+ LOGGER_FILE_DUMP_DONE_IND,
65
+ LOGGER_SET_HAL_START,
66
+ LOGGER_HAL_STOP,
67
+ LOGGER_SET_HAL_PID
6268 } DEBUG_SUB_COMMAND;
6369
6470 typedef enum {
71
+ LOGGER_ATTRIBUTE_INVALID = 0,
6572 LOGGER_ATTRIBUTE_DRIVER_VER,
6673 LOGGER_ATTRIBUTE_FW_VER,
6774 LOGGER_ATTRIBUTE_RING_ID,
....@@ -80,6 +87,8 @@
8087 LOGGER_ATTRIBUTE_DRIVER_DUMP_DATA,
8188 LOGGER_ATTRIBUTE_PKT_FATE_NUM,
8289 LOGGER_ATTRIBUTE_PKT_FATE_DATA,
90
+ LOGGER_ATTRIBUTE_AFTER_LAST,
91
+ LOGGER_ATTRIBUTE_MAX = LOGGER_ATTRIBUTE_AFTER_LAST - 1,
8392 } LOGGER_ATTRIBUTE;
8493
8594 typedef enum {
....@@ -105,6 +114,29 @@
105114 RX_PACKET_FATE,
106115 } PktFateReqType;
107116
117
+enum wake_stat_attributes {
118
+ WAKE_STAT_ATTRIBUTE_TOTAL_CMD_EVENT,
119
+ WAKE_STAT_ATTRIBUTE_CMD_EVENT_WAKE,
120
+ WAKE_STAT_ATTRIBUTE_CMD_EVENT_COUNT,
121
+ WAKE_STAT_ATTRIBUTE_CMD_COUNT_USED,
122
+ WAKE_STAT_ATTRIBUTE_TOTAL_DRIVER_FW,
123
+ WAKE_STAT_ATTRIBUTE_DRIVER_FW_WAKE,
124
+ WAKE_STAT_ATTRIBUTE_DRIVER_FW_COUNT,
125
+ WAKE_STAT_ATTRIBUTE_DRIVER_FW_COUNT_USED,
126
+ WAKE_STAT_ATTRIBUTE_TOTAL_RX_DATA_WAKE,
127
+ WAKE_STAT_ATTRIBUTE_RX_UNICAST_COUNT,
128
+ WAKE_STAT_ATTRIBUTE_RX_MULTICAST_COUNT,
129
+ WAKE_STAT_ATTRIBUTE_RX_BROADCAST_COUNT,
130
+ WAKE_STAT_ATTRIBUTE_RX_ICMP_PKT,
131
+ WAKE_STAT_ATTRIBUTE_RX_ICMP6_PKT,
132
+ WAKE_STAT_ATTRIBUTE_RX_ICMP6_RA,
133
+ WAKE_STAT_ATTRIBUTE_RX_ICMP6_NA,
134
+ WAKE_STAT_ATTRIBUTE_RX_ICMP6_NS,
135
+ WAKE_STAT_ATTRIBUTE_IPV4_RX_MULTICAST_ADD_CNT,
136
+ WAKE_STAT_ATTRIBUTE_IPV6_RX_MULTICAST_ADD_CNT,
137
+ WAKE_STAT_ATTRIBUTE_OTHER__RX_MULTICAST_ADD_CNT,
138
+ WAKE_STAT_ATTRIBUTE_RX_MULTICAST_PKT_INFO
139
+};
108140
109141 ///////////////////////////////////////////////////////////////////////////////
110142 class DebugCommand : public WifiCommand
....@@ -321,14 +353,30 @@
321353 case GET_DRV_VER:
322354 case GET_FW_VER:
323355 {
324
- void *data = reply.get_vendor_data();
356
+ const struct nlattr *data = (const struct nlattr *)reply.get_vendor_data();
325357 int len = reply.get_vendor_data_len();
326358
359
+ const struct nlattr *iter;
360
+ int rem, type, datalen;
361
+
327362 ALOGD("len = %d, expected len = %d", len, *mBuffSize);
328
- memcpy(mBuff, data, min(len, *mBuffSize));
329
- if (*mBuffSize < len)
330
- return NL_SKIP;
331
- *mBuffSize = len;
363
+
364
+ nla_for_each_attr(iter, data, len, rem) {
365
+ type = nla_type(iter);
366
+ switch (type) {
367
+ case LOGGER_ATTRIBUTE_DRIVER_VER:
368
+ case LOGGER_ATTRIBUTE_FW_VER:
369
+ datalen = nla_len(iter);
370
+ if (datalen > *mBuffSize)
371
+ return NL_SKIP;
372
+ memcpy(mBuff, nla_data(iter), datalen);
373
+ ALOGD("WLAN %s version: %s", (type == LOGGER_ATTRIBUTE_DRIVER_VER) ? "Driver" : "Firmware", mBuff);
374
+ *mBuffSize = datalen;
375
+ break;
376
+ default:
377
+ return NL_SKIP;
378
+ }
379
+ }
332380 break;
333381 }
334382
....@@ -378,11 +426,17 @@
378426
379427 case GET_FEATURE:
380428 {
381
- void *data = reply.get_vendor_data();
382
- int len = reply.get_vendor_data_len();
429
+ nlattr *data = reply.get_attribute(NL80211_ATTR_VENDOR_DATA);
383430
384
- ALOGD("len = %d, expected len = %d", len, sizeof(unsigned int));
385
- memcpy(mSupport, data, sizeof(unsigned int));
431
+ if (!mSupport) {
432
+ ALOGE("Buffers pointers not set");
433
+ return NL_SKIP;
434
+ }
435
+
436
+ nl_iterator it(data);
437
+ /* do not care it.get_type() */
438
+ memcpy(mSupport, it.get_data(), min(it.get_len(), (int) sizeof(*mSupport)));
439
+ ALOGD("logger feature set: 0x%08X", *(int *)mSupport);
386440 break;
387441 }
388442
....@@ -1075,6 +1129,143 @@
10751129 }
10761130 };
10771131
1132
+class GetWakeReasonCountCommand : public WifiCommand {
1133
+ WLAN_DRIVER_WAKE_REASON_CNT *mWakeReasonCnt;
1134
+ void *mCmdEventWakeCount;
1135
+ public:
1136
+ GetWakeReasonCountCommand(wifi_interface_handle handle,
1137
+ WLAN_DRIVER_WAKE_REASON_CNT *wlanDriverWakeReasonCount) :
1138
+ WifiCommand("GetWakeReasonCountCommand", handle, 0),
1139
+ mWakeReasonCnt(wlanDriverWakeReasonCount)
1140
+ {
1141
+ mCmdEventWakeCount = mWakeReasonCnt->cmd_event_wake_cnt;
1142
+ }
1143
+
1144
+ int createRequest(WifiRequest& request) {
1145
+ int result = request.create(GOOGLE_OUI, LOGGER_GET_WAKE_REASON_STATS);
1146
+ if (result < 0) {
1147
+ return result;
1148
+ }
1149
+
1150
+ nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA);
1151
+
1152
+ request.attr_end(data);
1153
+ return WIFI_SUCCESS;
1154
+ }
1155
+
1156
+ int start() {
1157
+ ALOGD("Start get wake stats command\n");
1158
+ WifiRequest request(familyId(), ifaceId());
1159
+
1160
+ int result = createRequest(request);
1161
+ if (result < 0) {
1162
+ ALOGE("Failed to create request result = %d\n", result);
1163
+ return result;
1164
+ }
1165
+
1166
+ result = requestResponse(request);
1167
+ if (result != WIFI_SUCCESS) {
1168
+ ALOGE("Failed to register wake stats response; result = %d\n", result);
1169
+ }
1170
+ return result;
1171
+ }
1172
+
1173
+ protected:
1174
+ int handleResponse(WifiEvent& reply) {
1175
+ ALOGE("In GetWakeReasonCountCommand::handleResponse");
1176
+
1177
+ if (reply.get_cmd() != NL80211_CMD_VENDOR) {
1178
+ ALOGD("Ignoring reply with cmd = %d", reply.get_cmd());
1179
+ return NL_SKIP;
1180
+ }
1181
+
1182
+ int id = reply.get_vendor_id();
1183
+ int subcmd = reply.get_vendor_subcmd();
1184
+
1185
+ nlattr *vendor_data = reply.get_attribute(NL80211_ATTR_VENDOR_DATA);
1186
+ int len = reply.get_vendor_data_len();
1187
+
1188
+ ALOGV("Id = %0x, subcmd = %d, len = %d", id, subcmd, len);
1189
+ if (vendor_data == NULL || len == 0) {
1190
+ ALOGE("no vendor data in GetGetWakeReasonCountCommand response; ignoring it");
1191
+ return NL_SKIP;
1192
+ }
1193
+
1194
+ for (nl_iterator it(vendor_data); it.has_next(); it.next()) {
1195
+ switch (it.get_type()) {
1196
+ case WAKE_STAT_ATTRIBUTE_TOTAL_DRIVER_FW:
1197
+ mWakeReasonCnt->total_driver_fw_local_wake =
1198
+ it.get_u32();
1199
+ break;
1200
+ case WAKE_STAT_ATTRIBUTE_TOTAL_CMD_EVENT:
1201
+ mWakeReasonCnt->total_cmd_event_wake =
1202
+ it.get_u32();
1203
+ break;
1204
+ case WAKE_STAT_ATTRIBUTE_CMD_COUNT_USED:
1205
+ mWakeReasonCnt->cmd_event_wake_cnt_used =
1206
+ it.get_u32();
1207
+ break;
1208
+ case WAKE_STAT_ATTRIBUTE_CMD_EVENT_WAKE:
1209
+ memcpy(mCmdEventWakeCount, it.get_data(),
1210
+ (mWakeReasonCnt->cmd_event_wake_cnt_used * sizeof(int)));
1211
+ break;
1212
+ case WAKE_STAT_ATTRIBUTE_TOTAL_RX_DATA_WAKE:
1213
+ mWakeReasonCnt->total_rx_data_wake =
1214
+ it.get_u32();
1215
+ break;
1216
+ case WAKE_STAT_ATTRIBUTE_RX_UNICAST_COUNT:
1217
+ mWakeReasonCnt->rx_wake_details.rx_unicast_cnt =
1218
+ it.get_u32();
1219
+ break;
1220
+ case WAKE_STAT_ATTRIBUTE_RX_MULTICAST_COUNT:
1221
+ mWakeReasonCnt->rx_wake_details.rx_multicast_cnt =
1222
+ it.get_u32();
1223
+ break;
1224
+ case WAKE_STAT_ATTRIBUTE_RX_BROADCAST_COUNT:
1225
+ mWakeReasonCnt->rx_wake_details.rx_broadcast_cnt =
1226
+ it.get_u32();
1227
+ break;
1228
+ case WAKE_STAT_ATTRIBUTE_RX_ICMP_PKT:
1229
+ mWakeReasonCnt->rx_wake_pkt_classification_info.icmp_pkt =
1230
+ it.get_u32();
1231
+ break;
1232
+ case WAKE_STAT_ATTRIBUTE_RX_ICMP6_PKT:
1233
+ mWakeReasonCnt->rx_wake_pkt_classification_info.icmp6_pkt =
1234
+ it.get_u32();
1235
+ break;
1236
+ case WAKE_STAT_ATTRIBUTE_RX_ICMP6_RA:
1237
+ mWakeReasonCnt->rx_wake_pkt_classification_info.icmp6_ra =
1238
+ it.get_u32();
1239
+ break;
1240
+ case WAKE_STAT_ATTRIBUTE_RX_ICMP6_NA:
1241
+ mWakeReasonCnt->rx_wake_pkt_classification_info.icmp6_na =
1242
+ it.get_u32();
1243
+ break;
1244
+ case WAKE_STAT_ATTRIBUTE_RX_ICMP6_NS:
1245
+ mWakeReasonCnt->rx_wake_pkt_classification_info.icmp6_ns =
1246
+ it.get_u32();
1247
+ break;
1248
+ case WAKE_STAT_ATTRIBUTE_IPV4_RX_MULTICAST_ADD_CNT:
1249
+ mWakeReasonCnt->rx_multicast_wake_pkt_info.ipv4_rx_multicast_addr_cnt =
1250
+ it.get_u32();
1251
+ break;
1252
+ case WAKE_STAT_ATTRIBUTE_IPV6_RX_MULTICAST_ADD_CNT:
1253
+ mWakeReasonCnt->rx_multicast_wake_pkt_info.ipv6_rx_multicast_addr_cnt =
1254
+ it.get_u32();
1255
+ break;
1256
+ case WAKE_STAT_ATTRIBUTE_OTHER__RX_MULTICAST_ADD_CNT:
1257
+ mWakeReasonCnt->rx_multicast_wake_pkt_info.other_rx_multicast_addr_cnt =
1258
+ it.get_u32();
1259
+ break;
1260
+ default:
1261
+ break;
1262
+ }
1263
+
1264
+ }
1265
+ return NL_OK;
1266
+ }
1267
+};
1268
+
10781269 wifi_error wifi_start_pkt_fate_monitoring(wifi_interface_handle handle)
10791270 {
10801271 PacketFateCommand *cmd = new PacketFateCommand(handle);
....@@ -1107,3 +1298,13 @@
11071298 cmd->releaseRef();
11081299 return result;
11091300 }
1301
+
1302
+wifi_error wifi_get_wake_reason_stats(wifi_interface_handle handle,
1303
+ WLAN_DRIVER_WAKE_REASON_CNT *wifi_wake_reason_cnt)
1304
+{
1305
+ GetWakeReasonCountCommand *cmd =
1306
+ new GetWakeReasonCountCommand(handle, wifi_wake_reason_cnt);
1307
+ wifi_error result = (wifi_error)cmd->start();
1308
+ cmd->releaseRef();
1309
+ return result;
1310
+}