1 /*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
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
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
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.
15 */
16
17 #include <android-base/logging.h>
18 #include <cutils/properties.h>
19
20 #include <android/hidl/manager/1.0/IServiceManager.h>
21 #include <hidl/HidlTransportSupport.h>
22
23 #include <wifi_system/interface_tool.h>
24 #include <wifi_system/supplicant_manager.h>
25
26 #include "supplicant_hidl_test_utils.h"
27 #include "wifi_hidl_test_utils.h"
28
29 using ::android::sp;
30 using ::android::hardware::configureRpcThreadpool;
31 using ::android::hardware::joinRpcThreadpool;
32 using ::android::hardware::hidl_string;
33 using ::android::hardware::hidl_vec;
34 using ::android::hardware::Return;
35 using ::android::hardware::Void;
36 using ::android::hardware::wifi::V1_0::ChipModeId;
37 using ::android::hardware::wifi::V1_0::IWifiChip;
38 using ::android::hardware::wifi::supplicant::V1_0::ISupplicant;
39 using ::android::hardware::wifi::supplicant::V1_0::ISupplicantIface;
40 using ::android::hardware::wifi::supplicant::V1_0::ISupplicantNetwork;
41 using ::android::hardware::wifi::supplicant::V1_0::ISupplicantStaIface;
42 using ::android::hardware::wifi::supplicant::V1_0::ISupplicantStaNetwork;
43 using ::android::hardware::wifi::supplicant::V1_0::ISupplicantP2pIface;
44 using ::android::hardware::wifi::supplicant::V1_0::IfaceType;
45 using ::android::hardware::wifi::supplicant::V1_0::SupplicantStatus;
46 using ::android::hardware::wifi::supplicant::V1_0::SupplicantStatusCode;
47 using ::android::wifi_system::InterfaceTool;
48 using ::android::wifi_system::SupplicantManager;
49
50 namespace {
51
52 // Helper function to initialize the driver and firmware to STA mode
53 // using the vendor HAL HIDL interface.
initilializeDriverAndFirmware(const std::string & wifi_instance_name)54 void initilializeDriverAndFirmware(const std::string& wifi_instance_name) {
55 // Skip if wifi instance is not set.
56 if (wifi_instance_name == "") {
57 return;
58 }
59 if (getWifi(wifi_instance_name) != nullptr) {
60 sp<IWifiChip> wifi_chip = getWifiChip(wifi_instance_name);
61 ChipModeId mode_id;
62 EXPECT_TRUE(configureChipToSupportIfaceType(
63 wifi_chip, ::android::hardware::wifi::V1_0::IfaceType::STA, &mode_id));
64 } else {
65 LOG(WARNING) << __func__ << ": Vendor HAL not supported";
66 }
67 }
68
69 // Helper function to deinitialize the driver and firmware
70 // using the vendor HAL HIDL interface.
deInitilializeDriverAndFirmware(const std::string & wifi_instance_name)71 void deInitilializeDriverAndFirmware(const std::string& wifi_instance_name) {
72 // Skip if wifi instance is not set.
73 if (wifi_instance_name == "") {
74 return;
75 }
76 if (getWifi(wifi_instance_name) != nullptr) {
77 stopWifi(wifi_instance_name);
78 } else {
79 LOG(WARNING) << __func__ << ": Vendor HAL not supported";
80 }
81 }
82
83 // Helper function to find any iface of the desired type exposed.
findIfaceOfType(sp<ISupplicant> supplicant,IfaceType desired_type,ISupplicant::IfaceInfo * out_info)84 bool findIfaceOfType(sp<ISupplicant> supplicant, IfaceType desired_type,
85 ISupplicant::IfaceInfo* out_info) {
86 bool operation_failed = false;
87 std::vector<ISupplicant::IfaceInfo> iface_infos;
88 supplicant->listInterfaces([&](const SupplicantStatus& status,
89 hidl_vec<ISupplicant::IfaceInfo> infos) {
90 if (status.code != SupplicantStatusCode::SUCCESS) {
91 operation_failed = true;
92 return;
93 }
94 iface_infos = infos;
95 });
96 if (operation_failed) {
97 return false;
98 }
99 for (const auto& info : iface_infos) {
100 if (info.type == desired_type) {
101 *out_info = info;
102 return true;
103 }
104 }
105 return false;
106 }
107
getStaIfaceName()108 std::string getStaIfaceName() {
109 std::array<char, PROPERTY_VALUE_MAX> buffer;
110 property_get("wifi.interface", buffer.data(), "wlan0");
111 return buffer.data();
112 }
113
getP2pIfaceName()114 std::string getP2pIfaceName() {
115 std::array<char, PROPERTY_VALUE_MAX> buffer;
116 property_get("wifi.direct.interface", buffer.data(), "p2p0");
117 return buffer.data();
118 }
119 } // namespace
120
stopSupplicant()121 void stopSupplicant() { stopSupplicant(""); }
122
stopSupplicant(const std::string & wifi_instance_name)123 void stopSupplicant(const std::string& wifi_instance_name) {
124 SupplicantManager supplicant_manager;
125
126 ASSERT_TRUE(supplicant_manager.StopSupplicant());
127 deInitilializeDriverAndFirmware(wifi_instance_name);
128 ASSERT_FALSE(supplicant_manager.IsSupplicantRunning());
129 }
130
startSupplicantAndWaitForHidlService(const std::string & wifi_instance_name,const std::string & supplicant_instance_name)131 void startSupplicantAndWaitForHidlService(
132 const std::string& wifi_instance_name,
133 const std::string& supplicant_instance_name) {
134 initilializeDriverAndFirmware(wifi_instance_name);
135
136 SupplicantManager supplicant_manager;
137 ASSERT_TRUE(supplicant_manager.StartSupplicant());
138 ASSERT_TRUE(supplicant_manager.IsSupplicantRunning());
139
140 // Wait for supplicant service to come up.
141 ISupplicant::getService(supplicant_instance_name);
142 }
143
is_1_1(const sp<ISupplicant> & supplicant)144 bool is_1_1(const sp<ISupplicant>& supplicant) {
145 sp<::android::hardware::wifi::supplicant::V1_1::ISupplicant>
146 supplicant_1_1 =
147 ::android::hardware::wifi::supplicant::V1_1::ISupplicant::castFrom(
148 supplicant);
149 return supplicant_1_1.get() != nullptr;
150 }
151
addSupplicantStaIface_1_1(const sp<ISupplicant> & supplicant)152 void addSupplicantStaIface_1_1(const sp<ISupplicant>& supplicant) {
153 sp<::android::hardware::wifi::supplicant::V1_1::ISupplicant>
154 supplicant_1_1 =
155 ::android::hardware::wifi::supplicant::V1_1::ISupplicant::castFrom(
156 supplicant);
157 ASSERT_TRUE(supplicant_1_1.get());
158 ISupplicant::IfaceInfo info = {IfaceType::STA, getStaIfaceName()};
159 supplicant_1_1->addInterface(
160 info, [&](const SupplicantStatus& status,
161 const sp<ISupplicantIface>& /* iface */) {
162 ASSERT_TRUE(
163 (SupplicantStatusCode::SUCCESS == status.code) ||
164 (SupplicantStatusCode::FAILURE_IFACE_EXISTS == status.code));
165 });
166 }
167
addSupplicantP2pIface_1_1(const sp<ISupplicant> & supplicant)168 void addSupplicantP2pIface_1_1(const sp<ISupplicant>& supplicant) {
169 sp<::android::hardware::wifi::supplicant::V1_1::ISupplicant>
170 supplicant_1_1 =
171 ::android::hardware::wifi::supplicant::V1_1::ISupplicant::castFrom(
172 supplicant);
173 ASSERT_TRUE(supplicant_1_1.get());
174 ISupplicant::IfaceInfo info = {IfaceType::P2P, getP2pIfaceName()};
175 supplicant_1_1->addInterface(
176 info, [&](const SupplicantStatus& status,
177 const sp<ISupplicantIface>& /* iface */) {
178 ASSERT_TRUE(
179 (SupplicantStatusCode::SUCCESS == status.code) ||
180 (SupplicantStatusCode::FAILURE_IFACE_EXISTS == status.code));
181 });
182 }
183
getSupplicant(const std::string & supplicant_instance_name,bool isP2pOn)184 sp<ISupplicant> getSupplicant(const std::string& supplicant_instance_name,
185 bool isP2pOn) {
186 sp<ISupplicant> supplicant =
187 ISupplicant::getService(supplicant_instance_name);
188 // For 1.1 supplicant, we need to add interfaces at initialization.
189 if (is_1_1(supplicant)) {
190 addSupplicantStaIface_1_1(supplicant);
191 if (isP2pOn) {
192 addSupplicantP2pIface_1_1(supplicant);
193 }
194 }
195 return supplicant;
196 }
197
getSupplicantStaIface(const sp<ISupplicant> & supplicant)198 sp<ISupplicantStaIface> getSupplicantStaIface(
199 const sp<ISupplicant>& supplicant) {
200 if (!supplicant.get()) {
201 return nullptr;
202 }
203 ISupplicant::IfaceInfo info;
204 if (!findIfaceOfType(supplicant, IfaceType::STA, &info)) {
205 return nullptr;
206 }
207 bool operation_failed = false;
208 sp<ISupplicantStaIface> sta_iface;
209 supplicant->getInterface(info, [&](const SupplicantStatus& status,
210 const sp<ISupplicantIface>& iface) {
211 if (status.code != SupplicantStatusCode::SUCCESS) {
212 operation_failed = true;
213 return;
214 }
215 sta_iface = ISupplicantStaIface::castFrom(iface);
216 });
217 if (operation_failed) {
218 return nullptr;
219 }
220 return sta_iface;
221 }
222
createSupplicantStaNetwork(const sp<ISupplicant> & supplicant)223 sp<ISupplicantStaNetwork> createSupplicantStaNetwork(
224 const sp<ISupplicant>& supplicant) {
225 sp<ISupplicantStaIface> sta_iface = getSupplicantStaIface(supplicant);
226 if (!sta_iface.get()) {
227 return nullptr;
228 }
229 bool operation_failed = false;
230 sp<ISupplicantStaNetwork> sta_network;
231 sta_iface->addNetwork([&](const SupplicantStatus& status,
232 const sp<ISupplicantNetwork>& network) {
233 if (status.code != SupplicantStatusCode::SUCCESS) {
234 operation_failed = true;
235 return;
236 }
237 sta_network = ISupplicantStaNetwork::castFrom(network);
238 });
239 if (operation_failed) {
240 return nullptr;
241 }
242 return sta_network;
243 }
244
getSupplicantP2pIface(const sp<ISupplicant> & supplicant)245 sp<ISupplicantP2pIface> getSupplicantP2pIface(
246 const sp<ISupplicant>& supplicant) {
247 if (!supplicant.get()) {
248 return nullptr;
249 }
250 ISupplicant::IfaceInfo info;
251 if (!findIfaceOfType(supplicant, IfaceType::P2P, &info)) {
252 return nullptr;
253 }
254 bool operation_failed = false;
255 sp<ISupplicantP2pIface> p2p_iface;
256 supplicant->getInterface(info, [&](const SupplicantStatus& status,
257 const sp<ISupplicantIface>& iface) {
258 if (status.code != SupplicantStatusCode::SUCCESS) {
259 operation_failed = true;
260 return;
261 }
262 p2p_iface = ISupplicantP2pIface::castFrom(iface);
263 });
264 if (operation_failed) {
265 return nullptr;
266 }
267 return p2p_iface;
268 }
269
turnOnExcessiveLogging(const sp<ISupplicant> & supplicant)270 bool turnOnExcessiveLogging(const sp<ISupplicant>& supplicant) {
271 if (!supplicant.get()) {
272 return false;
273 }
274 bool operation_failed = false;
275 supplicant->setDebugParams(
276 ISupplicant::DebugLevel::EXCESSIVE,
277 true, // show timestamps
278 true, // show keys
279 [&](const SupplicantStatus& status) {
280 if (status.code != SupplicantStatusCode::SUCCESS) {
281 operation_failed = true;
282 }
283 });
284 return !operation_failed;
285 }
286
waitForFrameworkReady()287 bool waitForFrameworkReady() {
288 int waitCount = 10;
289 do {
290 // Check whether package service is ready or not.
291 if (!testing::checkSubstringInCommandOutput(
292 "/system/bin/service check package", ": not found")) {
293 return true;
294 }
295 LOG(INFO) << "Framework is not ready";
296 sleep(1);
297 } while (waitCount-- > 0);
298 return false;
299 }
300