blob: 9c41a40b8abd0ffbbff5aece4cb00beb9a2cd9a3 [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"
Etan Cohenc5700402017-03-08 16:43:38 -080022#include "wifi_feature_flags.h"
Roshan Pius5c055462016-10-11 08:27:27 -070023#include "wifi_status_util.h"
Roshan Pius3c4e8a32016-10-03 14:53:58 -070024
Roshan Pius35d958c2016-10-06 16:47:38 -070025namespace {
26using android::sp;
27using android::hardware::hidl_vec;
28using android::hardware::hidl_string;
Roshan Pius2c06a3f2016-12-15 17:51:40 -080029using android::hardware::wifi::V1_0::ChipModeId;
Roshan Pius52947fb2016-11-18 11:38:07 -080030using android::hardware::wifi::V1_0::IWifiChip;
31using android::hardware::wifi::V1_0::IfaceType;
32
Roshan Pius2c06a3f2016-12-15 17:51:40 -080033constexpr ChipModeId kStaChipModeId = 0;
34constexpr ChipModeId kApChipModeId = 1;
35constexpr ChipModeId kInvalidModeId = UINT32_MAX;
Roshan Pius35d958c2016-10-06 16:47:38 -070036
Roshan Pius35d958c2016-10-06 16:47:38 -070037template <typename Iface>
38void invalidateAndClear(sp<Iface>& iface) {
39 if (iface.get()) {
40 iface->invalidate();
41 iface.clear();
42 }
43}
44} // namepsace
45
Roshan Pius3c4e8a32016-10-03 14:53:58 -070046namespace android {
47namespace hardware {
48namespace wifi {
Roshan Pius79a99752016-10-04 13:03:58 -070049namespace V1_0 {
50namespace implementation {
Roshan Pius3c868522016-10-27 12:43:49 -070051using hidl_return_util::validateAndCall;
Roshan Pius3c4e8a32016-10-03 14:53:58 -070052
Roshan Pius52947fb2016-11-18 11:38:07 -080053WifiChip::WifiChip(
54 ChipId chip_id,
55 const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal,
56 const std::weak_ptr<mode_controller::WifiModeController> mode_controller)
57 : chip_id_(chip_id),
58 legacy_hal_(legacy_hal),
59 mode_controller_(mode_controller),
60 is_valid_(true),
Roshan Pius48185b22016-12-15 19:10:30 -080061 current_mode_id_(kInvalidModeId),
62 debug_ring_buffer_cb_registered_(false) {}
Roshan Pius3c4e8a32016-10-03 14:53:58 -070063
Roshan Piusaabe5752016-09-29 09:03:59 -070064void WifiChip::invalidate() {
Roshan Pius35d958c2016-10-06 16:47:38 -070065 invalidateAndRemoveAllIfaces();
Roshan Piusaabe5752016-09-29 09:03:59 -070066 legacy_hal_.reset();
Roshan Piusd37341f2017-01-31 13:13:28 -080067 event_cb_handler_.invalidate();
Roshan Pius35d958c2016-10-06 16:47:38 -070068 is_valid_ = false;
Roshan Pius3c4e8a32016-10-03 14:53:58 -070069}
70
Roshan Pius3c868522016-10-27 12:43:49 -070071bool WifiChip::isValid() {
72 return is_valid_;
73}
74
Roshan Piusd37341f2017-01-31 13:13:28 -080075std::set<sp<IWifiChipEventCallback>> WifiChip::getEventCallbacks() {
76 return event_cb_handler_.getCallbacks();
Roshan Pius203cb032016-12-14 17:41:20 -080077}
78
Roshan Pius5c055462016-10-11 08:27:27 -070079Return<void> WifiChip::getId(getId_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -070080 return validateAndCall(this,
81 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
82 &WifiChip::getIdInternal,
83 hidl_status_cb);
Roshan Piuscd566bd2016-10-10 08:03:42 -070084}
85
Roshan Pius3c4e8a32016-10-03 14:53:58 -070086Return<void> WifiChip::registerEventCallback(
Roshan Pius5c055462016-10-11 08:27:27 -070087 const sp<IWifiChipEventCallback>& event_callback,
88 registerEventCallback_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -070089 return validateAndCall(this,
90 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
91 &WifiChip::registerEventCallbackInternal,
92 hidl_status_cb,
93 event_callback);
Roshan Pius3c4e8a32016-10-03 14:53:58 -070094}
95
Roshan Pius7d08d7a2016-10-27 14:35:05 -070096Return<void> WifiChip::getCapabilities(getCapabilities_cb hidl_status_cb) {
97 return validateAndCall(this,
98 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
99 &WifiChip::getCapabilitiesInternal,
100 hidl_status_cb);
101}
102
Roshan Pius5c055462016-10-11 08:27:27 -0700103Return<void> WifiChip::getAvailableModes(getAvailableModes_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700104 return validateAndCall(this,
105 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
106 &WifiChip::getAvailableModesInternal,
107 hidl_status_cb);
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700108}
109
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800110Return<void> WifiChip::configureChip(ChipModeId mode_id,
Roshan Pius5c055462016-10-11 08:27:27 -0700111 configureChip_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700112 return validateAndCall(this,
113 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
114 &WifiChip::configureChipInternal,
115 hidl_status_cb,
116 mode_id);
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700117}
118
Roshan Pius5c055462016-10-11 08:27:27 -0700119Return<void> WifiChip::getMode(getMode_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700120 return validateAndCall(this,
121 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
122 &WifiChip::getModeInternal,
123 hidl_status_cb);
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700124}
125
Roshan Pius5c055462016-10-11 08:27:27 -0700126Return<void> WifiChip::requestChipDebugInfo(
127 requestChipDebugInfo_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700128 return validateAndCall(this,
129 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
130 &WifiChip::requestChipDebugInfoInternal,
131 hidl_status_cb);
Roshan Pius5c055462016-10-11 08:27:27 -0700132}
133
134Return<void> WifiChip::requestDriverDebugDump(
135 requestDriverDebugDump_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700136 return validateAndCall(this,
137 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
138 &WifiChip::requestDriverDebugDumpInternal,
139 hidl_status_cb);
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700140}
141
Roshan Pius5c055462016-10-11 08:27:27 -0700142Return<void> WifiChip::requestFirmwareDebugDump(
143 requestFirmwareDebugDump_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700144 return validateAndCall(this,
145 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
146 &WifiChip::requestFirmwareDebugDumpInternal,
147 hidl_status_cb);
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700148}
149
Roshan Pius5c055462016-10-11 08:27:27 -0700150Return<void> WifiChip::createApIface(createApIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700151 return validateAndCall(this,
152 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
153 &WifiChip::createApIfaceInternal,
154 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700155}
156
Roshan Pius5c055462016-10-11 08:27:27 -0700157Return<void> WifiChip::getApIfaceNames(getApIfaceNames_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700158 return validateAndCall(this,
159 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
160 &WifiChip::getApIfaceNamesInternal,
161 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700162}
163
Roshan Pius5c055462016-10-11 08:27:27 -0700164Return<void> WifiChip::getApIface(const hidl_string& ifname,
165 getApIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700166 return validateAndCall(this,
167 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
168 &WifiChip::getApIfaceInternal,
169 hidl_status_cb,
170 ifname);
Roshan Pius35d958c2016-10-06 16:47:38 -0700171}
172
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800173Return<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,
178 hidl_status_cb,
179 ifname);
180}
181
Roshan Pius5c055462016-10-11 08:27:27 -0700182Return<void> WifiChip::createNanIface(createNanIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700183 return validateAndCall(this,
184 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
185 &WifiChip::createNanIfaceInternal,
186 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700187}
188
Roshan Pius5c055462016-10-11 08:27:27 -0700189Return<void> WifiChip::getNanIfaceNames(getNanIfaceNames_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700190 return validateAndCall(this,
191 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
192 &WifiChip::getNanIfaceNamesInternal,
193 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700194}
195
196Return<void> WifiChip::getNanIface(const hidl_string& ifname,
Roshan Pius5c055462016-10-11 08:27:27 -0700197 getNanIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700198 return validateAndCall(this,
199 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
200 &WifiChip::getNanIfaceInternal,
201 hidl_status_cb,
202 ifname);
Roshan Pius35d958c2016-10-06 16:47:38 -0700203}
204
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800205Return<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,
210 hidl_status_cb,
211 ifname);
212}
213
Roshan Pius5c055462016-10-11 08:27:27 -0700214Return<void> WifiChip::createP2pIface(createP2pIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700215 return validateAndCall(this,
216 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
217 &WifiChip::createP2pIfaceInternal,
218 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700219}
220
Roshan Pius5c055462016-10-11 08:27:27 -0700221Return<void> WifiChip::getP2pIfaceNames(getP2pIfaceNames_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700222 return validateAndCall(this,
223 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
224 &WifiChip::getP2pIfaceNamesInternal,
225 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700226}
227
228Return<void> WifiChip::getP2pIface(const hidl_string& ifname,
Roshan Pius5c055462016-10-11 08:27:27 -0700229 getP2pIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700230 return validateAndCall(this,
231 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
232 &WifiChip::getP2pIfaceInternal,
233 hidl_status_cb,
234 ifname);
Roshan Pius35d958c2016-10-06 16:47:38 -0700235}
236
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800237Return<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,
242 hidl_status_cb,
243 ifname);
244}
245
Roshan Pius5c055462016-10-11 08:27:27 -0700246Return<void> WifiChip::createStaIface(createStaIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700247 return validateAndCall(this,
248 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
249 &WifiChip::createStaIfaceInternal,
250 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700251}
252
Roshan Pius5c055462016-10-11 08:27:27 -0700253Return<void> WifiChip::getStaIfaceNames(getStaIfaceNames_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700254 return validateAndCall(this,
255 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
256 &WifiChip::getStaIfaceNamesInternal,
257 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700258}
259
260Return<void> WifiChip::getStaIface(const hidl_string& ifname,
Roshan Pius5c055462016-10-11 08:27:27 -0700261 getStaIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700262 return validateAndCall(this,
263 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
264 &WifiChip::getStaIfaceInternal,
265 hidl_status_cb,
266 ifname);
Roshan Pius35d958c2016-10-06 16:47:38 -0700267}
268
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800269Return<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,
274 hidl_status_cb,
275 ifname);
276}
277
Roshan Pius5c055462016-10-11 08:27:27 -0700278Return<void> WifiChip::createRttController(
279 const sp<IWifiIface>& bound_iface, createRttController_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700280 return validateAndCall(this,
281 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
282 &WifiChip::createRttControllerInternal,
283 hidl_status_cb,
284 bound_iface);
Roshan Pius59268282016-10-06 20:23:47 -0700285}
286
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700287Return<void> WifiChip::getDebugRingBuffersStatus(
288 getDebugRingBuffersStatus_cb hidl_status_cb) {
289 return validateAndCall(this,
290 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
291 &WifiChip::getDebugRingBuffersStatusInternal,
292 hidl_status_cb);
293}
294
295Return<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,
304 hidl_status_cb,
305 ring_name,
306 verbose_level,
307 max_interval_in_sec,
308 min_data_size_in_bytes);
309}
310
311Return<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,
317 hidl_status_cb,
318 ring_name);
319}
320
Roshan Pius8c0c8e92017-02-24 08:07:42 -0800321Return<void> WifiChip::stopLoggingToDebugRingBuffer(
322 stopLoggingToDebugRingBuffer_cb hidl_status_cb) {
323 return validateAndCall(this,
324 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
325 &WifiChip::stopLoggingToDebugRingBufferInternal,
326 hidl_status_cb);
327}
328
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700329Return<void> WifiChip::getDebugHostWakeReasonStats(
330 getDebugHostWakeReasonStats_cb hidl_status_cb) {
331 return validateAndCall(this,
332 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
333 &WifiChip::getDebugHostWakeReasonStatsInternal,
334 hidl_status_cb);
335}
336
Roshan Pius203cb032016-12-14 17:41:20 -0800337Return<void> WifiChip::enableDebugErrorAlerts(
338 bool enable, enableDebugErrorAlerts_cb hidl_status_cb) {
339 return validateAndCall(this,
340 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
341 &WifiChip::enableDebugErrorAlertsInternal,
342 hidl_status_cb,
343 enable);
344}
345
Roshan Pius35d958c2016-10-06 16:47:38 -0700346void WifiChip::invalidateAndRemoveAllIfaces() {
347 invalidateAndClear(ap_iface_);
348 invalidateAndClear(nan_iface_);
349 invalidateAndClear(p2p_iface_);
350 invalidateAndClear(sta_iface_);
Roshan Pius59268282016-10-06 20:23:47 -0700351 // 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_) {
354 rtt->invalidate();
355 }
356 rtt_controllers_.clear();
Roshan Pius35d958c2016-10-06 16:47:38 -0700357}
358
Roshan Pius3c868522016-10-27 12:43:49 -0700359std::pair<WifiStatus, ChipId> WifiChip::getIdInternal() {
360 return {createWifiStatus(WifiStatusCode::SUCCESS), chip_id_};
361}
362
363WifiStatus WifiChip::registerEventCallbackInternal(
364 const sp<IWifiChipEventCallback>& event_callback) {
Roshan Piusd37341f2017-01-31 13:13:28 -0800365 if (!event_cb_handler_.addCallback(event_callback)) {
366 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
367 }
Roshan Pius3c868522016-10-27 12:43:49 -0700368 return createWifiStatus(WifiStatusCode::SUCCESS);
369}
370
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700371std::pair<WifiStatus, uint32_t> WifiChip::getCapabilitiesInternal() {
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800372 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};
378 }
379 uint32_t hidl_caps;
380 if (!hidl_struct_util::convertLegacyFeaturesToHidlChipCapabilities(
381 legacy_logger_feature_set, &hidl_caps)) {
382 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), 0};
383 }
384 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700385}
386
Roshan Pius3c868522016-10-27 12:43:49 -0700387std::pair<WifiStatus, std::vector<IWifiChip::ChipMode>>
388WifiChip::getAvailableModesInternal() {
Roshan Pius52947fb2016-11-18 11:38:07 -0800389 // 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
Etan Cohenc5700402017-03-08 16:43:38 -0800392 // concurrently [NAN conditional on wifiHidlFeatureAware]
Roshan Pius52947fb2016-11-18 11:38:07 -0800393 // Mode 2 (AP mode): Will support 1 AP iface operations.
394 // TODO (b/32997844): Read this from some device specific flags in the
395 // makefile.
396 // STA mode iface combinations.
397 const IWifiChip::ChipIfaceCombinationLimit
398 sta_chip_iface_combination_limit_1 = {{IfaceType::STA}, 1};
Etan Cohenc5700402017-03-08 16:43:38 -0800399 IWifiChip::ChipIfaceCombinationLimit sta_chip_iface_combination_limit_2;
400 if (WifiFeatureFlags::wifiHidlFeatureAware) {
401 sta_chip_iface_combination_limit_2 = {{IfaceType::P2P, IfaceType::NAN},
402 1};
403 } else {
404 sta_chip_iface_combination_limit_2 = {{IfaceType::P2P},
405 1};
406 }
Roshan Pius52947fb2016-11-18 11:38:07 -0800407 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 = {
413 {IfaceType::AP}, 1};
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}};
Roshan Pius3c868522016-10-27 12:43:49 -0700420}
421
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800422WifiStatus WifiChip::configureChipInternal(ChipModeId mode_id) {
Roshan Pius52947fb2016-11-18 11:38:07 -0800423 if (mode_id != kStaChipModeId && mode_id != kApChipModeId) {
424 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
425 }
426 if (mode_id == current_mode_id_) {
427 LOG(DEBUG) << "Already in the specified mode " << mode_id;
428 return createWifiStatus(WifiStatusCode::SUCCESS);
429 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800430 WifiStatus status = handleChipConfiguration(mode_id);
431 if (status.code != WifiStatusCode::SUCCESS) {
Roshan Piusd37341f2017-01-31 13:13:28 -0800432 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800433 if (!callback->onChipReconfigureFailure(status).isOk()) {
434 LOG(ERROR) << "Failed to invoke onChipReconfigureFailure callback";
435 }
Roshan Pius52947fb2016-11-18 11:38:07 -0800436 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800437 return status;
Roshan Pius52947fb2016-11-18 11:38:07 -0800438 }
Roshan Piusd37341f2017-01-31 13:13:28 -0800439 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800440 if (!callback->onChipReconfigured(mode_id).isOk()) {
441 LOG(ERROR) << "Failed to invoke onChipReconfigured callback";
442 }
Roshan Pius52947fb2016-11-18 11:38:07 -0800443 }
444 current_mode_id_ = mode_id;
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800445 return status;
Roshan Pius3c868522016-10-27 12:43:49 -0700446}
447
448std::pair<WifiStatus, uint32_t> WifiChip::getModeInternal() {
Roshan Pius52947fb2016-11-18 11:38:07 -0800449 if (current_mode_id_ == kInvalidModeId) {
450 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE),
451 current_mode_id_};
452 }
453 return {createWifiStatus(WifiStatusCode::SUCCESS), current_mode_id_};
Roshan Pius3c868522016-10-27 12:43:49 -0700454}
455
456std::pair<WifiStatus, IWifiChip::ChipDebugInfo>
457WifiChip::requestChipDebugInfoInternal() {
458 IWifiChip::ChipDebugInfo result;
Roshan Piusa4854ff2016-12-01 13:47:41 -0800459 legacy_hal::wifi_error legacy_status;
Roshan Pius3c868522016-10-27 12:43:49 -0700460 std::string driver_desc;
461 std::tie(legacy_status, driver_desc) = legacy_hal_.lock()->getDriverVersion();
Roshan Piusa4854ff2016-12-01 13:47:41 -0800462 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
Roshan Pius3c868522016-10-27 12:43:49 -0700463 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};
468 }
469 result.driverDescription = driver_desc.c_str();
470
471 std::string firmware_desc;
472 std::tie(legacy_status, firmware_desc) =
473 legacy_hal_.lock()->getFirmwareVersion();
Roshan Piusa4854ff2016-12-01 13:47:41 -0800474 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
Roshan Pius3c868522016-10-27 12:43:49 -0700475 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};
480 }
481 result.firmwareDescription = firmware_desc.c_str();
482
483 return {createWifiStatus(WifiStatusCode::SUCCESS), result};
484}
485
486std::pair<WifiStatus, std::vector<uint8_t>>
487WifiChip::requestDriverDebugDumpInternal() {
Roshan Piusa4854ff2016-12-01 13:47:41 -0800488 legacy_hal::wifi_error legacy_status;
Roshan Pius3c868522016-10-27 12:43:49 -0700489 std::vector<uint8_t> driver_dump;
490 std::tie(legacy_status, driver_dump) =
491 legacy_hal_.lock()->requestDriverMemoryDump();
Roshan Piusa4854ff2016-12-01 13:47:41 -0800492 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
Roshan Pius3c868522016-10-27 12:43:49 -0700493 LOG(ERROR) << "Failed to get driver debug dump: "
494 << legacyErrorToString(legacy_status);
495 return {createWifiStatusFromLegacyError(legacy_status),
496 std::vector<uint8_t>()};
497 }
498 return {createWifiStatus(WifiStatusCode::SUCCESS), driver_dump};
499}
500
501std::pair<WifiStatus, std::vector<uint8_t>>
502WifiChip::requestFirmwareDebugDumpInternal() {
Roshan Piusa4854ff2016-12-01 13:47:41 -0800503 legacy_hal::wifi_error legacy_status;
Roshan Pius3c868522016-10-27 12:43:49 -0700504 std::vector<uint8_t> firmware_dump;
505 std::tie(legacy_status, firmware_dump) =
506 legacy_hal_.lock()->requestFirmwareMemoryDump();
Roshan Piusa4854ff2016-12-01 13:47:41 -0800507 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
Roshan Pius3c868522016-10-27 12:43:49 -0700508 LOG(ERROR) << "Failed to get firmware debug dump: "
509 << legacyErrorToString(legacy_status);
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700510 return {createWifiStatusFromLegacyError(legacy_status), {}};
Roshan Pius3c868522016-10-27 12:43:49 -0700511 }
512 return {createWifiStatus(WifiStatusCode::SUCCESS), firmware_dump};
513}
514
515std::pair<WifiStatus, sp<IWifiApIface>> WifiChip::createApIfaceInternal() {
Roshan Pius073d5b92016-12-08 19:10:06 -0800516 if (current_mode_id_ != kApChipModeId || ap_iface_.get()) {
517 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
518 }
Roshan Pius3c868522016-10-27 12:43:49 -0700519 std::string ifname = legacy_hal_.lock()->getApIfaceName();
520 ap_iface_ = new WifiApIface(ifname, legacy_hal_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800521 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800522 if (!callback->onIfaceAdded(IfaceType::AP, ifname).isOk()) {
523 LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
524 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800525 }
Roshan Pius3c868522016-10-27 12:43:49 -0700526 return {createWifiStatus(WifiStatusCode::SUCCESS), ap_iface_};
527}
528
529std::pair<WifiStatus, std::vector<hidl_string>>
530WifiChip::getApIfaceNamesInternal() {
531 if (!ap_iface_.get()) {
532 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
533 }
534 return {createWifiStatus(WifiStatusCode::SUCCESS),
535 {legacy_hal_.lock()->getApIfaceName()}};
536}
537
538std::pair<WifiStatus, sp<IWifiApIface>> WifiChip::getApIfaceInternal(
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800539 const std::string& ifname) {
540 if (!ap_iface_.get() || (ifname != legacy_hal_.lock()->getApIfaceName())) {
Roshan Pius3c868522016-10-27 12:43:49 -0700541 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
542 }
543 return {createWifiStatus(WifiStatusCode::SUCCESS), ap_iface_};
544}
545
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800546WifiStatus WifiChip::removeApIfaceInternal(const std::string& ifname) {
547 if (!ap_iface_.get() || (ifname != legacy_hal_.lock()->getApIfaceName())) {
548 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
549 }
550 invalidateAndClear(ap_iface_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800551 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800552 if (!callback->onIfaceRemoved(IfaceType::AP, ifname).isOk()) {
553 LOG(ERROR) << "Failed to invoke onIfaceRemoved callback";
554 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800555 }
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800556 return createWifiStatus(WifiStatusCode::SUCCESS);
557}
558
Roshan Pius3c868522016-10-27 12:43:49 -0700559std::pair<WifiStatus, sp<IWifiNanIface>> WifiChip::createNanIfaceInternal() {
Roshan Pius073d5b92016-12-08 19:10:06 -0800560 // Only 1 of NAN or P2P iface can be active at a time.
Etan Cohenc5700402017-03-08 16:43:38 -0800561 if (WifiFeatureFlags::wifiHidlFeatureAware) {
562 if (current_mode_id_ != kStaChipModeId || nan_iface_.get() ||
563 p2p_iface_.get()) {
564 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
565 }
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";
571 }
572 }
573 return {createWifiStatus(WifiStatusCode::SUCCESS), nan_iface_};
574 } else {
Roshan Pius073d5b92016-12-08 19:10:06 -0800575 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
576 }
Roshan Pius3c868522016-10-27 12:43:49 -0700577}
578
579std::pair<WifiStatus, std::vector<hidl_string>>
580WifiChip::getNanIfaceNamesInternal() {
581 if (!nan_iface_.get()) {
582 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
583 }
584 return {createWifiStatus(WifiStatusCode::SUCCESS),
585 {legacy_hal_.lock()->getNanIfaceName()}};
586}
587
588std::pair<WifiStatus, sp<IWifiNanIface>> WifiChip::getNanIfaceInternal(
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800589 const std::string& ifname) {
590 if (!nan_iface_.get() || (ifname != legacy_hal_.lock()->getNanIfaceName())) {
Roshan Pius3c868522016-10-27 12:43:49 -0700591 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
592 }
593 return {createWifiStatus(WifiStatusCode::SUCCESS), nan_iface_};
594}
595
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800596WifiStatus WifiChip::removeNanIfaceInternal(const std::string& ifname) {
597 if (!nan_iface_.get() || (ifname != legacy_hal_.lock()->getNanIfaceName())) {
598 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
599 }
600 invalidateAndClear(nan_iface_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800601 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800602 if (!callback->onIfaceRemoved(IfaceType::NAN, ifname).isOk()) {
603 LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
604 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800605 }
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800606 return createWifiStatus(WifiStatusCode::SUCCESS);
607}
608
Roshan Pius3c868522016-10-27 12:43:49 -0700609std::pair<WifiStatus, sp<IWifiP2pIface>> WifiChip::createP2pIfaceInternal() {
Roshan Pius073d5b92016-12-08 19:10:06 -0800610 // Only 1 of NAN or P2P iface can be active at a time.
611 if (current_mode_id_ != kStaChipModeId || p2p_iface_.get() ||
612 nan_iface_.get()) {
613 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
614 }
Roshan Pius3c868522016-10-27 12:43:49 -0700615 std::string ifname = legacy_hal_.lock()->getP2pIfaceName();
616 p2p_iface_ = new WifiP2pIface(ifname, legacy_hal_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800617 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800618 if (!callback->onIfaceAdded(IfaceType::P2P, ifname).isOk()) {
619 LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
620 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800621 }
Roshan Pius3c868522016-10-27 12:43:49 -0700622 return {createWifiStatus(WifiStatusCode::SUCCESS), p2p_iface_};
623}
624
625std::pair<WifiStatus, std::vector<hidl_string>>
626WifiChip::getP2pIfaceNamesInternal() {
627 if (!p2p_iface_.get()) {
628 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
629 }
630 return {createWifiStatus(WifiStatusCode::SUCCESS),
631 {legacy_hal_.lock()->getP2pIfaceName()}};
632}
633
634std::pair<WifiStatus, sp<IWifiP2pIface>> WifiChip::getP2pIfaceInternal(
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800635 const std::string& ifname) {
636 if (!p2p_iface_.get() || (ifname != legacy_hal_.lock()->getP2pIfaceName())) {
Roshan Pius3c868522016-10-27 12:43:49 -0700637 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
638 }
639 return {createWifiStatus(WifiStatusCode::SUCCESS), p2p_iface_};
640}
641
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800642WifiStatus WifiChip::removeP2pIfaceInternal(const std::string& ifname) {
643 if (!p2p_iface_.get() || (ifname != legacy_hal_.lock()->getP2pIfaceName())) {
644 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
645 }
646 invalidateAndClear(p2p_iface_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800647 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800648 if (!callback->onIfaceRemoved(IfaceType::P2P, ifname).isOk()) {
649 LOG(ERROR) << "Failed to invoke onIfaceRemoved callback";
650 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800651 }
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800652 return createWifiStatus(WifiStatusCode::SUCCESS);
653}
654
Roshan Pius3c868522016-10-27 12:43:49 -0700655std::pair<WifiStatus, sp<IWifiStaIface>> WifiChip::createStaIfaceInternal() {
Roshan Pius073d5b92016-12-08 19:10:06 -0800656 if (current_mode_id_ != kStaChipModeId || sta_iface_.get()) {
657 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
658 }
Roshan Pius3c868522016-10-27 12:43:49 -0700659 std::string ifname = legacy_hal_.lock()->getStaIfaceName();
660 sta_iface_ = new WifiStaIface(ifname, legacy_hal_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800661 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800662 if (!callback->onIfaceAdded(IfaceType::STA, ifname).isOk()) {
663 LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
664 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800665 }
Roshan Pius3c868522016-10-27 12:43:49 -0700666 return {createWifiStatus(WifiStatusCode::SUCCESS), sta_iface_};
667}
668
669std::pair<WifiStatus, std::vector<hidl_string>>
670WifiChip::getStaIfaceNamesInternal() {
671 if (!sta_iface_.get()) {
672 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
673 }
674 return {createWifiStatus(WifiStatusCode::SUCCESS),
675 {legacy_hal_.lock()->getStaIfaceName()}};
676}
677
678std::pair<WifiStatus, sp<IWifiStaIface>> WifiChip::getStaIfaceInternal(
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800679 const std::string& ifname) {
680 if (!sta_iface_.get() || (ifname != legacy_hal_.lock()->getStaIfaceName())) {
Roshan Pius3c868522016-10-27 12:43:49 -0700681 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
682 }
683 return {createWifiStatus(WifiStatusCode::SUCCESS), sta_iface_};
684}
685
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800686WifiStatus WifiChip::removeStaIfaceInternal(const std::string& ifname) {
687 if (!sta_iface_.get() || (ifname != legacy_hal_.lock()->getStaIfaceName())) {
688 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
689 }
690 invalidateAndClear(sta_iface_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800691 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800692 if (!callback->onIfaceRemoved(IfaceType::STA, ifname).isOk()) {
693 LOG(ERROR) << "Failed to invoke onIfaceRemoved callback";
694 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800695 }
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800696 return createWifiStatus(WifiStatusCode::SUCCESS);
697}
698
Roshan Pius3c868522016-10-27 12:43:49 -0700699std::pair<WifiStatus, sp<IWifiRttController>>
700WifiChip::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};
704}
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700705
706std::pair<WifiStatus, std::vector<WifiDebugRingBufferStatus>>
707WifiChip::getDebugRingBuffersStatusInternal() {
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800708 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), {}};
715 }
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), {}};
720 }
721 return {createWifiStatus(WifiStatusCode::SUCCESS),
722 hidl_ring_buffer_status_vec};
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700723}
724
725WifiStatus WifiChip::startLoggingToDebugRingBufferInternal(
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800726 const hidl_string& ring_name,
727 WifiDebugRingBufferVerboseLevel verbose_level,
728 uint32_t max_interval_in_sec,
729 uint32_t min_data_size_in_bytes) {
Roshan Pius48185b22016-12-15 19:10:30 -0800730 WifiStatus status = registerDebugRingBufferCallback();
731 if (status.code != WifiStatusCode::SUCCESS) {
732 return status;
733 }
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800734 legacy_hal::wifi_error legacy_status =
735 legacy_hal_.lock()->startRingBufferLogging(
736 ring_name,
737 static_cast<
738 std::underlying_type<WifiDebugRingBufferVerboseLevel>::type>(
739 verbose_level),
740 max_interval_in_sec,
741 min_data_size_in_bytes);
742 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700743}
744
745WifiStatus WifiChip::forceDumpToDebugRingBufferInternal(
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800746 const hidl_string& ring_name) {
Roshan Pius48185b22016-12-15 19:10:30 -0800747 WifiStatus status = registerDebugRingBufferCallback();
748 if (status.code != WifiStatusCode::SUCCESS) {
749 return status;
750 }
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800751 legacy_hal::wifi_error legacy_status =
752 legacy_hal_.lock()->getRingBufferData(ring_name);
753 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700754}
755
Roshan Pius8c0c8e92017-02-24 08:07:42 -0800756WifiStatus WifiChip::stopLoggingToDebugRingBufferInternal() {
757 legacy_hal::wifi_error legacy_status =
758 legacy_hal_.lock()->deregisterRingBufferCallbackHandler();
759 return createWifiStatusFromLegacyError(legacy_status);
760}
761
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700762std::pair<WifiStatus, WifiDebugHostWakeReasonStats>
763WifiChip::getDebugHostWakeReasonStatsInternal() {
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800764 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), {}};
770 }
771 WifiDebugHostWakeReasonStats hidl_stats;
772 if (!hidl_struct_util::convertLegacyWakeReasonStatsToHidl(legacy_stats,
773 &hidl_stats)) {
774 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
775 }
776 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_stats};
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700777}
778
Roshan Pius203cb032016-12-14 17:41:20 -0800779WifiStatus WifiChip::enableDebugErrorAlertsInternal(bool enable) {
780 legacy_hal::wifi_error legacy_status;
781 if (enable) {
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";
788 return;
789 }
790 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800791 if (!callback->onDebugErrorAlert(error_code, debug_data).isOk()) {
792 LOG(ERROR) << "Failed to invoke onDebugErrorAlert callback";
793 }
Roshan Pius203cb032016-12-14 17:41:20 -0800794 }
795 };
796 legacy_status = legacy_hal_.lock()->registerErrorAlertCallbackHandler(
797 on_alert_callback);
798 } else {
799 legacy_status = legacy_hal_.lock()->deregisterErrorAlertCallbackHandler();
800 }
801 return createWifiStatusFromLegacyError(legacy_status);
802}
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800803
804WifiStatus 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 if (current_mode_id_ != kInvalidModeId) {
808 invalidateAndRemoveAllIfaces();
809 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->stop([]() {});
810 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
811 LOG(ERROR) << "Failed to stop legacy HAL: "
812 << legacyErrorToString(legacy_status);
813 return createWifiStatusFromLegacyError(legacy_status);
814 }
815 }
816 bool success;
817 if (mode_id == kStaChipModeId) {
818 success = mode_controller_.lock()->changeFirmwareMode(IfaceType::STA);
819 } else {
820 success = mode_controller_.lock()->changeFirmwareMode(IfaceType::AP);
821 }
822 if (!success) {
823 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
824 }
825 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->start();
826 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
827 LOG(ERROR) << "Failed to start legacy HAL: "
828 << legacyErrorToString(legacy_status);
829 return createWifiStatusFromLegacyError(legacy_status);
830 }
831 return createWifiStatus(WifiStatusCode::SUCCESS);
832}
Roshan Pius48185b22016-12-15 19:10:30 -0800833
834WifiStatus WifiChip::registerDebugRingBufferCallback() {
835 if (debug_ring_buffer_cb_registered_) {
836 return createWifiStatus(WifiStatusCode::SUCCESS);
837 }
838
839 android::wp<WifiChip> weak_ptr_this(this);
840 const auto& on_ring_buffer_data_callback = [weak_ptr_this](
841 const std::string& /* name */,
842 const std::vector<uint8_t>& data,
843 const legacy_hal::wifi_ring_buffer_status& status) {
844 const auto shared_ptr_this = weak_ptr_this.promote();
845 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
846 LOG(ERROR) << "Callback invoked on an invalid object";
847 return;
848 }
849 WifiDebugRingBufferStatus hidl_status;
850 if (!hidl_struct_util::convertLegacyDebugRingBufferStatusToHidl(
851 status, &hidl_status)) {
852 LOG(ERROR) << "Error converting ring buffer status";
853 return;
854 }
855 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800856 if (!callback->onDebugRingBufferDataAvailable(hidl_status, data).isOk()) {
857 LOG(ERROR) << "Failed to invoke onDebugRingBufferDataAvailable"
858 << " callback";
859 }
Roshan Pius48185b22016-12-15 19:10:30 -0800860 }
861 };
862 legacy_hal::wifi_error legacy_status =
863 legacy_hal_.lock()->registerRingBufferCallbackHandler(
864 on_ring_buffer_data_callback);
865
866 if (legacy_status == legacy_hal::WIFI_SUCCESS) {
867 debug_ring_buffer_cb_registered_ = true;
868 }
869 return createWifiStatusFromLegacyError(legacy_status);
870}
871
Roshan Pius79a99752016-10-04 13:03:58 -0700872} // namespace implementation
873} // namespace V1_0
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700874} // namespace wifi
875} // namespace hardware
876} // namespace android