blob: 6faf009379ed1b120400a85a79bf78969d7e6853 [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 Pius675609b2017-10-31 14:24:58 -070052std::string WifiStaIface::getName() { return ifname_; }
53
Roshan Piusd37341f2017-01-31 13:13:28 -080054std::set<sp<IWifiStaIfaceEventCallback>> WifiStaIface::getEventCallbacks() {
Roshan Piusabcf78f2017-10-06 16:30:38 -070055 return event_cb_handler_.getCallbacks();
Roshan Pius970f0312016-12-05 15:25:51 -080056}
57
Roshan Pius734fea02016-10-11 08:30:28 -070058Return<void> WifiStaIface::getName(getName_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070059 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
60 &WifiStaIface::getNameInternal, hidl_status_cb);
Roshan Pius3e2d6712016-10-06 13:16:23 -070061}
62
Roshan Pius734fea02016-10-11 08:30:28 -070063Return<void> WifiStaIface::getType(getType_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070064 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
65 &WifiStaIface::getTypeInternal, hidl_status_cb);
Roshan Pius907d4a22016-10-27 12:48:12 -070066}
67
Roshan Piusa04ba3f2016-10-27 14:36:26 -070068Return<void> WifiStaIface::registerEventCallback(
69 const sp<IWifiStaIfaceEventCallback>& callback,
70 registerEventCallback_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070071 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
72 &WifiStaIface::registerEventCallbackInternal,
73 hidl_status_cb, callback);
Roshan Piusa04ba3f2016-10-27 14:36:26 -070074}
75
76Return<void> WifiStaIface::getCapabilities(getCapabilities_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070077 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
78 &WifiStaIface::getCapabilitiesInternal,
79 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -070080}
81
82Return<void> WifiStaIface::getApfPacketFilterCapabilities(
83 getApfPacketFilterCapabilities_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070084 return validateAndCall(
85 this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
86 &WifiStaIface::getApfPacketFilterCapabilitiesInternal, hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -070087}
88
89Return<void> WifiStaIface::installApfPacketFilter(
Roshan Piusabcf78f2017-10-06 16:30:38 -070090 uint32_t cmd_id, const hidl_vec<uint8_t>& program,
Roshan Piusa04ba3f2016-10-27 14:36:26 -070091 installApfPacketFilter_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070092 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
93 &WifiStaIface::installApfPacketFilterInternal,
94 hidl_status_cb, cmd_id, program);
Roshan Piusa04ba3f2016-10-27 14:36:26 -070095}
96
97Return<void> WifiStaIface::getBackgroundScanCapabilities(
98 getBackgroundScanCapabilities_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070099 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
100 &WifiStaIface::getBackgroundScanCapabilitiesInternal,
101 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700102}
103
Roshan Pius7f4574d2017-02-22 09:48:03 -0800104Return<void> WifiStaIface::getValidFrequenciesForBand(
105 WifiBand band, getValidFrequenciesForBand_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700106 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
107 &WifiStaIface::getValidFrequenciesForBandInternal,
108 hidl_status_cb, band);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700109}
110
111Return<void> WifiStaIface::startBackgroundScan(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700112 uint32_t cmd_id, const StaBackgroundScanParameters& params,
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700113 startBackgroundScan_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700114 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
115 &WifiStaIface::startBackgroundScanInternal,
116 hidl_status_cb, cmd_id, params);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700117}
118
119Return<void> WifiStaIface::stopBackgroundScan(
120 uint32_t cmd_id, stopBackgroundScan_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700121 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
122 &WifiStaIface::stopBackgroundScanInternal,
123 hidl_status_cb, cmd_id);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700124}
125
126Return<void> WifiStaIface::enableLinkLayerStatsCollection(
127 bool debug, enableLinkLayerStatsCollection_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700128 return validateAndCall(
129 this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
130 &WifiStaIface::enableLinkLayerStatsCollectionInternal, hidl_status_cb,
131 debug);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700132}
133
134Return<void> WifiStaIface::disableLinkLayerStatsCollection(
135 disableLinkLayerStatsCollection_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700136 return validateAndCall(
137 this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
138 &WifiStaIface::disableLinkLayerStatsCollectionInternal, hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700139}
140
141Return<void> WifiStaIface::getLinkLayerStats(
142 getLinkLayerStats_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700143 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
144 &WifiStaIface::getLinkLayerStatsInternal,
145 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700146}
147
Roshan Piusd4767542016-12-06 10:04:05 -0800148Return<void> WifiStaIface::startRssiMonitoring(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700149 uint32_t cmd_id, int32_t max_rssi, int32_t min_rssi,
Roshan Piusd4767542016-12-06 10:04:05 -0800150 startRssiMonitoring_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700151 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
152 &WifiStaIface::startRssiMonitoringInternal,
153 hidl_status_cb, cmd_id, max_rssi, min_rssi);
Roshan Piusd4767542016-12-06 10:04:05 -0800154}
155
156Return<void> WifiStaIface::stopRssiMonitoring(
157 uint32_t cmd_id, stopRssiMonitoring_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700158 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
159 &WifiStaIface::stopRssiMonitoringInternal,
160 hidl_status_cb, cmd_id);
Roshan Piusd4767542016-12-06 10:04:05 -0800161}
162
Roshan Pius26801cb2016-12-13 14:25:45 -0800163Return<void> WifiStaIface::getRoamingCapabilities(
164 getRoamingCapabilities_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700165 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
166 &WifiStaIface::getRoamingCapabilitiesInternal,
167 hidl_status_cb);
Roshan Pius26801cb2016-12-13 14:25:45 -0800168}
169
170Return<void> WifiStaIface::configureRoaming(
171 const StaRoamingConfig& config, configureRoaming_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700172 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
173 &WifiStaIface::configureRoamingInternal,
174 hidl_status_cb, config);
Roshan Pius26801cb2016-12-13 14:25:45 -0800175}
176
177Return<void> WifiStaIface::setRoamingState(StaRoamingState state,
178 setRoamingState_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700179 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
180 &WifiStaIface::setRoamingStateInternal,
181 hidl_status_cb, state);
Roshan Pius26801cb2016-12-13 14:25:45 -0800182}
183
Roshan Piusaf727c02017-01-11 15:37:25 -0800184Return<void> WifiStaIface::enableNdOffload(bool enable,
185 enableNdOffload_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700186 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
187 &WifiStaIface::enableNdOffloadInternal,
188 hidl_status_cb, enable);
Roshan Piusaf727c02017-01-11 15:37:25 -0800189}
190
Roshan Pius9a9869a2017-01-11 16:42:16 -0800191Return<void> WifiStaIface::startSendingKeepAlivePackets(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700192 uint32_t cmd_id, const hidl_vec<uint8_t>& ip_packet_data,
193 uint16_t ether_type, const hidl_array<uint8_t, 6>& src_address,
194 const hidl_array<uint8_t, 6>& dst_address, uint32_t period_in_ms,
Roshan Pius9a9869a2017-01-11 16:42:16 -0800195 startSendingKeepAlivePackets_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700196 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
197 &WifiStaIface::startSendingKeepAlivePacketsInternal,
198 hidl_status_cb, cmd_id, ip_packet_data, ether_type,
199 src_address, dst_address, period_in_ms);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800200}
201
202Return<void> WifiStaIface::stopSendingKeepAlivePackets(
203 uint32_t cmd_id, stopSendingKeepAlivePackets_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700204 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
205 &WifiStaIface::stopSendingKeepAlivePacketsInternal,
206 hidl_status_cb, cmd_id);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800207}
208
Roshan Pius795bb812017-02-01 13:09:08 -0800209Return<void> WifiStaIface::setScanningMacOui(
210 const hidl_array<uint8_t, 3>& oui, setScanningMacOui_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700211 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
212 &WifiStaIface::setScanningMacOuiInternal,
213 hidl_status_cb, oui);
Roshan Pius795bb812017-02-01 13:09:08 -0800214}
215
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700216Return<void> WifiStaIface::startDebugPacketFateMonitoring(
217 startDebugPacketFateMonitoring_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700218 return validateAndCall(
219 this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
220 &WifiStaIface::startDebugPacketFateMonitoringInternal, hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700221}
222
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700223Return<void> WifiStaIface::getDebugTxPacketFates(
224 getDebugTxPacketFates_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700225 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
226 &WifiStaIface::getDebugTxPacketFatesInternal,
227 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700228}
229
230Return<void> WifiStaIface::getDebugRxPacketFates(
231 getDebugRxPacketFates_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700232 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
233 &WifiStaIface::getDebugRxPacketFatesInternal,
234 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700235}
236
Roshan Pius907d4a22016-10-27 12:48:12 -0700237std::pair<WifiStatus, std::string> WifiStaIface::getNameInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700238 return {createWifiStatus(WifiStatusCode::SUCCESS), ifname_};
Roshan Pius907d4a22016-10-27 12:48:12 -0700239}
240
241std::pair<WifiStatus, IfaceType> WifiStaIface::getTypeInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700242 return {createWifiStatus(WifiStatusCode::SUCCESS), IfaceType::STA};
Roshan Pius3e2d6712016-10-06 13:16:23 -0700243}
244
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700245WifiStatus WifiStaIface::registerEventCallbackInternal(
246 const sp<IWifiStaIfaceEventCallback>& callback) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700247 if (!event_cb_handler_.addCallback(callback)) {
248 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
249 }
250 return createWifiStatus(WifiStatusCode::SUCCESS);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700251}
252
253std::pair<WifiStatus, uint32_t> WifiStaIface::getCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700254 legacy_hal::wifi_error legacy_status;
255 uint32_t legacy_feature_set;
256 std::tie(legacy_status, legacy_feature_set) =
257 legacy_hal_.lock()->getSupportedFeatureSet(ifname_);
258 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
259 return {createWifiStatusFromLegacyError(legacy_status), 0};
260 }
261 uint32_t legacy_logger_feature_set;
262 std::tie(legacy_status, legacy_logger_feature_set) =
263 legacy_hal_.lock()->getLoggerSupportedFeatureSet(ifname_);
264 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
265 // some devices don't support querying logger feature set
266 legacy_logger_feature_set = 0;
267 }
268 uint32_t hidl_caps;
269 if (!hidl_struct_util::convertLegacyFeaturesToHidlStaCapabilities(
270 legacy_feature_set, legacy_logger_feature_set, &hidl_caps)) {
271 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), 0};
272 }
273 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700274}
275
276std::pair<WifiStatus, StaApfPacketFilterCapabilities>
277WifiStaIface::getApfPacketFilterCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700278 legacy_hal::wifi_error legacy_status;
279 legacy_hal::PacketFilterCapabilities legacy_caps;
280 std::tie(legacy_status, legacy_caps) =
281 legacy_hal_.lock()->getPacketFilterCapabilities(ifname_);
282 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
283 return {createWifiStatusFromLegacyError(legacy_status), {}};
284 }
285 StaApfPacketFilterCapabilities hidl_caps;
286 if (!hidl_struct_util::convertLegacyApfCapabilitiesToHidl(legacy_caps,
287 &hidl_caps)) {
288 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
289 }
290 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700291}
292
293WifiStatus WifiStaIface::installApfPacketFilterInternal(
Roshan Pius970f0312016-12-05 15:25:51 -0800294 uint32_t /* cmd_id */, const std::vector<uint8_t>& program) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700295 legacy_hal::wifi_error legacy_status =
296 legacy_hal_.lock()->setPacketFilter(ifname_, program);
297 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700298}
299
300std::pair<WifiStatus, StaBackgroundScanCapabilities>
301WifiStaIface::getBackgroundScanCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700302 legacy_hal::wifi_error legacy_status;
303 legacy_hal::wifi_gscan_capabilities legacy_caps;
304 std::tie(legacy_status, legacy_caps) =
305 legacy_hal_.lock()->getGscanCapabilities(ifname_);
306 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
307 return {createWifiStatusFromLegacyError(legacy_status), {}};
308 }
309 StaBackgroundScanCapabilities hidl_caps;
310 if (!hidl_struct_util::convertLegacyGscanCapabilitiesToHidl(legacy_caps,
311 &hidl_caps)) {
312 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
313 }
314 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700315}
316
317std::pair<WifiStatus, std::vector<WifiChannelInMhz>>
Roshan Pius7f4574d2017-02-22 09:48:03 -0800318WifiStaIface::getValidFrequenciesForBandInternal(WifiBand band) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700319 static_assert(sizeof(WifiChannelInMhz) == sizeof(uint32_t),
320 "Size mismatch");
321 legacy_hal::wifi_error legacy_status;
322 std::vector<uint32_t> valid_frequencies;
323 std::tie(legacy_status, valid_frequencies) =
324 legacy_hal_.lock()->getValidFrequenciesForBand(
325 ifname_, hidl_struct_util::convertHidlWifiBandToLegacy(band));
326 return {createWifiStatusFromLegacyError(legacy_status), valid_frequencies};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700327}
328
329WifiStatus WifiStaIface::startBackgroundScanInternal(
Roshan Pius970f0312016-12-05 15:25:51 -0800330 uint32_t cmd_id, const StaBackgroundScanParameters& params) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700331 legacy_hal::wifi_scan_cmd_params legacy_params;
332 if (!hidl_struct_util::convertHidlGscanParamsToLegacy(params,
333 &legacy_params)) {
334 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
335 }
336 android::wp<WifiStaIface> weak_ptr_this(this);
337 const auto& on_failure_callback =
338 [weak_ptr_this](legacy_hal::wifi_request_id id) {
339 const auto shared_ptr_this = weak_ptr_this.promote();
340 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
341 LOG(ERROR) << "Callback invoked on an invalid object";
342 return;
343 }
344 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
345 if (!callback->onBackgroundScanFailure(id).isOk()) {
346 LOG(ERROR)
347 << "Failed to invoke onBackgroundScanFailure callback";
348 }
349 }
350 };
351 const auto& on_results_callback =
352 [weak_ptr_this](
353 legacy_hal::wifi_request_id id,
354 const std::vector<legacy_hal::wifi_cached_scan_results>& results) {
355 const auto shared_ptr_this = weak_ptr_this.promote();
356 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
357 LOG(ERROR) << "Callback invoked on an invalid object";
358 return;
359 }
360 std::vector<StaScanData> hidl_scan_datas;
361 if (!hidl_struct_util::
362 convertLegacyVectorOfCachedGscanResultsToHidl(
363 results, &hidl_scan_datas)) {
364 LOG(ERROR) << "Failed to convert scan results to HIDL structs";
365 return;
366 }
367 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
368 if (!callback->onBackgroundScanResults(id, hidl_scan_datas)
369 .isOk()) {
370 LOG(ERROR)
371 << "Failed to invoke onBackgroundScanResults callback";
372 }
373 }
374 };
375 const auto& on_full_result_callback = [weak_ptr_this](
376 legacy_hal::wifi_request_id id,
377 const legacy_hal::
378 wifi_scan_result* result,
379 uint32_t buckets_scanned) {
Roshan Pius970f0312016-12-05 15:25:51 -0800380 const auto shared_ptr_this = weak_ptr_this.promote();
381 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700382 LOG(ERROR) << "Callback invoked on an invalid object";
383 return;
384 }
385 StaScanResult hidl_scan_result;
386 if (!hidl_struct_util::convertLegacyGscanResultToHidl(
387 *result, true, &hidl_scan_result)) {
388 LOG(ERROR) << "Failed to convert full scan results to HIDL structs";
389 return;
Roshan Pius970f0312016-12-05 15:25:51 -0800390 }
391 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700392 if (!callback
393 ->onBackgroundFullScanResult(id, buckets_scanned,
394 hidl_scan_result)
395 .isOk()) {
396 LOG(ERROR)
397 << "Failed to invoke onBackgroundFullScanResult callback";
398 }
Roshan Pius970f0312016-12-05 15:25:51 -0800399 }
Roshan Piusabcf78f2017-10-06 16:30:38 -0700400 };
401 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->startGscan(
402 ifname_, cmd_id, legacy_params, on_failure_callback,
403 on_results_callback, on_full_result_callback);
404 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700405}
406
Roshan Pius970f0312016-12-05 15:25:51 -0800407WifiStatus WifiStaIface::stopBackgroundScanInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700408 legacy_hal::wifi_error legacy_status =
409 legacy_hal_.lock()->stopGscan(ifname_, cmd_id);
410 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700411}
412
Roshan Pius970f0312016-12-05 15:25:51 -0800413WifiStatus WifiStaIface::enableLinkLayerStatsCollectionInternal(bool debug) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700414 legacy_hal::wifi_error legacy_status =
415 legacy_hal_.lock()->enableLinkLayerStats(ifname_, debug);
416 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700417}
418
419WifiStatus WifiStaIface::disableLinkLayerStatsCollectionInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700420 legacy_hal::wifi_error legacy_status =
421 legacy_hal_.lock()->disableLinkLayerStats(ifname_);
422 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700423}
424
425std::pair<WifiStatus, StaLinkLayerStats>
426WifiStaIface::getLinkLayerStatsInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700427 legacy_hal::wifi_error legacy_status;
428 legacy_hal::LinkLayerStats legacy_stats;
429 std::tie(legacy_status, legacy_stats) =
430 legacy_hal_.lock()->getLinkLayerStats(ifname_);
431 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
432 return {createWifiStatusFromLegacyError(legacy_status), {}};
433 }
434 StaLinkLayerStats hidl_stats;
435 if (!hidl_struct_util::convertLegacyLinkLayerStatsToHidl(legacy_stats,
436 &hidl_stats)) {
437 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
438 }
439 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_stats};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700440}
441
Roshan Piusd4767542016-12-06 10:04:05 -0800442WifiStatus WifiStaIface::startRssiMonitoringInternal(uint32_t cmd_id,
443 int32_t max_rssi,
444 int32_t min_rssi) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700445 android::wp<WifiStaIface> weak_ptr_this(this);
446 const auto& on_threshold_breached_callback =
447 [weak_ptr_this](legacy_hal::wifi_request_id id,
448 std::array<uint8_t, 6> bssid, int8_t rssi) {
449 const auto shared_ptr_this = weak_ptr_this.promote();
450 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
451 LOG(ERROR) << "Callback invoked on an invalid object";
452 return;
453 }
454 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
455 if (!callback->onRssiThresholdBreached(id, bssid, rssi)
456 .isOk()) {
457 LOG(ERROR)
458 << "Failed to invoke onRssiThresholdBreached callback";
459 }
460 }
461 };
462 legacy_hal::wifi_error legacy_status =
463 legacy_hal_.lock()->startRssiMonitoring(ifname_, cmd_id, max_rssi,
464 min_rssi,
465 on_threshold_breached_callback);
466 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusd4767542016-12-06 10:04:05 -0800467}
468
469WifiStatus WifiStaIface::stopRssiMonitoringInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700470 legacy_hal::wifi_error legacy_status =
471 legacy_hal_.lock()->stopRssiMonitoring(ifname_, cmd_id);
472 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusd4767542016-12-06 10:04:05 -0800473}
474
Roshan Pius26801cb2016-12-13 14:25:45 -0800475std::pair<WifiStatus, StaRoamingCapabilities>
476WifiStaIface::getRoamingCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700477 legacy_hal::wifi_error legacy_status;
478 legacy_hal::wifi_roaming_capabilities legacy_caps;
479 std::tie(legacy_status, legacy_caps) =
480 legacy_hal_.lock()->getRoamingCapabilities(ifname_);
481 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
482 return {createWifiStatusFromLegacyError(legacy_status), {}};
483 }
484 StaRoamingCapabilities hidl_caps;
485 if (!hidl_struct_util::convertLegacyRoamingCapabilitiesToHidl(legacy_caps,
486 &hidl_caps)) {
487 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
488 }
489 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Pius26801cb2016-12-13 14:25:45 -0800490}
491
492WifiStatus WifiStaIface::configureRoamingInternal(
493 const StaRoamingConfig& config) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700494 legacy_hal::wifi_roaming_config legacy_config;
495 if (!hidl_struct_util::convertHidlRoamingConfigToLegacy(config,
496 &legacy_config)) {
497 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
498 }
499 legacy_hal::wifi_error legacy_status =
500 legacy_hal_.lock()->configureRoaming(ifname_, legacy_config);
501 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius26801cb2016-12-13 14:25:45 -0800502}
503
504WifiStatus WifiStaIface::setRoamingStateInternal(StaRoamingState state) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700505 legacy_hal::wifi_error legacy_status =
506 legacy_hal_.lock()->enableFirmwareRoaming(
507 ifname_, hidl_struct_util::convertHidlRoamingStateToLegacy(state));
508 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius26801cb2016-12-13 14:25:45 -0800509}
510
Roshan Piusaf727c02017-01-11 15:37:25 -0800511WifiStatus WifiStaIface::enableNdOffloadInternal(bool enable) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700512 legacy_hal::wifi_error legacy_status =
513 legacy_hal_.lock()->configureNdOffload(ifname_, enable);
514 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusaf727c02017-01-11 15:37:25 -0800515}
516
Roshan Pius9a9869a2017-01-11 16:42:16 -0800517WifiStatus WifiStaIface::startSendingKeepAlivePacketsInternal(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700518 uint32_t cmd_id, const std::vector<uint8_t>& ip_packet_data,
519 uint16_t /* ether_type */, const std::array<uint8_t, 6>& src_address,
520 const std::array<uint8_t, 6>& dst_address, uint32_t period_in_ms) {
521 legacy_hal::wifi_error legacy_status =
522 legacy_hal_.lock()->startSendingOffloadedPacket(
523 ifname_, cmd_id, ip_packet_data, src_address, dst_address,
524 period_in_ms);
525 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800526}
527
528WifiStatus WifiStaIface::stopSendingKeepAlivePacketsInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700529 legacy_hal::wifi_error legacy_status =
530 legacy_hal_.lock()->stopSendingOffloadedPacket(ifname_, cmd_id);
531 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800532}
533
Roshan Piusd37341f2017-01-31 13:13:28 -0800534WifiStatus WifiStaIface::setScanningMacOuiInternal(
535 const std::array<uint8_t, 3>& oui) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700536 legacy_hal::wifi_error legacy_status =
537 legacy_hal_.lock()->setScanningMacOui(ifname_, oui);
538 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius795bb812017-02-01 13:09:08 -0800539}
540
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700541WifiStatus WifiStaIface::startDebugPacketFateMonitoringInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700542 legacy_hal::wifi_error legacy_status =
543 legacy_hal_.lock()->startPktFateMonitoring(ifname_);
544 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700545}
546
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700547std::pair<WifiStatus, std::vector<WifiDebugTxPacketFateReport>>
548WifiStaIface::getDebugTxPacketFatesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700549 legacy_hal::wifi_error legacy_status;
550 std::vector<legacy_hal::wifi_tx_report> legacy_fates;
551 std::tie(legacy_status, legacy_fates) =
552 legacy_hal_.lock()->getTxPktFates(ifname_);
553 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
554 return {createWifiStatusFromLegacyError(legacy_status), {}};
555 }
556 std::vector<WifiDebugTxPacketFateReport> hidl_fates;
557 if (!hidl_struct_util::convertLegacyVectorOfDebugTxPacketFateToHidl(
558 legacy_fates, &hidl_fates)) {
559 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
560 }
561 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700562}
563
564std::pair<WifiStatus, std::vector<WifiDebugRxPacketFateReport>>
565WifiStaIface::getDebugRxPacketFatesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700566 legacy_hal::wifi_error legacy_status;
567 std::vector<legacy_hal::wifi_rx_report> legacy_fates;
568 std::tie(legacy_status, legacy_fates) =
569 legacy_hal_.lock()->getRxPktFates(ifname_);
570 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
571 return {createWifiStatusFromLegacyError(legacy_status), {}};
572 }
573 std::vector<WifiDebugRxPacketFateReport> hidl_fates;
574 if (!hidl_struct_util::convertLegacyVectorOfDebugRxPacketFateToHidl(
575 legacy_fates, &hidl_fates)) {
576 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
577 }
578 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700579}
580
Roshan Pius3e2d6712016-10-06 13:16:23 -0700581} // namespace implementation
Etan Cohen6ce50902017-09-14 07:30:57 -0700582} // namespace V1_2
Roshan Pius3e2d6712016-10-06 13:16:23 -0700583} // namespace wifi
584} // namespace hardware
585} // namespace android