From 7e6f71ad924febdeec027473bcaa4bd7e097ea76 Mon Sep 17 00:00:00 2001 From: Bernie Innocenti Date: Wed, 7 Mar 2018 00:17:50 +0900 Subject: [PATCH] Wire readApfPacketFilterData() to the legacy hal Bug: 73804303 Bug: 36221302 Change-Id: If5d9d3afd40758aea98832e4b350216f496fc3bd Test: built and flashed, verified boot (cherry picked from commit efbb9c3f59777dace6491ddaa2e67218eba92ec2) --- .../default/tests/wifi_chip_unit_tests.cpp | 2 +- wifi/1.2/default/wifi_legacy_hal.cpp | 22 +++++++++++++++++++ wifi/1.2/default/wifi_legacy_hal.h | 4 +++- wifi/1.2/default/wifi_sta_iface.cpp | 16 ++++++++++++++ wifi/1.2/default/wifi_sta_iface.h | 8 +++++-- 5 files changed, 48 insertions(+), 4 deletions(-) diff --git a/wifi/1.2/default/tests/wifi_chip_unit_tests.cpp b/wifi/1.2/default/tests/wifi_chip_unit_tests.cpp index 27c8d60b97..3928c9ab0a 100644 --- a/wifi/1.2/default/tests/wifi_chip_unit_tests.cpp +++ b/wifi/1.2/default/tests/wifi_chip_unit_tests.cpp @@ -146,7 +146,7 @@ class WifiChipTest : public Test { } else if (type == IfaceType::STA) { chip_->createStaIface( [&iface_name](const WifiStatus& status, - const sp& iface) { + const sp& iface) { if (WifiStatusCode::SUCCESS == status.code) { ASSERT_NE(iface.get(), nullptr); iface->getName([&iface_name](const WifiStatus& status, diff --git a/wifi/1.2/default/wifi_legacy_hal.cpp b/wifi/1.2/default/wifi_legacy_hal.cpp index 84af9c4808..c314e6451a 100644 --- a/wifi/1.2/default/wifi_legacy_hal.cpp +++ b/wifi/1.2/default/wifi_legacy_hal.cpp @@ -492,6 +492,28 @@ wifi_error WifiLegacyHal::setPacketFilter(const std::string& iface_name, getIfaceHandle(iface_name), program.data(), program.size()); } +std::pair> +WifiLegacyHal::readApfPacketFilterData(const std::string& iface_name) { + if (global_func_table_.wifi_read_packet_filter == nullptr) { + return {WIFI_ERROR_NOT_SUPPORTED, {}}; + } + + PacketFilterCapabilities caps; + wifi_error status = global_func_table_.wifi_get_packet_filter_capabilities( + getIfaceHandle(iface_name), &caps.version, &caps.max_len); + if (status != WIFI_SUCCESS) { + return {status, {}}; + } + + // Size the buffer to read the entire program & work memory. + std::vector buffer(caps.max_len); + + status = global_func_table_.wifi_read_packet_filter( + getIfaceHandle(iface_name), /*src_offset=*/0, buffer.data(), + buffer.size()); + return {status, move(buffer)}; +} + std::pair WifiLegacyHal::getGscanCapabilities(const std::string& iface_name) { wifi_gscan_capabilities caps; diff --git a/wifi/1.2/default/wifi_legacy_hal.h b/wifi/1.2/default/wifi_legacy_hal.h index dedbbf8279..60905ab399 100644 --- a/wifi/1.2/default/wifi_legacy_hal.h +++ b/wifi/1.2/default/wifi_legacy_hal.h @@ -156,7 +156,7 @@ using on_radio_mode_change_callback = * Class that encapsulates all legacy HAL interactions. * This class manages the lifetime of the event loop thread used by legacy HAL. * - * Note: aThere will only be a single instance of this class created in the Wifi + * Note: There will only be a single instance of this class created in the Wifi * object and will be valid for the lifetime of the process. */ class WifiLegacyHal { @@ -188,6 +188,8 @@ class WifiLegacyHal { const std::string& iface_name); wifi_error setPacketFilter(const std::string& iface_name, const std::vector& program); + std::pair> readApfPacketFilterData( + const std::string& iface_name); // Gscan functions. std::pair getGscanCapabilities( const std::string& iface_name); diff --git a/wifi/1.2/default/wifi_sta_iface.cpp b/wifi/1.2/default/wifi_sta_iface.cpp index 6faf009379..ab99daa24a 100644 --- a/wifi/1.2/default/wifi_sta_iface.cpp +++ b/wifi/1.2/default/wifi_sta_iface.cpp @@ -94,6 +94,13 @@ Return WifiStaIface::installApfPacketFilter( hidl_status_cb, cmd_id, program); } +Return WifiStaIface::readApfPacketFilterData( + readApfPacketFilterData_cb hidl_status_cb) { + return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, + &WifiStaIface::readApfPacketFilterDataInternal, + hidl_status_cb); +} + Return WifiStaIface::getBackgroundScanCapabilities( getBackgroundScanCapabilities_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, @@ -297,6 +304,15 @@ WifiStatus WifiStaIface::installApfPacketFilterInternal( return createWifiStatusFromLegacyError(legacy_status); } +std::pair> +WifiStaIface::readApfPacketFilterDataInternal() { + const std::pair> + legacy_status_and_data = + legacy_hal_.lock()->readApfPacketFilterData(ifname_); + return {createWifiStatusFromLegacyError(legacy_status_and_data.first), + std::move(legacy_status_and_data.second)}; +} + std::pair WifiStaIface::getBackgroundScanCapabilitiesInternal() { legacy_hal::wifi_error legacy_status; diff --git a/wifi/1.2/default/wifi_sta_iface.h b/wifi/1.2/default/wifi_sta_iface.h index 423365cfbd..a2128882f5 100644 --- a/wifi/1.2/default/wifi_sta_iface.h +++ b/wifi/1.2/default/wifi_sta_iface.h @@ -18,8 +18,8 @@ #define WIFI_STA_IFACE_H_ #include -#include #include +#include #include "hidl_callback_util.h" #include "wifi_legacy_hal.h" @@ -34,7 +34,7 @@ using namespace android::hardware::wifi::V1_0; /** * HIDL interface object used to control a STA Iface instance. */ -class WifiStaIface : public V1_0::IWifiStaIface { +class WifiStaIface : public V1_2::IWifiStaIface { public: WifiStaIface(const std::string& ifname, const std::weak_ptr legacy_hal); @@ -56,6 +56,8 @@ class WifiStaIface : public V1_0::IWifiStaIface { Return installApfPacketFilter( uint32_t cmd_id, const hidl_vec& program, installApfPacketFilter_cb hidl_status_cb) override; + Return readApfPacketFilterData( + readApfPacketFilterData_cb hidl_status_cb) override; Return getBackgroundScanCapabilities( getBackgroundScanCapabilities_cb hidl_status_cb) override; Return getValidFrequenciesForBand( @@ -113,6 +115,8 @@ class WifiStaIface : public V1_0::IWifiStaIface { getApfPacketFilterCapabilitiesInternal(); WifiStatus installApfPacketFilterInternal( uint32_t cmd_id, const std::vector& program); + std::pair> + readApfPacketFilterDataInternal(); std::pair getBackgroundScanCapabilitiesInternal(); std::pair>