blob: 63341dfb4a15b6f60a378feee07bc2424107f067 [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
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
Jong Wook Kimb9f0ff92018-03-16 16:21:49 -0700244Return<void> WifiStaIface::setMacAddress(const hidl_array<uint8_t, 6>& mac,
245 setMacAddress_cb hidl_status_cb) {
246 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
247 &WifiStaIface::setMacAddressInternal, hidl_status_cb,
248 mac);
249}
250
Roshan Pius907d4a22016-10-27 12:48:12 -0700251std::pair<WifiStatus, std::string> WifiStaIface::getNameInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700252 return {createWifiStatus(WifiStatusCode::SUCCESS), ifname_};
Roshan Pius907d4a22016-10-27 12:48:12 -0700253}
254
255std::pair<WifiStatus, IfaceType> WifiStaIface::getTypeInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700256 return {createWifiStatus(WifiStatusCode::SUCCESS), IfaceType::STA};
Roshan Pius3e2d6712016-10-06 13:16:23 -0700257}
258
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700259WifiStatus WifiStaIface::registerEventCallbackInternal(
260 const sp<IWifiStaIfaceEventCallback>& callback) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700261 if (!event_cb_handler_.addCallback(callback)) {
262 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
263 }
264 return createWifiStatus(WifiStatusCode::SUCCESS);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700265}
266
267std::pair<WifiStatus, uint32_t> WifiStaIface::getCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700268 legacy_hal::wifi_error legacy_status;
269 uint32_t legacy_feature_set;
270 std::tie(legacy_status, legacy_feature_set) =
271 legacy_hal_.lock()->getSupportedFeatureSet(ifname_);
272 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
273 return {createWifiStatusFromLegacyError(legacy_status), 0};
274 }
275 uint32_t legacy_logger_feature_set;
276 std::tie(legacy_status, legacy_logger_feature_set) =
277 legacy_hal_.lock()->getLoggerSupportedFeatureSet(ifname_);
278 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
279 // some devices don't support querying logger feature set
280 legacy_logger_feature_set = 0;
281 }
282 uint32_t hidl_caps;
283 if (!hidl_struct_util::convertLegacyFeaturesToHidlStaCapabilities(
284 legacy_feature_set, legacy_logger_feature_set, &hidl_caps)) {
285 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), 0};
286 }
287 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700288}
289
290std::pair<WifiStatus, StaApfPacketFilterCapabilities>
291WifiStaIface::getApfPacketFilterCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700292 legacy_hal::wifi_error legacy_status;
293 legacy_hal::PacketFilterCapabilities legacy_caps;
294 std::tie(legacy_status, legacy_caps) =
295 legacy_hal_.lock()->getPacketFilterCapabilities(ifname_);
296 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
297 return {createWifiStatusFromLegacyError(legacy_status), {}};
298 }
299 StaApfPacketFilterCapabilities hidl_caps;
300 if (!hidl_struct_util::convertLegacyApfCapabilitiesToHidl(legacy_caps,
301 &hidl_caps)) {
302 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
303 }
304 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700305}
306
307WifiStatus WifiStaIface::installApfPacketFilterInternal(
Roshan Pius970f0312016-12-05 15:25:51 -0800308 uint32_t /* cmd_id */, const std::vector<uint8_t>& program) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700309 legacy_hal::wifi_error legacy_status =
310 legacy_hal_.lock()->setPacketFilter(ifname_, program);
311 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700312}
313
Bernie Innocenti7e6f71a2018-03-07 00:17:50 +0900314std::pair<WifiStatus, std::vector<uint8_t>>
315WifiStaIface::readApfPacketFilterDataInternal() {
316 const std::pair<legacy_hal::wifi_error, std::vector<uint8_t>>
317 legacy_status_and_data =
318 legacy_hal_.lock()->readApfPacketFilterData(ifname_);
319 return {createWifiStatusFromLegacyError(legacy_status_and_data.first),
320 std::move(legacy_status_and_data.second)};
321}
322
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700323std::pair<WifiStatus, StaBackgroundScanCapabilities>
324WifiStaIface::getBackgroundScanCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700325 legacy_hal::wifi_error legacy_status;
326 legacy_hal::wifi_gscan_capabilities legacy_caps;
327 std::tie(legacy_status, legacy_caps) =
328 legacy_hal_.lock()->getGscanCapabilities(ifname_);
329 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
330 return {createWifiStatusFromLegacyError(legacy_status), {}};
331 }
332 StaBackgroundScanCapabilities hidl_caps;
333 if (!hidl_struct_util::convertLegacyGscanCapabilitiesToHidl(legacy_caps,
334 &hidl_caps)) {
335 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
336 }
337 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700338}
339
340std::pair<WifiStatus, std::vector<WifiChannelInMhz>>
Roshan Pius7f4574d2017-02-22 09:48:03 -0800341WifiStaIface::getValidFrequenciesForBandInternal(WifiBand band) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700342 static_assert(sizeof(WifiChannelInMhz) == sizeof(uint32_t),
343 "Size mismatch");
344 legacy_hal::wifi_error legacy_status;
345 std::vector<uint32_t> valid_frequencies;
346 std::tie(legacy_status, valid_frequencies) =
347 legacy_hal_.lock()->getValidFrequenciesForBand(
348 ifname_, hidl_struct_util::convertHidlWifiBandToLegacy(band));
349 return {createWifiStatusFromLegacyError(legacy_status), valid_frequencies};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700350}
351
352WifiStatus WifiStaIface::startBackgroundScanInternal(
Roshan Pius970f0312016-12-05 15:25:51 -0800353 uint32_t cmd_id, const StaBackgroundScanParameters& params) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700354 legacy_hal::wifi_scan_cmd_params legacy_params;
355 if (!hidl_struct_util::convertHidlGscanParamsToLegacy(params,
356 &legacy_params)) {
357 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
358 }
359 android::wp<WifiStaIface> weak_ptr_this(this);
360 const auto& on_failure_callback =
361 [weak_ptr_this](legacy_hal::wifi_request_id id) {
362 const auto shared_ptr_this = weak_ptr_this.promote();
363 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
364 LOG(ERROR) << "Callback invoked on an invalid object";
365 return;
366 }
367 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
368 if (!callback->onBackgroundScanFailure(id).isOk()) {
369 LOG(ERROR)
370 << "Failed to invoke onBackgroundScanFailure callback";
371 }
372 }
373 };
374 const auto& on_results_callback =
375 [weak_ptr_this](
376 legacy_hal::wifi_request_id id,
377 const std::vector<legacy_hal::wifi_cached_scan_results>& results) {
378 const auto shared_ptr_this = weak_ptr_this.promote();
379 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
380 LOG(ERROR) << "Callback invoked on an invalid object";
381 return;
382 }
383 std::vector<StaScanData> hidl_scan_datas;
384 if (!hidl_struct_util::
385 convertLegacyVectorOfCachedGscanResultsToHidl(
386 results, &hidl_scan_datas)) {
387 LOG(ERROR) << "Failed to convert scan results to HIDL structs";
388 return;
389 }
390 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
391 if (!callback->onBackgroundScanResults(id, hidl_scan_datas)
392 .isOk()) {
393 LOG(ERROR)
394 << "Failed to invoke onBackgroundScanResults callback";
395 }
396 }
397 };
398 const auto& on_full_result_callback = [weak_ptr_this](
399 legacy_hal::wifi_request_id id,
400 const legacy_hal::
401 wifi_scan_result* result,
402 uint32_t buckets_scanned) {
Roshan Pius970f0312016-12-05 15:25:51 -0800403 const auto shared_ptr_this = weak_ptr_this.promote();
404 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700405 LOG(ERROR) << "Callback invoked on an invalid object";
406 return;
407 }
408 StaScanResult hidl_scan_result;
409 if (!hidl_struct_util::convertLegacyGscanResultToHidl(
410 *result, true, &hidl_scan_result)) {
411 LOG(ERROR) << "Failed to convert full scan results to HIDL structs";
412 return;
Roshan Pius970f0312016-12-05 15:25:51 -0800413 }
414 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700415 if (!callback
416 ->onBackgroundFullScanResult(id, buckets_scanned,
417 hidl_scan_result)
418 .isOk()) {
419 LOG(ERROR)
420 << "Failed to invoke onBackgroundFullScanResult callback";
421 }
Roshan Pius970f0312016-12-05 15:25:51 -0800422 }
Roshan Piusabcf78f2017-10-06 16:30:38 -0700423 };
424 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->startGscan(
425 ifname_, cmd_id, legacy_params, on_failure_callback,
426 on_results_callback, on_full_result_callback);
427 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700428}
429
Roshan Pius970f0312016-12-05 15:25:51 -0800430WifiStatus WifiStaIface::stopBackgroundScanInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700431 legacy_hal::wifi_error legacy_status =
432 legacy_hal_.lock()->stopGscan(ifname_, cmd_id);
433 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700434}
435
Roshan Pius970f0312016-12-05 15:25:51 -0800436WifiStatus WifiStaIface::enableLinkLayerStatsCollectionInternal(bool debug) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700437 legacy_hal::wifi_error legacy_status =
438 legacy_hal_.lock()->enableLinkLayerStats(ifname_, debug);
439 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700440}
441
442WifiStatus WifiStaIface::disableLinkLayerStatsCollectionInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700443 legacy_hal::wifi_error legacy_status =
444 legacy_hal_.lock()->disableLinkLayerStats(ifname_);
445 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700446}
447
448std::pair<WifiStatus, StaLinkLayerStats>
449WifiStaIface::getLinkLayerStatsInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700450 legacy_hal::wifi_error legacy_status;
451 legacy_hal::LinkLayerStats legacy_stats;
452 std::tie(legacy_status, legacy_stats) =
453 legacy_hal_.lock()->getLinkLayerStats(ifname_);
454 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
455 return {createWifiStatusFromLegacyError(legacy_status), {}};
456 }
457 StaLinkLayerStats hidl_stats;
458 if (!hidl_struct_util::convertLegacyLinkLayerStatsToHidl(legacy_stats,
459 &hidl_stats)) {
460 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
461 }
462 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_stats};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700463}
464
Roshan Piusd4767542016-12-06 10:04:05 -0800465WifiStatus WifiStaIface::startRssiMonitoringInternal(uint32_t cmd_id,
466 int32_t max_rssi,
467 int32_t min_rssi) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700468 android::wp<WifiStaIface> weak_ptr_this(this);
469 const auto& on_threshold_breached_callback =
470 [weak_ptr_this](legacy_hal::wifi_request_id id,
471 std::array<uint8_t, 6> bssid, int8_t rssi) {
472 const auto shared_ptr_this = weak_ptr_this.promote();
473 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
474 LOG(ERROR) << "Callback invoked on an invalid object";
475 return;
476 }
477 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
478 if (!callback->onRssiThresholdBreached(id, bssid, rssi)
479 .isOk()) {
480 LOG(ERROR)
481 << "Failed to invoke onRssiThresholdBreached callback";
482 }
483 }
484 };
485 legacy_hal::wifi_error legacy_status =
486 legacy_hal_.lock()->startRssiMonitoring(ifname_, cmd_id, max_rssi,
487 min_rssi,
488 on_threshold_breached_callback);
489 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusd4767542016-12-06 10:04:05 -0800490}
491
492WifiStatus WifiStaIface::stopRssiMonitoringInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700493 legacy_hal::wifi_error legacy_status =
494 legacy_hal_.lock()->stopRssiMonitoring(ifname_, cmd_id);
495 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusd4767542016-12-06 10:04:05 -0800496}
497
Roshan Pius26801cb2016-12-13 14:25:45 -0800498std::pair<WifiStatus, StaRoamingCapabilities>
499WifiStaIface::getRoamingCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700500 legacy_hal::wifi_error legacy_status;
501 legacy_hal::wifi_roaming_capabilities legacy_caps;
502 std::tie(legacy_status, legacy_caps) =
503 legacy_hal_.lock()->getRoamingCapabilities(ifname_);
504 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
505 return {createWifiStatusFromLegacyError(legacy_status), {}};
506 }
507 StaRoamingCapabilities hidl_caps;
508 if (!hidl_struct_util::convertLegacyRoamingCapabilitiesToHidl(legacy_caps,
509 &hidl_caps)) {
510 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
511 }
512 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Pius26801cb2016-12-13 14:25:45 -0800513}
514
515WifiStatus WifiStaIface::configureRoamingInternal(
516 const StaRoamingConfig& config) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700517 legacy_hal::wifi_roaming_config legacy_config;
518 if (!hidl_struct_util::convertHidlRoamingConfigToLegacy(config,
519 &legacy_config)) {
520 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
521 }
522 legacy_hal::wifi_error legacy_status =
523 legacy_hal_.lock()->configureRoaming(ifname_, legacy_config);
524 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius26801cb2016-12-13 14:25:45 -0800525}
526
527WifiStatus WifiStaIface::setRoamingStateInternal(StaRoamingState state) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700528 legacy_hal::wifi_error legacy_status =
529 legacy_hal_.lock()->enableFirmwareRoaming(
530 ifname_, hidl_struct_util::convertHidlRoamingStateToLegacy(state));
531 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius26801cb2016-12-13 14:25:45 -0800532}
533
Roshan Piusaf727c02017-01-11 15:37:25 -0800534WifiStatus WifiStaIface::enableNdOffloadInternal(bool enable) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700535 legacy_hal::wifi_error legacy_status =
536 legacy_hal_.lock()->configureNdOffload(ifname_, enable);
537 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusaf727c02017-01-11 15:37:25 -0800538}
539
Roshan Pius9a9869a2017-01-11 16:42:16 -0800540WifiStatus WifiStaIface::startSendingKeepAlivePacketsInternal(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700541 uint32_t cmd_id, const std::vector<uint8_t>& ip_packet_data,
542 uint16_t /* ether_type */, const std::array<uint8_t, 6>& src_address,
543 const std::array<uint8_t, 6>& dst_address, uint32_t period_in_ms) {
544 legacy_hal::wifi_error legacy_status =
545 legacy_hal_.lock()->startSendingOffloadedPacket(
546 ifname_, cmd_id, ip_packet_data, src_address, dst_address,
547 period_in_ms);
548 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800549}
550
551WifiStatus WifiStaIface::stopSendingKeepAlivePacketsInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700552 legacy_hal::wifi_error legacy_status =
553 legacy_hal_.lock()->stopSendingOffloadedPacket(ifname_, cmd_id);
554 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800555}
556
Roshan Piusd37341f2017-01-31 13:13:28 -0800557WifiStatus WifiStaIface::setScanningMacOuiInternal(
558 const std::array<uint8_t, 3>& oui) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700559 legacy_hal::wifi_error legacy_status =
560 legacy_hal_.lock()->setScanningMacOui(ifname_, oui);
561 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius795bb812017-02-01 13:09:08 -0800562}
563
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700564WifiStatus WifiStaIface::startDebugPacketFateMonitoringInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700565 legacy_hal::wifi_error legacy_status =
566 legacy_hal_.lock()->startPktFateMonitoring(ifname_);
567 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700568}
569
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700570std::pair<WifiStatus, std::vector<WifiDebugTxPacketFateReport>>
571WifiStaIface::getDebugTxPacketFatesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700572 legacy_hal::wifi_error legacy_status;
573 std::vector<legacy_hal::wifi_tx_report> legacy_fates;
574 std::tie(legacy_status, legacy_fates) =
575 legacy_hal_.lock()->getTxPktFates(ifname_);
576 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
577 return {createWifiStatusFromLegacyError(legacy_status), {}};
578 }
579 std::vector<WifiDebugTxPacketFateReport> hidl_fates;
580 if (!hidl_struct_util::convertLegacyVectorOfDebugTxPacketFateToHidl(
581 legacy_fates, &hidl_fates)) {
582 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
583 }
584 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700585}
586
587std::pair<WifiStatus, std::vector<WifiDebugRxPacketFateReport>>
588WifiStaIface::getDebugRxPacketFatesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700589 legacy_hal::wifi_error legacy_status;
590 std::vector<legacy_hal::wifi_rx_report> legacy_fates;
591 std::tie(legacy_status, legacy_fates) =
592 legacy_hal_.lock()->getRxPktFates(ifname_);
593 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
594 return {createWifiStatusFromLegacyError(legacy_status), {}};
595 }
596 std::vector<WifiDebugRxPacketFateReport> hidl_fates;
597 if (!hidl_struct_util::convertLegacyVectorOfDebugRxPacketFateToHidl(
598 legacy_fates, &hidl_fates)) {
599 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
600 }
601 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700602}
603
Jong Wook Kimb9f0ff92018-03-16 16:21:49 -0700604WifiStatus WifiStaIface::setMacAddressInternal(
605 const std::array<uint8_t, 6>& mac) {
606 if (!iface_tool_.SetWifiUpState(false)) {
607 LOG(ERROR) << "SetWifiUpState(false) failed.";
608 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
609 }
610
611 if (!iface_tool_.SetMacAddress(ifname_.c_str(), mac)) {
612 LOG(ERROR) << "SetMacAddress failed.";
613 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
614 }
615
616 if (!iface_tool_.SetWifiUpState(true)) {
617 LOG(ERROR) << "SetWifiUpState(true) failed.";
618 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
619 }
620 LOG(DEBUG) << "Successfully SetMacAddress.";
621 return createWifiStatus(WifiStatusCode::SUCCESS);
622}
623
Roshan Pius3e2d6712016-10-06 13:16:23 -0700624} // namespace implementation
Jong Wook Kimda830c92018-07-23 15:29:38 -0700625} // namespace V1_3
Roshan Pius3e2d6712016-10-06 13:16:23 -0700626} // namespace wifi
627} // namespace hardware
628} // namespace android