blob: 87985c067a3f2b80d99902a184057c990d249ddc [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 Piusdbd83ef2017-06-20 12:05:40 -070049namespace V1_1 {
Roshan Pius79a99752016-10-04 13:03:58 -070050namespace 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 Piusdbd83ef2017-06-20 12:05:40 -0700346Return<void> WifiChip::setTxPowerLimit(
347 int32_t powerInDbm, setTxPowerLimit_cb hidl_status_cb) {
348 return validateAndCall(this,
349 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
350 &WifiChip::setTxPowerLimitInternal,
351 hidl_status_cb,
352 powerInDbm);
353}
354
355Return<void> WifiChip::resetTxPowerLimit(
356 resetTxPowerLimit_cb hidl_status_cb) {
357 return validateAndCall(this,
358 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
359 &WifiChip::resetTxPowerLimitInternal,
360 hidl_status_cb);
361}
362
Roshan Pius35d958c2016-10-06 16:47:38 -0700363void WifiChip::invalidateAndRemoveAllIfaces() {
364 invalidateAndClear(ap_iface_);
365 invalidateAndClear(nan_iface_);
366 invalidateAndClear(p2p_iface_);
367 invalidateAndClear(sta_iface_);
Roshan Pius59268282016-10-06 20:23:47 -0700368 // Since all the ifaces are invalid now, all RTT controller objects
369 // using those ifaces also need to be invalidated.
370 for (const auto& rtt : rtt_controllers_) {
371 rtt->invalidate();
372 }
373 rtt_controllers_.clear();
Roshan Pius35d958c2016-10-06 16:47:38 -0700374}
375
Roshan Pius3c868522016-10-27 12:43:49 -0700376std::pair<WifiStatus, ChipId> WifiChip::getIdInternal() {
377 return {createWifiStatus(WifiStatusCode::SUCCESS), chip_id_};
378}
379
380WifiStatus WifiChip::registerEventCallbackInternal(
381 const sp<IWifiChipEventCallback>& event_callback) {
Roshan Piusd37341f2017-01-31 13:13:28 -0800382 if (!event_cb_handler_.addCallback(event_callback)) {
383 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
384 }
Roshan Pius3c868522016-10-27 12:43:49 -0700385 return createWifiStatus(WifiStatusCode::SUCCESS);
386}
387
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700388std::pair<WifiStatus, uint32_t> WifiChip::getCapabilitiesInternal() {
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800389 legacy_hal::wifi_error legacy_status;
390 uint32_t legacy_logger_feature_set;
391 std::tie(legacy_status, legacy_logger_feature_set) =
392 legacy_hal_.lock()->getLoggerSupportedFeatureSet();
393 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
394 return {createWifiStatusFromLegacyError(legacy_status), 0};
395 }
396 uint32_t hidl_caps;
397 if (!hidl_struct_util::convertLegacyFeaturesToHidlChipCapabilities(
398 legacy_logger_feature_set, &hidl_caps)) {
399 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), 0};
400 }
401 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700402}
403
Roshan Pius3c868522016-10-27 12:43:49 -0700404std::pair<WifiStatus, std::vector<IWifiChip::ChipMode>>
405WifiChip::getAvailableModesInternal() {
Roshan Pius52947fb2016-11-18 11:38:07 -0800406 // The chip combination supported for current devices is fixed for now with
407 // 2 separate modes of operation:
408 // Mode 1 (STA mode): Will support 1 STA and 1 P2P or NAN iface operations
Etan Cohenc5700402017-03-08 16:43:38 -0800409 // concurrently [NAN conditional on wifiHidlFeatureAware]
Roshan Pius52947fb2016-11-18 11:38:07 -0800410 // Mode 2 (AP mode): Will support 1 AP iface operations.
411 // TODO (b/32997844): Read this from some device specific flags in the
412 // makefile.
413 // STA mode iface combinations.
414 const IWifiChip::ChipIfaceCombinationLimit
415 sta_chip_iface_combination_limit_1 = {{IfaceType::STA}, 1};
Etan Cohenc5700402017-03-08 16:43:38 -0800416 IWifiChip::ChipIfaceCombinationLimit sta_chip_iface_combination_limit_2;
417 if (WifiFeatureFlags::wifiHidlFeatureAware) {
418 sta_chip_iface_combination_limit_2 = {{IfaceType::P2P, IfaceType::NAN},
419 1};
420 } else {
421 sta_chip_iface_combination_limit_2 = {{IfaceType::P2P},
422 1};
423 }
Roshan Pius52947fb2016-11-18 11:38:07 -0800424 const IWifiChip::ChipIfaceCombination sta_chip_iface_combination = {
425 {sta_chip_iface_combination_limit_1, sta_chip_iface_combination_limit_2}};
426 const IWifiChip::ChipMode sta_chip_mode = {kStaChipModeId,
427 {sta_chip_iface_combination}};
428 // AP mode iface combinations.
429 const IWifiChip::ChipIfaceCombinationLimit ap_chip_iface_combination_limit = {
430 {IfaceType::AP}, 1};
431 const IWifiChip::ChipIfaceCombination ap_chip_iface_combination = {
432 {ap_chip_iface_combination_limit}};
433 const IWifiChip::ChipMode ap_chip_mode = {kApChipModeId,
434 {ap_chip_iface_combination}};
435 return {createWifiStatus(WifiStatusCode::SUCCESS),
436 {sta_chip_mode, ap_chip_mode}};
Roshan Pius3c868522016-10-27 12:43:49 -0700437}
438
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800439WifiStatus WifiChip::configureChipInternal(ChipModeId mode_id) {
Roshan Pius52947fb2016-11-18 11:38:07 -0800440 if (mode_id != kStaChipModeId && mode_id != kApChipModeId) {
441 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
442 }
443 if (mode_id == current_mode_id_) {
444 LOG(DEBUG) << "Already in the specified mode " << mode_id;
445 return createWifiStatus(WifiStatusCode::SUCCESS);
446 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800447 WifiStatus status = handleChipConfiguration(mode_id);
448 if (status.code != WifiStatusCode::SUCCESS) {
Roshan Piusd37341f2017-01-31 13:13:28 -0800449 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800450 if (!callback->onChipReconfigureFailure(status).isOk()) {
451 LOG(ERROR) << "Failed to invoke onChipReconfigureFailure callback";
452 }
Roshan Pius52947fb2016-11-18 11:38:07 -0800453 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800454 return status;
Roshan Pius52947fb2016-11-18 11:38:07 -0800455 }
Roshan Piusd37341f2017-01-31 13:13:28 -0800456 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800457 if (!callback->onChipReconfigured(mode_id).isOk()) {
458 LOG(ERROR) << "Failed to invoke onChipReconfigured callback";
459 }
Roshan Pius52947fb2016-11-18 11:38:07 -0800460 }
461 current_mode_id_ = mode_id;
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800462 return status;
Roshan Pius3c868522016-10-27 12:43:49 -0700463}
464
465std::pair<WifiStatus, uint32_t> WifiChip::getModeInternal() {
Roshan Pius52947fb2016-11-18 11:38:07 -0800466 if (current_mode_id_ == kInvalidModeId) {
467 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE),
468 current_mode_id_};
469 }
470 return {createWifiStatus(WifiStatusCode::SUCCESS), current_mode_id_};
Roshan Pius3c868522016-10-27 12:43:49 -0700471}
472
473std::pair<WifiStatus, IWifiChip::ChipDebugInfo>
474WifiChip::requestChipDebugInfoInternal() {
475 IWifiChip::ChipDebugInfo result;
Roshan Piusa4854ff2016-12-01 13:47:41 -0800476 legacy_hal::wifi_error legacy_status;
Roshan Pius3c868522016-10-27 12:43:49 -0700477 std::string driver_desc;
478 std::tie(legacy_status, driver_desc) = legacy_hal_.lock()->getDriverVersion();
Roshan Piusa4854ff2016-12-01 13:47:41 -0800479 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
Roshan Pius3c868522016-10-27 12:43:49 -0700480 LOG(ERROR) << "Failed to get driver version: "
481 << legacyErrorToString(legacy_status);
482 WifiStatus status = createWifiStatusFromLegacyError(
483 legacy_status, "failed to get driver version");
484 return {status, result};
485 }
486 result.driverDescription = driver_desc.c_str();
487
488 std::string firmware_desc;
489 std::tie(legacy_status, firmware_desc) =
490 legacy_hal_.lock()->getFirmwareVersion();
Roshan Piusa4854ff2016-12-01 13:47:41 -0800491 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
Roshan Pius3c868522016-10-27 12:43:49 -0700492 LOG(ERROR) << "Failed to get firmware version: "
493 << legacyErrorToString(legacy_status);
494 WifiStatus status = createWifiStatusFromLegacyError(
495 legacy_status, "failed to get firmware version");
496 return {status, result};
497 }
498 result.firmwareDescription = firmware_desc.c_str();
499
500 return {createWifiStatus(WifiStatusCode::SUCCESS), result};
501}
502
503std::pair<WifiStatus, std::vector<uint8_t>>
504WifiChip::requestDriverDebugDumpInternal() {
Roshan Piusa4854ff2016-12-01 13:47:41 -0800505 legacy_hal::wifi_error legacy_status;
Roshan Pius3c868522016-10-27 12:43:49 -0700506 std::vector<uint8_t> driver_dump;
507 std::tie(legacy_status, driver_dump) =
508 legacy_hal_.lock()->requestDriverMemoryDump();
Roshan Piusa4854ff2016-12-01 13:47:41 -0800509 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
Roshan Pius3c868522016-10-27 12:43:49 -0700510 LOG(ERROR) << "Failed to get driver debug dump: "
511 << legacyErrorToString(legacy_status);
512 return {createWifiStatusFromLegacyError(legacy_status),
513 std::vector<uint8_t>()};
514 }
515 return {createWifiStatus(WifiStatusCode::SUCCESS), driver_dump};
516}
517
518std::pair<WifiStatus, std::vector<uint8_t>>
519WifiChip::requestFirmwareDebugDumpInternal() {
Roshan Piusa4854ff2016-12-01 13:47:41 -0800520 legacy_hal::wifi_error legacy_status;
Roshan Pius3c868522016-10-27 12:43:49 -0700521 std::vector<uint8_t> firmware_dump;
522 std::tie(legacy_status, firmware_dump) =
523 legacy_hal_.lock()->requestFirmwareMemoryDump();
Roshan Piusa4854ff2016-12-01 13:47:41 -0800524 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
Roshan Pius3c868522016-10-27 12:43:49 -0700525 LOG(ERROR) << "Failed to get firmware debug dump: "
526 << legacyErrorToString(legacy_status);
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700527 return {createWifiStatusFromLegacyError(legacy_status), {}};
Roshan Pius3c868522016-10-27 12:43:49 -0700528 }
529 return {createWifiStatus(WifiStatusCode::SUCCESS), firmware_dump};
530}
531
532std::pair<WifiStatus, sp<IWifiApIface>> WifiChip::createApIfaceInternal() {
Roshan Pius073d5b92016-12-08 19:10:06 -0800533 if (current_mode_id_ != kApChipModeId || ap_iface_.get()) {
534 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
535 }
Roshan Pius3c868522016-10-27 12:43:49 -0700536 std::string ifname = legacy_hal_.lock()->getApIfaceName();
537 ap_iface_ = new WifiApIface(ifname, legacy_hal_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800538 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800539 if (!callback->onIfaceAdded(IfaceType::AP, ifname).isOk()) {
540 LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
541 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800542 }
Roshan Pius3c868522016-10-27 12:43:49 -0700543 return {createWifiStatus(WifiStatusCode::SUCCESS), ap_iface_};
544}
545
546std::pair<WifiStatus, std::vector<hidl_string>>
547WifiChip::getApIfaceNamesInternal() {
548 if (!ap_iface_.get()) {
549 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
550 }
551 return {createWifiStatus(WifiStatusCode::SUCCESS),
552 {legacy_hal_.lock()->getApIfaceName()}};
553}
554
555std::pair<WifiStatus, sp<IWifiApIface>> WifiChip::getApIfaceInternal(
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800556 const std::string& ifname) {
557 if (!ap_iface_.get() || (ifname != legacy_hal_.lock()->getApIfaceName())) {
Roshan Pius3c868522016-10-27 12:43:49 -0700558 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
559 }
560 return {createWifiStatus(WifiStatusCode::SUCCESS), ap_iface_};
561}
562
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800563WifiStatus WifiChip::removeApIfaceInternal(const std::string& ifname) {
564 if (!ap_iface_.get() || (ifname != legacy_hal_.lock()->getApIfaceName())) {
565 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
566 }
567 invalidateAndClear(ap_iface_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800568 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800569 if (!callback->onIfaceRemoved(IfaceType::AP, ifname).isOk()) {
570 LOG(ERROR) << "Failed to invoke onIfaceRemoved callback";
571 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800572 }
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800573 return createWifiStatus(WifiStatusCode::SUCCESS);
574}
575
Roshan Pius3c868522016-10-27 12:43:49 -0700576std::pair<WifiStatus, sp<IWifiNanIface>> WifiChip::createNanIfaceInternal() {
Roshan Pius073d5b92016-12-08 19:10:06 -0800577 // Only 1 of NAN or P2P iface can be active at a time.
Etan Cohenc5700402017-03-08 16:43:38 -0800578 if (WifiFeatureFlags::wifiHidlFeatureAware) {
579 if (current_mode_id_ != kStaChipModeId || nan_iface_.get() ||
580 p2p_iface_.get()) {
581 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
582 }
583 std::string ifname = legacy_hal_.lock()->getNanIfaceName();
584 nan_iface_ = new WifiNanIface(ifname, legacy_hal_);
585 for (const auto& callback : event_cb_handler_.getCallbacks()) {
586 if (!callback->onIfaceAdded(IfaceType::NAN, ifname).isOk()) {
587 LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
588 }
589 }
590 return {createWifiStatus(WifiStatusCode::SUCCESS), nan_iface_};
591 } else {
Roshan Pius073d5b92016-12-08 19:10:06 -0800592 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
593 }
Roshan Pius3c868522016-10-27 12:43:49 -0700594}
595
596std::pair<WifiStatus, std::vector<hidl_string>>
597WifiChip::getNanIfaceNamesInternal() {
598 if (!nan_iface_.get()) {
599 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
600 }
601 return {createWifiStatus(WifiStatusCode::SUCCESS),
602 {legacy_hal_.lock()->getNanIfaceName()}};
603}
604
605std::pair<WifiStatus, sp<IWifiNanIface>> WifiChip::getNanIfaceInternal(
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800606 const std::string& ifname) {
607 if (!nan_iface_.get() || (ifname != legacy_hal_.lock()->getNanIfaceName())) {
Roshan Pius3c868522016-10-27 12:43:49 -0700608 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
609 }
610 return {createWifiStatus(WifiStatusCode::SUCCESS), nan_iface_};
611}
612
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800613WifiStatus WifiChip::removeNanIfaceInternal(const std::string& ifname) {
614 if (!nan_iface_.get() || (ifname != legacy_hal_.lock()->getNanIfaceName())) {
615 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
616 }
617 invalidateAndClear(nan_iface_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800618 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800619 if (!callback->onIfaceRemoved(IfaceType::NAN, ifname).isOk()) {
620 LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
621 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800622 }
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800623 return createWifiStatus(WifiStatusCode::SUCCESS);
624}
625
Roshan Pius3c868522016-10-27 12:43:49 -0700626std::pair<WifiStatus, sp<IWifiP2pIface>> WifiChip::createP2pIfaceInternal() {
Roshan Pius073d5b92016-12-08 19:10:06 -0800627 // Only 1 of NAN or P2P iface can be active at a time.
628 if (current_mode_id_ != kStaChipModeId || p2p_iface_.get() ||
629 nan_iface_.get()) {
630 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
631 }
Roshan Pius3c868522016-10-27 12:43:49 -0700632 std::string ifname = legacy_hal_.lock()->getP2pIfaceName();
633 p2p_iface_ = new WifiP2pIface(ifname, legacy_hal_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800634 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800635 if (!callback->onIfaceAdded(IfaceType::P2P, ifname).isOk()) {
636 LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
637 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800638 }
Roshan Pius3c868522016-10-27 12:43:49 -0700639 return {createWifiStatus(WifiStatusCode::SUCCESS), p2p_iface_};
640}
641
642std::pair<WifiStatus, std::vector<hidl_string>>
643WifiChip::getP2pIfaceNamesInternal() {
644 if (!p2p_iface_.get()) {
645 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
646 }
647 return {createWifiStatus(WifiStatusCode::SUCCESS),
648 {legacy_hal_.lock()->getP2pIfaceName()}};
649}
650
651std::pair<WifiStatus, sp<IWifiP2pIface>> WifiChip::getP2pIfaceInternal(
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800652 const std::string& ifname) {
653 if (!p2p_iface_.get() || (ifname != legacy_hal_.lock()->getP2pIfaceName())) {
Roshan Pius3c868522016-10-27 12:43:49 -0700654 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
655 }
656 return {createWifiStatus(WifiStatusCode::SUCCESS), p2p_iface_};
657}
658
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800659WifiStatus WifiChip::removeP2pIfaceInternal(const std::string& ifname) {
660 if (!p2p_iface_.get() || (ifname != legacy_hal_.lock()->getP2pIfaceName())) {
661 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
662 }
663 invalidateAndClear(p2p_iface_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800664 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800665 if (!callback->onIfaceRemoved(IfaceType::P2P, ifname).isOk()) {
666 LOG(ERROR) << "Failed to invoke onIfaceRemoved callback";
667 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800668 }
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800669 return createWifiStatus(WifiStatusCode::SUCCESS);
670}
671
Roshan Pius3c868522016-10-27 12:43:49 -0700672std::pair<WifiStatus, sp<IWifiStaIface>> WifiChip::createStaIfaceInternal() {
Roshan Pius073d5b92016-12-08 19:10:06 -0800673 if (current_mode_id_ != kStaChipModeId || sta_iface_.get()) {
674 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
675 }
Roshan Pius3c868522016-10-27 12:43:49 -0700676 std::string ifname = legacy_hal_.lock()->getStaIfaceName();
677 sta_iface_ = new WifiStaIface(ifname, legacy_hal_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800678 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800679 if (!callback->onIfaceAdded(IfaceType::STA, ifname).isOk()) {
680 LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
681 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800682 }
Roshan Pius3c868522016-10-27 12:43:49 -0700683 return {createWifiStatus(WifiStatusCode::SUCCESS), sta_iface_};
684}
685
686std::pair<WifiStatus, std::vector<hidl_string>>
687WifiChip::getStaIfaceNamesInternal() {
688 if (!sta_iface_.get()) {
689 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
690 }
691 return {createWifiStatus(WifiStatusCode::SUCCESS),
692 {legacy_hal_.lock()->getStaIfaceName()}};
693}
694
695std::pair<WifiStatus, sp<IWifiStaIface>> WifiChip::getStaIfaceInternal(
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800696 const std::string& ifname) {
697 if (!sta_iface_.get() || (ifname != legacy_hal_.lock()->getStaIfaceName())) {
Roshan Pius3c868522016-10-27 12:43:49 -0700698 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
699 }
700 return {createWifiStatus(WifiStatusCode::SUCCESS), sta_iface_};
701}
702
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800703WifiStatus WifiChip::removeStaIfaceInternal(const std::string& ifname) {
704 if (!sta_iface_.get() || (ifname != legacy_hal_.lock()->getStaIfaceName())) {
705 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
706 }
707 invalidateAndClear(sta_iface_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800708 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800709 if (!callback->onIfaceRemoved(IfaceType::STA, ifname).isOk()) {
710 LOG(ERROR) << "Failed to invoke onIfaceRemoved callback";
711 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800712 }
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800713 return createWifiStatus(WifiStatusCode::SUCCESS);
714}
715
Roshan Pius3c868522016-10-27 12:43:49 -0700716std::pair<WifiStatus, sp<IWifiRttController>>
717WifiChip::createRttControllerInternal(const sp<IWifiIface>& bound_iface) {
718 sp<WifiRttController> rtt = new WifiRttController(bound_iface, legacy_hal_);
719 rtt_controllers_.emplace_back(rtt);
720 return {createWifiStatus(WifiStatusCode::SUCCESS), rtt};
721}
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700722
723std::pair<WifiStatus, std::vector<WifiDebugRingBufferStatus>>
724WifiChip::getDebugRingBuffersStatusInternal() {
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800725 legacy_hal::wifi_error legacy_status;
726 std::vector<legacy_hal::wifi_ring_buffer_status>
727 legacy_ring_buffer_status_vec;
728 std::tie(legacy_status, legacy_ring_buffer_status_vec) =
729 legacy_hal_.lock()->getRingBuffersStatus();
730 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
731 return {createWifiStatusFromLegacyError(legacy_status), {}};
732 }
733 std::vector<WifiDebugRingBufferStatus> hidl_ring_buffer_status_vec;
734 if (!hidl_struct_util::convertLegacyVectorOfDebugRingBufferStatusToHidl(
735 legacy_ring_buffer_status_vec, &hidl_ring_buffer_status_vec)) {
736 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
737 }
738 return {createWifiStatus(WifiStatusCode::SUCCESS),
739 hidl_ring_buffer_status_vec};
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700740}
741
742WifiStatus WifiChip::startLoggingToDebugRingBufferInternal(
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800743 const hidl_string& ring_name,
744 WifiDebugRingBufferVerboseLevel verbose_level,
745 uint32_t max_interval_in_sec,
746 uint32_t min_data_size_in_bytes) {
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()->startRingBufferLogging(
753 ring_name,
754 static_cast<
755 std::underlying_type<WifiDebugRingBufferVerboseLevel>::type>(
756 verbose_level),
757 max_interval_in_sec,
758 min_data_size_in_bytes);
759 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700760}
761
762WifiStatus WifiChip::forceDumpToDebugRingBufferInternal(
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800763 const hidl_string& ring_name) {
Roshan Pius48185b22016-12-15 19:10:30 -0800764 WifiStatus status = registerDebugRingBufferCallback();
765 if (status.code != WifiStatusCode::SUCCESS) {
766 return status;
767 }
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800768 legacy_hal::wifi_error legacy_status =
769 legacy_hal_.lock()->getRingBufferData(ring_name);
770 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700771}
772
Roshan Pius8c0c8e92017-02-24 08:07:42 -0800773WifiStatus WifiChip::stopLoggingToDebugRingBufferInternal() {
774 legacy_hal::wifi_error legacy_status =
775 legacy_hal_.lock()->deregisterRingBufferCallbackHandler();
776 return createWifiStatusFromLegacyError(legacy_status);
777}
778
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700779std::pair<WifiStatus, WifiDebugHostWakeReasonStats>
780WifiChip::getDebugHostWakeReasonStatsInternal() {
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800781 legacy_hal::wifi_error legacy_status;
782 legacy_hal::WakeReasonStats legacy_stats;
783 std::tie(legacy_status, legacy_stats) =
784 legacy_hal_.lock()->getWakeReasonStats();
785 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
786 return {createWifiStatusFromLegacyError(legacy_status), {}};
787 }
788 WifiDebugHostWakeReasonStats hidl_stats;
789 if (!hidl_struct_util::convertLegacyWakeReasonStatsToHidl(legacy_stats,
790 &hidl_stats)) {
791 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
792 }
793 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_stats};
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700794}
795
Roshan Pius203cb032016-12-14 17:41:20 -0800796WifiStatus WifiChip::enableDebugErrorAlertsInternal(bool enable) {
797 legacy_hal::wifi_error legacy_status;
798 if (enable) {
799 android::wp<WifiChip> weak_ptr_this(this);
800 const auto& on_alert_callback = [weak_ptr_this](
801 int32_t error_code, std::vector<uint8_t> debug_data) {
802 const auto shared_ptr_this = weak_ptr_this.promote();
803 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
804 LOG(ERROR) << "Callback invoked on an invalid object";
805 return;
806 }
807 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800808 if (!callback->onDebugErrorAlert(error_code, debug_data).isOk()) {
809 LOG(ERROR) << "Failed to invoke onDebugErrorAlert callback";
810 }
Roshan Pius203cb032016-12-14 17:41:20 -0800811 }
812 };
813 legacy_status = legacy_hal_.lock()->registerErrorAlertCallbackHandler(
814 on_alert_callback);
815 } else {
816 legacy_status = legacy_hal_.lock()->deregisterErrorAlertCallbackHandler();
817 }
818 return createWifiStatusFromLegacyError(legacy_status);
819}
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800820
Roshan Piusdbd83ef2017-06-20 12:05:40 -0700821WifiStatus WifiChip::setTxPowerLimitInternal(int32_t /* powerInDbm */) {
822 // TODO(b/62437848): Implement this method once we are ready with the
823 // header changes in legacy HAL.
824 return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
825}
826
827WifiStatus WifiChip::resetTxPowerLimitInternal() {
828 // TODO(b/62437848): Implement this method once we are ready with the
829 // header changes in legacy HAL.
830 return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
831}
832
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800833WifiStatus WifiChip::handleChipConfiguration(ChipModeId mode_id) {
834 // If the chip is already configured in a different mode, stop
835 // the legacy HAL and then start it after firmware mode change.
Ningyuan Wangb1ad3a72017-04-18 14:20:41 -0700836 // Currently the underlying implementation has a deadlock issue.
837 // We should return ERROR_NOT_SUPPORTED if chip is already configured in
838 // a different mode.
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800839 if (current_mode_id_ != kInvalidModeId) {
Ningyuan Wangb1ad3a72017-04-18 14:20:41 -0700840 // TODO(b/37446050): Fix the deadlock.
841 return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800842 }
843 bool success;
844 if (mode_id == kStaChipModeId) {
845 success = mode_controller_.lock()->changeFirmwareMode(IfaceType::STA);
846 } else {
847 success = mode_controller_.lock()->changeFirmwareMode(IfaceType::AP);
848 }
849 if (!success) {
850 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
851 }
852 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->start();
853 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
854 LOG(ERROR) << "Failed to start legacy HAL: "
855 << legacyErrorToString(legacy_status);
856 return createWifiStatusFromLegacyError(legacy_status);
857 }
858 return createWifiStatus(WifiStatusCode::SUCCESS);
859}
Roshan Pius48185b22016-12-15 19:10:30 -0800860
861WifiStatus WifiChip::registerDebugRingBufferCallback() {
862 if (debug_ring_buffer_cb_registered_) {
863 return createWifiStatus(WifiStatusCode::SUCCESS);
864 }
865
866 android::wp<WifiChip> weak_ptr_this(this);
867 const auto& on_ring_buffer_data_callback = [weak_ptr_this](
868 const std::string& /* name */,
869 const std::vector<uint8_t>& data,
870 const legacy_hal::wifi_ring_buffer_status& status) {
871 const auto shared_ptr_this = weak_ptr_this.promote();
872 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
873 LOG(ERROR) << "Callback invoked on an invalid object";
874 return;
875 }
876 WifiDebugRingBufferStatus hidl_status;
877 if (!hidl_struct_util::convertLegacyDebugRingBufferStatusToHidl(
878 status, &hidl_status)) {
879 LOG(ERROR) << "Error converting ring buffer status";
880 return;
881 }
882 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800883 if (!callback->onDebugRingBufferDataAvailable(hidl_status, data).isOk()) {
884 LOG(ERROR) << "Failed to invoke onDebugRingBufferDataAvailable"
Roshan Pius3797e182017-03-30 18:01:54 -0700885 << " callback on: " << toString(callback);
886
Roshan Piusbc662202017-01-30 17:07:42 -0800887 }
Roshan Pius48185b22016-12-15 19:10:30 -0800888 }
889 };
890 legacy_hal::wifi_error legacy_status =
891 legacy_hal_.lock()->registerRingBufferCallbackHandler(
892 on_ring_buffer_data_callback);
893
894 if (legacy_status == legacy_hal::WIFI_SUCCESS) {
895 debug_ring_buffer_cb_registered_ = true;
896 }
897 return createWifiStatusFromLegacyError(legacy_status);
898}
899
Roshan Pius79a99752016-10-04 13:03:58 -0700900} // namespace implementation
Roshan Piusdbd83ef2017-06-20 12:05:40 -0700901} // namespace V1_1
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700902} // namespace wifi
903} // namespace hardware
904} // namespace android