blob: 4f3c192c1a6f42bc7eb5ef64d35d7acea8f55928 [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() {
468 // TODO(b/31997422): Disallow this based on the chip combination.
469 std::string ifname = legacy_hal_.lock()->getApIfaceName();
470 ap_iface_ = new WifiApIface(ifname, legacy_hal_);
471 return {createWifiStatus(WifiStatusCode::SUCCESS), ap_iface_};
472}
473
474std::pair<WifiStatus, std::vector<hidl_string>>
475WifiChip::getApIfaceNamesInternal() {
476 if (!ap_iface_.get()) {
477 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
478 }
479 return {createWifiStatus(WifiStatusCode::SUCCESS),
480 {legacy_hal_.lock()->getApIfaceName()}};
481}
482
483std::pair<WifiStatus, sp<IWifiApIface>> WifiChip::getApIfaceInternal(
484 const hidl_string& ifname) {
485 if (!ap_iface_.get() ||
486 (ifname.c_str() != legacy_hal_.lock()->getApIfaceName())) {
487 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
488 }
489 return {createWifiStatus(WifiStatusCode::SUCCESS), ap_iface_};
490}
491
492std::pair<WifiStatus, sp<IWifiNanIface>> WifiChip::createNanIfaceInternal() {
493 // TODO(b/31997422): Disallow this based on the chip combination.
494 std::string ifname = legacy_hal_.lock()->getNanIfaceName();
495 nan_iface_ = new WifiNanIface(ifname, legacy_hal_);
496 return {createWifiStatus(WifiStatusCode::SUCCESS), nan_iface_};
497}
498
499std::pair<WifiStatus, std::vector<hidl_string>>
500WifiChip::getNanIfaceNamesInternal() {
501 if (!nan_iface_.get()) {
502 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
503 }
504 return {createWifiStatus(WifiStatusCode::SUCCESS),
505 {legacy_hal_.lock()->getNanIfaceName()}};
506}
507
508std::pair<WifiStatus, sp<IWifiNanIface>> WifiChip::getNanIfaceInternal(
509 const hidl_string& ifname) {
510 if (!nan_iface_.get() ||
511 (ifname.c_str() != legacy_hal_.lock()->getNanIfaceName())) {
512 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
513 }
514 return {createWifiStatus(WifiStatusCode::SUCCESS), nan_iface_};
515}
516
517std::pair<WifiStatus, sp<IWifiP2pIface>> WifiChip::createP2pIfaceInternal() {
518 // TODO(b/31997422): Disallow this based on the chip combination.
519 std::string ifname = legacy_hal_.lock()->getP2pIfaceName();
520 p2p_iface_ = new WifiP2pIface(ifname, legacy_hal_);
521 return {createWifiStatus(WifiStatusCode::SUCCESS), p2p_iface_};
522}
523
524std::pair<WifiStatus, std::vector<hidl_string>>
525WifiChip::getP2pIfaceNamesInternal() {
526 if (!p2p_iface_.get()) {
527 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
528 }
529 return {createWifiStatus(WifiStatusCode::SUCCESS),
530 {legacy_hal_.lock()->getP2pIfaceName()}};
531}
532
533std::pair<WifiStatus, sp<IWifiP2pIface>> WifiChip::getP2pIfaceInternal(
534 const hidl_string& ifname) {
535 if (!p2p_iface_.get() ||
536 (ifname.c_str() != legacy_hal_.lock()->getP2pIfaceName())) {
537 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
538 }
539 return {createWifiStatus(WifiStatusCode::SUCCESS), p2p_iface_};
540}
541
542std::pair<WifiStatus, sp<IWifiStaIface>> WifiChip::createStaIfaceInternal() {
543 // TODO(b/31997422): Disallow this based on the chip combination.
544 std::string ifname = legacy_hal_.lock()->getStaIfaceName();
545 sta_iface_ = new WifiStaIface(ifname, legacy_hal_);
546 return {createWifiStatus(WifiStatusCode::SUCCESS), sta_iface_};
547}
548
549std::pair<WifiStatus, std::vector<hidl_string>>
550WifiChip::getStaIfaceNamesInternal() {
551 if (!sta_iface_.get()) {
552 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
553 }
554 return {createWifiStatus(WifiStatusCode::SUCCESS),
555 {legacy_hal_.lock()->getStaIfaceName()}};
556}
557
558std::pair<WifiStatus, sp<IWifiStaIface>> WifiChip::getStaIfaceInternal(
559 const hidl_string& ifname) {
560 if (!sta_iface_.get() ||
561 (ifname.c_str() != legacy_hal_.lock()->getStaIfaceName())) {
562 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
563 }
564 return {createWifiStatus(WifiStatusCode::SUCCESS), sta_iface_};
565}
566
567std::pair<WifiStatus, sp<IWifiRttController>>
568WifiChip::createRttControllerInternal(const sp<IWifiIface>& bound_iface) {
569 sp<WifiRttController> rtt = new WifiRttController(bound_iface, legacy_hal_);
570 rtt_controllers_.emplace_back(rtt);
571 return {createWifiStatus(WifiStatusCode::SUCCESS), rtt};
572}
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700573
574std::pair<WifiStatus, std::vector<WifiDebugRingBufferStatus>>
575WifiChip::getDebugRingBuffersStatusInternal() {
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800576 legacy_hal::wifi_error legacy_status;
577 std::vector<legacy_hal::wifi_ring_buffer_status>
578 legacy_ring_buffer_status_vec;
579 std::tie(legacy_status, legacy_ring_buffer_status_vec) =
580 legacy_hal_.lock()->getRingBuffersStatus();
581 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
582 return {createWifiStatusFromLegacyError(legacy_status), {}};
583 }
584 std::vector<WifiDebugRingBufferStatus> hidl_ring_buffer_status_vec;
585 if (!hidl_struct_util::convertLegacyVectorOfDebugRingBufferStatusToHidl(
586 legacy_ring_buffer_status_vec, &hidl_ring_buffer_status_vec)) {
587 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
588 }
589 return {createWifiStatus(WifiStatusCode::SUCCESS),
590 hidl_ring_buffer_status_vec};
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700591}
592
593WifiStatus WifiChip::startLoggingToDebugRingBufferInternal(
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800594 const hidl_string& ring_name,
595 WifiDebugRingBufferVerboseLevel verbose_level,
596 uint32_t max_interval_in_sec,
597 uint32_t min_data_size_in_bytes) {
598 legacy_hal::wifi_error legacy_status =
599 legacy_hal_.lock()->startRingBufferLogging(
600 ring_name,
601 static_cast<
602 std::underlying_type<WifiDebugRingBufferVerboseLevel>::type>(
603 verbose_level),
604 max_interval_in_sec,
605 min_data_size_in_bytes);
606 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700607}
608
609WifiStatus WifiChip::forceDumpToDebugRingBufferInternal(
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800610 const hidl_string& ring_name) {
611 legacy_hal::wifi_error legacy_status =
612 legacy_hal_.lock()->getRingBufferData(ring_name);
613 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700614}
615
616std::pair<WifiStatus, WifiDebugHostWakeReasonStats>
617WifiChip::getDebugHostWakeReasonStatsInternal() {
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800618 legacy_hal::wifi_error legacy_status;
619 legacy_hal::WakeReasonStats legacy_stats;
620 std::tie(legacy_status, legacy_stats) =
621 legacy_hal_.lock()->getWakeReasonStats();
622 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
623 return {createWifiStatusFromLegacyError(legacy_status), {}};
624 }
625 WifiDebugHostWakeReasonStats hidl_stats;
626 if (!hidl_struct_util::convertLegacyWakeReasonStatsToHidl(legacy_stats,
627 &hidl_stats)) {
628 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
629 }
630 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_stats};
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700631}
632
Roshan Pius79a99752016-10-04 13:03:58 -0700633} // namespace implementation
634} // namespace V1_0
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700635} // namespace wifi
636} // namespace hardware
637} // namespace android