blob: ab99daa24aef604dacf4439139d0991fac0c8a78 [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
Bernie Innocenti7e6f71a2018-03-07 00:17:50 +090097Return<void> WifiStaIface::readApfPacketFilterData(
98 readApfPacketFilterData_cb hidl_status_cb) {
99 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
100 &WifiStaIface::readApfPacketFilterDataInternal,
101 hidl_status_cb);
102}
103
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700104Return<void> WifiStaIface::getBackgroundScanCapabilities(
105 getBackgroundScanCapabilities_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700106 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
107 &WifiStaIface::getBackgroundScanCapabilitiesInternal,
108 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700109}
110
Roshan Pius7f4574d2017-02-22 09:48:03 -0800111Return<void> WifiStaIface::getValidFrequenciesForBand(
112 WifiBand band, getValidFrequenciesForBand_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700113 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
114 &WifiStaIface::getValidFrequenciesForBandInternal,
115 hidl_status_cb, band);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700116}
117
118Return<void> WifiStaIface::startBackgroundScan(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700119 uint32_t cmd_id, const StaBackgroundScanParameters& params,
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700120 startBackgroundScan_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700121 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
122 &WifiStaIface::startBackgroundScanInternal,
123 hidl_status_cb, cmd_id, params);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700124}
125
126Return<void> WifiStaIface::stopBackgroundScan(
127 uint32_t cmd_id, stopBackgroundScan_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700128 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
129 &WifiStaIface::stopBackgroundScanInternal,
130 hidl_status_cb, cmd_id);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700131}
132
133Return<void> WifiStaIface::enableLinkLayerStatsCollection(
134 bool debug, enableLinkLayerStatsCollection_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700135 return validateAndCall(
136 this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
137 &WifiStaIface::enableLinkLayerStatsCollectionInternal, hidl_status_cb,
138 debug);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700139}
140
141Return<void> WifiStaIface::disableLinkLayerStatsCollection(
142 disableLinkLayerStatsCollection_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700143 return validateAndCall(
144 this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
145 &WifiStaIface::disableLinkLayerStatsCollectionInternal, hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700146}
147
148Return<void> WifiStaIface::getLinkLayerStats(
149 getLinkLayerStats_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700150 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
151 &WifiStaIface::getLinkLayerStatsInternal,
152 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700153}
154
Roshan Piusd4767542016-12-06 10:04:05 -0800155Return<void> WifiStaIface::startRssiMonitoring(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700156 uint32_t cmd_id, int32_t max_rssi, int32_t min_rssi,
Roshan Piusd4767542016-12-06 10:04:05 -0800157 startRssiMonitoring_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700158 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
159 &WifiStaIface::startRssiMonitoringInternal,
160 hidl_status_cb, cmd_id, max_rssi, min_rssi);
Roshan Piusd4767542016-12-06 10:04:05 -0800161}
162
163Return<void> WifiStaIface::stopRssiMonitoring(
164 uint32_t cmd_id, stopRssiMonitoring_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700165 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
166 &WifiStaIface::stopRssiMonitoringInternal,
167 hidl_status_cb, cmd_id);
Roshan Piusd4767542016-12-06 10:04:05 -0800168}
169
Roshan Pius26801cb2016-12-13 14:25:45 -0800170Return<void> WifiStaIface::getRoamingCapabilities(
171 getRoamingCapabilities_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700172 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
173 &WifiStaIface::getRoamingCapabilitiesInternal,
174 hidl_status_cb);
Roshan Pius26801cb2016-12-13 14:25:45 -0800175}
176
177Return<void> WifiStaIface::configureRoaming(
178 const StaRoamingConfig& config, configureRoaming_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700179 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
180 &WifiStaIface::configureRoamingInternal,
181 hidl_status_cb, config);
Roshan Pius26801cb2016-12-13 14:25:45 -0800182}
183
184Return<void> WifiStaIface::setRoamingState(StaRoamingState state,
185 setRoamingState_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700186 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
187 &WifiStaIface::setRoamingStateInternal,
188 hidl_status_cb, state);
Roshan Pius26801cb2016-12-13 14:25:45 -0800189}
190
Roshan Piusaf727c02017-01-11 15:37:25 -0800191Return<void> WifiStaIface::enableNdOffload(bool enable,
192 enableNdOffload_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700193 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
194 &WifiStaIface::enableNdOffloadInternal,
195 hidl_status_cb, enable);
Roshan Piusaf727c02017-01-11 15:37:25 -0800196}
197
Roshan Pius9a9869a2017-01-11 16:42:16 -0800198Return<void> WifiStaIface::startSendingKeepAlivePackets(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700199 uint32_t cmd_id, const hidl_vec<uint8_t>& ip_packet_data,
200 uint16_t ether_type, const hidl_array<uint8_t, 6>& src_address,
201 const hidl_array<uint8_t, 6>& dst_address, uint32_t period_in_ms,
Roshan Pius9a9869a2017-01-11 16:42:16 -0800202 startSendingKeepAlivePackets_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700203 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
204 &WifiStaIface::startSendingKeepAlivePacketsInternal,
205 hidl_status_cb, cmd_id, ip_packet_data, ether_type,
206 src_address, dst_address, period_in_ms);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800207}
208
209Return<void> WifiStaIface::stopSendingKeepAlivePackets(
210 uint32_t cmd_id, stopSendingKeepAlivePackets_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700211 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
212 &WifiStaIface::stopSendingKeepAlivePacketsInternal,
213 hidl_status_cb, cmd_id);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800214}
215
Roshan Pius795bb812017-02-01 13:09:08 -0800216Return<void> WifiStaIface::setScanningMacOui(
217 const hidl_array<uint8_t, 3>& oui, setScanningMacOui_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700218 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
219 &WifiStaIface::setScanningMacOuiInternal,
220 hidl_status_cb, oui);
Roshan Pius795bb812017-02-01 13:09:08 -0800221}
222
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700223Return<void> WifiStaIface::startDebugPacketFateMonitoring(
224 startDebugPacketFateMonitoring_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700225 return validateAndCall(
226 this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
227 &WifiStaIface::startDebugPacketFateMonitoringInternal, hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700228}
229
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700230Return<void> WifiStaIface::getDebugTxPacketFates(
231 getDebugTxPacketFates_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700232 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
233 &WifiStaIface::getDebugTxPacketFatesInternal,
234 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700235}
236
237Return<void> WifiStaIface::getDebugRxPacketFates(
238 getDebugRxPacketFates_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700239 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
240 &WifiStaIface::getDebugRxPacketFatesInternal,
241 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700242}
243
Roshan Pius907d4a22016-10-27 12:48:12 -0700244std::pair<WifiStatus, std::string> WifiStaIface::getNameInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700245 return {createWifiStatus(WifiStatusCode::SUCCESS), ifname_};
Roshan Pius907d4a22016-10-27 12:48:12 -0700246}
247
248std::pair<WifiStatus, IfaceType> WifiStaIface::getTypeInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700249 return {createWifiStatus(WifiStatusCode::SUCCESS), IfaceType::STA};
Roshan Pius3e2d6712016-10-06 13:16:23 -0700250}
251
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700252WifiStatus WifiStaIface::registerEventCallbackInternal(
253 const sp<IWifiStaIfaceEventCallback>& callback) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700254 if (!event_cb_handler_.addCallback(callback)) {
255 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
256 }
257 return createWifiStatus(WifiStatusCode::SUCCESS);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700258}
259
260std::pair<WifiStatus, uint32_t> WifiStaIface::getCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700261 legacy_hal::wifi_error legacy_status;
262 uint32_t legacy_feature_set;
263 std::tie(legacy_status, legacy_feature_set) =
264 legacy_hal_.lock()->getSupportedFeatureSet(ifname_);
265 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
266 return {createWifiStatusFromLegacyError(legacy_status), 0};
267 }
268 uint32_t legacy_logger_feature_set;
269 std::tie(legacy_status, legacy_logger_feature_set) =
270 legacy_hal_.lock()->getLoggerSupportedFeatureSet(ifname_);
271 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
272 // some devices don't support querying logger feature set
273 legacy_logger_feature_set = 0;
274 }
275 uint32_t hidl_caps;
276 if (!hidl_struct_util::convertLegacyFeaturesToHidlStaCapabilities(
277 legacy_feature_set, legacy_logger_feature_set, &hidl_caps)) {
278 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), 0};
279 }
280 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700281}
282
283std::pair<WifiStatus, StaApfPacketFilterCapabilities>
284WifiStaIface::getApfPacketFilterCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700285 legacy_hal::wifi_error legacy_status;
286 legacy_hal::PacketFilterCapabilities legacy_caps;
287 std::tie(legacy_status, legacy_caps) =
288 legacy_hal_.lock()->getPacketFilterCapabilities(ifname_);
289 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
290 return {createWifiStatusFromLegacyError(legacy_status), {}};
291 }
292 StaApfPacketFilterCapabilities hidl_caps;
293 if (!hidl_struct_util::convertLegacyApfCapabilitiesToHidl(legacy_caps,
294 &hidl_caps)) {
295 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
296 }
297 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700298}
299
300WifiStatus WifiStaIface::installApfPacketFilterInternal(
Roshan Pius970f0312016-12-05 15:25:51 -0800301 uint32_t /* cmd_id */, const std::vector<uint8_t>& program) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700302 legacy_hal::wifi_error legacy_status =
303 legacy_hal_.lock()->setPacketFilter(ifname_, program);
304 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700305}
306
Bernie Innocenti7e6f71a2018-03-07 00:17:50 +0900307std::pair<WifiStatus, std::vector<uint8_t>>
308WifiStaIface::readApfPacketFilterDataInternal() {
309 const std::pair<legacy_hal::wifi_error, std::vector<uint8_t>>
310 legacy_status_and_data =
311 legacy_hal_.lock()->readApfPacketFilterData(ifname_);
312 return {createWifiStatusFromLegacyError(legacy_status_and_data.first),
313 std::move(legacy_status_and_data.second)};
314}
315
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700316std::pair<WifiStatus, StaBackgroundScanCapabilities>
317WifiStaIface::getBackgroundScanCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700318 legacy_hal::wifi_error legacy_status;
319 legacy_hal::wifi_gscan_capabilities legacy_caps;
320 std::tie(legacy_status, legacy_caps) =
321 legacy_hal_.lock()->getGscanCapabilities(ifname_);
322 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
323 return {createWifiStatusFromLegacyError(legacy_status), {}};
324 }
325 StaBackgroundScanCapabilities hidl_caps;
326 if (!hidl_struct_util::convertLegacyGscanCapabilitiesToHidl(legacy_caps,
327 &hidl_caps)) {
328 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
329 }
330 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700331}
332
333std::pair<WifiStatus, std::vector<WifiChannelInMhz>>
Roshan Pius7f4574d2017-02-22 09:48:03 -0800334WifiStaIface::getValidFrequenciesForBandInternal(WifiBand band) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700335 static_assert(sizeof(WifiChannelInMhz) == sizeof(uint32_t),
336 "Size mismatch");
337 legacy_hal::wifi_error legacy_status;
338 std::vector<uint32_t> valid_frequencies;
339 std::tie(legacy_status, valid_frequencies) =
340 legacy_hal_.lock()->getValidFrequenciesForBand(
341 ifname_, hidl_struct_util::convertHidlWifiBandToLegacy(band));
342 return {createWifiStatusFromLegacyError(legacy_status), valid_frequencies};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700343}
344
345WifiStatus WifiStaIface::startBackgroundScanInternal(
Roshan Pius970f0312016-12-05 15:25:51 -0800346 uint32_t cmd_id, const StaBackgroundScanParameters& params) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700347 legacy_hal::wifi_scan_cmd_params legacy_params;
348 if (!hidl_struct_util::convertHidlGscanParamsToLegacy(params,
349 &legacy_params)) {
350 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
351 }
352 android::wp<WifiStaIface> weak_ptr_this(this);
353 const auto& on_failure_callback =
354 [weak_ptr_this](legacy_hal::wifi_request_id id) {
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 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
361 if (!callback->onBackgroundScanFailure(id).isOk()) {
362 LOG(ERROR)
363 << "Failed to invoke onBackgroundScanFailure callback";
364 }
365 }
366 };
367 const auto& on_results_callback =
368 [weak_ptr_this](
369 legacy_hal::wifi_request_id id,
370 const std::vector<legacy_hal::wifi_cached_scan_results>& results) {
371 const auto shared_ptr_this = weak_ptr_this.promote();
372 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
373 LOG(ERROR) << "Callback invoked on an invalid object";
374 return;
375 }
376 std::vector<StaScanData> hidl_scan_datas;
377 if (!hidl_struct_util::
378 convertLegacyVectorOfCachedGscanResultsToHidl(
379 results, &hidl_scan_datas)) {
380 LOG(ERROR) << "Failed to convert scan results to HIDL structs";
381 return;
382 }
383 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
384 if (!callback->onBackgroundScanResults(id, hidl_scan_datas)
385 .isOk()) {
386 LOG(ERROR)
387 << "Failed to invoke onBackgroundScanResults callback";
388 }
389 }
390 };
391 const auto& on_full_result_callback = [weak_ptr_this](
392 legacy_hal::wifi_request_id id,
393 const legacy_hal::
394 wifi_scan_result* result,
395 uint32_t buckets_scanned) {
Roshan Pius970f0312016-12-05 15:25:51 -0800396 const auto shared_ptr_this = weak_ptr_this.promote();
397 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700398 LOG(ERROR) << "Callback invoked on an invalid object";
399 return;
400 }
401 StaScanResult hidl_scan_result;
402 if (!hidl_struct_util::convertLegacyGscanResultToHidl(
403 *result, true, &hidl_scan_result)) {
404 LOG(ERROR) << "Failed to convert full scan results to HIDL structs";
405 return;
Roshan Pius970f0312016-12-05 15:25:51 -0800406 }
407 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700408 if (!callback
409 ->onBackgroundFullScanResult(id, buckets_scanned,
410 hidl_scan_result)
411 .isOk()) {
412 LOG(ERROR)
413 << "Failed to invoke onBackgroundFullScanResult callback";
414 }
Roshan Pius970f0312016-12-05 15:25:51 -0800415 }
Roshan Piusabcf78f2017-10-06 16:30:38 -0700416 };
417 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->startGscan(
418 ifname_, cmd_id, legacy_params, on_failure_callback,
419 on_results_callback, on_full_result_callback);
420 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700421}
422
Roshan Pius970f0312016-12-05 15:25:51 -0800423WifiStatus WifiStaIface::stopBackgroundScanInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700424 legacy_hal::wifi_error legacy_status =
425 legacy_hal_.lock()->stopGscan(ifname_, cmd_id);
426 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700427}
428
Roshan Pius970f0312016-12-05 15:25:51 -0800429WifiStatus WifiStaIface::enableLinkLayerStatsCollectionInternal(bool debug) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700430 legacy_hal::wifi_error legacy_status =
431 legacy_hal_.lock()->enableLinkLayerStats(ifname_, debug);
432 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700433}
434
435WifiStatus WifiStaIface::disableLinkLayerStatsCollectionInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700436 legacy_hal::wifi_error legacy_status =
437 legacy_hal_.lock()->disableLinkLayerStats(ifname_);
438 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700439}
440
441std::pair<WifiStatus, StaLinkLayerStats>
442WifiStaIface::getLinkLayerStatsInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700443 legacy_hal::wifi_error legacy_status;
444 legacy_hal::LinkLayerStats legacy_stats;
445 std::tie(legacy_status, legacy_stats) =
446 legacy_hal_.lock()->getLinkLayerStats(ifname_);
447 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
448 return {createWifiStatusFromLegacyError(legacy_status), {}};
449 }
450 StaLinkLayerStats hidl_stats;
451 if (!hidl_struct_util::convertLegacyLinkLayerStatsToHidl(legacy_stats,
452 &hidl_stats)) {
453 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
454 }
455 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_stats};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700456}
457
Roshan Piusd4767542016-12-06 10:04:05 -0800458WifiStatus WifiStaIface::startRssiMonitoringInternal(uint32_t cmd_id,
459 int32_t max_rssi,
460 int32_t min_rssi) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700461 android::wp<WifiStaIface> weak_ptr_this(this);
462 const auto& on_threshold_breached_callback =
463 [weak_ptr_this](legacy_hal::wifi_request_id id,
464 std::array<uint8_t, 6> bssid, int8_t rssi) {
465 const auto shared_ptr_this = weak_ptr_this.promote();
466 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
467 LOG(ERROR) << "Callback invoked on an invalid object";
468 return;
469 }
470 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
471 if (!callback->onRssiThresholdBreached(id, bssid, rssi)
472 .isOk()) {
473 LOG(ERROR)
474 << "Failed to invoke onRssiThresholdBreached callback";
475 }
476 }
477 };
478 legacy_hal::wifi_error legacy_status =
479 legacy_hal_.lock()->startRssiMonitoring(ifname_, cmd_id, max_rssi,
480 min_rssi,
481 on_threshold_breached_callback);
482 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusd4767542016-12-06 10:04:05 -0800483}
484
485WifiStatus WifiStaIface::stopRssiMonitoringInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700486 legacy_hal::wifi_error legacy_status =
487 legacy_hal_.lock()->stopRssiMonitoring(ifname_, cmd_id);
488 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusd4767542016-12-06 10:04:05 -0800489}
490
Roshan Pius26801cb2016-12-13 14:25:45 -0800491std::pair<WifiStatus, StaRoamingCapabilities>
492WifiStaIface::getRoamingCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700493 legacy_hal::wifi_error legacy_status;
494 legacy_hal::wifi_roaming_capabilities legacy_caps;
495 std::tie(legacy_status, legacy_caps) =
496 legacy_hal_.lock()->getRoamingCapabilities(ifname_);
497 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
498 return {createWifiStatusFromLegacyError(legacy_status), {}};
499 }
500 StaRoamingCapabilities hidl_caps;
501 if (!hidl_struct_util::convertLegacyRoamingCapabilitiesToHidl(legacy_caps,
502 &hidl_caps)) {
503 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
504 }
505 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Pius26801cb2016-12-13 14:25:45 -0800506}
507
508WifiStatus WifiStaIface::configureRoamingInternal(
509 const StaRoamingConfig& config) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700510 legacy_hal::wifi_roaming_config legacy_config;
511 if (!hidl_struct_util::convertHidlRoamingConfigToLegacy(config,
512 &legacy_config)) {
513 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
514 }
515 legacy_hal::wifi_error legacy_status =
516 legacy_hal_.lock()->configureRoaming(ifname_, legacy_config);
517 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius26801cb2016-12-13 14:25:45 -0800518}
519
520WifiStatus WifiStaIface::setRoamingStateInternal(StaRoamingState state) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700521 legacy_hal::wifi_error legacy_status =
522 legacy_hal_.lock()->enableFirmwareRoaming(
523 ifname_, hidl_struct_util::convertHidlRoamingStateToLegacy(state));
524 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius26801cb2016-12-13 14:25:45 -0800525}
526
Roshan Piusaf727c02017-01-11 15:37:25 -0800527WifiStatus WifiStaIface::enableNdOffloadInternal(bool enable) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700528 legacy_hal::wifi_error legacy_status =
529 legacy_hal_.lock()->configureNdOffload(ifname_, enable);
530 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusaf727c02017-01-11 15:37:25 -0800531}
532
Roshan Pius9a9869a2017-01-11 16:42:16 -0800533WifiStatus WifiStaIface::startSendingKeepAlivePacketsInternal(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700534 uint32_t cmd_id, const std::vector<uint8_t>& ip_packet_data,
535 uint16_t /* ether_type */, const std::array<uint8_t, 6>& src_address,
536 const std::array<uint8_t, 6>& dst_address, uint32_t period_in_ms) {
537 legacy_hal::wifi_error legacy_status =
538 legacy_hal_.lock()->startSendingOffloadedPacket(
539 ifname_, cmd_id, ip_packet_data, src_address, dst_address,
540 period_in_ms);
541 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800542}
543
544WifiStatus WifiStaIface::stopSendingKeepAlivePacketsInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700545 legacy_hal::wifi_error legacy_status =
546 legacy_hal_.lock()->stopSendingOffloadedPacket(ifname_, cmd_id);
547 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800548}
549
Roshan Piusd37341f2017-01-31 13:13:28 -0800550WifiStatus WifiStaIface::setScanningMacOuiInternal(
551 const std::array<uint8_t, 3>& oui) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700552 legacy_hal::wifi_error legacy_status =
553 legacy_hal_.lock()->setScanningMacOui(ifname_, oui);
554 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius795bb812017-02-01 13:09:08 -0800555}
556
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700557WifiStatus WifiStaIface::startDebugPacketFateMonitoringInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700558 legacy_hal::wifi_error legacy_status =
559 legacy_hal_.lock()->startPktFateMonitoring(ifname_);
560 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700561}
562
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700563std::pair<WifiStatus, std::vector<WifiDebugTxPacketFateReport>>
564WifiStaIface::getDebugTxPacketFatesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700565 legacy_hal::wifi_error legacy_status;
566 std::vector<legacy_hal::wifi_tx_report> legacy_fates;
567 std::tie(legacy_status, legacy_fates) =
568 legacy_hal_.lock()->getTxPktFates(ifname_);
569 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
570 return {createWifiStatusFromLegacyError(legacy_status), {}};
571 }
572 std::vector<WifiDebugTxPacketFateReport> hidl_fates;
573 if (!hidl_struct_util::convertLegacyVectorOfDebugTxPacketFateToHidl(
574 legacy_fates, &hidl_fates)) {
575 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
576 }
577 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700578}
579
580std::pair<WifiStatus, std::vector<WifiDebugRxPacketFateReport>>
581WifiStaIface::getDebugRxPacketFatesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700582 legacy_hal::wifi_error legacy_status;
583 std::vector<legacy_hal::wifi_rx_report> legacy_fates;
584 std::tie(legacy_status, legacy_fates) =
585 legacy_hal_.lock()->getRxPktFates(ifname_);
586 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
587 return {createWifiStatusFromLegacyError(legacy_status), {}};
588 }
589 std::vector<WifiDebugRxPacketFateReport> hidl_fates;
590 if (!hidl_struct_util::convertLegacyVectorOfDebugRxPacketFateToHidl(
591 legacy_fates, &hidl_fates)) {
592 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
593 }
594 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700595}
596
Roshan Pius3e2d6712016-10-06 13:16:23 -0700597} // namespace implementation
Etan Cohen6ce50902017-09-14 07:30:57 -0700598} // namespace V1_2
Roshan Pius3e2d6712016-10-06 13:16:23 -0700599} // namespace wifi
600} // namespace hardware
601} // namespace android