• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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