2 * Copyright (C) 2016 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #include <android-base/logging.h>
19 #include "hidl_return_util.h"
20 #include "hidl_struct_util.h"
21 #include "wifi_chip.h"
22 #include "wifi_feature_flags.h"
23 #include "wifi_status_util.h"
27 using android::hardware::hidl_vec;
28 using android::hardware::hidl_string;
29 using android::hardware::wifi::V1_0::ChipModeId;
30 using android::hardware::wifi::V1_0::IWifiChip;
31 using android::hardware::wifi::V1_0::IfaceType;
33 constexpr ChipModeId kStaChipModeId = 0;
34 constexpr ChipModeId kApChipModeId = 1;
35 constexpr ChipModeId kInvalidModeId = UINT32_MAX;
37 template <typename Iface>
38 void invalidateAndClear(sp<Iface>& iface) {
50 namespace implementation {
51 using hidl_return_util::validateAndCall;
55 const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal,
56 const std::weak_ptr<mode_controller::WifiModeController> mode_controller)
58 legacy_hal_(legacy_hal),
59 mode_controller_(mode_controller),
61 current_mode_id_(kInvalidModeId),
62 debug_ring_buffer_cb_registered_(false) {}
64 void WifiChip::invalidate() {
65 invalidateAndRemoveAllIfaces();
67 event_cb_handler_.invalidate();
71 bool WifiChip::isValid() {
75 std::set<sp<IWifiChipEventCallback>> WifiChip::getEventCallbacks() {
76 return event_cb_handler_.getCallbacks();
79 Return<void> WifiChip::getId(getId_cb hidl_status_cb) {
80 return validateAndCall(this,
81 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
82 &WifiChip::getIdInternal,
86 Return<void> WifiChip::registerEventCallback(
87 const sp<IWifiChipEventCallback>& event_callback,
88 registerEventCallback_cb hidl_status_cb) {
89 return validateAndCall(this,
90 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
91 &WifiChip::registerEventCallbackInternal,
96 Return<void> WifiChip::getCapabilities(getCapabilities_cb hidl_status_cb) {
97 return validateAndCall(this,
98 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
99 &WifiChip::getCapabilitiesInternal,
103 Return<void> WifiChip::getAvailableModes(getAvailableModes_cb hidl_status_cb) {
104 return validateAndCall(this,
105 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
106 &WifiChip::getAvailableModesInternal,
110 Return<void> WifiChip::configureChip(ChipModeId mode_id,
111 configureChip_cb hidl_status_cb) {
112 return validateAndCall(this,
113 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
114 &WifiChip::configureChipInternal,
119 Return<void> WifiChip::getMode(getMode_cb hidl_status_cb) {
120 return validateAndCall(this,
121 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
122 &WifiChip::getModeInternal,
126 Return<void> WifiChip::requestChipDebugInfo(
127 requestChipDebugInfo_cb hidl_status_cb) {
128 return validateAndCall(this,
129 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
130 &WifiChip::requestChipDebugInfoInternal,
134 Return<void> WifiChip::requestDriverDebugDump(
135 requestDriverDebugDump_cb hidl_status_cb) {
136 return validateAndCall(this,
137 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
138 &WifiChip::requestDriverDebugDumpInternal,
142 Return<void> WifiChip::requestFirmwareDebugDump(
143 requestFirmwareDebugDump_cb hidl_status_cb) {
144 return validateAndCall(this,
145 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
146 &WifiChip::requestFirmwareDebugDumpInternal,
150 Return<void> WifiChip::createApIface(createApIface_cb hidl_status_cb) {
151 return validateAndCall(this,
152 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
153 &WifiChip::createApIfaceInternal,
157 Return<void> WifiChip::getApIfaceNames(getApIfaceNames_cb hidl_status_cb) {
158 return validateAndCall(this,
159 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
160 &WifiChip::getApIfaceNamesInternal,
164 Return<void> WifiChip::getApIface(const hidl_string& ifname,
165 getApIface_cb hidl_status_cb) {
166 return validateAndCall(this,
167 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
168 &WifiChip::getApIfaceInternal,
173 Return<void> WifiChip::removeApIface(const hidl_string& ifname,
174 removeApIface_cb hidl_status_cb) {
175 return validateAndCall(this,
176 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
177 &WifiChip::removeApIfaceInternal,
182 Return<void> WifiChip::createNanIface(createNanIface_cb hidl_status_cb) {
183 return validateAndCall(this,
184 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
185 &WifiChip::createNanIfaceInternal,
189 Return<void> WifiChip::getNanIfaceNames(getNanIfaceNames_cb hidl_status_cb) {
190 return validateAndCall(this,
191 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
192 &WifiChip::getNanIfaceNamesInternal,
196 Return<void> WifiChip::getNanIface(const hidl_string& ifname,
197 getNanIface_cb hidl_status_cb) {
198 return validateAndCall(this,
199 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
200 &WifiChip::getNanIfaceInternal,
205 Return<void> WifiChip::removeNanIface(const hidl_string& ifname,
206 removeNanIface_cb hidl_status_cb) {
207 return validateAndCall(this,
208 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
209 &WifiChip::removeNanIfaceInternal,
214 Return<void> WifiChip::createP2pIface(createP2pIface_cb hidl_status_cb) {
215 return validateAndCall(this,
216 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
217 &WifiChip::createP2pIfaceInternal,
221 Return<void> WifiChip::getP2pIfaceNames(getP2pIfaceNames_cb hidl_status_cb) {
222 return validateAndCall(this,
223 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
224 &WifiChip::getP2pIfaceNamesInternal,
228 Return<void> WifiChip::getP2pIface(const hidl_string& ifname,
229 getP2pIface_cb hidl_status_cb) {
230 return validateAndCall(this,
231 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
232 &WifiChip::getP2pIfaceInternal,
237 Return<void> WifiChip::removeP2pIface(const hidl_string& ifname,
238 removeP2pIface_cb hidl_status_cb) {
239 return validateAndCall(this,
240 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
241 &WifiChip::removeP2pIfaceInternal,
246 Return<void> WifiChip::createStaIface(createStaIface_cb hidl_status_cb) {
247 return validateAndCall(this,
248 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
249 &WifiChip::createStaIfaceInternal,
253 Return<void> WifiChip::getStaIfaceNames(getStaIfaceNames_cb hidl_status_cb) {
254 return validateAndCall(this,
255 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
256 &WifiChip::getStaIfaceNamesInternal,
260 Return<void> WifiChip::getStaIface(const hidl_string& ifname,
261 getStaIface_cb hidl_status_cb) {
262 return validateAndCall(this,
263 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
264 &WifiChip::getStaIfaceInternal,
269 Return<void> WifiChip::removeStaIface(const hidl_string& ifname,
270 removeStaIface_cb hidl_status_cb) {
271 return validateAndCall(this,
272 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
273 &WifiChip::removeStaIfaceInternal,
278 Return<void> WifiChip::createRttController(
279 const sp<IWifiIface>& bound_iface, createRttController_cb hidl_status_cb) {
280 return validateAndCall(this,
281 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
282 &WifiChip::createRttControllerInternal,
287 Return<void> WifiChip::getDebugRingBuffersStatus(
288 getDebugRingBuffersStatus_cb hidl_status_cb) {
289 return validateAndCall(this,
290 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
291 &WifiChip::getDebugRingBuffersStatusInternal,
295 Return<void> WifiChip::startLoggingToDebugRingBuffer(
296 const hidl_string& ring_name,
297 WifiDebugRingBufferVerboseLevel verbose_level,
298 uint32_t max_interval_in_sec,
299 uint32_t min_data_size_in_bytes,
300 startLoggingToDebugRingBuffer_cb hidl_status_cb) {
301 return validateAndCall(this,
302 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
303 &WifiChip::startLoggingToDebugRingBufferInternal,
308 min_data_size_in_bytes);
311 Return<void> WifiChip::forceDumpToDebugRingBuffer(
312 const hidl_string& ring_name,
313 forceDumpToDebugRingBuffer_cb hidl_status_cb) {
314 return validateAndCall(this,
315 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
316 &WifiChip::forceDumpToDebugRingBufferInternal,
321 Return<void> WifiChip::stopLoggingToDebugRingBuffer(
322 stopLoggingToDebugRingBuffer_cb hidl_status_cb) {
323 return validateAndCall(this,
324 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
325 &WifiChip::stopLoggingToDebugRingBufferInternal,
329 Return<void> WifiChip::getDebugHostWakeReasonStats(
330 getDebugHostWakeReasonStats_cb hidl_status_cb) {
331 return validateAndCall(this,
332 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
333 &WifiChip::getDebugHostWakeReasonStatsInternal,
337 Return<void> WifiChip::enableDebugErrorAlerts(
338 bool enable, enableDebugErrorAlerts_cb hidl_status_cb) {
339 return validateAndCall(this,
340 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
341 &WifiChip::enableDebugErrorAlertsInternal,
346 void WifiChip::invalidateAndRemoveAllIfaces() {
347 invalidateAndClear(ap_iface_);
348 invalidateAndClear(nan_iface_);
349 invalidateAndClear(p2p_iface_);
350 invalidateAndClear(sta_iface_);
351 // Since all the ifaces are invalid now, all RTT controller objects
352 // using those ifaces also need to be invalidated.
353 for (const auto& rtt : rtt_controllers_) {
356 rtt_controllers_.clear();
359 std::pair<WifiStatus, ChipId> WifiChip::getIdInternal() {
360 return {createWifiStatus(WifiStatusCode::SUCCESS), chip_id_};
363 WifiStatus WifiChip::registerEventCallbackInternal(
364 const sp<IWifiChipEventCallback>& event_callback) {
365 if (!event_cb_handler_.addCallback(event_callback)) {
366 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
368 return createWifiStatus(WifiStatusCode::SUCCESS);
371 std::pair<WifiStatus, uint32_t> WifiChip::getCapabilitiesInternal() {
372 legacy_hal::wifi_error legacy_status;
373 uint32_t legacy_logger_feature_set;
374 std::tie(legacy_status, legacy_logger_feature_set) =
375 legacy_hal_.lock()->getLoggerSupportedFeatureSet();
376 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
377 return {createWifiStatusFromLegacyError(legacy_status), 0};
380 if (!hidl_struct_util::convertLegacyFeaturesToHidlChipCapabilities(
381 legacy_logger_feature_set, &hidl_caps)) {
382 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), 0};
384 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
387 std::pair<WifiStatus, std::vector<IWifiChip::ChipMode>>
388 WifiChip::getAvailableModesInternal() {
389 // The chip combination supported for current devices is fixed for now with
390 // 2 separate modes of operation:
391 // Mode 1 (STA mode): Will support 1 STA and 1 P2P or NAN iface operations
392 // concurrently [NAN conditional on wifiHidlFeatureAware]
393 // Mode 2 (AP mode): Will support 1 AP iface operations.
394 // TODO (b/32997844): Read this from some device specific flags in the
396 // STA mode iface combinations.
397 const IWifiChip::ChipIfaceCombinationLimit
398 sta_chip_iface_combination_limit_1 = {{IfaceType::STA}, 1};
399 IWifiChip::ChipIfaceCombinationLimit sta_chip_iface_combination_limit_2;
400 if (WifiFeatureFlags::wifiHidlFeatureAware) {
401 sta_chip_iface_combination_limit_2 = {{IfaceType::P2P, IfaceType::NAN},
404 sta_chip_iface_combination_limit_2 = {{IfaceType::P2P},
407 const IWifiChip::ChipIfaceCombination sta_chip_iface_combination = {
408 {sta_chip_iface_combination_limit_1, sta_chip_iface_combination_limit_2}};
409 const IWifiChip::ChipMode sta_chip_mode = {kStaChipModeId,
410 {sta_chip_iface_combination}};
411 // AP mode iface combinations.
412 const IWifiChip::ChipIfaceCombinationLimit ap_chip_iface_combination_limit = {
414 const IWifiChip::ChipIfaceCombination ap_chip_iface_combination = {
415 {ap_chip_iface_combination_limit}};
416 const IWifiChip::ChipMode ap_chip_mode = {kApChipModeId,
417 {ap_chip_iface_combination}};
418 return {createWifiStatus(WifiStatusCode::SUCCESS),
419 {sta_chip_mode, ap_chip_mode}};
422 WifiStatus WifiChip::configureChipInternal(ChipModeId mode_id) {
423 if (mode_id != kStaChipModeId && mode_id != kApChipModeId) {
424 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
426 if (mode_id == current_mode_id_) {
427 LOG(DEBUG) << "Already in the specified mode " << mode_id;
428 return createWifiStatus(WifiStatusCode::SUCCESS);
430 WifiStatus status = handleChipConfiguration(mode_id);
431 if (status.code != WifiStatusCode::SUCCESS) {
432 for (const auto& callback : event_cb_handler_.getCallbacks()) {
433 if (!callback->onChipReconfigureFailure(status).isOk()) {
434 LOG(ERROR) << "Failed to invoke onChipReconfigureFailure callback";
439 for (const auto& callback : event_cb_handler_.getCallbacks()) {
440 if (!callback->onChipReconfigured(mode_id).isOk()) {
441 LOG(ERROR) << "Failed to invoke onChipReconfigured callback";
444 current_mode_id_ = mode_id;
448 std::pair<WifiStatus, uint32_t> WifiChip::getModeInternal() {
449 if (current_mode_id_ == kInvalidModeId) {
450 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE),
453 return {createWifiStatus(WifiStatusCode::SUCCESS), current_mode_id_};
456 std::pair<WifiStatus, IWifiChip::ChipDebugInfo>
457 WifiChip::requestChipDebugInfoInternal() {
458 IWifiChip::ChipDebugInfo result;
459 legacy_hal::wifi_error legacy_status;
460 std::string driver_desc;
461 std::tie(legacy_status, driver_desc) = legacy_hal_.lock()->getDriverVersion();
462 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
463 LOG(ERROR) << "Failed to get driver version: "
464 << legacyErrorToString(legacy_status);
465 WifiStatus status = createWifiStatusFromLegacyError(
466 legacy_status, "failed to get driver version");
467 return {status, result};
469 result.driverDescription = driver_desc.c_str();
471 std::string firmware_desc;
472 std::tie(legacy_status, firmware_desc) =
473 legacy_hal_.lock()->getFirmwareVersion();
474 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
475 LOG(ERROR) << "Failed to get firmware version: "
476 << legacyErrorToString(legacy_status);
477 WifiStatus status = createWifiStatusFromLegacyError(
478 legacy_status, "failed to get firmware version");
479 return {status, result};
481 result.firmwareDescription = firmware_desc.c_str();
483 return {createWifiStatus(WifiStatusCode::SUCCESS), result};
486 std::pair<WifiStatus, std::vector<uint8_t>>
487 WifiChip::requestDriverDebugDumpInternal() {
488 legacy_hal::wifi_error legacy_status;
489 std::vector<uint8_t> driver_dump;
490 std::tie(legacy_status, driver_dump) =
491 legacy_hal_.lock()->requestDriverMemoryDump();
492 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
493 LOG(ERROR) << "Failed to get driver debug dump: "
494 << legacyErrorToString(legacy_status);
495 return {createWifiStatusFromLegacyError(legacy_status),
496 std::vector<uint8_t>()};
498 return {createWifiStatus(WifiStatusCode::SUCCESS), driver_dump};
501 std::pair<WifiStatus, std::vector<uint8_t>>
502 WifiChip::requestFirmwareDebugDumpInternal() {
503 legacy_hal::wifi_error legacy_status;
504 std::vector<uint8_t> firmware_dump;
505 std::tie(legacy_status, firmware_dump) =
506 legacy_hal_.lock()->requestFirmwareMemoryDump();
507 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
508 LOG(ERROR) << "Failed to get firmware debug dump: "
509 << legacyErrorToString(legacy_status);
510 return {createWifiStatusFromLegacyError(legacy_status), {}};
512 return {createWifiStatus(WifiStatusCode::SUCCESS), firmware_dump};
515 std::pair<WifiStatus, sp<IWifiApIface>> WifiChip::createApIfaceInternal() {
516 if (current_mode_id_ != kApChipModeId || ap_iface_.get()) {
517 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
519 std::string ifname = legacy_hal_.lock()->getApIfaceName();
520 ap_iface_ = new WifiApIface(ifname, legacy_hal_);
521 for (const auto& callback : event_cb_handler_.getCallbacks()) {
522 if (!callback->onIfaceAdded(IfaceType::AP, ifname).isOk()) {
523 LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
526 return {createWifiStatus(WifiStatusCode::SUCCESS), ap_iface_};
529 std::pair<WifiStatus, std::vector<hidl_string>>
530 WifiChip::getApIfaceNamesInternal() {
531 if (!ap_iface_.get()) {
532 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
534 return {createWifiStatus(WifiStatusCode::SUCCESS),
535 {legacy_hal_.lock()->getApIfaceName()}};
538 std::pair<WifiStatus, sp<IWifiApIface>> WifiChip::getApIfaceInternal(
539 const std::string& ifname) {
540 if (!ap_iface_.get() || (ifname != legacy_hal_.lock()->getApIfaceName())) {
541 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
543 return {createWifiStatus(WifiStatusCode::SUCCESS), ap_iface_};
546 WifiStatus WifiChip::removeApIfaceInternal(const std::string& ifname) {
547 if (!ap_iface_.get() || (ifname != legacy_hal_.lock()->getApIfaceName())) {
548 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
550 invalidateAndClear(ap_iface_);
551 for (const auto& callback : event_cb_handler_.getCallbacks()) {
552 if (!callback->onIfaceRemoved(IfaceType::AP, ifname).isOk()) {
553 LOG(ERROR) << "Failed to invoke onIfaceRemoved callback";
556 return createWifiStatus(WifiStatusCode::SUCCESS);
559 std::pair<WifiStatus, sp<IWifiNanIface>> WifiChip::createNanIfaceInternal() {
560 // Only 1 of NAN or P2P iface can be active at a time.
561 if (WifiFeatureFlags::wifiHidlFeatureAware) {
562 if (current_mode_id_ != kStaChipModeId || nan_iface_.get() ||
564 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
566 std::string ifname = legacy_hal_.lock()->getNanIfaceName();
567 nan_iface_ = new WifiNanIface(ifname, legacy_hal_);
568 for (const auto& callback : event_cb_handler_.getCallbacks()) {
569 if (!callback->onIfaceAdded(IfaceType::NAN, ifname).isOk()) {
570 LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
573 return {createWifiStatus(WifiStatusCode::SUCCESS), nan_iface_};
575 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
579 std::pair<WifiStatus, std::vector<hidl_string>>
580 WifiChip::getNanIfaceNamesInternal() {
581 if (!nan_iface_.get()) {
582 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
584 return {createWifiStatus(WifiStatusCode::SUCCESS),
585 {legacy_hal_.lock()->getNanIfaceName()}};
588 std::pair<WifiStatus, sp<IWifiNanIface>> WifiChip::getNanIfaceInternal(
589 const std::string& ifname) {
590 if (!nan_iface_.get() || (ifname != legacy_hal_.lock()->getNanIfaceName())) {
591 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
593 return {createWifiStatus(WifiStatusCode::SUCCESS), nan_iface_};
596 WifiStatus WifiChip::removeNanIfaceInternal(const std::string& ifname) {
597 if (!nan_iface_.get() || (ifname != legacy_hal_.lock()->getNanIfaceName())) {
598 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
600 invalidateAndClear(nan_iface_);
601 for (const auto& callback : event_cb_handler_.getCallbacks()) {
602 if (!callback->onIfaceRemoved(IfaceType::NAN, ifname).isOk()) {
603 LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
606 return createWifiStatus(WifiStatusCode::SUCCESS);
609 std::pair<WifiStatus, sp<IWifiP2pIface>> WifiChip::createP2pIfaceInternal() {
610 // Only 1 of NAN or P2P iface can be active at a time.
611 if (current_mode_id_ != kStaChipModeId || p2p_iface_.get() ||
613 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
615 std::string ifname = legacy_hal_.lock()->getP2pIfaceName();
616 p2p_iface_ = new WifiP2pIface(ifname, legacy_hal_);
617 for (const auto& callback : event_cb_handler_.getCallbacks()) {
618 if (!callback->onIfaceAdded(IfaceType::P2P, ifname).isOk()) {
619 LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
622 return {createWifiStatus(WifiStatusCode::SUCCESS), p2p_iface_};
625 std::pair<WifiStatus, std::vector<hidl_string>>
626 WifiChip::getP2pIfaceNamesInternal() {
627 if (!p2p_iface_.get()) {
628 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
630 return {createWifiStatus(WifiStatusCode::SUCCESS),
631 {legacy_hal_.lock()->getP2pIfaceName()}};
634 std::pair<WifiStatus, sp<IWifiP2pIface>> WifiChip::getP2pIfaceInternal(
635 const std::string& ifname) {
636 if (!p2p_iface_.get() || (ifname != legacy_hal_.lock()->getP2pIfaceName())) {
637 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
639 return {createWifiStatus(WifiStatusCode::SUCCESS), p2p_iface_};
642 WifiStatus WifiChip::removeP2pIfaceInternal(const std::string& ifname) {
643 if (!p2p_iface_.get() || (ifname != legacy_hal_.lock()->getP2pIfaceName())) {
644 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
646 invalidateAndClear(p2p_iface_);
647 for (const auto& callback : event_cb_handler_.getCallbacks()) {
648 if (!callback->onIfaceRemoved(IfaceType::P2P, ifname).isOk()) {
649 LOG(ERROR) << "Failed to invoke onIfaceRemoved callback";
652 return createWifiStatus(WifiStatusCode::SUCCESS);
655 std::pair<WifiStatus, sp<IWifiStaIface>> WifiChip::createStaIfaceInternal() {
656 if (current_mode_id_ != kStaChipModeId || sta_iface_.get()) {
657 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
659 std::string ifname = legacy_hal_.lock()->getStaIfaceName();
660 sta_iface_ = new WifiStaIface(ifname, legacy_hal_);
661 for (const auto& callback : event_cb_handler_.getCallbacks()) {
662 if (!callback->onIfaceAdded(IfaceType::STA, ifname).isOk()) {
663 LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
666 return {createWifiStatus(WifiStatusCode::SUCCESS), sta_iface_};
669 std::pair<WifiStatus, std::vector<hidl_string>>
670 WifiChip::getStaIfaceNamesInternal() {
671 if (!sta_iface_.get()) {
672 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
674 return {createWifiStatus(WifiStatusCode::SUCCESS),
675 {legacy_hal_.lock()->getStaIfaceName()}};
678 std::pair<WifiStatus, sp<IWifiStaIface>> WifiChip::getStaIfaceInternal(
679 const std::string& ifname) {
680 if (!sta_iface_.get() || (ifname != legacy_hal_.lock()->getStaIfaceName())) {
681 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
683 return {createWifiStatus(WifiStatusCode::SUCCESS), sta_iface_};
686 WifiStatus WifiChip::removeStaIfaceInternal(const std::string& ifname) {
687 if (!sta_iface_.get() || (ifname != legacy_hal_.lock()->getStaIfaceName())) {
688 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
690 invalidateAndClear(sta_iface_);
691 for (const auto& callback : event_cb_handler_.getCallbacks()) {
692 if (!callback->onIfaceRemoved(IfaceType::STA, ifname).isOk()) {
693 LOG(ERROR) << "Failed to invoke onIfaceRemoved callback";
696 return createWifiStatus(WifiStatusCode::SUCCESS);
699 std::pair<WifiStatus, sp<IWifiRttController>>
700 WifiChip::createRttControllerInternal(const sp<IWifiIface>& bound_iface) {
701 sp<WifiRttController> rtt = new WifiRttController(bound_iface, legacy_hal_);
702 rtt_controllers_.emplace_back(rtt);
703 return {createWifiStatus(WifiStatusCode::SUCCESS), rtt};
706 std::pair<WifiStatus, std::vector<WifiDebugRingBufferStatus>>
707 WifiChip::getDebugRingBuffersStatusInternal() {
708 legacy_hal::wifi_error legacy_status;
709 std::vector<legacy_hal::wifi_ring_buffer_status>
710 legacy_ring_buffer_status_vec;
711 std::tie(legacy_status, legacy_ring_buffer_status_vec) =
712 legacy_hal_.lock()->getRingBuffersStatus();
713 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
714 return {createWifiStatusFromLegacyError(legacy_status), {}};
716 std::vector<WifiDebugRingBufferStatus> hidl_ring_buffer_status_vec;
717 if (!hidl_struct_util::convertLegacyVectorOfDebugRingBufferStatusToHidl(
718 legacy_ring_buffer_status_vec, &hidl_ring_buffer_status_vec)) {
719 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
721 return {createWifiStatus(WifiStatusCode::SUCCESS),
722 hidl_ring_buffer_status_vec};
725 WifiStatus WifiChip::startLoggingToDebugRingBufferInternal(
726 const hidl_string& ring_name,
727 WifiDebugRingBufferVerboseLevel verbose_level,
728 uint32_t max_interval_in_sec,
729 uint32_t min_data_size_in_bytes) {
730 WifiStatus status = registerDebugRingBufferCallback();
731 if (status.code != WifiStatusCode::SUCCESS) {
734 legacy_hal::wifi_error legacy_status =
735 legacy_hal_.lock()->startRingBufferLogging(
738 std::underlying_type<WifiDebugRingBufferVerboseLevel>::type>(
741 min_data_size_in_bytes);
742 return createWifiStatusFromLegacyError(legacy_status);
745 WifiStatus WifiChip::forceDumpToDebugRingBufferInternal(
746 const hidl_string& ring_name) {
747 WifiStatus status = registerDebugRingBufferCallback();
748 if (status.code != WifiStatusCode::SUCCESS) {
751 legacy_hal::wifi_error legacy_status =
752 legacy_hal_.lock()->getRingBufferData(ring_name);
753 return createWifiStatusFromLegacyError(legacy_status);
756 WifiStatus WifiChip::stopLoggingToDebugRingBufferInternal() {
757 legacy_hal::wifi_error legacy_status =
758 legacy_hal_.lock()->deregisterRingBufferCallbackHandler();
759 return createWifiStatusFromLegacyError(legacy_status);
762 std::pair<WifiStatus, WifiDebugHostWakeReasonStats>
763 WifiChip::getDebugHostWakeReasonStatsInternal() {
764 legacy_hal::wifi_error legacy_status;
765 legacy_hal::WakeReasonStats legacy_stats;
766 std::tie(legacy_status, legacy_stats) =
767 legacy_hal_.lock()->getWakeReasonStats();
768 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
769 return {createWifiStatusFromLegacyError(legacy_status), {}};
771 WifiDebugHostWakeReasonStats hidl_stats;
772 if (!hidl_struct_util::convertLegacyWakeReasonStatsToHidl(legacy_stats,
774 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
776 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_stats};
779 WifiStatus WifiChip::enableDebugErrorAlertsInternal(bool enable) {
780 legacy_hal::wifi_error legacy_status;
782 android::wp<WifiChip> weak_ptr_this(this);
783 const auto& on_alert_callback = [weak_ptr_this](
784 int32_t error_code, std::vector<uint8_t> debug_data) {
785 const auto shared_ptr_this = weak_ptr_this.promote();
786 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
787 LOG(ERROR) << "Callback invoked on an invalid object";
790 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
791 if (!callback->onDebugErrorAlert(error_code, debug_data).isOk()) {
792 LOG(ERROR) << "Failed to invoke onDebugErrorAlert callback";
796 legacy_status = legacy_hal_.lock()->registerErrorAlertCallbackHandler(
799 legacy_status = legacy_hal_.lock()->deregisterErrorAlertCallbackHandler();
801 return createWifiStatusFromLegacyError(legacy_status);
804 WifiStatus WifiChip::handleChipConfiguration(ChipModeId mode_id) {
805 // If the chip is already configured in a different mode, stop
806 // the legacy HAL and then start it after firmware mode change.
807 // Currently the underlying implementation has a deadlock issue.
808 // We should return ERROR_NOT_SUPPORTED if chip is already configured in
810 if (current_mode_id_ != kInvalidModeId) {
811 // TODO(b/37446050): Fix the deadlock.
812 return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
815 if (mode_id == kStaChipModeId) {
816 success = mode_controller_.lock()->changeFirmwareMode(IfaceType::STA);
818 success = mode_controller_.lock()->changeFirmwareMode(IfaceType::AP);
821 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
823 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->start();
824 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
825 LOG(ERROR) << "Failed to start legacy HAL: "
826 << legacyErrorToString(legacy_status);
827 return createWifiStatusFromLegacyError(legacy_status);
829 return createWifiStatus(WifiStatusCode::SUCCESS);
832 WifiStatus WifiChip::registerDebugRingBufferCallback() {
833 if (debug_ring_buffer_cb_registered_) {
834 return createWifiStatus(WifiStatusCode::SUCCESS);
837 android::wp<WifiChip> weak_ptr_this(this);
838 const auto& on_ring_buffer_data_callback = [weak_ptr_this](
839 const std::string& /* name */,
840 const std::vector<uint8_t>& data,
841 const legacy_hal::wifi_ring_buffer_status& status) {
842 const auto shared_ptr_this = weak_ptr_this.promote();
843 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
844 LOG(ERROR) << "Callback invoked on an invalid object";
847 WifiDebugRingBufferStatus hidl_status;
848 if (!hidl_struct_util::convertLegacyDebugRingBufferStatusToHidl(
849 status, &hidl_status)) {
850 LOG(ERROR) << "Error converting ring buffer status";
853 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
854 if (!callback->onDebugRingBufferDataAvailable(hidl_status, data).isOk()) {
855 LOG(ERROR) << "Failed to invoke onDebugRingBufferDataAvailable"
856 << " callback on: " << toString(callback);
861 legacy_hal::wifi_error legacy_status =
862 legacy_hal_.lock()->registerRingBufferCallbackHandler(
863 on_ring_buffer_data_callback);
865 if (legacy_status == legacy_hal::WIFI_SUCCESS) {
866 debug_ring_buffer_cb_registered_ = true;
868 return createWifiStatusFromLegacyError(legacy_status);
871 } // namespace implementation
874 } // namespace hardware
875 } // namespace android