blob: b0fa1aef6b485ea31d1e401e7adab194cf92e09a [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 {
Jong Wook Kimda830c92018-07-23 15:29:38 -070027namespace V1_3 {
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
xshue9873252018-08-07 11:04:34 -0700155Return<void> WifiStaIface::getLinkLayerStats_1_3(
156 getLinkLayerStats_1_3_cb hidl_status_cb) {
157 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
158 &WifiStaIface::getLinkLayerStatsInternal_1_3,
159 hidl_status_cb);
160}
161
Roshan Piusd4767542016-12-06 10:04:05 -0800162Return<void> WifiStaIface::startRssiMonitoring(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700163 uint32_t cmd_id, int32_t max_rssi, int32_t min_rssi,
Roshan Piusd4767542016-12-06 10:04:05 -0800164 startRssiMonitoring_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700165 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
166 &WifiStaIface::startRssiMonitoringInternal,
167 hidl_status_cb, cmd_id, max_rssi, min_rssi);
Roshan Piusd4767542016-12-06 10:04:05 -0800168}
169
170Return<void> WifiStaIface::stopRssiMonitoring(
171 uint32_t cmd_id, stopRssiMonitoring_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700172 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
173 &WifiStaIface::stopRssiMonitoringInternal,
174 hidl_status_cb, cmd_id);
Roshan Piusd4767542016-12-06 10:04:05 -0800175}
176
Roshan Pius26801cb2016-12-13 14:25:45 -0800177Return<void> WifiStaIface::getRoamingCapabilities(
178 getRoamingCapabilities_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700179 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
180 &WifiStaIface::getRoamingCapabilitiesInternal,
181 hidl_status_cb);
Roshan Pius26801cb2016-12-13 14:25:45 -0800182}
183
184Return<void> WifiStaIface::configureRoaming(
185 const StaRoamingConfig& config, configureRoaming_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700186 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
187 &WifiStaIface::configureRoamingInternal,
188 hidl_status_cb, config);
Roshan Pius26801cb2016-12-13 14:25:45 -0800189}
190
191Return<void> WifiStaIface::setRoamingState(StaRoamingState state,
192 setRoamingState_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700193 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
194 &WifiStaIface::setRoamingStateInternal,
195 hidl_status_cb, state);
Roshan Pius26801cb2016-12-13 14:25:45 -0800196}
197
Roshan Piusaf727c02017-01-11 15:37:25 -0800198Return<void> WifiStaIface::enableNdOffload(bool enable,
199 enableNdOffload_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700200 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
201 &WifiStaIface::enableNdOffloadInternal,
202 hidl_status_cb, enable);
Roshan Piusaf727c02017-01-11 15:37:25 -0800203}
204
Roshan Pius9a9869a2017-01-11 16:42:16 -0800205Return<void> WifiStaIface::startSendingKeepAlivePackets(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700206 uint32_t cmd_id, const hidl_vec<uint8_t>& ip_packet_data,
207 uint16_t ether_type, const hidl_array<uint8_t, 6>& src_address,
208 const hidl_array<uint8_t, 6>& dst_address, uint32_t period_in_ms,
Roshan Pius9a9869a2017-01-11 16:42:16 -0800209 startSendingKeepAlivePackets_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700210 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
211 &WifiStaIface::startSendingKeepAlivePacketsInternal,
212 hidl_status_cb, cmd_id, ip_packet_data, ether_type,
213 src_address, dst_address, period_in_ms);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800214}
215
216Return<void> WifiStaIface::stopSendingKeepAlivePackets(
217 uint32_t cmd_id, stopSendingKeepAlivePackets_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700218 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
219 &WifiStaIface::stopSendingKeepAlivePacketsInternal,
220 hidl_status_cb, cmd_id);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800221}
222
Roshan Pius795bb812017-02-01 13:09:08 -0800223Return<void> WifiStaIface::setScanningMacOui(
224 const hidl_array<uint8_t, 3>& oui, setScanningMacOui_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700225 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
226 &WifiStaIface::setScanningMacOuiInternal,
227 hidl_status_cb, oui);
Roshan Pius795bb812017-02-01 13:09:08 -0800228}
229
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700230Return<void> WifiStaIface::startDebugPacketFateMonitoring(
231 startDebugPacketFateMonitoring_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700232 return validateAndCall(
233 this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
234 &WifiStaIface::startDebugPacketFateMonitoringInternal, hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700235}
236
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700237Return<void> WifiStaIface::getDebugTxPacketFates(
238 getDebugTxPacketFates_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700239 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
240 &WifiStaIface::getDebugTxPacketFatesInternal,
241 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700242}
243
244Return<void> WifiStaIface::getDebugRxPacketFates(
245 getDebugRxPacketFates_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700246 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
247 &WifiStaIface::getDebugRxPacketFatesInternal,
248 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700249}
250
Jong Wook Kimb9f0ff92018-03-16 16:21:49 -0700251Return<void> WifiStaIface::setMacAddress(const hidl_array<uint8_t, 6>& mac,
252 setMacAddress_cb hidl_status_cb) {
253 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
254 &WifiStaIface::setMacAddressInternal, hidl_status_cb,
255 mac);
256}
257
Roshan Pius907d4a22016-10-27 12:48:12 -0700258std::pair<WifiStatus, std::string> WifiStaIface::getNameInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700259 return {createWifiStatus(WifiStatusCode::SUCCESS), ifname_};
Roshan Pius907d4a22016-10-27 12:48:12 -0700260}
261
262std::pair<WifiStatus, IfaceType> WifiStaIface::getTypeInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700263 return {createWifiStatus(WifiStatusCode::SUCCESS), IfaceType::STA};
Roshan Pius3e2d6712016-10-06 13:16:23 -0700264}
265
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700266WifiStatus WifiStaIface::registerEventCallbackInternal(
267 const sp<IWifiStaIfaceEventCallback>& callback) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700268 if (!event_cb_handler_.addCallback(callback)) {
269 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
270 }
271 return createWifiStatus(WifiStatusCode::SUCCESS);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700272}
273
274std::pair<WifiStatus, uint32_t> WifiStaIface::getCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700275 legacy_hal::wifi_error legacy_status;
276 uint32_t legacy_feature_set;
277 std::tie(legacy_status, legacy_feature_set) =
278 legacy_hal_.lock()->getSupportedFeatureSet(ifname_);
279 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
280 return {createWifiStatusFromLegacyError(legacy_status), 0};
281 }
282 uint32_t legacy_logger_feature_set;
283 std::tie(legacy_status, legacy_logger_feature_set) =
284 legacy_hal_.lock()->getLoggerSupportedFeatureSet(ifname_);
285 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
286 // some devices don't support querying logger feature set
287 legacy_logger_feature_set = 0;
288 }
289 uint32_t hidl_caps;
290 if (!hidl_struct_util::convertLegacyFeaturesToHidlStaCapabilities(
291 legacy_feature_set, legacy_logger_feature_set, &hidl_caps)) {
292 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), 0};
293 }
294 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700295}
296
297std::pair<WifiStatus, StaApfPacketFilterCapabilities>
298WifiStaIface::getApfPacketFilterCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700299 legacy_hal::wifi_error legacy_status;
300 legacy_hal::PacketFilterCapabilities legacy_caps;
301 std::tie(legacy_status, legacy_caps) =
302 legacy_hal_.lock()->getPacketFilterCapabilities(ifname_);
303 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
304 return {createWifiStatusFromLegacyError(legacy_status), {}};
305 }
306 StaApfPacketFilterCapabilities hidl_caps;
307 if (!hidl_struct_util::convertLegacyApfCapabilitiesToHidl(legacy_caps,
308 &hidl_caps)) {
309 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
310 }
311 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700312}
313
314WifiStatus WifiStaIface::installApfPacketFilterInternal(
Roshan Pius970f0312016-12-05 15:25:51 -0800315 uint32_t /* cmd_id */, const std::vector<uint8_t>& program) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700316 legacy_hal::wifi_error legacy_status =
317 legacy_hal_.lock()->setPacketFilter(ifname_, program);
318 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700319}
320
Bernie Innocenti7e6f71a2018-03-07 00:17:50 +0900321std::pair<WifiStatus, std::vector<uint8_t>>
322WifiStaIface::readApfPacketFilterDataInternal() {
323 const std::pair<legacy_hal::wifi_error, std::vector<uint8_t>>
324 legacy_status_and_data =
325 legacy_hal_.lock()->readApfPacketFilterData(ifname_);
326 return {createWifiStatusFromLegacyError(legacy_status_and_data.first),
327 std::move(legacy_status_and_data.second)};
328}
329
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700330std::pair<WifiStatus, StaBackgroundScanCapabilities>
331WifiStaIface::getBackgroundScanCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700332 legacy_hal::wifi_error legacy_status;
333 legacy_hal::wifi_gscan_capabilities legacy_caps;
334 std::tie(legacy_status, legacy_caps) =
335 legacy_hal_.lock()->getGscanCapabilities(ifname_);
336 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
337 return {createWifiStatusFromLegacyError(legacy_status), {}};
338 }
339 StaBackgroundScanCapabilities hidl_caps;
340 if (!hidl_struct_util::convertLegacyGscanCapabilitiesToHidl(legacy_caps,
341 &hidl_caps)) {
342 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
343 }
344 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700345}
346
347std::pair<WifiStatus, std::vector<WifiChannelInMhz>>
Roshan Pius7f4574d2017-02-22 09:48:03 -0800348WifiStaIface::getValidFrequenciesForBandInternal(WifiBand band) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700349 static_assert(sizeof(WifiChannelInMhz) == sizeof(uint32_t),
350 "Size mismatch");
351 legacy_hal::wifi_error legacy_status;
352 std::vector<uint32_t> valid_frequencies;
353 std::tie(legacy_status, valid_frequencies) =
354 legacy_hal_.lock()->getValidFrequenciesForBand(
355 ifname_, hidl_struct_util::convertHidlWifiBandToLegacy(band));
356 return {createWifiStatusFromLegacyError(legacy_status), valid_frequencies};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700357}
358
359WifiStatus WifiStaIface::startBackgroundScanInternal(
Roshan Pius970f0312016-12-05 15:25:51 -0800360 uint32_t cmd_id, const StaBackgroundScanParameters& params) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700361 legacy_hal::wifi_scan_cmd_params legacy_params;
362 if (!hidl_struct_util::convertHidlGscanParamsToLegacy(params,
363 &legacy_params)) {
364 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
365 }
366 android::wp<WifiStaIface> weak_ptr_this(this);
367 const auto& on_failure_callback =
368 [weak_ptr_this](legacy_hal::wifi_request_id id) {
369 const auto shared_ptr_this = weak_ptr_this.promote();
370 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
371 LOG(ERROR) << "Callback invoked on an invalid object";
372 return;
373 }
374 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
375 if (!callback->onBackgroundScanFailure(id).isOk()) {
376 LOG(ERROR)
377 << "Failed to invoke onBackgroundScanFailure callback";
378 }
379 }
380 };
381 const auto& on_results_callback =
382 [weak_ptr_this](
383 legacy_hal::wifi_request_id id,
384 const std::vector<legacy_hal::wifi_cached_scan_results>& results) {
385 const auto shared_ptr_this = weak_ptr_this.promote();
386 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
387 LOG(ERROR) << "Callback invoked on an invalid object";
388 return;
389 }
390 std::vector<StaScanData> hidl_scan_datas;
391 if (!hidl_struct_util::
392 convertLegacyVectorOfCachedGscanResultsToHidl(
393 results, &hidl_scan_datas)) {
394 LOG(ERROR) << "Failed to convert scan results to HIDL structs";
395 return;
396 }
397 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
398 if (!callback->onBackgroundScanResults(id, hidl_scan_datas)
399 .isOk()) {
400 LOG(ERROR)
401 << "Failed to invoke onBackgroundScanResults callback";
402 }
403 }
404 };
405 const auto& on_full_result_callback = [weak_ptr_this](
406 legacy_hal::wifi_request_id id,
407 const legacy_hal::
408 wifi_scan_result* result,
409 uint32_t buckets_scanned) {
Roshan Pius970f0312016-12-05 15:25:51 -0800410 const auto shared_ptr_this = weak_ptr_this.promote();
411 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700412 LOG(ERROR) << "Callback invoked on an invalid object";
413 return;
414 }
415 StaScanResult hidl_scan_result;
416 if (!hidl_struct_util::convertLegacyGscanResultToHidl(
417 *result, true, &hidl_scan_result)) {
418 LOG(ERROR) << "Failed to convert full scan results to HIDL structs";
419 return;
Roshan Pius970f0312016-12-05 15:25:51 -0800420 }
421 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700422 if (!callback
423 ->onBackgroundFullScanResult(id, buckets_scanned,
424 hidl_scan_result)
425 .isOk()) {
426 LOG(ERROR)
427 << "Failed to invoke onBackgroundFullScanResult callback";
428 }
Roshan Pius970f0312016-12-05 15:25:51 -0800429 }
Roshan Piusabcf78f2017-10-06 16:30:38 -0700430 };
431 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->startGscan(
432 ifname_, cmd_id, legacy_params, on_failure_callback,
433 on_results_callback, on_full_result_callback);
434 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700435}
436
Roshan Pius970f0312016-12-05 15:25:51 -0800437WifiStatus WifiStaIface::stopBackgroundScanInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700438 legacy_hal::wifi_error legacy_status =
439 legacy_hal_.lock()->stopGscan(ifname_, cmd_id);
440 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700441}
442
Roshan Pius970f0312016-12-05 15:25:51 -0800443WifiStatus WifiStaIface::enableLinkLayerStatsCollectionInternal(bool debug) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700444 legacy_hal::wifi_error legacy_status =
445 legacy_hal_.lock()->enableLinkLayerStats(ifname_, debug);
446 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700447}
448
449WifiStatus WifiStaIface::disableLinkLayerStatsCollectionInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700450 legacy_hal::wifi_error legacy_status =
451 legacy_hal_.lock()->disableLinkLayerStats(ifname_);
452 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700453}
454
xshue9873252018-08-07 11:04:34 -0700455std::pair<WifiStatus, V1_0::StaLinkLayerStats>
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700456WifiStaIface::getLinkLayerStatsInternal() {
xshue9873252018-08-07 11:04:34 -0700457 return {createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED), {}};
458}
459
460std::pair<WifiStatus, V1_3::StaLinkLayerStats>
461WifiStaIface::getLinkLayerStatsInternal_1_3() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700462 legacy_hal::wifi_error legacy_status;
463 legacy_hal::LinkLayerStats legacy_stats;
464 std::tie(legacy_status, legacy_stats) =
465 legacy_hal_.lock()->getLinkLayerStats(ifname_);
466 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
467 return {createWifiStatusFromLegacyError(legacy_status), {}};
468 }
xshue9873252018-08-07 11:04:34 -0700469 V1_3::StaLinkLayerStats hidl_stats;
Roshan Piusabcf78f2017-10-06 16:30:38 -0700470 if (!hidl_struct_util::convertLegacyLinkLayerStatsToHidl(legacy_stats,
471 &hidl_stats)) {
472 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
473 }
474 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_stats};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700475}
476
Roshan Piusd4767542016-12-06 10:04:05 -0800477WifiStatus WifiStaIface::startRssiMonitoringInternal(uint32_t cmd_id,
478 int32_t max_rssi,
479 int32_t min_rssi) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700480 android::wp<WifiStaIface> weak_ptr_this(this);
481 const auto& on_threshold_breached_callback =
482 [weak_ptr_this](legacy_hal::wifi_request_id id,
483 std::array<uint8_t, 6> bssid, int8_t rssi) {
484 const auto shared_ptr_this = weak_ptr_this.promote();
485 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
486 LOG(ERROR) << "Callback invoked on an invalid object";
487 return;
488 }
489 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
490 if (!callback->onRssiThresholdBreached(id, bssid, rssi)
491 .isOk()) {
492 LOG(ERROR)
493 << "Failed to invoke onRssiThresholdBreached callback";
494 }
495 }
496 };
497 legacy_hal::wifi_error legacy_status =
498 legacy_hal_.lock()->startRssiMonitoring(ifname_, cmd_id, max_rssi,
499 min_rssi,
500 on_threshold_breached_callback);
501 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusd4767542016-12-06 10:04:05 -0800502}
503
504WifiStatus WifiStaIface::stopRssiMonitoringInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700505 legacy_hal::wifi_error legacy_status =
506 legacy_hal_.lock()->stopRssiMonitoring(ifname_, cmd_id);
507 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusd4767542016-12-06 10:04:05 -0800508}
509
Roshan Pius26801cb2016-12-13 14:25:45 -0800510std::pair<WifiStatus, StaRoamingCapabilities>
511WifiStaIface::getRoamingCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700512 legacy_hal::wifi_error legacy_status;
513 legacy_hal::wifi_roaming_capabilities legacy_caps;
514 std::tie(legacy_status, legacy_caps) =
515 legacy_hal_.lock()->getRoamingCapabilities(ifname_);
516 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
517 return {createWifiStatusFromLegacyError(legacy_status), {}};
518 }
519 StaRoamingCapabilities hidl_caps;
520 if (!hidl_struct_util::convertLegacyRoamingCapabilitiesToHidl(legacy_caps,
521 &hidl_caps)) {
522 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
523 }
524 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Pius26801cb2016-12-13 14:25:45 -0800525}
526
527WifiStatus WifiStaIface::configureRoamingInternal(
528 const StaRoamingConfig& config) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700529 legacy_hal::wifi_roaming_config legacy_config;
530 if (!hidl_struct_util::convertHidlRoamingConfigToLegacy(config,
531 &legacy_config)) {
532 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
533 }
534 legacy_hal::wifi_error legacy_status =
535 legacy_hal_.lock()->configureRoaming(ifname_, legacy_config);
536 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius26801cb2016-12-13 14:25:45 -0800537}
538
539WifiStatus WifiStaIface::setRoamingStateInternal(StaRoamingState state) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700540 legacy_hal::wifi_error legacy_status =
541 legacy_hal_.lock()->enableFirmwareRoaming(
542 ifname_, hidl_struct_util::convertHidlRoamingStateToLegacy(state));
543 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius26801cb2016-12-13 14:25:45 -0800544}
545
Roshan Piusaf727c02017-01-11 15:37:25 -0800546WifiStatus WifiStaIface::enableNdOffloadInternal(bool enable) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700547 legacy_hal::wifi_error legacy_status =
548 legacy_hal_.lock()->configureNdOffload(ifname_, enable);
549 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusaf727c02017-01-11 15:37:25 -0800550}
551
Roshan Pius9a9869a2017-01-11 16:42:16 -0800552WifiStatus WifiStaIface::startSendingKeepAlivePacketsInternal(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700553 uint32_t cmd_id, const std::vector<uint8_t>& ip_packet_data,
554 uint16_t /* ether_type */, const std::array<uint8_t, 6>& src_address,
555 const std::array<uint8_t, 6>& dst_address, uint32_t period_in_ms) {
556 legacy_hal::wifi_error legacy_status =
557 legacy_hal_.lock()->startSendingOffloadedPacket(
558 ifname_, cmd_id, ip_packet_data, src_address, dst_address,
559 period_in_ms);
560 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800561}
562
563WifiStatus WifiStaIface::stopSendingKeepAlivePacketsInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700564 legacy_hal::wifi_error legacy_status =
565 legacy_hal_.lock()->stopSendingOffloadedPacket(ifname_, cmd_id);
566 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800567}
568
Roshan Piusd37341f2017-01-31 13:13:28 -0800569WifiStatus WifiStaIface::setScanningMacOuiInternal(
570 const std::array<uint8_t, 3>& oui) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700571 legacy_hal::wifi_error legacy_status =
572 legacy_hal_.lock()->setScanningMacOui(ifname_, oui);
573 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius795bb812017-02-01 13:09:08 -0800574}
575
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700576WifiStatus WifiStaIface::startDebugPacketFateMonitoringInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700577 legacy_hal::wifi_error legacy_status =
578 legacy_hal_.lock()->startPktFateMonitoring(ifname_);
579 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700580}
581
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700582std::pair<WifiStatus, std::vector<WifiDebugTxPacketFateReport>>
583WifiStaIface::getDebugTxPacketFatesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700584 legacy_hal::wifi_error legacy_status;
585 std::vector<legacy_hal::wifi_tx_report> legacy_fates;
586 std::tie(legacy_status, legacy_fates) =
587 legacy_hal_.lock()->getTxPktFates(ifname_);
588 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
589 return {createWifiStatusFromLegacyError(legacy_status), {}};
590 }
591 std::vector<WifiDebugTxPacketFateReport> hidl_fates;
592 if (!hidl_struct_util::convertLegacyVectorOfDebugTxPacketFateToHidl(
593 legacy_fates, &hidl_fates)) {
594 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
595 }
596 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700597}
598
599std::pair<WifiStatus, std::vector<WifiDebugRxPacketFateReport>>
600WifiStaIface::getDebugRxPacketFatesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700601 legacy_hal::wifi_error legacy_status;
602 std::vector<legacy_hal::wifi_rx_report> legacy_fates;
603 std::tie(legacy_status, legacy_fates) =
604 legacy_hal_.lock()->getRxPktFates(ifname_);
605 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
606 return {createWifiStatusFromLegacyError(legacy_status), {}};
607 }
608 std::vector<WifiDebugRxPacketFateReport> hidl_fates;
609 if (!hidl_struct_util::convertLegacyVectorOfDebugRxPacketFateToHidl(
610 legacy_fates, &hidl_fates)) {
611 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
612 }
613 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700614}
615
Jong Wook Kimb9f0ff92018-03-16 16:21:49 -0700616WifiStatus WifiStaIface::setMacAddressInternal(
617 const std::array<uint8_t, 6>& mac) {
618 if (!iface_tool_.SetWifiUpState(false)) {
619 LOG(ERROR) << "SetWifiUpState(false) failed.";
620 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
621 }
622
623 if (!iface_tool_.SetMacAddress(ifname_.c_str(), mac)) {
624 LOG(ERROR) << "SetMacAddress failed.";
625 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
626 }
627
628 if (!iface_tool_.SetWifiUpState(true)) {
629 LOG(ERROR) << "SetWifiUpState(true) failed.";
630 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
631 }
632 LOG(DEBUG) << "Successfully SetMacAddress.";
633 return createWifiStatus(WifiStatusCode::SUCCESS);
634}
635
Roshan Pius3e2d6712016-10-06 13:16:23 -0700636} // namespace implementation
Jong Wook Kimda830c92018-07-23 15:29:38 -0700637} // namespace V1_3
Roshan Pius3e2d6712016-10-06 13:16:23 -0700638} // namespace wifi
639} // namespace hardware
640} // namespace android