2 * Copyright (C) 2016 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <VtsHalHidlTargetTestBase.h>
19 #include "wifi_hidl_call_util.h"
20 #include "wifi_hidl_test_utils.h"
22 using ::android::hardware::wifi::V1_0::IWifi;
23 using ::android::hardware::wifi::V1_0::IWifiApIface;
24 using ::android::hardware::wifi::V1_0::IWifiChip;
25 using ::android::hardware::wifi::V1_0::IWifiNanIface;
26 using ::android::hardware::wifi::V1_0::IWifiP2pIface;
27 using ::android::hardware::wifi::V1_0::IWifiRttController;
28 using ::android::hardware::wifi::V1_0::IWifiStaIface;
29 using ::android::hardware::wifi::V1_0::ChipModeId;
30 using ::android::hardware::wifi::V1_0::ChipId;
31 using ::android::hardware::wifi::V1_0::IfaceType;
32 using ::android::hardware::wifi::V1_0::WifiStatus;
33 using ::android::hardware::wifi::V1_0::WifiStatusCode;
35 using ::android::hardware::hidl_string;
36 using ::android::hardware::hidl_vec;
39 bool findAnyModeSupportingIfaceType(
40 IfaceType desired_type, const std::vector<IWifiChip::ChipMode>& modes,
41 ChipModeId* mode_id) {
42 for (const auto& mode : modes) {
43 for (const auto& combination : mode.availableCombinations) {
44 for (const auto& iface_limit : combination.limits) {
45 const auto& iface_types = iface_limit.types;
46 if (std::find(iface_types.begin(), iface_types.end(),
47 desired_type) != iface_types.end()) {
57 bool configureChipToSupportIfaceTypeInternal(const sp<IWifiChip>& wifi_chip,
59 ChipModeId* configured_mode_id) {
60 if (!configured_mode_id) {
63 const auto& status_and_modes = HIDL_INVOKE(wifi_chip, getAvailableModes);
64 if (status_and_modes.first.code != WifiStatusCode::SUCCESS) {
67 if (!findAnyModeSupportingIfaceType(type, status_and_modes.second,
68 configured_mode_id)) {
71 if (HIDL_INVOKE(wifi_chip, configureChip, *configured_mode_id).code !=
72 WifiStatusCode::SUCCESS) {
78 bool configureChipToSupportIfaceTypeInternal(const sp<IWifiChip>& wifi_chip,
81 return configureChipToSupportIfaceTypeInternal(wifi_chip, type, &mode_id);
86 sp<IWifi> wifi = ::testing::VtsHalHidlTargetTestBase::getService<IWifi>();
90 sp<IWifiChip> getWifiChip() {
91 sp<IWifi> wifi = getWifi();
95 if (HIDL_INVOKE(wifi, start).code != WifiStatusCode::SUCCESS) {
98 const auto& status_and_chip_ids = HIDL_INVOKE(wifi, getChipIds);
99 const auto& chip_ids = status_and_chip_ids.second;
100 if (status_and_chip_ids.first.code != WifiStatusCode::SUCCESS ||
101 chip_ids.size() != 1) {
104 const auto& status_and_chip = HIDL_INVOKE(wifi, getChip, chip_ids[0]);
105 if (status_and_chip.first.code != WifiStatusCode::SUCCESS) {
108 return status_and_chip.second;
111 sp<IWifiApIface> getWifiApIface() {
112 sp<IWifiChip> wifi_chip = getWifiChip();
113 if (!wifi_chip.get()) {
116 if (!configureChipToSupportIfaceTypeInternal(wifi_chip, IfaceType::AP)) {
119 const auto& status_and_iface = HIDL_INVOKE(wifi_chip, createApIface);
120 if (status_and_iface.first.code != WifiStatusCode::SUCCESS) {
123 return status_and_iface.second;
126 sp<IWifiNanIface> getWifiNanIface() {
127 sp<IWifiChip> wifi_chip = getWifiChip();
128 if (!wifi_chip.get()) {
131 if (!configureChipToSupportIfaceTypeInternal(wifi_chip, IfaceType::NAN)) {
134 const auto& status_and_iface = HIDL_INVOKE(wifi_chip, createNanIface);
135 if (status_and_iface.first.code != WifiStatusCode::SUCCESS) {
138 return status_and_iface.second;
141 sp<IWifiP2pIface> getWifiP2pIface() {
142 sp<IWifiChip> wifi_chip = getWifiChip();
143 if (!wifi_chip.get()) {
146 if (!configureChipToSupportIfaceTypeInternal(wifi_chip, IfaceType::P2P)) {
149 const auto& status_and_iface = HIDL_INVOKE(wifi_chip, createP2pIface);
150 if (status_and_iface.first.code != WifiStatusCode::SUCCESS) {
153 return status_and_iface.second;
156 sp<IWifiStaIface> getWifiStaIface() {
157 sp<IWifiChip> wifi_chip = getWifiChip();
158 if (!wifi_chip.get()) {
161 if (!configureChipToSupportIfaceTypeInternal(wifi_chip, IfaceType::STA)) {
164 const auto& status_and_iface = HIDL_INVOKE(wifi_chip, createStaIface);
165 if (status_and_iface.first.code != WifiStatusCode::SUCCESS) {
168 return status_and_iface.second;
171 sp<IWifiRttController> getWifiRttController() {
172 sp<IWifiChip> wifi_chip = getWifiChip();
173 if (!wifi_chip.get()) {
176 sp<IWifiStaIface> wifi_sta_iface = getWifiStaIface();
177 if (!wifi_sta_iface.get()) {
180 const auto& status_and_controller =
181 HIDL_INVOKE(wifi_chip, createRttController, wifi_sta_iface);
182 if (status_and_controller.first.code != WifiStatusCode::SUCCESS) {
185 return status_and_controller.second;
188 bool configureChipToSupportIfaceType(const sp<IWifiChip>& wifi_chip,
190 ChipModeId* configured_mode_id) {
191 return configureChipToSupportIfaceTypeInternal(wifi_chip, type,
196 sp<IWifi> wifi = getWifi();
197 ASSERT_NE(wifi, nullptr);
198 ASSERT_EQ(HIDL_INVOKE(wifi, stop).code, WifiStatusCode::SUCCESS);