blob: 4f8545ff4816f53c9a098b934586f7f7cb77eb13 [file] [log] [blame]
Roshan Pius3c4e8a32016-10-03 14:53:58 -07001/*
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 "wifi_chip.h"
18
19#include <android-base/logging.h>
20
Roshan Pius5c055462016-10-11 08:27:27 -070021#include "wifi_status_util.h"
Roshan Pius3c4e8a32016-10-03 14:53:58 -070022
Roshan Pius35d958c2016-10-06 16:47:38 -070023namespace {
24using android::sp;
25using android::hardware::hidl_vec;
26using android::hardware::hidl_string;
27
Roshan Pius5c055462016-10-11 08:27:27 -070028std::vector<hidl_string> createHidlVecOfIfaceNames(const std::string& ifname) {
Roshan Pius35d958c2016-10-06 16:47:38 -070029 std::vector<hidl_string> ifnames;
30 if (!ifname.empty()) {
Roshan Pius5c055462016-10-11 08:27:27 -070031 ifnames.emplace_back(ifname);
Roshan Pius35d958c2016-10-06 16:47:38 -070032 }
Roshan Pius5c055462016-10-11 08:27:27 -070033 return ifnames;
Roshan Pius35d958c2016-10-06 16:47:38 -070034}
35
36template <typename Iface>
37void invalidateAndClear(sp<Iface>& iface) {
38 if (iface.get()) {
39 iface->invalidate();
40 iface.clear();
41 }
42}
43} // namepsace
44
Roshan Pius3c4e8a32016-10-03 14:53:58 -070045namespace android {
46namespace hardware {
47namespace wifi {
Roshan Pius79a99752016-10-04 13:03:58 -070048namespace V1_0 {
49namespace implementation {
Roshan Pius3c4e8a32016-10-03 14:53:58 -070050
Roshan Piuscd566bd2016-10-10 08:03:42 -070051WifiChip::WifiChip(ChipId chip_id,
52 const std::weak_ptr<WifiLegacyHal> legacy_hal)
Roshan Pius35d958c2016-10-06 16:47:38 -070053 : chip_id_(chip_id), legacy_hal_(legacy_hal), is_valid_(true) {}
Roshan Pius3c4e8a32016-10-03 14:53:58 -070054
Roshan Piusaabe5752016-09-29 09:03:59 -070055void WifiChip::invalidate() {
Roshan Pius35d958c2016-10-06 16:47:38 -070056 invalidateAndRemoveAllIfaces();
Roshan Piusaabe5752016-09-29 09:03:59 -070057 legacy_hal_.reset();
Roshan Pius5c055462016-10-11 08:27:27 -070058 event_callbacks_.clear();
Roshan Pius35d958c2016-10-06 16:47:38 -070059 is_valid_ = false;
Roshan Pius3c4e8a32016-10-03 14:53:58 -070060}
61
Roshan Pius5c055462016-10-11 08:27:27 -070062Return<void> WifiChip::getId(getId_cb hidl_status_cb) {
63 if (!is_valid_) {
64 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID),
65 UINT32_MAX);
66 return Void();
67 }
68 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS), chip_id_);
69 return Void();
Roshan Piuscd566bd2016-10-10 08:03:42 -070070}
71
Roshan Pius3c4e8a32016-10-03 14:53:58 -070072Return<void> WifiChip::registerEventCallback(
Roshan Pius5c055462016-10-11 08:27:27 -070073 const sp<IWifiChipEventCallback>& event_callback,
74 registerEventCallback_cb hidl_status_cb) {
75 if (!is_valid_) {
76 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID));
Roshan Pius79a99752016-10-04 13:03:58 -070077 return Void();
Roshan Pius5c055462016-10-11 08:27:27 -070078 }
Roshan Pius3c4e8a32016-10-03 14:53:58 -070079 // TODO(b/31632518): remove the callback when the client is destroyed
Roshan Pius5c055462016-10-11 08:27:27 -070080 event_callbacks_.emplace_back(event_callback);
81 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS));
Roshan Pius3c4e8a32016-10-03 14:53:58 -070082 return Void();
83}
84
Roshan Pius5c055462016-10-11 08:27:27 -070085Return<void> WifiChip::getAvailableModes(getAvailableModes_cb hidl_status_cb) {
Roshan Pius35d958c2016-10-06 16:47:38 -070086 if (!is_valid_) {
Roshan Pius5c055462016-10-11 08:27:27 -070087 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID),
88 hidl_vec<ChipMode>());
Roshan Pius3c4e8a32016-10-03 14:53:58 -070089 return Void();
90 }
Roshan Pius5c055462016-10-11 08:27:27 -070091 // TODO add implementation
92 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS),
93 hidl_vec<ChipMode>());
94 return Void();
Roshan Pius3c4e8a32016-10-03 14:53:58 -070095}
96
Roshan Pius5c055462016-10-11 08:27:27 -070097Return<void> WifiChip::configureChip(uint32_t /*mode_id*/,
98 configureChip_cb hidl_status_cb) {
99 if (!is_valid_) {
100 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID));
Roshan Pius79a99752016-10-04 13:03:58 -0700101 return Void();
Roshan Pius5c055462016-10-11 08:27:27 -0700102 }
Roshan Pius35d958c2016-10-06 16:47:38 -0700103
104 invalidateAndRemoveAllIfaces();
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700105 // TODO add implementation
Roshan Pius5c055462016-10-11 08:27:27 -0700106 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS));
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700107 return Void();
108}
109
Roshan Pius5c055462016-10-11 08:27:27 -0700110Return<void> WifiChip::getMode(getMode_cb hidl_status_cb) {
111 if (!is_valid_) {
112 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID),
113 UINT32_MAX);
114 return Void();
115 }
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700116 // TODO add implementation
Roshan Pius5c055462016-10-11 08:27:27 -0700117 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS), 0);
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700118 return Void();
119}
120
Roshan Pius5c055462016-10-11 08:27:27 -0700121Return<void> WifiChip::requestChipDebugInfo(
122 requestChipDebugInfo_cb hidl_status_cb) {
123 if (!is_valid_) {
124 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID),
125 IWifiChip::ChipDebugInfo());
Roshan Piuscdb77f32016-10-03 14:09:57 -0700126 return Void();
127 }
128
Roshan Pius5c055462016-10-11 08:27:27 -0700129 IWifiChip::ChipDebugInfo result;
130
131 wifi_error legacy_status;
132 std::string driver_desc;
133 std::tie(legacy_status, driver_desc) = legacy_hal_.lock()->getDriverVersion();
134 if (legacy_status != WIFI_SUCCESS) {
135 LOG(ERROR) << "Failed to get driver version: "
136 << legacyErrorToString(legacy_status);
137 WifiStatus status = createWifiStatusFromLegacyError(
138 legacy_status, "failed to get driver version");
139 hidl_status_cb(status, result);
140 return Void();
141 }
142 result.driverDescription = driver_desc.c_str();
143
144 std::string firmware_desc;
145 std::tie(legacy_status, firmware_desc) =
146 legacy_hal_.lock()->getFirmwareVersion();
147 if (legacy_status != WIFI_SUCCESS) {
148 LOG(ERROR) << "Failed to get firmware version: "
149 << legacyErrorToString(legacy_status);
150 WifiStatus status = createWifiStatusFromLegacyError(
151 legacy_status, "failed to get firmware version");
152 hidl_status_cb(status, result);
153 return Void();
154 }
155 result.firmwareDescription = firmware_desc.c_str();
156
157 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS), result);
158 return Void();
159}
160
161Return<void> WifiChip::requestDriverDebugDump(
162 requestDriverDebugDump_cb hidl_status_cb) {
163 if (!is_valid_) {
164 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID),
165 hidl_vec<uint8_t>());
166 return Void();
167 }
168
169 wifi_error legacy_status;
170 std::vector<char> driver_dump;
171 std::tie(legacy_status, driver_dump) =
172 legacy_hal_.lock()->requestDriverMemoryDump();
173 if (legacy_status != WIFI_SUCCESS) {
174 LOG(ERROR) << "Failed to get driver debug dump: "
175 << legacyErrorToString(legacy_status);
176 hidl_status_cb(createWifiStatusFromLegacyError(legacy_status),
177 hidl_vec<uint8_t>());
178 return Void();
179 }
180
Roshan Piuscdb77f32016-10-03 14:09:57 -0700181 hidl_vec<uint8_t> hidl_data;
182 hidl_data.setToExternal(reinterpret_cast<uint8_t*>(driver_dump.data()),
183 driver_dump.size());
Roshan Pius5c055462016-10-11 08:27:27 -0700184 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS), hidl_data);
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700185 return Void();
186}
187
Roshan Pius5c055462016-10-11 08:27:27 -0700188Return<void> WifiChip::requestFirmwareDebugDump(
189 requestFirmwareDebugDump_cb hidl_status_cb) {
190 if (!is_valid_) {
191 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID),
192 hidl_vec<uint8_t>());
Roshan Piuscdb77f32016-10-03 14:09:57 -0700193 return Void();
194 }
195
Roshan Pius5c055462016-10-11 08:27:27 -0700196 wifi_error legacy_status;
197 std::vector<char> firmware_dump;
198 std::tie(legacy_status, firmware_dump) =
199 legacy_hal_.lock()->requestFirmwareMemoryDump();
200 if (legacy_status != WIFI_SUCCESS) {
201 LOG(ERROR) << "Failed to get firmware debug dump: "
202 << legacyErrorToString(legacy_status);
203 hidl_status_cb(createWifiStatusFromLegacyError(legacy_status),
204 hidl_vec<uint8_t>());
205 return Void();
206 }
207
Roshan Piuscdb77f32016-10-03 14:09:57 -0700208 hidl_vec<uint8_t> hidl_data;
209 hidl_data.setToExternal(reinterpret_cast<uint8_t*>(firmware_dump.data()),
210 firmware_dump.size());
Roshan Pius5c055462016-10-11 08:27:27 -0700211 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS), hidl_data);
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700212 return Void();
213}
214
Roshan Pius5c055462016-10-11 08:27:27 -0700215Return<void> WifiChip::createApIface(createApIface_cb hidl_status_cb) {
Roshan Pius35d958c2016-10-06 16:47:38 -0700216 if (!is_valid_) {
Roshan Pius5c055462016-10-11 08:27:27 -0700217 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID),
218 nullptr);
Roshan Pius35d958c2016-10-06 16:47:38 -0700219 return Void();
220 }
221
222 // TODO(b/31997422): Disallow this based on the chip combination.
223 std::string ifname = legacy_hal_.lock()->getApIfaceName();
224 ap_iface_ = new WifiApIface(ifname, legacy_hal_);
Roshan Pius5c055462016-10-11 08:27:27 -0700225 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS), ap_iface_);
Roshan Pius35d958c2016-10-06 16:47:38 -0700226 return Void();
227}
228
Roshan Pius5c055462016-10-11 08:27:27 -0700229Return<void> WifiChip::getApIfaceNames(getApIfaceNames_cb hidl_status_cb) {
Roshan Pius35d958c2016-10-06 16:47:38 -0700230 if (!is_valid_) {
Roshan Pius5c055462016-10-11 08:27:27 -0700231 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID),
232 hidl_vec<hidl_string>());
Roshan Pius35d958c2016-10-06 16:47:38 -0700233 return Void();
234 }
235
236 std::string ifname;
237 if (ap_iface_.get()) {
238 ifname = legacy_hal_.lock()->getApIfaceName().c_str();
239 }
Roshan Pius5c055462016-10-11 08:27:27 -0700240 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS),
241 createHidlVecOfIfaceNames(ifname));
Roshan Pius35d958c2016-10-06 16:47:38 -0700242 return Void();
243}
244
Roshan Pius5c055462016-10-11 08:27:27 -0700245Return<void> WifiChip::getApIface(const hidl_string& ifname,
246 getApIface_cb hidl_status_cb) {
Roshan Pius35d958c2016-10-06 16:47:38 -0700247 if (!is_valid_) {
Roshan Pius5c055462016-10-11 08:27:27 -0700248 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID),
249 nullptr);
Roshan Pius35d958c2016-10-06 16:47:38 -0700250 return Void();
251 }
252
253 if (ap_iface_.get() &&
254 (ifname.c_str() == legacy_hal_.lock()->getApIfaceName())) {
Roshan Pius5c055462016-10-11 08:27:27 -0700255 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS), ap_iface_);
Roshan Pius35d958c2016-10-06 16:47:38 -0700256 } else {
Roshan Pius5c055462016-10-11 08:27:27 -0700257 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS),
258 nullptr);
Roshan Pius35d958c2016-10-06 16:47:38 -0700259 }
260 return Void();
261}
262
Roshan Pius5c055462016-10-11 08:27:27 -0700263Return<void> WifiChip::createNanIface(createNanIface_cb hidl_status_cb) {
Roshan Pius35d958c2016-10-06 16:47:38 -0700264 if (!is_valid_) {
Roshan Pius5c055462016-10-11 08:27:27 -0700265 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID),
266 nullptr);
Roshan Pius35d958c2016-10-06 16:47:38 -0700267 return Void();
268 }
269
270 // TODO(b/31997422): Disallow this based on the chip combination.
271 std::string ifname = legacy_hal_.lock()->getNanIfaceName();
272 nan_iface_ = new WifiNanIface(ifname, legacy_hal_);
Roshan Pius5c055462016-10-11 08:27:27 -0700273 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS), nan_iface_);
Roshan Pius35d958c2016-10-06 16:47:38 -0700274 return Void();
275}
276
Roshan Pius5c055462016-10-11 08:27:27 -0700277Return<void> WifiChip::getNanIfaceNames(getNanIfaceNames_cb hidl_status_cb) {
Roshan Pius35d958c2016-10-06 16:47:38 -0700278 if (!is_valid_) {
Roshan Pius5c055462016-10-11 08:27:27 -0700279 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID),
280 hidl_vec<hidl_string>());
Roshan Pius35d958c2016-10-06 16:47:38 -0700281 return Void();
282 }
283
284 std::string ifname;
285 if (nan_iface_.get()) {
286 ifname = legacy_hal_.lock()->getNanIfaceName().c_str();
287 }
Roshan Pius5c055462016-10-11 08:27:27 -0700288 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS),
289 createHidlVecOfIfaceNames(ifname));
Roshan Pius35d958c2016-10-06 16:47:38 -0700290 return Void();
291}
292
293Return<void> WifiChip::getNanIface(const hidl_string& ifname,
Roshan Pius5c055462016-10-11 08:27:27 -0700294 getNanIface_cb hidl_status_cb) {
Roshan Pius35d958c2016-10-06 16:47:38 -0700295 if (!is_valid_) {
Roshan Pius5c055462016-10-11 08:27:27 -0700296 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID),
297 nullptr);
Roshan Pius35d958c2016-10-06 16:47:38 -0700298 return Void();
299 }
300
301 if (nan_iface_.get() &&
302 (ifname.c_str() == legacy_hal_.lock()->getNanIfaceName())) {
Roshan Pius5c055462016-10-11 08:27:27 -0700303 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS), nan_iface_);
Roshan Pius35d958c2016-10-06 16:47:38 -0700304 } else {
Roshan Pius5c055462016-10-11 08:27:27 -0700305 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS),
306 nullptr);
Roshan Pius35d958c2016-10-06 16:47:38 -0700307 }
308 return Void();
309}
310
Roshan Pius5c055462016-10-11 08:27:27 -0700311Return<void> WifiChip::createP2pIface(createP2pIface_cb hidl_status_cb) {
Roshan Pius35d958c2016-10-06 16:47:38 -0700312 if (!is_valid_) {
Roshan Pius5c055462016-10-11 08:27:27 -0700313 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID),
314 nullptr);
Roshan Pius35d958c2016-10-06 16:47:38 -0700315 return Void();
316 }
317
318 // TODO(b/31997422): Disallow this based on the chip combination.
319 std::string ifname = legacy_hal_.lock()->getP2pIfaceName();
320 p2p_iface_ = new WifiP2pIface(ifname, legacy_hal_);
Roshan Pius5c055462016-10-11 08:27:27 -0700321 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS), p2p_iface_);
Roshan Pius35d958c2016-10-06 16:47:38 -0700322 return Void();
323}
324
Roshan Pius5c055462016-10-11 08:27:27 -0700325Return<void> WifiChip::getP2pIfaceNames(getP2pIfaceNames_cb hidl_status_cb) {
Roshan Pius35d958c2016-10-06 16:47:38 -0700326 if (!is_valid_) {
Roshan Pius5c055462016-10-11 08:27:27 -0700327 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID),
328 hidl_vec<hidl_string>());
Roshan Pius35d958c2016-10-06 16:47:38 -0700329 return Void();
330 }
331
332 std::string ifname;
333 if (p2p_iface_.get()) {
334 ifname = legacy_hal_.lock()->getP2pIfaceName().c_str();
335 }
Roshan Pius5c055462016-10-11 08:27:27 -0700336 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS),
337 createHidlVecOfIfaceNames(ifname));
Roshan Pius35d958c2016-10-06 16:47:38 -0700338 return Void();
339}
340
341Return<void> WifiChip::getP2pIface(const hidl_string& ifname,
Roshan Pius5c055462016-10-11 08:27:27 -0700342 getP2pIface_cb hidl_status_cb) {
Roshan Pius35d958c2016-10-06 16:47:38 -0700343 if (!is_valid_) {
Roshan Pius5c055462016-10-11 08:27:27 -0700344 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID),
345 nullptr);
Roshan Pius35d958c2016-10-06 16:47:38 -0700346 return Void();
347 }
348
349 if (p2p_iface_.get() &&
350 (ifname.c_str() == legacy_hal_.lock()->getP2pIfaceName())) {
Roshan Pius5c055462016-10-11 08:27:27 -0700351 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS), p2p_iface_);
Roshan Pius35d958c2016-10-06 16:47:38 -0700352 } else {
Roshan Pius5c055462016-10-11 08:27:27 -0700353 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS),
354 nullptr);
Roshan Pius35d958c2016-10-06 16:47:38 -0700355 }
356 return Void();
357}
358
Roshan Pius5c055462016-10-11 08:27:27 -0700359Return<void> WifiChip::createStaIface(createStaIface_cb hidl_status_cb) {
Roshan Pius35d958c2016-10-06 16:47:38 -0700360 if (!is_valid_) {
Roshan Pius5c055462016-10-11 08:27:27 -0700361 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID),
362 nullptr);
Roshan Pius35d958c2016-10-06 16:47:38 -0700363 return Void();
364 }
365
366 // TODO(b/31997422): Disallow this based on the chip combination.
367 std::string ifname = legacy_hal_.lock()->getStaIfaceName();
368 sta_iface_ = new WifiStaIface(ifname, legacy_hal_);
Roshan Pius5c055462016-10-11 08:27:27 -0700369 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS), sta_iface_);
Roshan Pius35d958c2016-10-06 16:47:38 -0700370 return Void();
371}
372
Roshan Pius5c055462016-10-11 08:27:27 -0700373Return<void> WifiChip::getStaIfaceNames(getStaIfaceNames_cb hidl_status_cb) {
Roshan Pius35d958c2016-10-06 16:47:38 -0700374 if (!is_valid_) {
Roshan Pius5c055462016-10-11 08:27:27 -0700375 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID),
376 hidl_vec<hidl_string>());
Roshan Pius35d958c2016-10-06 16:47:38 -0700377 return Void();
378 }
379
380 std::string ifname;
381 if (sta_iface_.get()) {
382 ifname = legacy_hal_.lock()->getStaIfaceName().c_str();
383 }
Roshan Pius5c055462016-10-11 08:27:27 -0700384 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS),
385 createHidlVecOfIfaceNames(ifname));
Roshan Pius35d958c2016-10-06 16:47:38 -0700386 return Void();
387}
388
389Return<void> WifiChip::getStaIface(const hidl_string& ifname,
Roshan Pius5c055462016-10-11 08:27:27 -0700390 getStaIface_cb hidl_status_cb) {
Roshan Pius35d958c2016-10-06 16:47:38 -0700391 if (!is_valid_) {
Roshan Pius5c055462016-10-11 08:27:27 -0700392 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID),
393 nullptr);
Roshan Pius35d958c2016-10-06 16:47:38 -0700394 return Void();
395 }
396
397 if (sta_iface_.get() &&
398 (ifname.c_str() == legacy_hal_.lock()->getStaIfaceName())) {
Roshan Pius5c055462016-10-11 08:27:27 -0700399 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS), sta_iface_);
Roshan Pius35d958c2016-10-06 16:47:38 -0700400 } else {
Roshan Pius5c055462016-10-11 08:27:27 -0700401 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS),
402 nullptr);
Roshan Pius35d958c2016-10-06 16:47:38 -0700403 }
404 return Void();
405}
406
Roshan Pius5c055462016-10-11 08:27:27 -0700407Return<void> WifiChip::createRttController(
408 const sp<IWifiIface>& bound_iface, createRttController_cb hidl_status_cb) {
Roshan Pius59268282016-10-06 20:23:47 -0700409 if (!is_valid_) {
Roshan Pius5c055462016-10-11 08:27:27 -0700410 hidl_status_cb(createWifiStatus(WifiStatusCode::ERROR_WIFI_CHIP_INVALID),
411 nullptr);
Roshan Pius59268282016-10-06 20:23:47 -0700412 return Void();
413 }
414
415 sp<WifiRttController> rtt = new WifiRttController(bound_iface, legacy_hal_);
416 rtt_controllers_.emplace_back(rtt);
Roshan Pius5c055462016-10-11 08:27:27 -0700417 hidl_status_cb(createWifiStatus(WifiStatusCode::SUCCESS), rtt);
Roshan Pius59268282016-10-06 20:23:47 -0700418 return Void();
419}
420
Roshan Pius35d958c2016-10-06 16:47:38 -0700421void WifiChip::invalidateAndRemoveAllIfaces() {
422 invalidateAndClear(ap_iface_);
423 invalidateAndClear(nan_iface_);
424 invalidateAndClear(p2p_iface_);
425 invalidateAndClear(sta_iface_);
Roshan Pius59268282016-10-06 20:23:47 -0700426 // Since all the ifaces are invalid now, all RTT controller objects
427 // using those ifaces also need to be invalidated.
428 for (const auto& rtt : rtt_controllers_) {
429 rtt->invalidate();
430 }
431 rtt_controllers_.clear();
Roshan Pius35d958c2016-10-06 16:47:38 -0700432}
433
Roshan Pius79a99752016-10-04 13:03:58 -0700434} // namespace implementation
435} // namespace V1_0
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700436} // namespace wifi
437} // namespace hardware
438} // namespace android