.. | .. |
---|
59 | 59 | LOGGER_START_PKT_FATE_MONITORING, |
---|
60 | 60 | LOGGER_GET_TX_PKT_FATES, |
---|
61 | 61 | 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 |
---|
62 | 68 | } DEBUG_SUB_COMMAND; |
---|
63 | 69 | |
---|
64 | 70 | typedef enum { |
---|
| 71 | + LOGGER_ATTRIBUTE_INVALID = 0, |
---|
65 | 72 | LOGGER_ATTRIBUTE_DRIVER_VER, |
---|
66 | 73 | LOGGER_ATTRIBUTE_FW_VER, |
---|
67 | 74 | LOGGER_ATTRIBUTE_RING_ID, |
---|
.. | .. |
---|
80 | 87 | LOGGER_ATTRIBUTE_DRIVER_DUMP_DATA, |
---|
81 | 88 | LOGGER_ATTRIBUTE_PKT_FATE_NUM, |
---|
82 | 89 | LOGGER_ATTRIBUTE_PKT_FATE_DATA, |
---|
| 90 | + LOGGER_ATTRIBUTE_AFTER_LAST, |
---|
| 91 | + LOGGER_ATTRIBUTE_MAX = LOGGER_ATTRIBUTE_AFTER_LAST - 1, |
---|
83 | 92 | } LOGGER_ATTRIBUTE; |
---|
84 | 93 | |
---|
85 | 94 | typedef enum { |
---|
.. | .. |
---|
105 | 114 | RX_PACKET_FATE, |
---|
106 | 115 | } PktFateReqType; |
---|
107 | 116 | |
---|
| 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 | +}; |
---|
108 | 140 | |
---|
109 | 141 | /////////////////////////////////////////////////////////////////////////////// |
---|
110 | 142 | class DebugCommand : public WifiCommand |
---|
.. | .. |
---|
321 | 353 | case GET_DRV_VER: |
---|
322 | 354 | case GET_FW_VER: |
---|
323 | 355 | { |
---|
324 | | - void *data = reply.get_vendor_data(); |
---|
| 356 | + const struct nlattr *data = (const struct nlattr *)reply.get_vendor_data(); |
---|
325 | 357 | int len = reply.get_vendor_data_len(); |
---|
326 | 358 | |
---|
| 359 | + const struct nlattr *iter; |
---|
| 360 | + int rem, type, datalen; |
---|
| 361 | + |
---|
327 | 362 | 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 | + } |
---|
332 | 380 | break; |
---|
333 | 381 | } |
---|
334 | 382 | |
---|
.. | .. |
---|
378 | 426 | |
---|
379 | 427 | case GET_FEATURE: |
---|
380 | 428 | { |
---|
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); |
---|
383 | 430 | |
---|
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); |
---|
386 | 440 | break; |
---|
387 | 441 | } |
---|
388 | 442 | |
---|
.. | .. |
---|
1075 | 1129 | } |
---|
1076 | 1130 | }; |
---|
1077 | 1131 | |
---|
| 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 | + |
---|
1078 | 1269 | wifi_error wifi_start_pkt_fate_monitoring(wifi_interface_handle handle) |
---|
1079 | 1270 | { |
---|
1080 | 1271 | PacketFateCommand *cmd = new PacketFateCommand(handle); |
---|
.. | .. |
---|
1107 | 1298 | cmd->releaseRef(); |
---|
1108 | 1299 | return result; |
---|
1109 | 1300 | } |
---|
| 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 | +} |
---|