From b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98 Mon Sep 17 00:00:00 2001 From: Jong Wook Kim Date: Fri, 16 Mar 2018 16:21:49 -0700 Subject: [PATCH] SetMacAddress in Vendor HAL Add a Wifi HAL interface to set MAC address. The default implementation is to bring the interface down, change the MAC address, and then bring the interface back up. Bug: 74347653 Test: vts, manual testing Change-Id: Ic740d94ec2fcb37e6743d0f3e967f3f4b6afb57d --- current.txt | 2 +- wifi/1.2/IWifiStaIface.hal | 14 +++++ wifi/1.2/default/wifi_sta_iface.cpp | 27 +++++++++ wifi/1.2/default/wifi_sta_iface.h | 6 ++ wifi/1.2/vts/functional/Android.bp | 1 + .../functional/wifi_sta_iface_hidl_test.cpp | 56 +++++++++++++++++++ 6 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 wifi/1.2/vts/functional/wifi_sta_iface_hidl_test.cpp diff --git a/current.txt b/current.txt index 69ad1ed71a..4671f84291 100644 --- a/current.txt +++ b/current.txt @@ -364,7 +364,7 @@ a0aefa29881235c21e4761d15c55edc35ef85c2e0d9e01d0966176d1dbf5f811 android.hardwar 167af870fdb87e1cbbaa0fa62ef35e1031caad20dd1ba695983dedb1e9993486 android.hardware.wifi@1.2::IWifiChipEventCallback 8c7ef32fc78d5ec6e6956de3784cc2c6f42614b5272d2e461f6d60534ba38ec2 android.hardware.wifi@1.2::IWifiNanIface 1e6074efad9da333803fb7c1acdb719d51c30b2e1e92087b0420341631c30b60 android.hardware.wifi@1.2::IWifiNanIfaceEventCallback -a9d733eb0d555f2a6cb79a212810e81b56ecba0e31a8ffe0916de086a29e4f88 android.hardware.wifi@1.2::IWifiStaIface +f5682dbf19f712bef9cc3faa5fe3dc670b6ffbcb62a147a1d86b9d43574cd83f android.hardware.wifi@1.2::IWifiStaIface 6db2e7d274be2dca9bf3087afd1f774a68c99d2b4dc7eeaf41690e5cebcbef7a android.hardware.wifi@1.2::types ee08280de21cb41e3ec26d6ed636c701b7f70516e71fb22f4fe60a13e603f406 android.hardware.wifi.hostapd@1.0::IHostapd b2479cd7a417a1cf4f3a22db4e4579e21bac38fdcaf381e2bf10176d05397e01 android.hardware.wifi.hostapd@1.0::types diff --git a/wifi/1.2/IWifiStaIface.hal b/wifi/1.2/IWifiStaIface.hal index be4e5376d7..3a7f7772c8 100644 --- a/wifi/1.2/IWifiStaIface.hal +++ b/wifi/1.2/IWifiStaIface.hal @@ -17,6 +17,7 @@ package android.hardware.wifi@1.2; import @1.0::WifiStatus; +import @1.0::MacAddress; import @1.0::IWifiStaIface; /** @@ -51,4 +52,17 @@ interface IWifiStaIface extends @1.0::IWifiStaIface { * @see installApfPacketFilter() */ readApfPacketFilterData() generates (WifiStatus status, vec data); + + /** + * Changes the MAC address of the Sta Interface to the given + * MAC address. + * + * @param mac MAC address to change into. + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, + * |WifiStatusCode.ERROR_UNKNOWN| + */ + setMacAddress(MacAddress mac) generates (WifiStatus status); }; diff --git a/wifi/1.2/default/wifi_sta_iface.cpp b/wifi/1.2/default/wifi_sta_iface.cpp index ab99daa24a..daa56101c3 100644 --- a/wifi/1.2/default/wifi_sta_iface.cpp +++ b/wifi/1.2/default/wifi_sta_iface.cpp @@ -241,6 +241,13 @@ Return WifiStaIface::getDebugRxPacketFates( hidl_status_cb); } +Return WifiStaIface::setMacAddress(const hidl_array& mac, + setMacAddress_cb hidl_status_cb) { + return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, + &WifiStaIface::setMacAddressInternal, hidl_status_cb, + mac); +} + std::pair WifiStaIface::getNameInternal() { return {createWifiStatus(WifiStatusCode::SUCCESS), ifname_}; } @@ -594,6 +601,26 @@ WifiStaIface::getDebugRxPacketFatesInternal() { return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates}; } +WifiStatus WifiStaIface::setMacAddressInternal( + const std::array& mac) { + if (!iface_tool_.SetWifiUpState(false)) { + LOG(ERROR) << "SetWifiUpState(false) failed."; + return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN); + } + + if (!iface_tool_.SetMacAddress(ifname_.c_str(), mac)) { + LOG(ERROR) << "SetMacAddress failed."; + return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN); + } + + if (!iface_tool_.SetWifiUpState(true)) { + LOG(ERROR) << "SetWifiUpState(true) failed."; + return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN); + } + LOG(DEBUG) << "Successfully SetMacAddress."; + return createWifiStatus(WifiStatusCode::SUCCESS); +} + } // namespace implementation } // namespace V1_2 } // namespace wifi diff --git a/wifi/1.2/default/wifi_sta_iface.h b/wifi/1.2/default/wifi_sta_iface.h index a2128882f5..71cd17d30c 100644 --- a/wifi/1.2/default/wifi_sta_iface.h +++ b/wifi/1.2/default/wifi_sta_iface.h @@ -21,6 +21,8 @@ #include #include +#include + #include "hidl_callback_util.h" #include "wifi_legacy_hal.h" @@ -103,6 +105,8 @@ class WifiStaIface : public V1_2::IWifiStaIface { getDebugTxPacketFates_cb hidl_status_cb) override; Return getDebugRxPacketFates( getDebugRxPacketFates_cb hidl_status_cb) override; + Return setMacAddress(const hidl_array& mac, + setMacAddress_cb hidl_status_cb) override; private: // Corresponding worker functions for the HIDL methods. @@ -146,12 +150,14 @@ class WifiStaIface : public V1_2::IWifiStaIface { getDebugTxPacketFatesInternal(); std::pair> getDebugRxPacketFatesInternal(); + WifiStatus setMacAddressInternal(const std::array& mac); std::string ifname_; std::weak_ptr legacy_hal_; bool is_valid_; hidl_callback_util::HidlCallbackHandler event_cb_handler_; + wifi_system::InterfaceTool iface_tool_; DISALLOW_COPY_AND_ASSIGN(WifiStaIface); }; diff --git a/wifi/1.2/vts/functional/Android.bp b/wifi/1.2/vts/functional/Android.bp index d85d42ec99..918e4a456b 100644 --- a/wifi/1.2/vts/functional/Android.bp +++ b/wifi/1.2/vts/functional/Android.bp @@ -20,6 +20,7 @@ cc_test { srcs: [ "VtsHalWifiV1_2TargetTest.cpp", "wifi_chip_hidl_test.cpp", + "wifi_sta_iface_hidl_test.cpp", ], static_libs: [ "VtsHalWifiV1_0TargetTestUtil", diff --git a/wifi/1.2/vts/functional/wifi_sta_iface_hidl_test.cpp b/wifi/1.2/vts/functional/wifi_sta_iface_hidl_test.cpp new file mode 100644 index 0000000000..fd4a671c0a --- /dev/null +++ b/wifi/1.2/vts/functional/wifi_sta_iface_hidl_test.cpp @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Staache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include + +#include + +#include "wifi_hidl_call_util.h" +#include "wifi_hidl_test_utils.h" + +using ::android::sp; +using ::android::hardware::wifi::V1_2::IWifiStaIface; +using ::android::hardware::wifi::V1_0::WifiStatusCode; + +/** + * Fixture to use for all STA Iface HIDL interface tests. + */ +class WifiStaIfaceHidlTest : public ::testing::VtsHalHidlTargetTestBase { + public: + virtual void SetUp() override { + wifi_sta_iface_ = IWifiStaIface::castFrom(getWifiStaIface()); + ASSERT_NE(nullptr, wifi_sta_iface_.get()); + } + + virtual void TearDown() override { stopWifi(); } + + protected: + sp wifi_sta_iface_; +}; + +/* + * SetMacAddress: + * Ensures that calls to set MAC address will return a success status + * code. + */ +TEST_F(WifiStaIfaceHidlTest, SetMacAddress) { + const android::hardware::hidl_array kMac{ + std::array{{0x12, 0x22, 0x33, 0x52, 0x10, 0x41}}}; + EXPECT_EQ(WifiStatusCode::SUCCESS, + HIDL_INVOKE(wifi_sta_iface_, setMacAddress, kMac).code); +}