diff --git a/wifi/aidl/default/aidl_struct_util.cpp b/wifi/aidl/default/aidl_struct_util.cpp index 0f0c77e171..d9e023c80e 100644 --- a/wifi/aidl/default/aidl_struct_util.cpp +++ b/wifi/aidl/default/aidl_struct_util.cpp @@ -1085,6 +1085,41 @@ bool convertLegacyLinkLayerStatsToAidl(const legacy_hal::LinkLayerStats& legacy_ return true; } +// TODO (b/324519882): Remove logs after validating the structure size. +void logAidlLinkLayerStatsSize(StaLinkLayerStats& aidl_stats) { + unsigned long expectedMaxRadios = 5; + unsigned long expectedMaxLinks = 5; + unsigned long expectedMaxChannelStats = 512; + unsigned long expectedMaxPeers = 3; + unsigned long expectedMaxRateStats = 1024; + + unsigned long maxChannelStats = 0, maxPeers = 0, maxRateStats = 0; + for (size_t i = 0; i < aidl_stats.radios.size(); i++) { + maxChannelStats = + std::max(maxChannelStats, (unsigned long)aidl_stats.radios[i].channelStats.size()); + } + for (size_t i = 0; i < aidl_stats.iface.links.size(); i++) { + maxPeers = std::max(maxPeers, (unsigned long)aidl_stats.iface.links[i].peers.size()); + for (size_t j = 0; j < aidl_stats.iface.links[i].peers.size(); j++) { + maxRateStats = + std::max(maxRateStats, + (unsigned long)aidl_stats.iface.links[i].peers[j].rateStats.size()); + } + } + + if (aidl_stats.radios.size() > expectedMaxRadios || + aidl_stats.iface.links.size() > expectedMaxLinks || + maxChannelStats > expectedMaxChannelStats || maxPeers > expectedMaxPeers || + maxRateStats > expectedMaxRateStats) { + LOG(INFO) << "StaLinkLayerStats exceeds expected vector size"; + LOG(INFO) << " numRadios: " << aidl_stats.radios.size(); + LOG(INFO) << " numLinks: " << aidl_stats.iface.links.size(); + LOG(INFO) << " maxChannelStats: " << maxChannelStats; + LOG(INFO) << " maxPeers: " << maxPeers; + LOG(INFO) << " maxRateStats: " << maxRateStats; + } +} + bool convertLegacyPeerInfoStatsToAidl(const legacy_hal::WifiPeerInfo& legacy_peer_info_stats, StaPeerInfo* aidl_peer_info_stats) { if (!aidl_peer_info_stats) { diff --git a/wifi/aidl/default/aidl_struct_util.h b/wifi/aidl/default/aidl_struct_util.h index 708936354a..2574f9546b 100644 --- a/wifi/aidl/default/aidl_struct_util.h +++ b/wifi/aidl/default/aidl_struct_util.h @@ -94,6 +94,7 @@ bool convertLegacyLinkLayerMlStatsToAidl(const legacy_hal::LinkLayerMlStats& leg StaLinkLayerStats* aidl_stats); bool convertLegacyLinkLayerStatsToAidl(const legacy_hal::LinkLayerStats& legacy_stats, StaLinkLayerStats* aidl_stats); +void logAidlLinkLayerStatsSize(StaLinkLayerStats& aidl_stats); bool convertLegacyRoamingCapabilitiesToAidl( const legacy_hal::wifi_roaming_capabilities& legacy_caps, StaRoamingCapabilities* aidl_caps); diff --git a/wifi/aidl/default/wifi_sta_iface.cpp b/wifi/aidl/default/wifi_sta_iface.cpp index f0509dc19e..aee183d429 100644 --- a/wifi/aidl/default/wifi_sta_iface.cpp +++ b/wifi/aidl/default/wifi_sta_iface.cpp @@ -435,6 +435,7 @@ std::pair WifiStaIface::getLinkLayerStats } else { return {StaLinkLayerStats{}, createWifiStatus(WifiStatusCode::ERROR_UNKNOWN)}; } + aidl_struct_util::logAidlLinkLayerStatsSize(aidl_stats); return {aidl_stats, ndk::ScopedAStatus::ok()}; }