blob: c8605eedaa3b28936ec06e0bfd6f019b9891aba0 [file] [log] [blame]
Roshan Pius3e2d6712016-10-06 13:16:23 -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 Pius3e2d6712016-10-06 13:16:23 -070017#include <android-base/logging.h>
18
Roshan Pius907d4a22016-10-27 12:48:12 -070019#include "hidl_return_util.h"
Roshan Pius970f0312016-12-05 15:25:51 -080020#include "hidl_struct_util.h"
Roshan Pius907d4a22016-10-27 12:48:12 -070021#include "wifi_sta_iface.h"
Roshan Pius734fea02016-10-11 08:30:28 -070022#include "wifi_status_util.h"
Roshan Pius3e2d6712016-10-06 13:16:23 -070023
24namespace android {
25namespace hardware {
26namespace wifi {
Etan Cohen6ce50902017-09-14 07:30:57 -070027namespace V1_2 {
Roshan Pius3e2d6712016-10-06 13:16:23 -070028namespace implementation {
Roshan Pius907d4a22016-10-27 12:48:12 -070029using hidl_return_util::validateAndCall;
Roshan Pius3e2d6712016-10-06 13:16:23 -070030
Roshan Pius6cedc972016-10-28 10:11:17 -070031WifiStaIface::WifiStaIface(
32 const std::string& ifname,
33 const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal)
Roshan Pius08d1df42017-04-19 23:11:07 -070034 : ifname_(ifname), legacy_hal_(legacy_hal), is_valid_(true) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070035 // Turn on DFS channel usage for STA iface.
36 legacy_hal::wifi_error legacy_status =
37 legacy_hal_.lock()->setDfsFlag(ifname_, true);
38 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
39 LOG(ERROR)
40 << "Failed to set DFS flag; DFS channels may be unavailable.";
41 }
Roshan Pius08d1df42017-04-19 23:11:07 -070042}
Roshan Pius3e2d6712016-10-06 13:16:23 -070043
44void WifiStaIface::invalidate() {
Roshan Piusabcf78f2017-10-06 16:30:38 -070045 legacy_hal_.reset();
46 event_cb_handler_.invalidate();
47 is_valid_ = false;
Roshan Pius3e2d6712016-10-06 13:16:23 -070048}
49
Roshan Piusabcf78f2017-10-06 16:30:38 -070050bool WifiStaIface::isValid() { return is_valid_; }
Roshan Pius907d4a22016-10-27 12:48:12 -070051
Roshan Piusd37341f2017-01-31 13:13:28 -080052std::set<sp<IWifiStaIfaceEventCallback>> WifiStaIface::getEventCallbacks() {
Roshan Piusabcf78f2017-10-06 16:30:38 -070053 return event_cb_handler_.getCallbacks();
Roshan Pius970f0312016-12-05 15:25:51 -080054}
55
Roshan Pius734fea02016-10-11 08:30:28 -070056Return<void> WifiStaIface::getName(getName_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070057 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
58 &WifiStaIface::getNameInternal, hidl_status_cb);
Roshan Pius3e2d6712016-10-06 13:16:23 -070059}
60
Roshan Pius734fea02016-10-11 08:30:28 -070061Return<void> WifiStaIface::getType(getType_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070062 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
63 &WifiStaIface::getTypeInternal, hidl_status_cb);
Roshan Pius907d4a22016-10-27 12:48:12 -070064}
65
Roshan Piusa04ba3f2016-10-27 14:36:26 -070066Return<void> WifiStaIface::registerEventCallback(
67 const sp<IWifiStaIfaceEventCallback>& callback,
68 registerEventCallback_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070069 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
70 &WifiStaIface::registerEventCallbackInternal,
71 hidl_status_cb, callback);
Roshan Piusa04ba3f2016-10-27 14:36:26 -070072}
73
74Return<void> WifiStaIface::getCapabilities(getCapabilities_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070075 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
76 &WifiStaIface::getCapabilitiesInternal,
77 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -070078}
79
80Return<void> WifiStaIface::getApfPacketFilterCapabilities(
81 getApfPacketFilterCapabilities_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070082 return validateAndCall(
83 this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
84 &WifiStaIface::getApfPacketFilterCapabilitiesInternal, hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -070085}
86
87Return<void> WifiStaIface::installApfPacketFilter(
Roshan Piusabcf78f2017-10-06 16:30:38 -070088 uint32_t cmd_id, const hidl_vec<uint8_t>& program,
Roshan Piusa04ba3f2016-10-27 14:36:26 -070089 installApfPacketFilter_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070090 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
91 &WifiStaIface::installApfPacketFilterInternal,
92 hidl_status_cb, cmd_id, program);
Roshan Piusa04ba3f2016-10-27 14:36:26 -070093}
94
95Return<void> WifiStaIface::getBackgroundScanCapabilities(
96 getBackgroundScanCapabilities_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070097 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
98 &WifiStaIface::getBackgroundScanCapabilitiesInternal,
99 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700100}
101
Roshan Pius7f4574d2017-02-22 09:48:03 -0800102Return<void> WifiStaIface::getValidFrequenciesForBand(
103 WifiBand band, getValidFrequenciesForBand_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700104 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
105 &WifiStaIface::getValidFrequenciesForBandInternal,
106 hidl_status_cb, band);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700107}
108
109Return<void> WifiStaIface::startBackgroundScan(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700110 uint32_t cmd_id, const StaBackgroundScanParameters& params,
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700111 startBackgroundScan_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700112 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
113 &WifiStaIface::startBackgroundScanInternal,
114 hidl_status_cb, cmd_id, params);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700115}
116
117Return<void> WifiStaIface::stopBackgroundScan(
118 uint32_t cmd_id, stopBackgroundScan_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700119 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
120 &WifiStaIface::stopBackgroundScanInternal,
121 hidl_status_cb, cmd_id);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700122}
123
124Return<void> WifiStaIface::enableLinkLayerStatsCollection(
125 bool debug, enableLinkLayerStatsCollection_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700126 return validateAndCall(
127 this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
128 &WifiStaIface::enableLinkLayerStatsCollectionInternal, hidl_status_cb,
129 debug);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700130}
131
132Return<void> WifiStaIface::disableLinkLayerStatsCollection(
133 disableLinkLayerStatsCollection_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700134 return validateAndCall(
135 this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
136 &WifiStaIface::disableLinkLayerStatsCollectionInternal, hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700137}
138
139Return<void> WifiStaIface::getLinkLayerStats(
140 getLinkLayerStats_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700141 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
142 &WifiStaIface::getLinkLayerStatsInternal,
143 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700144}
145
Roshan Piusd4767542016-12-06 10:04:05 -0800146Return<void> WifiStaIface::startRssiMonitoring(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700147 uint32_t cmd_id, int32_t max_rssi, int32_t min_rssi,
Roshan Piusd4767542016-12-06 10:04:05 -0800148 startRssiMonitoring_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700149 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
150 &WifiStaIface::startRssiMonitoringInternal,
151 hidl_status_cb, cmd_id, max_rssi, min_rssi);
Roshan Piusd4767542016-12-06 10:04:05 -0800152}
153
154Return<void> WifiStaIface::stopRssiMonitoring(
155 uint32_t cmd_id, stopRssiMonitoring_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700156 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
157 &WifiStaIface::stopRssiMonitoringInternal,
158 hidl_status_cb, cmd_id);
Roshan Piusd4767542016-12-06 10:04:05 -0800159}
160
Roshan Pius26801cb2016-12-13 14:25:45 -0800161Return<void> WifiStaIface::getRoamingCapabilities(
162 getRoamingCapabilities_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700163 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
164 &WifiStaIface::getRoamingCapabilitiesInternal,
165 hidl_status_cb);
Roshan Pius26801cb2016-12-13 14:25:45 -0800166}
167
168Return<void> WifiStaIface::configureRoaming(
169 const StaRoamingConfig& config, configureRoaming_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700170 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
171 &WifiStaIface::configureRoamingInternal,
172 hidl_status_cb, config);
Roshan Pius26801cb2016-12-13 14:25:45 -0800173}
174
175Return<void> WifiStaIface::setRoamingState(StaRoamingState state,
176 setRoamingState_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700177 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
178 &WifiStaIface::setRoamingStateInternal,
179 hidl_status_cb, state);
Roshan Pius26801cb2016-12-13 14:25:45 -0800180}
181
Roshan Piusaf727c02017-01-11 15:37:25 -0800182Return<void> WifiStaIface::enableNdOffload(bool enable,
183 enableNdOffload_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700184 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
185 &WifiStaIface::enableNdOffloadInternal,
186 hidl_status_cb, enable);
Roshan Piusaf727c02017-01-11 15:37:25 -0800187}
188
Roshan Pius9a9869a2017-01-11 16:42:16 -0800189Return<void> WifiStaIface::startSendingKeepAlivePackets(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700190 uint32_t cmd_id, const hidl_vec<uint8_t>& ip_packet_data,
191 uint16_t ether_type, const hidl_array<uint8_t, 6>& src_address,
192 const hidl_array<uint8_t, 6>& dst_address, uint32_t period_in_ms,
Roshan Pius9a9869a2017-01-11 16:42:16 -0800193 startSendingKeepAlivePackets_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700194 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
195 &WifiStaIface::startSendingKeepAlivePacketsInternal,
196 hidl_status_cb, cmd_id, ip_packet_data, ether_type,
197 src_address, dst_address, period_in_ms);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800198}
199
200Return<void> WifiStaIface::stopSendingKeepAlivePackets(
201 uint32_t cmd_id, stopSendingKeepAlivePackets_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700202 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
203 &WifiStaIface::stopSendingKeepAlivePacketsInternal,
204 hidl_status_cb, cmd_id);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800205}
206
Roshan Pius795bb812017-02-01 13:09:08 -0800207Return<void> WifiStaIface::setScanningMacOui(
208 const hidl_array<uint8_t, 3>& oui, setScanningMacOui_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700209 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
210 &WifiStaIface::setScanningMacOuiInternal,
211 hidl_status_cb, oui);
Roshan Pius795bb812017-02-01 13:09:08 -0800212}
213
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700214Return<void> WifiStaIface::startDebugPacketFateMonitoring(
215 startDebugPacketFateMonitoring_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700216 return validateAndCall(
217 this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
218 &WifiStaIface::startDebugPacketFateMonitoringInternal, hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700219}
220
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700221Return<void> WifiStaIface::getDebugTxPacketFates(
222 getDebugTxPacketFates_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700223 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
224 &WifiStaIface::getDebugTxPacketFatesInternal,
225 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700226}
227
228Return<void> WifiStaIface::getDebugRxPacketFates(
229 getDebugRxPacketFates_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700230 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
231 &WifiStaIface::getDebugRxPacketFatesInternal,
232 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700233}
234
Roshan Pius907d4a22016-10-27 12:48:12 -0700235std::pair<WifiStatus, std::string> WifiStaIface::getNameInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700236 return {createWifiStatus(WifiStatusCode::SUCCESS), ifname_};
Roshan Pius907d4a22016-10-27 12:48:12 -0700237}
238
239std::pair<WifiStatus, IfaceType> WifiStaIface::getTypeInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700240 return {createWifiStatus(WifiStatusCode::SUCCESS), IfaceType::STA};
Roshan Pius3e2d6712016-10-06 13:16:23 -0700241}
242
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700243WifiStatus WifiStaIface::registerEventCallbackInternal(
244 const sp<IWifiStaIfaceEventCallback>& callback) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700245 if (!event_cb_handler_.addCallback(callback)) {
246 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
247 }
248 return createWifiStatus(WifiStatusCode::SUCCESS);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700249}
250
251std::pair<WifiStatus, uint32_t> WifiStaIface::getCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700252 legacy_hal::wifi_error legacy_status;
253 uint32_t legacy_feature_set;
254 std::tie(legacy_status, legacy_feature_set) =
255 legacy_hal_.lock()->getSupportedFeatureSet(ifname_);
256 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
257 return {createWifiStatusFromLegacyError(legacy_status), 0};
258 }
259 uint32_t legacy_logger_feature_set;
260 std::tie(legacy_status, legacy_logger_feature_set) =
261 legacy_hal_.lock()->getLoggerSupportedFeatureSet(ifname_);
262 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
263 // some devices don't support querying logger feature set
264 legacy_logger_feature_set = 0;
265 }
266 uint32_t hidl_caps;
267 if (!hidl_struct_util::convertLegacyFeaturesToHidlStaCapabilities(
268 legacy_feature_set, legacy_logger_feature_set, &hidl_caps)) {
269 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), 0};
270 }
271 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700272}
273
274std::pair<WifiStatus, StaApfPacketFilterCapabilities>
275WifiStaIface::getApfPacketFilterCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700276 legacy_hal::wifi_error legacy_status;
277 legacy_hal::PacketFilterCapabilities legacy_caps;
278 std::tie(legacy_status, legacy_caps) =
279 legacy_hal_.lock()->getPacketFilterCapabilities(ifname_);
280 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
281 return {createWifiStatusFromLegacyError(legacy_status), {}};
282 }
283 StaApfPacketFilterCapabilities hidl_caps;
284 if (!hidl_struct_util::convertLegacyApfCapabilitiesToHidl(legacy_caps,
285 &hidl_caps)) {
286 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
287 }
288 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700289}
290
291WifiStatus WifiStaIface::installApfPacketFilterInternal(
Roshan Pius970f0312016-12-05 15:25:51 -0800292 uint32_t /* cmd_id */, const std::vector<uint8_t>& program) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700293 legacy_hal::wifi_error legacy_status =
294 legacy_hal_.lock()->setPacketFilter(ifname_, program);
295 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700296}
297
298std::pair<WifiStatus, StaBackgroundScanCapabilities>
299WifiStaIface::getBackgroundScanCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700300 legacy_hal::wifi_error legacy_status;
301 legacy_hal::wifi_gscan_capabilities legacy_caps;
302 std::tie(legacy_status, legacy_caps) =
303 legacy_hal_.lock()->getGscanCapabilities(ifname_);
304 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
305 return {createWifiStatusFromLegacyError(legacy_status), {}};
306 }
307 StaBackgroundScanCapabilities hidl_caps;
308 if (!hidl_struct_util::convertLegacyGscanCapabilitiesToHidl(legacy_caps,
309 &hidl_caps)) {
310 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
311 }
312 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700313}
314
315std::pair<WifiStatus, std::vector<WifiChannelInMhz>>
Roshan Pius7f4574d2017-02-22 09:48:03 -0800316WifiStaIface::getValidFrequenciesForBandInternal(WifiBand band) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700317 static_assert(sizeof(WifiChannelInMhz) == sizeof(uint32_t),
318 "Size mismatch");
319 legacy_hal::wifi_error legacy_status;
320 std::vector<uint32_t> valid_frequencies;
321 std::tie(legacy_status, valid_frequencies) =
322 legacy_hal_.lock()->getValidFrequenciesForBand(
323 ifname_, hidl_struct_util::convertHidlWifiBandToLegacy(band));
324 return {createWifiStatusFromLegacyError(legacy_status), valid_frequencies};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700325}
326
327WifiStatus WifiStaIface::startBackgroundScanInternal(
Roshan Pius970f0312016-12-05 15:25:51 -0800328 uint32_t cmd_id, const StaBackgroundScanParameters& params) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700329 legacy_hal::wifi_scan_cmd_params legacy_params;
330 if (!hidl_struct_util::convertHidlGscanParamsToLegacy(params,
331 &legacy_params)) {
332 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
333 }
334 android::wp<WifiStaIface> weak_ptr_this(this);
335 const auto& on_failure_callback =
336 [weak_ptr_this](legacy_hal::wifi_request_id id) {
337 const auto shared_ptr_this = weak_ptr_this.promote();
338 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
339 LOG(ERROR) << "Callback invoked on an invalid object";
340 return;
341 }
342 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
343 if (!callback->onBackgroundScanFailure(id).isOk()) {
344 LOG(ERROR)
345 << "Failed to invoke onBackgroundScanFailure callback";
346 }
347 }
348 };
349 const auto& on_results_callback =
350 [weak_ptr_this](
351 legacy_hal::wifi_request_id id,
352 const std::vector<legacy_hal::wifi_cached_scan_results>& results) {
353 const auto shared_ptr_this = weak_ptr_this.promote();
354 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
355 LOG(ERROR) << "Callback invoked on an invalid object";
356 return;
357 }
358 std::vector<StaScanData> hidl_scan_datas;
359 if (!hidl_struct_util::
360 convertLegacyVectorOfCachedGscanResultsToHidl(
361 results, &hidl_scan_datas)) {
362 LOG(ERROR) << "Failed to convert scan results to HIDL structs";
363 return;
364 }
365 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
366 if (!callback->onBackgroundScanResults(id, hidl_scan_datas)
367 .isOk()) {
368 LOG(ERROR)
369 << "Failed to invoke onBackgroundScanResults callback";
370 }
371 }
372 };
373 const auto& on_full_result_callback = [weak_ptr_this](
374 legacy_hal::wifi_request_id id,
375 const legacy_hal::
376 wifi_scan_result* result,
377 uint32_t buckets_scanned) {
Roshan Pius970f0312016-12-05 15:25:51 -0800378 const auto shared_ptr_this = weak_ptr_this.promote();
379 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700380 LOG(ERROR) << "Callback invoked on an invalid object";
381 return;
382 }
383 StaScanResult hidl_scan_result;
384 if (!hidl_struct_util::convertLegacyGscanResultToHidl(
385 *result, true, &hidl_scan_result)) {
386 LOG(ERROR) << "Failed to convert full scan results to HIDL structs";
387 return;
Roshan Pius970f0312016-12-05 15:25:51 -0800388 }
389 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700390 if (!callback
391 ->onBackgroundFullScanResult(id, buckets_scanned,
392 hidl_scan_result)
393 .isOk()) {
394 LOG(ERROR)
395 << "Failed to invoke onBackgroundFullScanResult callback";
396 }
Roshan Pius970f0312016-12-05 15:25:51 -0800397 }
Roshan Piusabcf78f2017-10-06 16:30:38 -0700398 };
399 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->startGscan(
400 ifname_, cmd_id, legacy_params, on_failure_callback,
401 on_results_callback, on_full_result_callback);
402 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700403}
404
Roshan Pius970f0312016-12-05 15:25:51 -0800405WifiStatus WifiStaIface::stopBackgroundScanInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700406 legacy_hal::wifi_error legacy_status =
407 legacy_hal_.lock()->stopGscan(ifname_, cmd_id);
408 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700409}
410
Roshan Pius970f0312016-12-05 15:25:51 -0800411WifiStatus WifiStaIface::enableLinkLayerStatsCollectionInternal(bool debug) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700412 legacy_hal::wifi_error legacy_status =
413 legacy_hal_.lock()->enableLinkLayerStats(ifname_, debug);
414 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700415}
416
417WifiStatus WifiStaIface::disableLinkLayerStatsCollectionInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700418 legacy_hal::wifi_error legacy_status =
419 legacy_hal_.lock()->disableLinkLayerStats(ifname_);
420 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700421}
422
423std::pair<WifiStatus, StaLinkLayerStats>
424WifiStaIface::getLinkLayerStatsInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700425 legacy_hal::wifi_error legacy_status;
426 legacy_hal::LinkLayerStats legacy_stats;
427 std::tie(legacy_status, legacy_stats) =
428 legacy_hal_.lock()->getLinkLayerStats(ifname_);
429 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
430 return {createWifiStatusFromLegacyError(legacy_status), {}};
431 }
432 StaLinkLayerStats hidl_stats;
433 if (!hidl_struct_util::convertLegacyLinkLayerStatsToHidl(legacy_stats,
434 &hidl_stats)) {
435 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
436 }
437 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_stats};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700438}
439
Roshan Piusd4767542016-12-06 10:04:05 -0800440WifiStatus WifiStaIface::startRssiMonitoringInternal(uint32_t cmd_id,
441 int32_t max_rssi,
442 int32_t min_rssi) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700443 android::wp<WifiStaIface> weak_ptr_this(this);
444 const auto& on_threshold_breached_callback =
445 [weak_ptr_this](legacy_hal::wifi_request_id id,
446 std::array<uint8_t, 6> bssid, int8_t rssi) {
447 const auto shared_ptr_this = weak_ptr_this.promote();
448 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
449 LOG(ERROR) << "Callback invoked on an invalid object";
450 return;
451 }
452 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
453 if (!callback->onRssiThresholdBreached(id, bssid, rssi)
454 .isOk()) {
455 LOG(ERROR)
456 << "Failed to invoke onRssiThresholdBreached callback";
457 }
458 }
459 };
460 legacy_hal::wifi_error legacy_status =
461 legacy_hal_.lock()->startRssiMonitoring(ifname_, cmd_id, max_rssi,
462 min_rssi,
463 on_threshold_breached_callback);
464 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusd4767542016-12-06 10:04:05 -0800465}
466
467WifiStatus WifiStaIface::stopRssiMonitoringInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700468 legacy_hal::wifi_error legacy_status =
469 legacy_hal_.lock()->stopRssiMonitoring(ifname_, cmd_id);
470 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusd4767542016-12-06 10:04:05 -0800471}
472
Roshan Pius26801cb2016-12-13 14:25:45 -0800473std::pair<WifiStatus, StaRoamingCapabilities>
474WifiStaIface::getRoamingCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700475 legacy_hal::wifi_error legacy_status;
476 legacy_hal::wifi_roaming_capabilities legacy_caps;
477 std::tie(legacy_status, legacy_caps) =
478 legacy_hal_.lock()->getRoamingCapabilities(ifname_);
479 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
480 return {createWifiStatusFromLegacyError(legacy_status), {}};
481 }
482 StaRoamingCapabilities hidl_caps;
483 if (!hidl_struct_util::convertLegacyRoamingCapabilitiesToHidl(legacy_caps,
484 &hidl_caps)) {
485 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
486 }
487 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Pius26801cb2016-12-13 14:25:45 -0800488}
489
490WifiStatus WifiStaIface::configureRoamingInternal(
491 const StaRoamingConfig& config) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700492 legacy_hal::wifi_roaming_config legacy_config;
493 if (!hidl_struct_util::convertHidlRoamingConfigToLegacy(config,
494 &legacy_config)) {
495 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
496 }
497 legacy_hal::wifi_error legacy_status =
498 legacy_hal_.lock()->configureRoaming(ifname_, legacy_config);
499 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius26801cb2016-12-13 14:25:45 -0800500}
501
502WifiStatus WifiStaIface::setRoamingStateInternal(StaRoamingState state) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700503 legacy_hal::wifi_error legacy_status =
504 legacy_hal_.lock()->enableFirmwareRoaming(
505 ifname_, hidl_struct_util::convertHidlRoamingStateToLegacy(state));
506 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius26801cb2016-12-13 14:25:45 -0800507}
508
Roshan Piusaf727c02017-01-11 15:37:25 -0800509WifiStatus WifiStaIface::enableNdOffloadInternal(bool enable) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700510 legacy_hal::wifi_error legacy_status =
511 legacy_hal_.lock()->configureNdOffload(ifname_, enable);
512 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusaf727c02017-01-11 15:37:25 -0800513}
514
Roshan Pius9a9869a2017-01-11 16:42:16 -0800515WifiStatus WifiStaIface::startSendingKeepAlivePacketsInternal(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700516 uint32_t cmd_id, const std::vector<uint8_t>& ip_packet_data,
517 uint16_t /* ether_type */, const std::array<uint8_t, 6>& src_address,
518 const std::array<uint8_t, 6>& dst_address, uint32_t period_in_ms) {
519 legacy_hal::wifi_error legacy_status =
520 legacy_hal_.lock()->startSendingOffloadedPacket(
521 ifname_, cmd_id, ip_packet_data, src_address, dst_address,
522 period_in_ms);
523 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800524}
525
526WifiStatus WifiStaIface::stopSendingKeepAlivePacketsInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700527 legacy_hal::wifi_error legacy_status =
528 legacy_hal_.lock()->stopSendingOffloadedPacket(ifname_, cmd_id);
529 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800530}
531
Roshan Piusd37341f2017-01-31 13:13:28 -0800532WifiStatus WifiStaIface::setScanningMacOuiInternal(
533 const std::array<uint8_t, 3>& oui) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700534 legacy_hal::wifi_error legacy_status =
535 legacy_hal_.lock()->setScanningMacOui(ifname_, oui);
536 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius795bb812017-02-01 13:09:08 -0800537}
538
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700539WifiStatus WifiStaIface::startDebugPacketFateMonitoringInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700540 legacy_hal::wifi_error legacy_status =
541 legacy_hal_.lock()->startPktFateMonitoring(ifname_);
542 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700543}
544
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700545std::pair<WifiStatus, std::vector<WifiDebugTxPacketFateReport>>
546WifiStaIface::getDebugTxPacketFatesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700547 legacy_hal::wifi_error legacy_status;
548 std::vector<legacy_hal::wifi_tx_report> legacy_fates;
549 std::tie(legacy_status, legacy_fates) =
550 legacy_hal_.lock()->getTxPktFates(ifname_);
551 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
552 return {createWifiStatusFromLegacyError(legacy_status), {}};
553 }
554 std::vector<WifiDebugTxPacketFateReport> hidl_fates;
555 if (!hidl_struct_util::convertLegacyVectorOfDebugTxPacketFateToHidl(
556 legacy_fates, &hidl_fates)) {
557 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
558 }
559 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700560}
561
562std::pair<WifiStatus, std::vector<WifiDebugRxPacketFateReport>>
563WifiStaIface::getDebugRxPacketFatesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700564 legacy_hal::wifi_error legacy_status;
565 std::vector<legacy_hal::wifi_rx_report> legacy_fates;
566 std::tie(legacy_status, legacy_fates) =
567 legacy_hal_.lock()->getRxPktFates(ifname_);
568 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
569 return {createWifiStatusFromLegacyError(legacy_status), {}};
570 }
571 std::vector<WifiDebugRxPacketFateReport> hidl_fates;
572 if (!hidl_struct_util::convertLegacyVectorOfDebugRxPacketFateToHidl(
573 legacy_fates, &hidl_fates)) {
574 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
575 }
576 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700577}
578
Roshan Pius3e2d6712016-10-06 13:16:23 -0700579} // namespace implementation
Etan Cohen6ce50902017-09-14 07:30:57 -0700580} // namespace V1_2
Roshan Pius3e2d6712016-10-06 13:16:23 -0700581} // namespace wifi
582} // namespace hardware
583} // namespace android