blob: 6f980c04c8c76cf0ffd6da18c4cde0fb406d219e [file] [log] [blame]
Roshan Pius3c4e8a32016-10-03 14:53:58 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Roshan Pius3c4e8a32016-10-03 14:53:58 -070017#include <android-base/logging.h>
18
Roshan Pius3c868522016-10-27 12:43:49 -070019#include "hidl_return_util.h"
Roshan Piuse2d0ab52016-12-05 15:24:20 -080020#include "hidl_struct_util.h"
Roshan Pius3c868522016-10-27 12:43:49 -070021#include "wifi_chip.h"
Roshan Pius5c055462016-10-11 08:27:27 -070022#include "wifi_status_util.h"
Roshan Pius3c4e8a32016-10-03 14:53:58 -070023
Roshan Pius35d958c2016-10-06 16:47:38 -070024namespace {
25using android::sp;
26using android::hardware::hidl_vec;
27using android::hardware::hidl_string;
Roshan Pius2c06a3f2016-12-15 17:51:40 -080028using android::hardware::wifi::V1_0::ChipModeId;
Roshan Pius52947fb2016-11-18 11:38:07 -080029using android::hardware::wifi::V1_0::IWifiChip;
30using android::hardware::wifi::V1_0::IfaceType;
31
Roshan Pius2c06a3f2016-12-15 17:51:40 -080032constexpr ChipModeId kStaChipModeId = 0;
33constexpr ChipModeId kApChipModeId = 1;
34constexpr ChipModeId kInvalidModeId = UINT32_MAX;
Roshan Pius35d958c2016-10-06 16:47:38 -070035
Roshan Pius35d958c2016-10-06 16:47:38 -070036template <typename Iface>
37void invalidateAndClear(sp<Iface>& iface) {
38 if (iface.get()) {
39 iface->invalidate();
40 iface.clear();
41 }
42}
43} // namepsace
44
Roshan Pius3c4e8a32016-10-03 14:53:58 -070045namespace android {
46namespace hardware {
47namespace wifi {
Roshan Pius79a99752016-10-04 13:03:58 -070048namespace V1_0 {
49namespace implementation {
Roshan Pius3c868522016-10-27 12:43:49 -070050using hidl_return_util::validateAndCall;
Roshan Pius3c4e8a32016-10-03 14:53:58 -070051
Roshan Pius52947fb2016-11-18 11:38:07 -080052WifiChip::WifiChip(
53 ChipId chip_id,
54 const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal,
55 const std::weak_ptr<mode_controller::WifiModeController> mode_controller)
56 : chip_id_(chip_id),
57 legacy_hal_(legacy_hal),
58 mode_controller_(mode_controller),
59 is_valid_(true),
Roshan Pius48185b22016-12-15 19:10:30 -080060 current_mode_id_(kInvalidModeId),
61 debug_ring_buffer_cb_registered_(false) {}
Roshan Pius3c4e8a32016-10-03 14:53:58 -070062
Roshan Piusaabe5752016-09-29 09:03:59 -070063void WifiChip::invalidate() {
Roshan Pius35d958c2016-10-06 16:47:38 -070064 invalidateAndRemoveAllIfaces();
Roshan Piusaabe5752016-09-29 09:03:59 -070065 legacy_hal_.reset();
Roshan Piusd37341f2017-01-31 13:13:28 -080066 event_cb_handler_.invalidate();
Roshan Pius35d958c2016-10-06 16:47:38 -070067 is_valid_ = false;
Roshan Pius3c4e8a32016-10-03 14:53:58 -070068}
69
Roshan Pius3c868522016-10-27 12:43:49 -070070bool WifiChip::isValid() {
71 return is_valid_;
72}
73
Roshan Piusd37341f2017-01-31 13:13:28 -080074std::set<sp<IWifiChipEventCallback>> WifiChip::getEventCallbacks() {
75 return event_cb_handler_.getCallbacks();
Roshan Pius203cb032016-12-14 17:41:20 -080076}
77
Roshan Pius5c055462016-10-11 08:27:27 -070078Return<void> WifiChip::getId(getId_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -070079 return validateAndCall(this,
80 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
81 &WifiChip::getIdInternal,
82 hidl_status_cb);
Roshan Piuscd566bd2016-10-10 08:03:42 -070083}
84
Roshan Pius3c4e8a32016-10-03 14:53:58 -070085Return<void> WifiChip::registerEventCallback(
Roshan Pius5c055462016-10-11 08:27:27 -070086 const sp<IWifiChipEventCallback>& event_callback,
87 registerEventCallback_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -070088 return validateAndCall(this,
89 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
90 &WifiChip::registerEventCallbackInternal,
91 hidl_status_cb,
92 event_callback);
Roshan Pius3c4e8a32016-10-03 14:53:58 -070093}
94
Roshan Pius7d08d7a2016-10-27 14:35:05 -070095Return<void> WifiChip::getCapabilities(getCapabilities_cb hidl_status_cb) {
96 return validateAndCall(this,
97 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
98 &WifiChip::getCapabilitiesInternal,
99 hidl_status_cb);
100}
101
Roshan Pius5c055462016-10-11 08:27:27 -0700102Return<void> WifiChip::getAvailableModes(getAvailableModes_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700103 return validateAndCall(this,
104 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
105 &WifiChip::getAvailableModesInternal,
106 hidl_status_cb);
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700107}
108
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800109Return<void> WifiChip::configureChip(ChipModeId mode_id,
Roshan Pius5c055462016-10-11 08:27:27 -0700110 configureChip_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700111 return validateAndCall(this,
112 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
113 &WifiChip::configureChipInternal,
114 hidl_status_cb,
115 mode_id);
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700116}
117
Roshan Pius5c055462016-10-11 08:27:27 -0700118Return<void> WifiChip::getMode(getMode_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700119 return validateAndCall(this,
120 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
121 &WifiChip::getModeInternal,
122 hidl_status_cb);
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700123}
124
Roshan Pius5c055462016-10-11 08:27:27 -0700125Return<void> WifiChip::requestChipDebugInfo(
126 requestChipDebugInfo_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700127 return validateAndCall(this,
128 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
129 &WifiChip::requestChipDebugInfoInternal,
130 hidl_status_cb);
Roshan Pius5c055462016-10-11 08:27:27 -0700131}
132
133Return<void> WifiChip::requestDriverDebugDump(
134 requestDriverDebugDump_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700135 return validateAndCall(this,
136 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
137 &WifiChip::requestDriverDebugDumpInternal,
138 hidl_status_cb);
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700139}
140
Roshan Pius5c055462016-10-11 08:27:27 -0700141Return<void> WifiChip::requestFirmwareDebugDump(
142 requestFirmwareDebugDump_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700143 return validateAndCall(this,
144 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
145 &WifiChip::requestFirmwareDebugDumpInternal,
146 hidl_status_cb);
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700147}
148
Roshan Pius5c055462016-10-11 08:27:27 -0700149Return<void> WifiChip::createApIface(createApIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700150 return validateAndCall(this,
151 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
152 &WifiChip::createApIfaceInternal,
153 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700154}
155
Roshan Pius5c055462016-10-11 08:27:27 -0700156Return<void> WifiChip::getApIfaceNames(getApIfaceNames_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700157 return validateAndCall(this,
158 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
159 &WifiChip::getApIfaceNamesInternal,
160 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700161}
162
Roshan Pius5c055462016-10-11 08:27:27 -0700163Return<void> WifiChip::getApIface(const hidl_string& ifname,
164 getApIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700165 return validateAndCall(this,
166 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
167 &WifiChip::getApIfaceInternal,
168 hidl_status_cb,
169 ifname);
Roshan Pius35d958c2016-10-06 16:47:38 -0700170}
171
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800172Return<void> WifiChip::removeApIface(const hidl_string& ifname,
173 removeApIface_cb hidl_status_cb) {
174 return validateAndCall(this,
175 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
176 &WifiChip::removeApIfaceInternal,
177 hidl_status_cb,
178 ifname);
179}
180
Roshan Pius5c055462016-10-11 08:27:27 -0700181Return<void> WifiChip::createNanIface(createNanIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700182 return validateAndCall(this,
183 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
184 &WifiChip::createNanIfaceInternal,
185 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700186}
187
Roshan Pius5c055462016-10-11 08:27:27 -0700188Return<void> WifiChip::getNanIfaceNames(getNanIfaceNames_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700189 return validateAndCall(this,
190 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
191 &WifiChip::getNanIfaceNamesInternal,
192 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700193}
194
195Return<void> WifiChip::getNanIface(const hidl_string& ifname,
Roshan Pius5c055462016-10-11 08:27:27 -0700196 getNanIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700197 return validateAndCall(this,
198 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
199 &WifiChip::getNanIfaceInternal,
200 hidl_status_cb,
201 ifname);
Roshan Pius35d958c2016-10-06 16:47:38 -0700202}
203
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800204Return<void> WifiChip::removeNanIface(const hidl_string& ifname,
205 removeNanIface_cb hidl_status_cb) {
206 return validateAndCall(this,
207 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
208 &WifiChip::removeNanIfaceInternal,
209 hidl_status_cb,
210 ifname);
211}
212
Roshan Pius5c055462016-10-11 08:27:27 -0700213Return<void> WifiChip::createP2pIface(createP2pIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700214 return validateAndCall(this,
215 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
216 &WifiChip::createP2pIfaceInternal,
217 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700218}
219
Roshan Pius5c055462016-10-11 08:27:27 -0700220Return<void> WifiChip::getP2pIfaceNames(getP2pIfaceNames_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700221 return validateAndCall(this,
222 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
223 &WifiChip::getP2pIfaceNamesInternal,
224 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700225}
226
227Return<void> WifiChip::getP2pIface(const hidl_string& ifname,
Roshan Pius5c055462016-10-11 08:27:27 -0700228 getP2pIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700229 return validateAndCall(this,
230 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
231 &WifiChip::getP2pIfaceInternal,
232 hidl_status_cb,
233 ifname);
Roshan Pius35d958c2016-10-06 16:47:38 -0700234}
235
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800236Return<void> WifiChip::removeP2pIface(const hidl_string& ifname,
237 removeP2pIface_cb hidl_status_cb) {
238 return validateAndCall(this,
239 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
240 &WifiChip::removeP2pIfaceInternal,
241 hidl_status_cb,
242 ifname);
243}
244
Roshan Pius5c055462016-10-11 08:27:27 -0700245Return<void> WifiChip::createStaIface(createStaIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700246 return validateAndCall(this,
247 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
248 &WifiChip::createStaIfaceInternal,
249 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700250}
251
Roshan Pius5c055462016-10-11 08:27:27 -0700252Return<void> WifiChip::getStaIfaceNames(getStaIfaceNames_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700253 return validateAndCall(this,
254 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
255 &WifiChip::getStaIfaceNamesInternal,
256 hidl_status_cb);
Roshan Pius35d958c2016-10-06 16:47:38 -0700257}
258
259Return<void> WifiChip::getStaIface(const hidl_string& ifname,
Roshan Pius5c055462016-10-11 08:27:27 -0700260 getStaIface_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700261 return validateAndCall(this,
262 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
263 &WifiChip::getStaIfaceInternal,
264 hidl_status_cb,
265 ifname);
Roshan Pius35d958c2016-10-06 16:47:38 -0700266}
267
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800268Return<void> WifiChip::removeStaIface(const hidl_string& ifname,
269 removeStaIface_cb hidl_status_cb) {
270 return validateAndCall(this,
271 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
272 &WifiChip::removeStaIfaceInternal,
273 hidl_status_cb,
274 ifname);
275}
276
Roshan Pius5c055462016-10-11 08:27:27 -0700277Return<void> WifiChip::createRttController(
278 const sp<IWifiIface>& bound_iface, createRttController_cb hidl_status_cb) {
Roshan Pius3c868522016-10-27 12:43:49 -0700279 return validateAndCall(this,
280 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
281 &WifiChip::createRttControllerInternal,
282 hidl_status_cb,
283 bound_iface);
Roshan Pius59268282016-10-06 20:23:47 -0700284}
285
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700286Return<void> WifiChip::getDebugRingBuffersStatus(
287 getDebugRingBuffersStatus_cb hidl_status_cb) {
288 return validateAndCall(this,
289 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
290 &WifiChip::getDebugRingBuffersStatusInternal,
291 hidl_status_cb);
292}
293
294Return<void> WifiChip::startLoggingToDebugRingBuffer(
295 const hidl_string& ring_name,
296 WifiDebugRingBufferVerboseLevel verbose_level,
297 uint32_t max_interval_in_sec,
298 uint32_t min_data_size_in_bytes,
299 startLoggingToDebugRingBuffer_cb hidl_status_cb) {
300 return validateAndCall(this,
301 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
302 &WifiChip::startLoggingToDebugRingBufferInternal,
303 hidl_status_cb,
304 ring_name,
305 verbose_level,
306 max_interval_in_sec,
307 min_data_size_in_bytes);
308}
309
310Return<void> WifiChip::forceDumpToDebugRingBuffer(
311 const hidl_string& ring_name,
312 forceDumpToDebugRingBuffer_cb hidl_status_cb) {
313 return validateAndCall(this,
314 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
315 &WifiChip::forceDumpToDebugRingBufferInternal,
316 hidl_status_cb,
317 ring_name);
318}
319
Roshan Pius8c0c8e92017-02-24 08:07:42 -0800320Return<void> WifiChip::stopLoggingToDebugRingBuffer(
321 stopLoggingToDebugRingBuffer_cb hidl_status_cb) {
322 return validateAndCall(this,
323 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
324 &WifiChip::stopLoggingToDebugRingBufferInternal,
325 hidl_status_cb);
326}
327
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700328Return<void> WifiChip::getDebugHostWakeReasonStats(
329 getDebugHostWakeReasonStats_cb hidl_status_cb) {
330 return validateAndCall(this,
331 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
332 &WifiChip::getDebugHostWakeReasonStatsInternal,
333 hidl_status_cb);
334}
335
Roshan Pius203cb032016-12-14 17:41:20 -0800336Return<void> WifiChip::enableDebugErrorAlerts(
337 bool enable, enableDebugErrorAlerts_cb hidl_status_cb) {
338 return validateAndCall(this,
339 WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
340 &WifiChip::enableDebugErrorAlertsInternal,
341 hidl_status_cb,
342 enable);
343}
344
Roshan Pius35d958c2016-10-06 16:47:38 -0700345void WifiChip::invalidateAndRemoveAllIfaces() {
346 invalidateAndClear(ap_iface_);
347 invalidateAndClear(nan_iface_);
348 invalidateAndClear(p2p_iface_);
349 invalidateAndClear(sta_iface_);
Roshan Pius59268282016-10-06 20:23:47 -0700350 // Since all the ifaces are invalid now, all RTT controller objects
351 // using those ifaces also need to be invalidated.
352 for (const auto& rtt : rtt_controllers_) {
353 rtt->invalidate();
354 }
355 rtt_controllers_.clear();
Roshan Pius35d958c2016-10-06 16:47:38 -0700356}
357
Roshan Pius3c868522016-10-27 12:43:49 -0700358std::pair<WifiStatus, ChipId> WifiChip::getIdInternal() {
359 return {createWifiStatus(WifiStatusCode::SUCCESS), chip_id_};
360}
361
362WifiStatus WifiChip::registerEventCallbackInternal(
363 const sp<IWifiChipEventCallback>& event_callback) {
Roshan Piusd37341f2017-01-31 13:13:28 -0800364 if (!event_cb_handler_.addCallback(event_callback)) {
365 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
366 }
Roshan Pius3c868522016-10-27 12:43:49 -0700367 return createWifiStatus(WifiStatusCode::SUCCESS);
368}
369
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700370std::pair<WifiStatus, uint32_t> WifiChip::getCapabilitiesInternal() {
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800371 legacy_hal::wifi_error legacy_status;
372 uint32_t legacy_logger_feature_set;
373 std::tie(legacy_status, legacy_logger_feature_set) =
374 legacy_hal_.lock()->getLoggerSupportedFeatureSet();
375 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
376 return {createWifiStatusFromLegacyError(legacy_status), 0};
377 }
378 uint32_t hidl_caps;
379 if (!hidl_struct_util::convertLegacyFeaturesToHidlChipCapabilities(
380 legacy_logger_feature_set, &hidl_caps)) {
381 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), 0};
382 }
383 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700384}
385
Roshan Pius3c868522016-10-27 12:43:49 -0700386std::pair<WifiStatus, std::vector<IWifiChip::ChipMode>>
387WifiChip::getAvailableModesInternal() {
Roshan Pius52947fb2016-11-18 11:38:07 -0800388 // The chip combination supported for current devices is fixed for now with
389 // 2 separate modes of operation:
390 // Mode 1 (STA mode): Will support 1 STA and 1 P2P or NAN iface operations
391 // concurrently.
392 // Mode 2 (AP mode): Will support 1 AP iface operations.
393 // TODO (b/32997844): Read this from some device specific flags in the
394 // makefile.
395 // STA mode iface combinations.
396 const IWifiChip::ChipIfaceCombinationLimit
397 sta_chip_iface_combination_limit_1 = {{IfaceType::STA}, 1};
398 const IWifiChip::ChipIfaceCombinationLimit
399 sta_chip_iface_combination_limit_2 = {{IfaceType::P2P, IfaceType::NAN},
400 1};
401 const IWifiChip::ChipIfaceCombination sta_chip_iface_combination = {
402 {sta_chip_iface_combination_limit_1, sta_chip_iface_combination_limit_2}};
403 const IWifiChip::ChipMode sta_chip_mode = {kStaChipModeId,
404 {sta_chip_iface_combination}};
405 // AP mode iface combinations.
406 const IWifiChip::ChipIfaceCombinationLimit ap_chip_iface_combination_limit = {
407 {IfaceType::AP}, 1};
408 const IWifiChip::ChipIfaceCombination ap_chip_iface_combination = {
409 {ap_chip_iface_combination_limit}};
410 const IWifiChip::ChipMode ap_chip_mode = {kApChipModeId,
411 {ap_chip_iface_combination}};
412 return {createWifiStatus(WifiStatusCode::SUCCESS),
413 {sta_chip_mode, ap_chip_mode}};
Roshan Pius3c868522016-10-27 12:43:49 -0700414}
415
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800416WifiStatus WifiChip::configureChipInternal(ChipModeId mode_id) {
Roshan Pius52947fb2016-11-18 11:38:07 -0800417 if (mode_id != kStaChipModeId && mode_id != kApChipModeId) {
418 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
419 }
420 if (mode_id == current_mode_id_) {
421 LOG(DEBUG) << "Already in the specified mode " << mode_id;
422 return createWifiStatus(WifiStatusCode::SUCCESS);
423 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800424 WifiStatus status = handleChipConfiguration(mode_id);
425 if (status.code != WifiStatusCode::SUCCESS) {
Roshan Piusd37341f2017-01-31 13:13:28 -0800426 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800427 if (!callback->onChipReconfigureFailure(status).isOk()) {
428 LOG(ERROR) << "Failed to invoke onChipReconfigureFailure callback";
429 }
Roshan Pius52947fb2016-11-18 11:38:07 -0800430 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800431 return status;
Roshan Pius52947fb2016-11-18 11:38:07 -0800432 }
Roshan Piusd37341f2017-01-31 13:13:28 -0800433 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800434 if (!callback->onChipReconfigured(mode_id).isOk()) {
435 LOG(ERROR) << "Failed to invoke onChipReconfigured callback";
436 }
Roshan Pius52947fb2016-11-18 11:38:07 -0800437 }
438 current_mode_id_ = mode_id;
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800439 return status;
Roshan Pius3c868522016-10-27 12:43:49 -0700440}
441
442std::pair<WifiStatus, uint32_t> WifiChip::getModeInternal() {
Roshan Pius52947fb2016-11-18 11:38:07 -0800443 if (current_mode_id_ == kInvalidModeId) {
444 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE),
445 current_mode_id_};
446 }
447 return {createWifiStatus(WifiStatusCode::SUCCESS), current_mode_id_};
Roshan Pius3c868522016-10-27 12:43:49 -0700448}
449
450std::pair<WifiStatus, IWifiChip::ChipDebugInfo>
451WifiChip::requestChipDebugInfoInternal() {
452 IWifiChip::ChipDebugInfo result;
Roshan Piusa4854ff2016-12-01 13:47:41 -0800453 legacy_hal::wifi_error legacy_status;
Roshan Pius3c868522016-10-27 12:43:49 -0700454 std::string driver_desc;
455 std::tie(legacy_status, driver_desc) = legacy_hal_.lock()->getDriverVersion();
Roshan Piusa4854ff2016-12-01 13:47:41 -0800456 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
Roshan Pius3c868522016-10-27 12:43:49 -0700457 LOG(ERROR) << "Failed to get driver version: "
458 << legacyErrorToString(legacy_status);
459 WifiStatus status = createWifiStatusFromLegacyError(
460 legacy_status, "failed to get driver version");
461 return {status, result};
462 }
463 result.driverDescription = driver_desc.c_str();
464
465 std::string firmware_desc;
466 std::tie(legacy_status, firmware_desc) =
467 legacy_hal_.lock()->getFirmwareVersion();
Roshan Piusa4854ff2016-12-01 13:47:41 -0800468 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
Roshan Pius3c868522016-10-27 12:43:49 -0700469 LOG(ERROR) << "Failed to get firmware version: "
470 << legacyErrorToString(legacy_status);
471 WifiStatus status = createWifiStatusFromLegacyError(
472 legacy_status, "failed to get firmware version");
473 return {status, result};
474 }
475 result.firmwareDescription = firmware_desc.c_str();
476
477 return {createWifiStatus(WifiStatusCode::SUCCESS), result};
478}
479
480std::pair<WifiStatus, std::vector<uint8_t>>
481WifiChip::requestDriverDebugDumpInternal() {
Roshan Piusa4854ff2016-12-01 13:47:41 -0800482 legacy_hal::wifi_error legacy_status;
Roshan Pius3c868522016-10-27 12:43:49 -0700483 std::vector<uint8_t> driver_dump;
484 std::tie(legacy_status, driver_dump) =
485 legacy_hal_.lock()->requestDriverMemoryDump();
Roshan Piusa4854ff2016-12-01 13:47:41 -0800486 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
Roshan Pius3c868522016-10-27 12:43:49 -0700487 LOG(ERROR) << "Failed to get driver debug dump: "
488 << legacyErrorToString(legacy_status);
489 return {createWifiStatusFromLegacyError(legacy_status),
490 std::vector<uint8_t>()};
491 }
492 return {createWifiStatus(WifiStatusCode::SUCCESS), driver_dump};
493}
494
495std::pair<WifiStatus, std::vector<uint8_t>>
496WifiChip::requestFirmwareDebugDumpInternal() {
Roshan Piusa4854ff2016-12-01 13:47:41 -0800497 legacy_hal::wifi_error legacy_status;
Roshan Pius3c868522016-10-27 12:43:49 -0700498 std::vector<uint8_t> firmware_dump;
499 std::tie(legacy_status, firmware_dump) =
500 legacy_hal_.lock()->requestFirmwareMemoryDump();
Roshan Piusa4854ff2016-12-01 13:47:41 -0800501 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
Roshan Pius3c868522016-10-27 12:43:49 -0700502 LOG(ERROR) << "Failed to get firmware debug dump: "
503 << legacyErrorToString(legacy_status);
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700504 return {createWifiStatusFromLegacyError(legacy_status), {}};
Roshan Pius3c868522016-10-27 12:43:49 -0700505 }
506 return {createWifiStatus(WifiStatusCode::SUCCESS), firmware_dump};
507}
508
509std::pair<WifiStatus, sp<IWifiApIface>> WifiChip::createApIfaceInternal() {
Roshan Pius073d5b92016-12-08 19:10:06 -0800510 if (current_mode_id_ != kApChipModeId || ap_iface_.get()) {
511 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
512 }
Roshan Pius3c868522016-10-27 12:43:49 -0700513 std::string ifname = legacy_hal_.lock()->getApIfaceName();
514 ap_iface_ = new WifiApIface(ifname, legacy_hal_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800515 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800516 if (!callback->onIfaceAdded(IfaceType::AP, ifname).isOk()) {
517 LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
518 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800519 }
Roshan Pius3c868522016-10-27 12:43:49 -0700520 return {createWifiStatus(WifiStatusCode::SUCCESS), ap_iface_};
521}
522
523std::pair<WifiStatus, std::vector<hidl_string>>
524WifiChip::getApIfaceNamesInternal() {
525 if (!ap_iface_.get()) {
526 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
527 }
528 return {createWifiStatus(WifiStatusCode::SUCCESS),
529 {legacy_hal_.lock()->getApIfaceName()}};
530}
531
532std::pair<WifiStatus, sp<IWifiApIface>> WifiChip::getApIfaceInternal(
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800533 const std::string& ifname) {
534 if (!ap_iface_.get() || (ifname != legacy_hal_.lock()->getApIfaceName())) {
Roshan Pius3c868522016-10-27 12:43:49 -0700535 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
536 }
537 return {createWifiStatus(WifiStatusCode::SUCCESS), ap_iface_};
538}
539
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800540WifiStatus WifiChip::removeApIfaceInternal(const std::string& ifname) {
541 if (!ap_iface_.get() || (ifname != legacy_hal_.lock()->getApIfaceName())) {
542 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
543 }
544 invalidateAndClear(ap_iface_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800545 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800546 if (!callback->onIfaceRemoved(IfaceType::AP, ifname).isOk()) {
547 LOG(ERROR) << "Failed to invoke onIfaceRemoved callback";
548 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800549 }
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800550 return createWifiStatus(WifiStatusCode::SUCCESS);
551}
552
Roshan Pius3c868522016-10-27 12:43:49 -0700553std::pair<WifiStatus, sp<IWifiNanIface>> WifiChip::createNanIfaceInternal() {
Roshan Pius073d5b92016-12-08 19:10:06 -0800554 // Only 1 of NAN or P2P iface can be active at a time.
555 if (current_mode_id_ != kStaChipModeId || nan_iface_.get() ||
556 p2p_iface_.get()) {
557 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
558 }
Roshan Pius3c868522016-10-27 12:43:49 -0700559 std::string ifname = legacy_hal_.lock()->getNanIfaceName();
560 nan_iface_ = new WifiNanIface(ifname, legacy_hal_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800561 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800562 if (!callback->onIfaceAdded(IfaceType::NAN, ifname).isOk()) {
563 LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
564 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800565 }
Roshan Pius3c868522016-10-27 12:43:49 -0700566 return {createWifiStatus(WifiStatusCode::SUCCESS), nan_iface_};
567}
568
569std::pair<WifiStatus, std::vector<hidl_string>>
570WifiChip::getNanIfaceNamesInternal() {
571 if (!nan_iface_.get()) {
572 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
573 }
574 return {createWifiStatus(WifiStatusCode::SUCCESS),
575 {legacy_hal_.lock()->getNanIfaceName()}};
576}
577
578std::pair<WifiStatus, sp<IWifiNanIface>> WifiChip::getNanIfaceInternal(
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800579 const std::string& ifname) {
580 if (!nan_iface_.get() || (ifname != legacy_hal_.lock()->getNanIfaceName())) {
Roshan Pius3c868522016-10-27 12:43:49 -0700581 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
582 }
583 return {createWifiStatus(WifiStatusCode::SUCCESS), nan_iface_};
584}
585
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800586WifiStatus WifiChip::removeNanIfaceInternal(const std::string& ifname) {
587 if (!nan_iface_.get() || (ifname != legacy_hal_.lock()->getNanIfaceName())) {
588 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
589 }
590 invalidateAndClear(nan_iface_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800591 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800592 if (!callback->onIfaceRemoved(IfaceType::NAN, ifname).isOk()) {
593 LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
594 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800595 }
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800596 return createWifiStatus(WifiStatusCode::SUCCESS);
597}
598
Roshan Pius3c868522016-10-27 12:43:49 -0700599std::pair<WifiStatus, sp<IWifiP2pIface>> WifiChip::createP2pIfaceInternal() {
Roshan Pius073d5b92016-12-08 19:10:06 -0800600 // Only 1 of NAN or P2P iface can be active at a time.
601 if (current_mode_id_ != kStaChipModeId || p2p_iface_.get() ||
602 nan_iface_.get()) {
603 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
604 }
Roshan Pius3c868522016-10-27 12:43:49 -0700605 std::string ifname = legacy_hal_.lock()->getP2pIfaceName();
606 p2p_iface_ = new WifiP2pIface(ifname, legacy_hal_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800607 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800608 if (!callback->onIfaceAdded(IfaceType::P2P, ifname).isOk()) {
609 LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
610 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800611 }
Roshan Pius3c868522016-10-27 12:43:49 -0700612 return {createWifiStatus(WifiStatusCode::SUCCESS), p2p_iface_};
613}
614
615std::pair<WifiStatus, std::vector<hidl_string>>
616WifiChip::getP2pIfaceNamesInternal() {
617 if (!p2p_iface_.get()) {
618 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
619 }
620 return {createWifiStatus(WifiStatusCode::SUCCESS),
621 {legacy_hal_.lock()->getP2pIfaceName()}};
622}
623
624std::pair<WifiStatus, sp<IWifiP2pIface>> WifiChip::getP2pIfaceInternal(
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800625 const std::string& ifname) {
626 if (!p2p_iface_.get() || (ifname != legacy_hal_.lock()->getP2pIfaceName())) {
Roshan Pius3c868522016-10-27 12:43:49 -0700627 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
628 }
629 return {createWifiStatus(WifiStatusCode::SUCCESS), p2p_iface_};
630}
631
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800632WifiStatus WifiChip::removeP2pIfaceInternal(const std::string& ifname) {
633 if (!p2p_iface_.get() || (ifname != legacy_hal_.lock()->getP2pIfaceName())) {
634 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
635 }
636 invalidateAndClear(p2p_iface_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800637 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800638 if (!callback->onIfaceRemoved(IfaceType::P2P, ifname).isOk()) {
639 LOG(ERROR) << "Failed to invoke onIfaceRemoved callback";
640 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800641 }
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800642 return createWifiStatus(WifiStatusCode::SUCCESS);
643}
644
Roshan Pius3c868522016-10-27 12:43:49 -0700645std::pair<WifiStatus, sp<IWifiStaIface>> WifiChip::createStaIfaceInternal() {
Roshan Pius073d5b92016-12-08 19:10:06 -0800646 if (current_mode_id_ != kStaChipModeId || sta_iface_.get()) {
647 return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}};
648 }
Roshan Pius3c868522016-10-27 12:43:49 -0700649 std::string ifname = legacy_hal_.lock()->getStaIfaceName();
650 sta_iface_ = new WifiStaIface(ifname, legacy_hal_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800651 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800652 if (!callback->onIfaceAdded(IfaceType::STA, ifname).isOk()) {
653 LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
654 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800655 }
Roshan Pius3c868522016-10-27 12:43:49 -0700656 return {createWifiStatus(WifiStatusCode::SUCCESS), sta_iface_};
657}
658
659std::pair<WifiStatus, std::vector<hidl_string>>
660WifiChip::getStaIfaceNamesInternal() {
661 if (!sta_iface_.get()) {
662 return {createWifiStatus(WifiStatusCode::SUCCESS), {}};
663 }
664 return {createWifiStatus(WifiStatusCode::SUCCESS),
665 {legacy_hal_.lock()->getStaIfaceName()}};
666}
667
668std::pair<WifiStatus, sp<IWifiStaIface>> WifiChip::getStaIfaceInternal(
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800669 const std::string& ifname) {
670 if (!sta_iface_.get() || (ifname != legacy_hal_.lock()->getStaIfaceName())) {
Roshan Pius3c868522016-10-27 12:43:49 -0700671 return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr};
672 }
673 return {createWifiStatus(WifiStatusCode::SUCCESS), sta_iface_};
674}
675
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800676WifiStatus WifiChip::removeStaIfaceInternal(const std::string& ifname) {
677 if (!sta_iface_.get() || (ifname != legacy_hal_.lock()->getStaIfaceName())) {
678 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
679 }
680 invalidateAndClear(sta_iface_);
Roshan Piusd37341f2017-01-31 13:13:28 -0800681 for (const auto& callback : event_cb_handler_.getCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800682 if (!callback->onIfaceRemoved(IfaceType::STA, ifname).isOk()) {
683 LOG(ERROR) << "Failed to invoke onIfaceRemoved callback";
684 }
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800685 }
Roshan Pius8b55e6f2016-12-09 12:05:12 -0800686 return createWifiStatus(WifiStatusCode::SUCCESS);
687}
688
Roshan Pius3c868522016-10-27 12:43:49 -0700689std::pair<WifiStatus, sp<IWifiRttController>>
690WifiChip::createRttControllerInternal(const sp<IWifiIface>& bound_iface) {
691 sp<WifiRttController> rtt = new WifiRttController(bound_iface, legacy_hal_);
692 rtt_controllers_.emplace_back(rtt);
693 return {createWifiStatus(WifiStatusCode::SUCCESS), rtt};
694}
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700695
696std::pair<WifiStatus, std::vector<WifiDebugRingBufferStatus>>
697WifiChip::getDebugRingBuffersStatusInternal() {
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800698 legacy_hal::wifi_error legacy_status;
699 std::vector<legacy_hal::wifi_ring_buffer_status>
700 legacy_ring_buffer_status_vec;
701 std::tie(legacy_status, legacy_ring_buffer_status_vec) =
702 legacy_hal_.lock()->getRingBuffersStatus();
703 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
704 return {createWifiStatusFromLegacyError(legacy_status), {}};
705 }
706 std::vector<WifiDebugRingBufferStatus> hidl_ring_buffer_status_vec;
707 if (!hidl_struct_util::convertLegacyVectorOfDebugRingBufferStatusToHidl(
708 legacy_ring_buffer_status_vec, &hidl_ring_buffer_status_vec)) {
709 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
710 }
711 return {createWifiStatus(WifiStatusCode::SUCCESS),
712 hidl_ring_buffer_status_vec};
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700713}
714
715WifiStatus WifiChip::startLoggingToDebugRingBufferInternal(
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800716 const hidl_string& ring_name,
717 WifiDebugRingBufferVerboseLevel verbose_level,
718 uint32_t max_interval_in_sec,
719 uint32_t min_data_size_in_bytes) {
Roshan Pius48185b22016-12-15 19:10:30 -0800720 WifiStatus status = registerDebugRingBufferCallback();
721 if (status.code != WifiStatusCode::SUCCESS) {
722 return status;
723 }
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800724 legacy_hal::wifi_error legacy_status =
725 legacy_hal_.lock()->startRingBufferLogging(
726 ring_name,
727 static_cast<
728 std::underlying_type<WifiDebugRingBufferVerboseLevel>::type>(
729 verbose_level),
730 max_interval_in_sec,
731 min_data_size_in_bytes);
732 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700733}
734
735WifiStatus WifiChip::forceDumpToDebugRingBufferInternal(
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800736 const hidl_string& ring_name) {
Roshan Pius48185b22016-12-15 19:10:30 -0800737 WifiStatus status = registerDebugRingBufferCallback();
738 if (status.code != WifiStatusCode::SUCCESS) {
739 return status;
740 }
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800741 legacy_hal::wifi_error legacy_status =
742 legacy_hal_.lock()->getRingBufferData(ring_name);
743 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700744}
745
Roshan Pius8c0c8e92017-02-24 08:07:42 -0800746WifiStatus WifiChip::stopLoggingToDebugRingBufferInternal() {
747 legacy_hal::wifi_error legacy_status =
748 legacy_hal_.lock()->deregisterRingBufferCallbackHandler();
749 return createWifiStatusFromLegacyError(legacy_status);
750}
751
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700752std::pair<WifiStatus, WifiDebugHostWakeReasonStats>
753WifiChip::getDebugHostWakeReasonStatsInternal() {
Roshan Piuse2d0ab52016-12-05 15:24:20 -0800754 legacy_hal::wifi_error legacy_status;
755 legacy_hal::WakeReasonStats legacy_stats;
756 std::tie(legacy_status, legacy_stats) =
757 legacy_hal_.lock()->getWakeReasonStats();
758 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
759 return {createWifiStatusFromLegacyError(legacy_status), {}};
760 }
761 WifiDebugHostWakeReasonStats hidl_stats;
762 if (!hidl_struct_util::convertLegacyWakeReasonStatsToHidl(legacy_stats,
763 &hidl_stats)) {
764 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
765 }
766 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_stats};
Roshan Pius7d08d7a2016-10-27 14:35:05 -0700767}
768
Roshan Pius203cb032016-12-14 17:41:20 -0800769WifiStatus WifiChip::enableDebugErrorAlertsInternal(bool enable) {
770 legacy_hal::wifi_error legacy_status;
771 if (enable) {
772 android::wp<WifiChip> weak_ptr_this(this);
773 const auto& on_alert_callback = [weak_ptr_this](
774 int32_t error_code, std::vector<uint8_t> debug_data) {
775 const auto shared_ptr_this = weak_ptr_this.promote();
776 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
777 LOG(ERROR) << "Callback invoked on an invalid object";
778 return;
779 }
780 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800781 if (!callback->onDebugErrorAlert(error_code, debug_data).isOk()) {
782 LOG(ERROR) << "Failed to invoke onDebugErrorAlert callback";
783 }
Roshan Pius203cb032016-12-14 17:41:20 -0800784 }
785 };
786 legacy_status = legacy_hal_.lock()->registerErrorAlertCallbackHandler(
787 on_alert_callback);
788 } else {
789 legacy_status = legacy_hal_.lock()->deregisterErrorAlertCallbackHandler();
790 }
791 return createWifiStatusFromLegacyError(legacy_status);
792}
Roshan Pius2c06a3f2016-12-15 17:51:40 -0800793
794WifiStatus WifiChip::handleChipConfiguration(ChipModeId mode_id) {
795 // If the chip is already configured in a different mode, stop
796 // the legacy HAL and then start it after firmware mode change.
797 if (current_mode_id_ != kInvalidModeId) {
798 invalidateAndRemoveAllIfaces();
799 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->stop([]() {});
800 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
801 LOG(ERROR) << "Failed to stop legacy HAL: "
802 << legacyErrorToString(legacy_status);
803 return createWifiStatusFromLegacyError(legacy_status);
804 }
805 }
806 bool success;
807 if (mode_id == kStaChipModeId) {
808 success = mode_controller_.lock()->changeFirmwareMode(IfaceType::STA);
809 } else {
810 success = mode_controller_.lock()->changeFirmwareMode(IfaceType::AP);
811 }
812 if (!success) {
813 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
814 }
815 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->start();
816 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
817 LOG(ERROR) << "Failed to start legacy HAL: "
818 << legacyErrorToString(legacy_status);
819 return createWifiStatusFromLegacyError(legacy_status);
820 }
821 return createWifiStatus(WifiStatusCode::SUCCESS);
822}
Roshan Pius48185b22016-12-15 19:10:30 -0800823
824WifiStatus WifiChip::registerDebugRingBufferCallback() {
825 if (debug_ring_buffer_cb_registered_) {
826 return createWifiStatus(WifiStatusCode::SUCCESS);
827 }
828
829 android::wp<WifiChip> weak_ptr_this(this);
830 const auto& on_ring_buffer_data_callback = [weak_ptr_this](
831 const std::string& /* name */,
832 const std::vector<uint8_t>& data,
833 const legacy_hal::wifi_ring_buffer_status& status) {
834 const auto shared_ptr_this = weak_ptr_this.promote();
835 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
836 LOG(ERROR) << "Callback invoked on an invalid object";
837 return;
838 }
839 WifiDebugRingBufferStatus hidl_status;
840 if (!hidl_struct_util::convertLegacyDebugRingBufferStatusToHidl(
841 status, &hidl_status)) {
842 LOG(ERROR) << "Error converting ring buffer status";
843 return;
844 }
845 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800846 if (!callback->onDebugRingBufferDataAvailable(hidl_status, data).isOk()) {
847 LOG(ERROR) << "Failed to invoke onDebugRingBufferDataAvailable"
848 << " callback";
849 }
Roshan Pius48185b22016-12-15 19:10:30 -0800850 }
851 };
852 legacy_hal::wifi_error legacy_status =
853 legacy_hal_.lock()->registerRingBufferCallbackHandler(
854 on_ring_buffer_data_callback);
855
856 if (legacy_status == legacy_hal::WIFI_SUCCESS) {
857 debug_ring_buffer_cb_registered_ = true;
858 }
859 return createWifiStatusFromLegacyError(legacy_status);
860}
861
Roshan Pius79a99752016-10-04 13:03:58 -0700862} // namespace implementation
863} // namespace V1_0
Roshan Pius3c4e8a32016-10-03 14:53:58 -0700864} // namespace wifi
865} // namespace hardware
866} // namespace android