mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 11:36:00 +00:00
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
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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<uint8_t> 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);
|
||||
};
|
||||
|
||||
@@ -241,6 +241,13 @@ Return<void> WifiStaIface::getDebugRxPacketFates(
|
||||
hidl_status_cb);
|
||||
}
|
||||
|
||||
Return<void> WifiStaIface::setMacAddress(const hidl_array<uint8_t, 6>& mac,
|
||||
setMacAddress_cb hidl_status_cb) {
|
||||
return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
|
||||
&WifiStaIface::setMacAddressInternal, hidl_status_cb,
|
||||
mac);
|
||||
}
|
||||
|
||||
std::pair<WifiStatus, std::string> 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<uint8_t, 6>& 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
|
||||
|
||||
@@ -21,6 +21,8 @@
|
||||
#include <android/hardware/wifi/1.0/IWifiStaIfaceEventCallback.h>
|
||||
#include <android/hardware/wifi/1.2/IWifiStaIface.h>
|
||||
|
||||
#include <wifi_system/interface_tool.h>
|
||||
|
||||
#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<void> getDebugRxPacketFates(
|
||||
getDebugRxPacketFates_cb hidl_status_cb) override;
|
||||
Return<void> setMacAddress(const hidl_array<uint8_t, 6>& 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<WifiStatus, std::vector<WifiDebugRxPacketFateReport>>
|
||||
getDebugRxPacketFatesInternal();
|
||||
WifiStatus setMacAddressInternal(const std::array<uint8_t, 6>& mac);
|
||||
|
||||
std::string ifname_;
|
||||
std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal_;
|
||||
bool is_valid_;
|
||||
hidl_callback_util::HidlCallbackHandler<IWifiStaIfaceEventCallback>
|
||||
event_cb_handler_;
|
||||
wifi_system::InterfaceTool iface_tool_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(WifiStaIface);
|
||||
};
|
||||
|
||||
@@ -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",
|
||||
|
||||
56
wifi/1.2/vts/functional/wifi_sta_iface_hidl_test.cpp
Normal file
56
wifi/1.2/vts/functional/wifi_sta_iface_hidl_test.cpp
Normal file
@@ -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 <android-base/logging.h>
|
||||
|
||||
#include <android/hardware/wifi/1.2/IWifiStaIface.h>
|
||||
|
||||
#include <VtsHalHidlTargetTestBase.h>
|
||||
|
||||
#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<IWifiStaIface> 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<uint8_t, 6> kMac{
|
||||
std::array<uint8_t, 6>{{0x12, 0x22, 0x33, 0x52, 0x10, 0x41}}};
|
||||
EXPECT_EQ(WifiStatusCode::SUCCESS,
|
||||
HIDL_INVOKE(wifi_sta_iface_, setMacAddress, kMac).code);
|
||||
}
|
||||
Reference in New Issue
Block a user