Merge "wifi: Add support for multiple radio stats"

am: c0fbd8fe63

Change-Id: Icca33f2745c8297d1f413e651fbf7506fc0521f6
This commit is contained in:
Roshan Pius 2017-03-14 19:57:45 +00:00 committed by android-build-merger
commit eaf6ed41dd
4 changed files with 50 additions and 36 deletions

View file

@ -706,11 +706,17 @@ bool convertLegacyLinkLayerStatsToHidl(
hidl_stats->iface.wmeVoPktStats.retries =
legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].retries;
// radio legacy_stats conversion.
hidl_stats->radio.onTimeInMs = legacy_stats.radio.on_time;
hidl_stats->radio.txTimeInMs = legacy_stats.radio.tx_time;
hidl_stats->radio.rxTimeInMs = legacy_stats.radio.rx_time;
hidl_stats->radio.onTimeInMsForScan = legacy_stats.radio.on_time_scan;
hidl_stats->radio.txTimeInMsPerLevel = legacy_stats.radio_tx_time_per_levels;
std::vector<StaLinkLayerRadioStats> hidl_radios_stats;
for (const auto& legacy_radio_stats : legacy_stats.radios) {
StaLinkLayerRadioStats hidl_radio_stats;
hidl_radio_stats.onTimeInMs = legacy_radio_stats.stats.on_time;
hidl_radio_stats.txTimeInMs = legacy_radio_stats.stats.tx_time;
hidl_radio_stats.rxTimeInMs = legacy_radio_stats.stats.rx_time;
hidl_radio_stats.onTimeInMsForScan = legacy_radio_stats.stats.on_time_scan;
hidl_radio_stats.txTimeInMsPerLevel = legacy_radio_stats.tx_time_per_levels;
hidl_radios_stats.push_back(hidl_radio_stats);
}
hidl_stats->radios = hidl_radios_stats;
// Timestamp in the HAL wrapper here since it's not provided in the legacy
// HAL API.
hidl_stats->timeStampInMs = uptimeMillis();

View file

@ -601,33 +601,37 @@ std::pair<wifi_error, LinkLayerStats> WifiLegacyHal::getLinkLayerStats() {
LinkLayerStats link_stats{};
LinkLayerStats* link_stats_ptr = &link_stats;
on_link_layer_stats_result_internal_callback = [&link_stats_ptr](
wifi_request_id /* id */,
wifi_iface_stat* iface_stats_ptr,
int num_radios,
wifi_radio_stat* radio_stats_ptr) {
if (iface_stats_ptr != nullptr) {
link_stats_ptr->iface = *iface_stats_ptr;
link_stats_ptr->iface.num_peers = 0;
} else {
LOG(ERROR) << "Invalid iface stats in link layer stats";
}
if (num_radios == 1 && radio_stats_ptr != nullptr) {
link_stats_ptr->radio = *radio_stats_ptr;
// Copy over the tx level array to the separate vector.
if (radio_stats_ptr->num_tx_levels > 0 &&
radio_stats_ptr->tx_time_per_levels != nullptr) {
link_stats_ptr->radio_tx_time_per_levels.assign(
radio_stats_ptr->tx_time_per_levels,
radio_stats_ptr->tx_time_per_levels +
radio_stats_ptr->num_tx_levels);
}
link_stats_ptr->radio.num_tx_levels = 0;
link_stats_ptr->radio.tx_time_per_levels = nullptr;
} else {
LOG(ERROR) << "Invalid radio stats in link layer stats";
}
};
on_link_layer_stats_result_internal_callback =
[&link_stats_ptr](wifi_request_id /* id */,
wifi_iface_stat* iface_stats_ptr,
int num_radios,
wifi_radio_stat* radio_stats_ptr) {
if (iface_stats_ptr != nullptr) {
link_stats_ptr->iface = *iface_stats_ptr;
link_stats_ptr->iface.num_peers = 0;
} else {
LOG(ERROR) << "Invalid iface stats in link layer stats";
}
if (num_radios <= 0 || radio_stats_ptr == nullptr) {
LOG(ERROR) << "Invalid radio stats in link layer stats";
return;
}
for (int i = 0; i < num_radios; i++) {
LinkLayerRadioStats radio;
radio.stats = radio_stats_ptr[i];
// Copy over the tx level array to the separate vector.
if (radio_stats_ptr[i].num_tx_levels > 0 &&
radio_stats_ptr[i].tx_time_per_levels != nullptr) {
radio.tx_time_per_levels.assign(
radio_stats_ptr[i].tx_time_per_levels,
radio_stats_ptr[i].tx_time_per_levels +
radio_stats_ptr[i].num_tx_levels);
}
radio.stats.num_tx_levels = 0;
radio.stats.tx_time_per_levels = nullptr;
link_stats_ptr->radios.push_back(radio);
}
};
wifi_error status = global_func_table_.wifi_get_link_stats(
0, wlan_interface_handle_, {onSyncLinkLayerStatsResult});

View file

@ -49,10 +49,14 @@ struct PacketFilterCapabilities {
// The |wifi_radio_stat.tx_time_per_levels| stats is provided as a pointer in
// |wifi_radio_stat| structure in the legacy HAL API. Separate that out
// into a separate return element to avoid passing pointers around.
struct LinkLayerRadioStats {
wifi_radio_stat stats;
std::vector<uint32_t> tx_time_per_levels;
};
struct LinkLayerStats {
wifi_iface_stat iface;
wifi_radio_stat radio;
std::vector<uint32_t> radio_tx_time_per_levels;
std::vector<LinkLayerRadioStats> radios;
};
#pragma GCC diagnostic pop

View file

@ -143,7 +143,7 @@ typedef MacAddress Bssid;
/**
* TimeStamp in milliseconds (ms).
*/
typedef uint32_t TimeStampInMs;
typedef uint64_t TimeStampInMs;
/**
* TimeStamp in microseconds (us).
@ -478,7 +478,7 @@ struct StaLinkLayerRadioStats {
*/
struct StaLinkLayerStats {
StaLinkLayerIfaceStats iface;
StaLinkLayerRadioStats radio;
vec<StaLinkLayerRadioStats> radios;
/**
* TimeStamp for each stats sample.
* This is the absolute milliseconds from boot when these stats were