blob: f7157a34afc3c64c014e57c31f5433c2a92d4060 [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
Jong Wook Kim0ee77432018-08-08 18:57:26 -0700258Return<void> WifiStaIface::getFactoryMacAddress(
259 getFactoryMacAddress_cb hidl_status_cb) {
260 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
261 &WifiStaIface::getFactoryMacAddressInternal,
262 hidl_status_cb);
263}
264
Roshan Pius907d4a22016-10-27 12:48:12 -0700265std::pair<WifiStatus, std::string> WifiStaIface::getNameInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700266 return {createWifiStatus(WifiStatusCode::SUCCESS), ifname_};
Roshan Pius907d4a22016-10-27 12:48:12 -0700267}
268
269std::pair<WifiStatus, IfaceType> WifiStaIface::getTypeInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700270 return {createWifiStatus(WifiStatusCode::SUCCESS), IfaceType::STA};
Roshan Pius3e2d6712016-10-06 13:16:23 -0700271}
272
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700273WifiStatus WifiStaIface::registerEventCallbackInternal(
274 const sp<IWifiStaIfaceEventCallback>& callback) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700275 if (!event_cb_handler_.addCallback(callback)) {
276 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
277 }
278 return createWifiStatus(WifiStatusCode::SUCCESS);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700279}
280
281std::pair<WifiStatus, uint32_t> WifiStaIface::getCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700282 legacy_hal::wifi_error legacy_status;
283 uint32_t legacy_feature_set;
284 std::tie(legacy_status, legacy_feature_set) =
285 legacy_hal_.lock()->getSupportedFeatureSet(ifname_);
286 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
287 return {createWifiStatusFromLegacyError(legacy_status), 0};
288 }
289 uint32_t legacy_logger_feature_set;
290 std::tie(legacy_status, legacy_logger_feature_set) =
291 legacy_hal_.lock()->getLoggerSupportedFeatureSet(ifname_);
292 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
293 // some devices don't support querying logger feature set
294 legacy_logger_feature_set = 0;
295 }
296 uint32_t hidl_caps;
297 if (!hidl_struct_util::convertLegacyFeaturesToHidlStaCapabilities(
298 legacy_feature_set, legacy_logger_feature_set, &hidl_caps)) {
299 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), 0};
300 }
301 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700302}
303
304std::pair<WifiStatus, StaApfPacketFilterCapabilities>
305WifiStaIface::getApfPacketFilterCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700306 legacy_hal::wifi_error legacy_status;
307 legacy_hal::PacketFilterCapabilities legacy_caps;
308 std::tie(legacy_status, legacy_caps) =
309 legacy_hal_.lock()->getPacketFilterCapabilities(ifname_);
310 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
311 return {createWifiStatusFromLegacyError(legacy_status), {}};
312 }
313 StaApfPacketFilterCapabilities hidl_caps;
314 if (!hidl_struct_util::convertLegacyApfCapabilitiesToHidl(legacy_caps,
315 &hidl_caps)) {
316 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
317 }
318 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700319}
320
321WifiStatus WifiStaIface::installApfPacketFilterInternal(
Roshan Pius970f0312016-12-05 15:25:51 -0800322 uint32_t /* cmd_id */, const std::vector<uint8_t>& program) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700323 legacy_hal::wifi_error legacy_status =
324 legacy_hal_.lock()->setPacketFilter(ifname_, program);
325 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700326}
327
Bernie Innocenti7e6f71a2018-03-07 00:17:50 +0900328std::pair<WifiStatus, std::vector<uint8_t>>
329WifiStaIface::readApfPacketFilterDataInternal() {
330 const std::pair<legacy_hal::wifi_error, std::vector<uint8_t>>
331 legacy_status_and_data =
332 legacy_hal_.lock()->readApfPacketFilterData(ifname_);
333 return {createWifiStatusFromLegacyError(legacy_status_and_data.first),
334 std::move(legacy_status_and_data.second)};
335}
336
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700337std::pair<WifiStatus, StaBackgroundScanCapabilities>
338WifiStaIface::getBackgroundScanCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700339 legacy_hal::wifi_error legacy_status;
340 legacy_hal::wifi_gscan_capabilities legacy_caps;
341 std::tie(legacy_status, legacy_caps) =
342 legacy_hal_.lock()->getGscanCapabilities(ifname_);
343 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
344 return {createWifiStatusFromLegacyError(legacy_status), {}};
345 }
346 StaBackgroundScanCapabilities hidl_caps;
347 if (!hidl_struct_util::convertLegacyGscanCapabilitiesToHidl(legacy_caps,
348 &hidl_caps)) {
349 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
350 }
351 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700352}
353
354std::pair<WifiStatus, std::vector<WifiChannelInMhz>>
Roshan Pius7f4574d2017-02-22 09:48:03 -0800355WifiStaIface::getValidFrequenciesForBandInternal(WifiBand band) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700356 static_assert(sizeof(WifiChannelInMhz) == sizeof(uint32_t),
357 "Size mismatch");
358 legacy_hal::wifi_error legacy_status;
359 std::vector<uint32_t> valid_frequencies;
360 std::tie(legacy_status, valid_frequencies) =
361 legacy_hal_.lock()->getValidFrequenciesForBand(
362 ifname_, hidl_struct_util::convertHidlWifiBandToLegacy(band));
363 return {createWifiStatusFromLegacyError(legacy_status), valid_frequencies};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700364}
365
366WifiStatus WifiStaIface::startBackgroundScanInternal(
Roshan Pius970f0312016-12-05 15:25:51 -0800367 uint32_t cmd_id, const StaBackgroundScanParameters& params) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700368 legacy_hal::wifi_scan_cmd_params legacy_params;
369 if (!hidl_struct_util::convertHidlGscanParamsToLegacy(params,
370 &legacy_params)) {
371 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
372 }
373 android::wp<WifiStaIface> weak_ptr_this(this);
374 const auto& on_failure_callback =
375 [weak_ptr_this](legacy_hal::wifi_request_id id) {
376 const auto shared_ptr_this = weak_ptr_this.promote();
377 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
378 LOG(ERROR) << "Callback invoked on an invalid object";
379 return;
380 }
381 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
382 if (!callback->onBackgroundScanFailure(id).isOk()) {
383 LOG(ERROR)
384 << "Failed to invoke onBackgroundScanFailure callback";
385 }
386 }
387 };
388 const auto& on_results_callback =
389 [weak_ptr_this](
390 legacy_hal::wifi_request_id id,
391 const std::vector<legacy_hal::wifi_cached_scan_results>& results) {
392 const auto shared_ptr_this = weak_ptr_this.promote();
393 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
394 LOG(ERROR) << "Callback invoked on an invalid object";
395 return;
396 }
397 std::vector<StaScanData> hidl_scan_datas;
398 if (!hidl_struct_util::
399 convertLegacyVectorOfCachedGscanResultsToHidl(
400 results, &hidl_scan_datas)) {
401 LOG(ERROR) << "Failed to convert scan results to HIDL structs";
402 return;
403 }
404 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
405 if (!callback->onBackgroundScanResults(id, hidl_scan_datas)
406 .isOk()) {
407 LOG(ERROR)
408 << "Failed to invoke onBackgroundScanResults callback";
409 }
410 }
411 };
412 const auto& on_full_result_callback = [weak_ptr_this](
413 legacy_hal::wifi_request_id id,
414 const legacy_hal::
415 wifi_scan_result* result,
416 uint32_t buckets_scanned) {
Roshan Pius970f0312016-12-05 15:25:51 -0800417 const auto shared_ptr_this = weak_ptr_this.promote();
418 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700419 LOG(ERROR) << "Callback invoked on an invalid object";
420 return;
421 }
422 StaScanResult hidl_scan_result;
423 if (!hidl_struct_util::convertLegacyGscanResultToHidl(
424 *result, true, &hidl_scan_result)) {
425 LOG(ERROR) << "Failed to convert full scan results to HIDL structs";
426 return;
Roshan Pius970f0312016-12-05 15:25:51 -0800427 }
428 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700429 if (!callback
430 ->onBackgroundFullScanResult(id, buckets_scanned,
431 hidl_scan_result)
432 .isOk()) {
433 LOG(ERROR)
434 << "Failed to invoke onBackgroundFullScanResult callback";
435 }
Roshan Pius970f0312016-12-05 15:25:51 -0800436 }
Roshan Piusabcf78f2017-10-06 16:30:38 -0700437 };
438 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->startGscan(
439 ifname_, cmd_id, legacy_params, on_failure_callback,
440 on_results_callback, on_full_result_callback);
441 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700442}
443
Roshan Pius970f0312016-12-05 15:25:51 -0800444WifiStatus WifiStaIface::stopBackgroundScanInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700445 legacy_hal::wifi_error legacy_status =
446 legacy_hal_.lock()->stopGscan(ifname_, cmd_id);
447 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700448}
449
Roshan Pius970f0312016-12-05 15:25:51 -0800450WifiStatus WifiStaIface::enableLinkLayerStatsCollectionInternal(bool debug) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700451 legacy_hal::wifi_error legacy_status =
452 legacy_hal_.lock()->enableLinkLayerStats(ifname_, debug);
453 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700454}
455
456WifiStatus WifiStaIface::disableLinkLayerStatsCollectionInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700457 legacy_hal::wifi_error legacy_status =
458 legacy_hal_.lock()->disableLinkLayerStats(ifname_);
459 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700460}
461
xshue9873252018-08-07 11:04:34 -0700462std::pair<WifiStatus, V1_0::StaLinkLayerStats>
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700463WifiStaIface::getLinkLayerStatsInternal() {
xshue9873252018-08-07 11:04:34 -0700464 return {createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED), {}};
465}
466
467std::pair<WifiStatus, V1_3::StaLinkLayerStats>
468WifiStaIface::getLinkLayerStatsInternal_1_3() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700469 legacy_hal::wifi_error legacy_status;
470 legacy_hal::LinkLayerStats legacy_stats;
471 std::tie(legacy_status, legacy_stats) =
472 legacy_hal_.lock()->getLinkLayerStats(ifname_);
473 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
474 return {createWifiStatusFromLegacyError(legacy_status), {}};
475 }
xshue9873252018-08-07 11:04:34 -0700476 V1_3::StaLinkLayerStats hidl_stats;
Roshan Piusabcf78f2017-10-06 16:30:38 -0700477 if (!hidl_struct_util::convertLegacyLinkLayerStatsToHidl(legacy_stats,
478 &hidl_stats)) {
479 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
480 }
481 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_stats};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700482}
483
Roshan Piusd4767542016-12-06 10:04:05 -0800484WifiStatus WifiStaIface::startRssiMonitoringInternal(uint32_t cmd_id,
485 int32_t max_rssi,
486 int32_t min_rssi) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700487 android::wp<WifiStaIface> weak_ptr_this(this);
488 const auto& on_threshold_breached_callback =
489 [weak_ptr_this](legacy_hal::wifi_request_id id,
490 std::array<uint8_t, 6> bssid, int8_t rssi) {
491 const auto shared_ptr_this = weak_ptr_this.promote();
492 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
493 LOG(ERROR) << "Callback invoked on an invalid object";
494 return;
495 }
496 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
497 if (!callback->onRssiThresholdBreached(id, bssid, rssi)
498 .isOk()) {
499 LOG(ERROR)
500 << "Failed to invoke onRssiThresholdBreached callback";
501 }
502 }
503 };
504 legacy_hal::wifi_error legacy_status =
505 legacy_hal_.lock()->startRssiMonitoring(ifname_, cmd_id, max_rssi,
506 min_rssi,
507 on_threshold_breached_callback);
508 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusd4767542016-12-06 10:04:05 -0800509}
510
511WifiStatus WifiStaIface::stopRssiMonitoringInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700512 legacy_hal::wifi_error legacy_status =
513 legacy_hal_.lock()->stopRssiMonitoring(ifname_, cmd_id);
514 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusd4767542016-12-06 10:04:05 -0800515}
516
Roshan Pius26801cb2016-12-13 14:25:45 -0800517std::pair<WifiStatus, StaRoamingCapabilities>
518WifiStaIface::getRoamingCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700519 legacy_hal::wifi_error legacy_status;
520 legacy_hal::wifi_roaming_capabilities legacy_caps;
521 std::tie(legacy_status, legacy_caps) =
522 legacy_hal_.lock()->getRoamingCapabilities(ifname_);
523 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
524 return {createWifiStatusFromLegacyError(legacy_status), {}};
525 }
526 StaRoamingCapabilities hidl_caps;
527 if (!hidl_struct_util::convertLegacyRoamingCapabilitiesToHidl(legacy_caps,
528 &hidl_caps)) {
529 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
530 }
531 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Pius26801cb2016-12-13 14:25:45 -0800532}
533
534WifiStatus WifiStaIface::configureRoamingInternal(
535 const StaRoamingConfig& config) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700536 legacy_hal::wifi_roaming_config legacy_config;
537 if (!hidl_struct_util::convertHidlRoamingConfigToLegacy(config,
538 &legacy_config)) {
539 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
540 }
541 legacy_hal::wifi_error legacy_status =
542 legacy_hal_.lock()->configureRoaming(ifname_, legacy_config);
543 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius26801cb2016-12-13 14:25:45 -0800544}
545
546WifiStatus WifiStaIface::setRoamingStateInternal(StaRoamingState state) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700547 legacy_hal::wifi_error legacy_status =
548 legacy_hal_.lock()->enableFirmwareRoaming(
549 ifname_, hidl_struct_util::convertHidlRoamingStateToLegacy(state));
550 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius26801cb2016-12-13 14:25:45 -0800551}
552
Roshan Piusaf727c02017-01-11 15:37:25 -0800553WifiStatus WifiStaIface::enableNdOffloadInternal(bool enable) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700554 legacy_hal::wifi_error legacy_status =
555 legacy_hal_.lock()->configureNdOffload(ifname_, enable);
556 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusaf727c02017-01-11 15:37:25 -0800557}
558
Roshan Pius9a9869a2017-01-11 16:42:16 -0800559WifiStatus WifiStaIface::startSendingKeepAlivePacketsInternal(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700560 uint32_t cmd_id, const std::vector<uint8_t>& ip_packet_data,
561 uint16_t /* ether_type */, const std::array<uint8_t, 6>& src_address,
562 const std::array<uint8_t, 6>& dst_address, uint32_t period_in_ms) {
563 legacy_hal::wifi_error legacy_status =
564 legacy_hal_.lock()->startSendingOffloadedPacket(
565 ifname_, cmd_id, ip_packet_data, src_address, dst_address,
566 period_in_ms);
567 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800568}
569
570WifiStatus WifiStaIface::stopSendingKeepAlivePacketsInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700571 legacy_hal::wifi_error legacy_status =
572 legacy_hal_.lock()->stopSendingOffloadedPacket(ifname_, cmd_id);
573 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800574}
575
Roshan Piusd37341f2017-01-31 13:13:28 -0800576WifiStatus WifiStaIface::setScanningMacOuiInternal(
577 const std::array<uint8_t, 3>& oui) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700578 legacy_hal::wifi_error legacy_status =
579 legacy_hal_.lock()->setScanningMacOui(ifname_, oui);
580 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius795bb812017-02-01 13:09:08 -0800581}
582
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700583WifiStatus WifiStaIface::startDebugPacketFateMonitoringInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700584 legacy_hal::wifi_error legacy_status =
585 legacy_hal_.lock()->startPktFateMonitoring(ifname_);
586 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700587}
588
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700589std::pair<WifiStatus, std::vector<WifiDebugTxPacketFateReport>>
590WifiStaIface::getDebugTxPacketFatesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700591 legacy_hal::wifi_error legacy_status;
592 std::vector<legacy_hal::wifi_tx_report> legacy_fates;
593 std::tie(legacy_status, legacy_fates) =
594 legacy_hal_.lock()->getTxPktFates(ifname_);
595 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
596 return {createWifiStatusFromLegacyError(legacy_status), {}};
597 }
598 std::vector<WifiDebugTxPacketFateReport> hidl_fates;
599 if (!hidl_struct_util::convertLegacyVectorOfDebugTxPacketFateToHidl(
600 legacy_fates, &hidl_fates)) {
601 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
602 }
603 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700604}
605
606std::pair<WifiStatus, std::vector<WifiDebugRxPacketFateReport>>
607WifiStaIface::getDebugRxPacketFatesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700608 legacy_hal::wifi_error legacy_status;
609 std::vector<legacy_hal::wifi_rx_report> legacy_fates;
610 std::tie(legacy_status, legacy_fates) =
611 legacy_hal_.lock()->getRxPktFates(ifname_);
612 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
613 return {createWifiStatusFromLegacyError(legacy_status), {}};
614 }
615 std::vector<WifiDebugRxPacketFateReport> hidl_fates;
616 if (!hidl_struct_util::convertLegacyVectorOfDebugRxPacketFateToHidl(
617 legacy_fates, &hidl_fates)) {
618 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
619 }
620 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700621}
622
Jong Wook Kimb9f0ff92018-03-16 16:21:49 -0700623WifiStatus WifiStaIface::setMacAddressInternal(
624 const std::array<uint8_t, 6>& mac) {
625 if (!iface_tool_.SetWifiUpState(false)) {
626 LOG(ERROR) << "SetWifiUpState(false) failed.";
627 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
628 }
629
630 if (!iface_tool_.SetMacAddress(ifname_.c_str(), mac)) {
631 LOG(ERROR) << "SetMacAddress failed.";
632 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
633 }
634
635 if (!iface_tool_.SetWifiUpState(true)) {
636 LOG(ERROR) << "SetWifiUpState(true) failed.";
637 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
638 }
639 LOG(DEBUG) << "Successfully SetMacAddress.";
640 return createWifiStatus(WifiStatusCode::SUCCESS);
641}
642
Jong Wook Kim0ee77432018-08-08 18:57:26 -0700643std::pair<WifiStatus, std::array<uint8_t, 6>>
644WifiStaIface::getFactoryMacAddressInternal() {
645 std::array<uint8_t, 6> mac =
646 iface_tool_.GetFactoryMacAddress(ifname_.c_str());
647 return {createWifiStatus(WifiStatusCode::SUCCESS), mac};
648}
649
Roshan Pius3e2d6712016-10-06 13:16:23 -0700650} // namespace implementation
Jong Wook Kimda830c92018-07-23 15:29:38 -0700651} // namespace V1_3
Roshan Pius3e2d6712016-10-06 13:16:23 -0700652} // namespace wifi
653} // namespace hardware
654} // namespace android