Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e42ace24 authored by Roshan Pius's avatar Roshan Pius
Browse files

wifi: Add support for multiple radio stats

Previously, we've always assumed that we have only one instance of
radio stats fetched in link layer stats. This is no longer true for the
newer devices which support multiple radios.

Also,
Changed the timestamp member from uint32_t to uint64_t.

Bug: 36148086
Test: The error logs no longer seen on newer devices.
Change-Id: I048a1db7cc0bfb0dc0dacafff2156f42a8ae1e63
parent 2e429d6b
Loading
Loading
Loading
Loading
+11 −5
Original line number Diff line number Diff line
@@ -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();
+31 −27
Original line number Diff line number Diff line
@@ -601,8 +601,8 @@ 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 */,
  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) {
@@ -612,20 +612,24 @@ std::pair<wifi_error, LinkLayerStats> WifiLegacyHal::getLinkLayerStats() {
        } 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 {
        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);
        }
      };

+6 −2
Original line number Diff line number Diff line
@@ -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

+2 −2
Original line number Diff line number Diff line
@@ -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