blob: af194912a3750ead3b10f56c79b4bbd58a91a1e2 [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
Roshan Pius3c4e8a32016-10-03 14:53:58 -070017#include <android-base/logging.h>
18
Roshan Pius3c868522016-10-27 12:43:49 -070019#include "hidl_return_util.h"
Roshan Piuse2d0ab52016-12-05 15:24:20 -080020#include "hidl_struct_util.h"
Roshan Pius3c868522016-10-27 12:43:49 -070021#include "wifi_chip.h"
Roshan Pius5c055462016-10-11 08:27:27 -070022#include "wifi_status_util.h"
Roshan Pius3c4e8a32016-10-03 14:53:58 -070023
Roshan Pius35d958c2016-10-06 16:47:38 -070024namespace {
25using android::sp;
26using android::hardware::hidl_vec;
27using android::hardware::hidl_string;
Roshan Pius52947fb2016-11-18 11:38:07 -080028using android::hardware::wifi::V1_0::IWifiChip;
29using android::hardware::wifi::V1_0::IfaceType;
30
31constexpr uint32_t kStaChipModeId = 0;
32constexpr uint32_t kApChipModeId = 1;
33constexpr uint32_t kInvalidModeId = UINT32_MAX;
Roshan Pius35d958c2016-10-06 16:47:38 -070034
Roshan Pius35d958c2016-10-06 16:47:38 -070035template <typename Iface>
36void invalidateAndClear(sp<Iface>& iface) {
37 if (iface.get()) {
38 iface->invalidate();
39 iface.clear();
40 }
41}
42} // namepsace
43
Roshan Pius3c4e8a32016-10-03 14:53:58 -070044namespace android {
45namespace hardware {
46namespace wifi {
Roshan Pius79a99752016-10-04 13:03:58 -070047namespace V1_0 {
48namespace implementation {
Roshan Pius3c868522016-10-27 12:43:49 -070049using hidl_return_util::validateAndCall;
Roshan Pius3c4e8a32016-10-03 14:53:58 -070050
Roshan Pius52947fb2016-11-18 11:38:07 -080051WifiChip::WifiChip(
52 ChipId chip_id,
53 const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal,
54 const std::weak_ptr<mode_controller::WifiModeController> mode_controller)
55 : chip_id_(chip_id),
56 legacy_hal_(legacy_hal),
57 mode_controller_(mode_controller),
58 is_valid_(true),
59 current_mode_id_(kInvalidModeId) {}
Roshan Pius3c4e8a32016-10-03 14:53:58 -070060
Roshan Piusaabe5752016-09-29 09:03:59 -070061void WifiChip::invalidate() {
Roshan Pius35d958c2016-10-06 16:47:38 -070062 invalidateAndRemoveAllIfaces();
Roshan Piusaabe5752016-09-29 09:03:59 -070063 legacy_hal_.reset();
Roshan Pius5c055462016-10-11 08:27:27 -070064 event_callbacks_.clear();
Roshan Pius35d958c2016-10-06 16:47:38 -070065 is_valid_ = false;
Roshan Pius3c4e8a32016-10-03 14:53:58 -070066}
67
Roshan Pius3c868522016-10-27 12:43:49 -070068bool WifiChip::isValid() {
69 return is_valid_;
70}
71
Roshan Pius5c055462016-10-11 08:27:27 -070072Return<void> WifiChip::getId(getId_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -070073 return validateAndCall(this,
74 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
75 &WifiChip::getIdInternal,
76 hidl_status_cb);
Roshan Piuscd566bd2016-10-10 08:03:42 -070077}
78
Roshan Pius3c4e8a32016-10-03 14:53:58 -070079Return<void> WifiChip::registerEventCallback(
Roshan Pius5c055462016-10-11 08:27:27 -070080 const sp<IWifiChipEventCallback>& event_callback,
81 registerEventCallback_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -070082 return validateAndCall(this,
83 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
84 &WifiChip::registerEventCallbackInternal,
85 hidl_status_cb,
86 event_callback);
Roshan Pius3c4e8a32016-10-03 14:53:58 -070087}
88
Roshan Pius7d08d7a2016-10-27 14:35:05 -070089Return<void> WifiChip::getCapabilities(getCapabilities_cb hidl_status_cb) {
90 return validateAndCall(this,
91 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
92 &WifiChip::getCapabilitiesInternal,
93 hidl_status_cb);
94}
95
Roshan Pius5c055462016-10-11 08:27:27 -070096Return<void> WifiChip::getAvailableModes(getAvailableModes_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -070097 return validateAndCall(this,
98 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
99 &WifiChip::getAvailableModesInternal,
100 hidl_status_cb);
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700101}
102
Roshan Pius3c868522016-10-27 12:43:49 -0700103Return<void> WifiChip::configureChip(uint32_t mode_id,
Roshan Pius5c055462016-10-11 08:27:27 -0700104 configureChip_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700105 return validateAndCall(this,
106 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
107 &WifiChip::configureChipInternal,
108 hidl_status_cb,
109 mode_id);
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700110}
111
Roshan Pius5c055462016-10-11 08:27:27 -0700112Return<void> WifiChip::getMode(getMode_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700113 return validateAndCall(this,
114 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
115 &WifiChip::getModeInternal,
116 hidl_status_cb);
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700117}
118
Roshan Pius5c055462016-10-11 08:27:27 -0700119Return<void> WifiChip::requestChipDebugInfo(
120 requestChipDebugInfo_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700121 return validateAndCall(this,
122 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
123 &WifiChip::requestChipDebugInfoInternal,
124 hidl_status_cb);
Roshan Pius5c055462016-10-11 08:27:27 -0700125}
126
127Return<void> WifiChip::requestDriverDebugDump(
128 requestDriverDebugDump_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700129 return validateAndCall(this,
130 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
131 &WifiChip::requestDriverDebugDumpInternal,
132 hidl_status_cb);
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700133}
134
Roshan Pius5c055462016-10-11 08:27:27 -0700135Return<void> WifiChip::requestFirmwareDebugDump(
136 requestFirmwareDebugDump_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700137 return validateAndCall(this,
138 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
139 &WifiChip::requestFirmwareDebugDumpInternal,
140 hidl_status_cb);
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700141}
142
Roshan Pius5c055462016-10-11 08:27:27 -0700143Return<void> WifiChip::createApIface(createApIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700144 return validateAndCall(this,
145 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
146 &WifiChip::createApIfaceInternal,
147 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700148}
149
Roshan Pius5c055462016-10-11 08:27:27 -0700150Return<void> WifiChip::getApIfaceNames(getApIfaceNames_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700151 return validateAndCall(this,
152 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
153 &WifiChip::getApIfaceNamesInternal,
154 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700155}
156
Roshan Pius5c055462016-10-11 08:27:27 -0700157Return<void> WifiChip::getApIface(const hidl_string& ifname,
158 getApIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700159 return validateAndCall(this,
160 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
161 &WifiChip::getApIfaceInternal,
162 hidl_status_cb,
163 ifname);
Roshan Pius35d958c2016-10-06 16:47:38 -0700164}
165
Roshan Pius5c055462016-10-11 08:27:27 -0700166Return<void> WifiChip::createNanIface(createNanIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700167 return validateAndCall(this,
168 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
169 &WifiChip::createNanIfaceInternal,
170 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700171}
172
Roshan Pius5c055462016-10-11 08:27:27 -0700173Return<void> WifiChip::getNanIfaceNames(getNanIfaceNames_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700174 return validateAndCall(this,
175 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
176 &WifiChip::getNanIfaceNamesInternal,
177 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700178}
179
180Return<void> WifiChip::getNanIface(const hidl_string& ifname,
Roshan Pius5c055462016-10-11 08:27:27 -0700181 getNanIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700182 return validateAndCall(this,
183 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
184 &WifiChip::getNanIfaceInternal,
185 hidl_status_cb,
186 ifname);
Roshan Pius35d958c2016-10-06 16:47:38 -0700187}
188
Roshan Pius5c055462016-10-11 08:27:27 -0700189Return<void> WifiChip::createP2pIface(createP2pIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700190 return validateAndCall(this,
191 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
192 &WifiChip::createP2pIfaceInternal,
193 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700194}
195
Roshan Pius5c055462016-10-11 08:27:27 -0700196Return<void> WifiChip::getP2pIfaceNames(getP2pIfaceNames_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700197 return validateAndCall(this,
198 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
199 &WifiChip::getP2pIfaceNamesInternal,
200 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700201}
202
203Return<void> WifiChip::getP2pIface(const hidl_string& ifname,
Roshan Pius5c055462016-10-11 08:27:27 -0700204 getP2pIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700205 return validateAndCall(this,
206 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
207 &WifiChip::getP2pIfaceInternal,
208 hidl_status_cb,
209 ifname);
Roshan Pius35d958c2016-10-06 16:47:38 -0700210}
211
Roshan Pius5c055462016-10-11 08:27:27 -0700212Return<void> WifiChip::createStaIface(createStaIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700213 return validateAndCall(this,
214 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
215 &WifiChip::createStaIfaceInternal,
216 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700217}
218
Roshan Pius5c055462016-10-11 08:27:27 -0700219Return<void> WifiChip::getStaIfaceNames(getStaIfaceNames_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700220 return validateAndCall(this,
221 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
222 &WifiChip::getStaIfaceNamesInternal,
223 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700224}
225
226Return<void> WifiChip::getStaIface(const hidl_string& ifname,
Roshan Pius5c055462016-10-11 08:27:27 -0700227 getStaIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700228 return validateAndCall(this,
229 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
230 &WifiChip::getStaIfaceInternal,
231 hidl_status_cb,
232 ifname);
Roshan Pius35d958c2016-10-06 16:47:38 -0700233}
234
Roshan Pius5c055462016-10-11 08:27:27 -0700235Return<void> WifiChip::createRttController(
236 const sp<IWifiIface>& bound_iface, createRttController_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700237 return validateAndCall(this,
238 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
239 &WifiChip::createRttControllerInternal,
240 hidl_status_cb,
241 bound_iface);
Roshan Pius59268282016-10-06 20:23:47 -0700242}
243
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700244Return<void> WifiChip::getDebugRingBuffersStatus(
245 getDebugRingBuffersStatus_cb hidl_status_cb) {
246 return validateAndCall(this,
247 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
248 &WifiChip::getDebugRingBuffersStatusInternal,
249 hidl_status_cb);
250}
251
252Return<void> WifiChip::startLoggingToDebugRingBuffer(
253 const hidl_string& ring_name,
254 WifiDebugRingBufferVerboseLevel verbose_level,
255 uint32_t max_interval_in_sec,
256 uint32_t min_data_size_in_bytes,
257 startLoggingToDebugRingBuffer_cb hidl_status_cb) {
258 return validateAndCall(this,
259 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
260 &WifiChip::startLoggingToDebugRingBufferInternal,
261 hidl_status_cb,
262 ring_name,
263 verbose_level,
264 max_interval_in_sec,
265 min_data_size_in_bytes);
266}
267
268Return<void> WifiChip::forceDumpToDebugRingBuffer(
269 const hidl_string& ring_name,
270 forceDumpToDebugRingBuffer_cb hidl_status_cb) {
271 return validateAndCall(this,
272 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
273 &WifiChip::forceDumpToDebugRingBufferInternal,
274 hidl_status_cb,
275 ring_name);
276}
277
278Return<void> WifiChip::getDebugHostWakeReasonStats(
279 getDebugHostWakeReasonStats_cb hidl_status_cb) {
280 return validateAndCall(this,
281 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
282 &WifiChip::getDebugHostWakeReasonStatsInternal,
283 hidl_status_cb);
284}
285
Roshan Pius35d958c2016-10-06 16:47:38 -0700286void WifiChip::invalidateAndRemoveAllIfaces() {
287 invalidateAndClear(ap_iface_);
288 invalidateAndClear(nan_iface_);
289 invalidateAndClear(p2p_iface_);
290 invalidateAndClear(sta_iface_);
Roshan Pius59268282016-10-06 20:23:47 -0700291 // Since all the ifaces are invalid now, all RTT controller objects
292 // using those ifaces also need to be invalidated.
293 for (const auto& rtt : rtt_controllers_) {
294 rtt->invalidate();
295 }
296 rtt_controllers_.clear();
Roshan Pius35d958c2016-10-06 16:47:38 -0700297}
298
Roshan Pius3c868522016-10-27 12:43:49 -0700299std::pair<WifiStatus, ChipId> WifiChip::getIdInternal() {
300 return {createWifiStatus(WifiStatusCode::SUCCESS), chip_id_};
301}
302
303WifiStatus WifiChip::registerEventCallbackInternal(
304 const sp<IWifiChipEventCallback>& event_callback) {
305 // TODO(b/31632518): remove the callback when the client is destroyed
306 event_callbacks_.emplace_back(event_callback);
307 return createWifiStatus(WifiStatusCode::SUCCESS);
308}
309
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700310std::pair<WifiStatus, uint32_t> WifiChip::getCapabilitiesInternal() {
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800311 legacy_hal::wifi_error legacy_status;
312 uint32_t legacy_logger_feature_set;
313 std::tie(legacy_status, legacy_logger_feature_set) =
314 legacy_hal_.lock()->getLoggerSupportedFeatureSet();
315 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
316 return {createWifiStatusFromLegacyError(legacy_status), 0};
317 }
318 uint32_t hidl_caps;
319 if (!hidl_struct_util::convertLegacyFeaturesToHidlChipCapabilities(
320 legacy_logger_feature_set, &hidl_caps)) {
321 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), 0};
322 }
323 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700324}
325
Roshan Pius3c868522016-10-27 12:43:49 -0700326std::pair<WifiStatus, std::vector<IWifiChip::ChipMode>>
327WifiChip::getAvailableModesInternal() {
Roshan Pius52947fb2016-11-18 11:38:07 -0800328 // The chip combination supported for current devices is fixed for now with
329 // 2 separate modes of operation:
330 // Mode 1 (STA mode): Will support 1 STA and 1 P2P or NAN iface operations
331 // concurrently.
332 // Mode 2 (AP mode): Will support 1 AP iface operations.
333 // TODO (b/32997844): Read this from some device specific flags in the
334 // makefile.
335 // STA mode iface combinations.
336 const IWifiChip::ChipIfaceCombinationLimit
337 sta_chip_iface_combination_limit_1 = {{IfaceType::STA}, 1};
338 const IWifiChip::ChipIfaceCombinationLimit
339 sta_chip_iface_combination_limit_2 = {{IfaceType::P2P, IfaceType::NAN},
340 1};
341 const IWifiChip::ChipIfaceCombination sta_chip_iface_combination = {
342 {sta_chip_iface_combination_limit_1, sta_chip_iface_combination_limit_2}};
343 const IWifiChip::ChipMode sta_chip_mode = {kStaChipModeId,
344 {sta_chip_iface_combination}};
345 // AP mode iface combinations.
346 const IWifiChip::ChipIfaceCombinationLimit ap_chip_iface_combination_limit = {
347 {IfaceType::AP}, 1};
348 const IWifiChip::ChipIfaceCombination ap_chip_iface_combination = {
349 {ap_chip_iface_combination_limit}};
350 const IWifiChip::ChipMode ap_chip_mode = {kApChipModeId,
351 {ap_chip_iface_combination}};
352 return {createWifiStatus(WifiStatusCode::SUCCESS),
353 {sta_chip_mode, ap_chip_mode}};
Roshan Pius3c868522016-10-27 12:43:49 -0700354}
355
Roshan Pius52947fb2016-11-18 11:38:07 -0800356WifiStatus WifiChip::configureChipInternal(uint32_t mode_id) {
357 if (mode_id != kStaChipModeId && mode_id != kApChipModeId) {
358 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
359 }
360 if (mode_id == current_mode_id_) {
361 LOG(DEBUG) << "Already in the specified mode " << mode_id;
362 return createWifiStatus(WifiStatusCode::SUCCESS);
363 }
364 // If the chip is already configured in a different mode, stop
365 // the legacy HAL and then start it after firmware mode change.
366 if (current_mode_id_ != kInvalidModeId) {
367 invalidateAndRemoveAllIfaces();
368 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->stop([]() {});
369 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
370 LOG(ERROR) << "Failed to stop legacy HAL: "
371 << legacyErrorToString(legacy_status);
372 // TODO(b/33038823): Need to invoke onChipReconfigureFailure()
373 return createWifiStatusFromLegacyError(legacy_status);
374 }
375 }
376 bool success;
377 if (mode_id == kStaChipModeId) {
378 success = mode_controller_.lock()->changeFirmwareMode(IfaceType::STA);
379 } else {
380 success = mode_controller_.lock()->changeFirmwareMode(IfaceType::AP);
381 }
382 if (!success) {
383 // TODO(b/33038823): Need to invoke onChipReconfigureFailure()
384 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
385 }
386 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->start();
387 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
388 LOG(ERROR) << "Failed to start legacy HAL: "
389 << legacyErrorToString(legacy_status);
390 // TODO(b/33038823): Need to invoke onChipReconfigureFailure()
391 return createWifiStatusFromLegacyError(legacy_status);
392 }
393 for (const auto& callback : event_callbacks_) {
394 callback->onChipReconfigured(mode_id);
395 }
396 current_mode_id_ = mode_id;
Roshan Pius3c868522016-10-27 12:43:49 -0700397 return createWifiStatus(WifiStatusCode::SUCCESS);
398}
399
400std::pair<WifiStatus, uint32_t> WifiChip::getModeInternal() {
Roshan Pius52947fb2016-11-18 11:38:07 -0800401 if (current_mode_id_ == kInvalidModeId) {
402 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE),
403 current_mode_id_};
404 }
405 return {createWifiStatus(WifiStatusCode::SUCCESS), current_mode_id_};
Roshan Pius3c868522016-10-27 12:43:49 -0700406}
407
408std::pair<WifiStatus, IWifiChip::ChipDebugInfo>
409WifiChip::requestChipDebugInfoInternal() {
410 IWifiChip::ChipDebugInfo result;
Roshan Piusa4854ff2016-12-01 13:47:41 -0800411 legacy_hal::wifi_error legacy_status;
Roshan Pius3c868522016-10-27 12:43:49 -0700412 std::string driver_desc;
413 std::tie(legacy_status, driver_desc) = legacy_hal_.lock()->getDriverVersion();
Roshan Piusa4854ff2016-12-01 13:47:41 -0800414 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
Roshan Pius3c868522016-10-27 12:43:49 -0700415 LOG(ERROR) << "Failed to get driver version: "
416 << legacyErrorToString(legacy_status);
417 WifiStatus status = createWifiStatusFromLegacyError(
418 legacy_status, "failed to get driver version");
419 return {status, result};
420 }
421 result.driverDescription = driver_desc.c_str();
422
423 std::string firmware_desc;
424 std::tie(legacy_status, firmware_desc) =
425 legacy_hal_.lock()->getFirmwareVersion();
Roshan Piusa4854ff2016-12-01 13:47:41 -0800426 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
Roshan Pius3c868522016-10-27 12:43:49 -0700427 LOG(ERROR) << "Failed to get firmware version: "
428 << legacyErrorToString(legacy_status);
429 WifiStatus status = createWifiStatusFromLegacyError(
430 legacy_status, "failed to get firmware version");
431 return {status, result};
432 }
433 result.firmwareDescription = firmware_desc.c_str();
434
435 return {createWifiStatus(WifiStatusCode::SUCCESS), result};
436}
437
438std::pair<WifiStatus, std::vector<uint8_t>>
439WifiChip::requestDriverDebugDumpInternal() {
Roshan Piusa4854ff2016-12-01 13:47:41 -0800440 legacy_hal::wifi_error legacy_status;
Roshan Pius3c868522016-10-27 12:43:49 -0700441 std::vector<uint8_t> driver_dump;
442 std::tie(legacy_status, driver_dump) =
443 legacy_hal_.lock()->requestDriverMemoryDump();
Roshan Piusa4854ff2016-12-01 13:47:41 -0800444 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
Roshan Pius3c868522016-10-27 12:43:49 -0700445 LOG(ERROR) << "Failed to get driver debug dump: "
446 << legacyErrorToString(legacy_status);
447 return {createWifiStatusFromLegacyError(legacy_status),
448 std::vector<uint8_t>()};
449 }
450 return {createWifiStatus(WifiStatusCode::SUCCESS), driver_dump};
451}
452
453std::pair<WifiStatus, std::vector<uint8_t>>
454WifiChip::requestFirmwareDebugDumpInternal() {
Roshan Piusa4854ff2016-12-01 13:47:41 -0800455 legacy_hal::wifi_error legacy_status;
Roshan Pius3c868522016-10-27 12:43:49 -0700456 std::vector<uint8_t> firmware_dump;
457 std::tie(legacy_status, firmware_dump) =
458 legacy_hal_.lock()->requestFirmwareMemoryDump();
Roshan Piusa4854ff2016-12-01 13:47:41 -0800459 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
Roshan Pius3c868522016-10-27 12:43:49 -0700460 LOG(ERROR) << "Failed to get firmware debug dump: "
461 << legacyErrorToString(legacy_status);
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700462 return {createWifiStatusFromLegacyError(legacy_status), {}};
Roshan Pius3c868522016-10-27 12:43:49 -0700463 }
464 return {createWifiStatus(WifiStatusCode::SUCCESS), firmware_dump};
465}
466
467std::pair<WifiStatus, sp<IWifiApIface>> WifiChip::createApIfaceInternal() {
Roshan Pius073d5b92016-12-08 19:10:06 -0800468 if (current_mode_id_ != kApChipModeId || ap_iface_.get()) {
469 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
470 }
Roshan Pius3c868522016-10-27 12:43:49 -0700471 std::string ifname = legacy_hal_.lock()->getApIfaceName();
472 ap_iface_ = new WifiApIface(ifname, legacy_hal_);
473 return {createWifiStatus(WifiStatusCode::SUCCESS), ap_iface_};
474}
475
476std::pair<WifiStatus, std::vector<hidl_string>>
477WifiChip::getApIfaceNamesInternal() {
478 if (!ap_iface_.get()) {
479 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
480 }
481 return {createWifiStatus(WifiStatusCode::SUCCESS),
482 {legacy_hal_.lock()->getApIfaceName()}};
483}
484
485std::pair<WifiStatus, sp<IWifiApIface>> WifiChip::getApIfaceInternal(
486 const hidl_string& ifname) {
487 if (!ap_iface_.get() ||
488 (ifname.c_str() != legacy_hal_.lock()->getApIfaceName())) {
489 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
490 }
491 return {createWifiStatus(WifiStatusCode::SUCCESS), ap_iface_};
492}
493
494std::pair<WifiStatus, sp<IWifiNanIface>> WifiChip::createNanIfaceInternal() {
Roshan Pius073d5b92016-12-08 19:10:06 -0800495 // Only 1 of NAN or P2P iface can be active at a time.
496 if (current_mode_id_ != kStaChipModeId || nan_iface_.get() ||
497 p2p_iface_.get()) {
498 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
499 }
Roshan Pius3c868522016-10-27 12:43:49 -0700500 std::string ifname = legacy_hal_.lock()->getNanIfaceName();
501 nan_iface_ = new WifiNanIface(ifname, legacy_hal_);
502 return {createWifiStatus(WifiStatusCode::SUCCESS), nan_iface_};
503}
504
505std::pair<WifiStatus, std::vector<hidl_string>>
506WifiChip::getNanIfaceNamesInternal() {
507 if (!nan_iface_.get()) {
508 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
509 }
510 return {createWifiStatus(WifiStatusCode::SUCCESS),
511 {legacy_hal_.lock()->getNanIfaceName()}};
512}
513
514std::pair<WifiStatus, sp<IWifiNanIface>> WifiChip::getNanIfaceInternal(
515 const hidl_string& ifname) {
516 if (!nan_iface_.get() ||
517 (ifname.c_str() != legacy_hal_.lock()->getNanIfaceName())) {
518 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
519 }
520 return {createWifiStatus(WifiStatusCode::SUCCESS), nan_iface_};
521}
522
523std::pair<WifiStatus, sp<IWifiP2pIface>> WifiChip::createP2pIfaceInternal() {
Roshan Pius073d5b92016-12-08 19:10:06 -0800524 // Only 1 of NAN or P2P iface can be active at a time.
525 if (current_mode_id_ != kStaChipModeId || p2p_iface_.get() ||
526 nan_iface_.get()) {
527 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
528 }
Roshan Pius3c868522016-10-27 12:43:49 -0700529 std::string ifname = legacy_hal_.lock()->getP2pIfaceName();
530 p2p_iface_ = new WifiP2pIface(ifname, legacy_hal_);
531 return {createWifiStatus(WifiStatusCode::SUCCESS), p2p_iface_};
532}
533
534std::pair<WifiStatus, std::vector<hidl_string>>
535WifiChip::getP2pIfaceNamesInternal() {
536 if (!p2p_iface_.get()) {
537 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
538 }
539 return {createWifiStatus(WifiStatusCode::SUCCESS),
540 {legacy_hal_.lock()->getP2pIfaceName()}};
541}
542
543std::pair<WifiStatus, sp<IWifiP2pIface>> WifiChip::getP2pIfaceInternal(
544 const hidl_string& ifname) {
545 if (!p2p_iface_.get() ||
546 (ifname.c_str() != legacy_hal_.lock()->getP2pIfaceName())) {
547 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
548 }
549 return {createWifiStatus(WifiStatusCode::SUCCESS), p2p_iface_};
550}
551
552std::pair<WifiStatus, sp<IWifiStaIface>> WifiChip::createStaIfaceInternal() {
Roshan Pius073d5b92016-12-08 19:10:06 -0800553 if (current_mode_id_ != kStaChipModeId || sta_iface_.get()) {
554 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
555 }
Roshan Pius3c868522016-10-27 12:43:49 -0700556 std::string ifname = legacy_hal_.lock()->getStaIfaceName();
557 sta_iface_ = new WifiStaIface(ifname, legacy_hal_);
558 return {createWifiStatus(WifiStatusCode::SUCCESS), sta_iface_};
559}
560
561std::pair<WifiStatus, std::vector<hidl_string>>
562WifiChip::getStaIfaceNamesInternal() {
563 if (!sta_iface_.get()) {
564 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
565 }
566 return {createWifiStatus(WifiStatusCode::SUCCESS),
567 {legacy_hal_.lock()->getStaIfaceName()}};
568}
569
570std::pair<WifiStatus, sp<IWifiStaIface>> WifiChip::getStaIfaceInternal(
571 const hidl_string& ifname) {
572 if (!sta_iface_.get() ||
573 (ifname.c_str() != legacy_hal_.lock()->getStaIfaceName())) {
574 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
575 }
576 return {createWifiStatus(WifiStatusCode::SUCCESS), sta_iface_};
577}
578
579std::pair<WifiStatus, sp<IWifiRttController>>
580WifiChip::createRttControllerInternal(const sp<IWifiIface>& bound_iface) {
581 sp<WifiRttController> rtt = new WifiRttController(bound_iface, legacy_hal_);
582 rtt_controllers_.emplace_back(rtt);
583 return {createWifiStatus(WifiStatusCode::SUCCESS), rtt};
584}
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700585
586std::pair<WifiStatus, std::vector<WifiDebugRingBufferStatus>>
587WifiChip::getDebugRingBuffersStatusInternal() {
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800588 legacy_hal::wifi_error legacy_status;
589 std::vector<legacy_hal::wifi_ring_buffer_status>
590 legacy_ring_buffer_status_vec;
591 std::tie(legacy_status, legacy_ring_buffer_status_vec) =
592 legacy_hal_.lock()->getRingBuffersStatus();
593 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
594 return {createWifiStatusFromLegacyError(legacy_status), {}};
595 }
596 std::vector<WifiDebugRingBufferStatus> hidl_ring_buffer_status_vec;
597 if (!hidl_struct_util::convertLegacyVectorOfDebugRingBufferStatusToHidl(
598 legacy_ring_buffer_status_vec, &hidl_ring_buffer_status_vec)) {
599 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
600 }
601 return {createWifiStatus(WifiStatusCode::SUCCESS),
602 hidl_ring_buffer_status_vec};
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700603}
604
605WifiStatus WifiChip::startLoggingToDebugRingBufferInternal(
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800606 const hidl_string& ring_name,
607 WifiDebugRingBufferVerboseLevel verbose_level,
608 uint32_t max_interval_in_sec,
609 uint32_t min_data_size_in_bytes) {
610 legacy_hal::wifi_error legacy_status =
611 legacy_hal_.lock()->startRingBufferLogging(
612 ring_name,
613 static_cast<
614 std::underlying_type<WifiDebugRingBufferVerboseLevel>::type>(
615 verbose_level),
616 max_interval_in_sec,
617 min_data_size_in_bytes);
618 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700619}
620
621WifiStatus WifiChip::forceDumpToDebugRingBufferInternal(
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800622 const hidl_string& ring_name) {
623 legacy_hal::wifi_error legacy_status =
624 legacy_hal_.lock()->getRingBufferData(ring_name);
625 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700626}
627
628std::pair<WifiStatus, WifiDebugHostWakeReasonStats>
629WifiChip::getDebugHostWakeReasonStatsInternal() {
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800630 legacy_hal::wifi_error legacy_status;
631 legacy_hal::WakeReasonStats legacy_stats;
632 std::tie(legacy_status, legacy_stats) =
633 legacy_hal_.lock()->getWakeReasonStats();
634 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
635 return {createWifiStatusFromLegacyError(legacy_status), {}};
636 }
637 WifiDebugHostWakeReasonStats hidl_stats;
638 if (!hidl_struct_util::convertLegacyWakeReasonStatsToHidl(legacy_stats,
639 &hidl_stats)) {
640 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
641 }
642 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_stats};
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700643}
644
Roshan Pius79a99752016-10-04 13:03:58 -0700645} // namespace implementation
646} // namespace V1_0
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700647} // namespace wifi
648} // namespace hardware
649} // namespace android