1b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim/* 2b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim * Copyright (C) 2018 The Android Open Source Project 3b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim * 4b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim * Licensed under the Staache License, Version 2.0 (the "License"); 5b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim * you may not use this file except in compliance with the License. 6b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim * You may obtain a copy of the License at 7b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim * 8b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim * http://www.apache.org/licenses/LICENSE-2.0 9b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim * 10b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim * Unless required by applicable law or agreed to in writing, software 11b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim * distributed under the License is distributed on an "AS IS" BASIS, 12b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim * See the License for the specific language governing permissions and 14b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim * limitations under the License. 15b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim */ 16b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim 17ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti#include <numeric> 18ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti#include <vector> 19ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti 20b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim#include <android-base/logging.h> 21b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim 22b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim#include <android/hardware/wifi/1.2/IWifiStaIface.h> 23b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim 24b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim#include <VtsHalHidlTargetTestBase.h> 25b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim 26b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim#include "wifi_hidl_call_util.h" 27b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim#include "wifi_hidl_test_utils.h" 28b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim 29b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kimusing ::android::sp; 30ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocentiusing ::android::hardware::wifi::V1_0::CommandId; 31b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kimusing ::android::hardware::wifi::V1_0::WifiStatusCode; 32ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocentiusing ::android::hardware::wifi::V1_2::IWifiStaIface; 33b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim 34b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim/** 35b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim * Fixture to use for all STA Iface HIDL interface tests. 36b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim */ 37b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kimclass WifiStaIfaceHidlTest : public ::testing::VtsHalHidlTargetTestBase { 38b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim public: 39b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim virtual void SetUp() override { 40b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim wifi_sta_iface_ = IWifiStaIface::castFrom(getWifiStaIface()); 41b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim ASSERT_NE(nullptr, wifi_sta_iface_.get()); 42b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim } 43b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim 44b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim virtual void TearDown() override { stopWifi(); } 45b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim 46b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim protected: 47ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti bool isCapabilitySupported(IWifiStaIface::StaIfaceCapabilityMask cap_mask) { 48ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti const auto& status_and_caps = 49ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti HIDL_INVOKE(wifi_sta_iface_, getCapabilities); 50ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_caps.first.code); 51ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti return (status_and_caps.second & cap_mask) != 0; 52ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti } 53ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti 54b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim sp<IWifiStaIface> wifi_sta_iface_; 55b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim}; 56b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim 57b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim/* 58b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim * SetMacAddress: 59b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim * Ensures that calls to set MAC address will return a success status 60b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim * code. 61b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim */ 62b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook KimTEST_F(WifiStaIfaceHidlTest, SetMacAddress) { 63b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim const android::hardware::hidl_array<uint8_t, 6> kMac{ 64b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim std::array<uint8_t, 6>{{0x12, 0x22, 0x33, 0x52, 0x10, 0x41}}}; 65b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim EXPECT_EQ(WifiStatusCode::SUCCESS, 66b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim HIDL_INVOKE(wifi_sta_iface_, setMacAddress, kMac).code); 67b9f0ff9fa6c4a8e5557c339ef0f06b3d597deb98Jong Wook Kim} 68ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti 69ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti/* 70ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti * ReadApfPacketFilterData: 71ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti * Ensures that we can read the APF working memory when supported. 72ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti * 73ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti * TODO: Test disabled because we can't even test reading and writing the APF 74ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti * memory while the interface is in disconnected state (b/73804303#comment25). 75ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti * There's a pending bug on VTS infra to add such support (b/32974062). 76ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti * TODO: We can't execute APF opcodes from this test because there's no way 77ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti * to loop test packets through the wifi firmware (b/73804303#comment29). 78ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti */ 79ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie InnocentiTEST_F(WifiStaIfaceHidlTest, DISABLED_ReadApfPacketFilterData) { 80ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti if (!isCapabilitySupported(IWifiStaIface::StaIfaceCapabilityMask::APF)) { 81ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti // Disable test if APF packet filer is not supported. 82ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti LOG(WARNING) << "TEST SKIPPED: APF packet filtering not supported"; 83ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti return; 84ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti } 85ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti 86ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti const auto& status_and_caps = 87ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti HIDL_INVOKE(wifi_sta_iface_, getApfPacketFilterCapabilities); 88ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_caps.first.code); 89ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti LOG(WARNING) << "StaApfPacketFilterCapabilities: version=" 90ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti << status_and_caps.second.version 91ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti << " maxLength=" << status_and_caps.second.maxLength; 92ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti 93ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti const CommandId kCmd = 0; // Matches what WifiVendorHal.java uses. 94ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti const uint32_t kDataSize = 95ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti std::min(status_and_caps.second.maxLength, static_cast<uint32_t>(500)); 96ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti 97ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti // Create a buffer and fill it with some values. 98ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti std::vector<uint8_t> data(kDataSize); 99ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti std::iota(data.begin(), data.end(), 0); 100ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti 101ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti EXPECT_EQ( 102ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti HIDL_INVOKE(wifi_sta_iface_, installApfPacketFilter, kCmd, data).code, 103ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti WifiStatusCode::SUCCESS); 104ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti const auto& status_and_data = 105ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti HIDL_INVOKE(wifi_sta_iface_, readApfPacketFilterData); 106ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_data.first.code); 107ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti 108ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti EXPECT_EQ(status_and_data.second, data); 109ac10280ea5c15de6a7415f3c9dd0a090242c475dBernie Innocenti} 110