1 /*
2 * Copyright (C) 2022 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
17 #include "wifi_sta_iface.h"
18
19 #include <android-base/logging.h>
20
21 #include "aidl_return_util.h"
22 #include "aidl_struct_util.h"
23 #include "wifi_status_util.h"
24
25 namespace aidl {
26 namespace android {
27 namespace hardware {
28 namespace wifi {
29 using aidl_return_util::validateAndCall;
30
WifiStaIface(const std::string & ifname,const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal,const std::weak_ptr<iface_util::WifiIfaceUtil> iface_util)31 WifiStaIface::WifiStaIface(const std::string& ifname,
32 const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal,
33 const std::weak_ptr<iface_util::WifiIfaceUtil> iface_util)
34 : ifname_(ifname),
35 legacy_hal_(legacy_hal),
36 iface_util_(iface_util),
37 is_valid_(true),
38 is_twt_registered_(false) {
39 // Turn on DFS channel usage for STA iface.
40 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->setDfsFlag(ifname_, true);
41 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
42 LOG(ERROR) << "Failed to set DFS flag; DFS channels may be unavailable.";
43 }
44 }
45
create(const std::string & ifname,const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal,const std::weak_ptr<iface_util::WifiIfaceUtil> iface_util)46 std::shared_ptr<WifiStaIface> WifiStaIface::create(
47 const std::string& ifname, const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal,
48 const std::weak_ptr<iface_util::WifiIfaceUtil> iface_util) {
49 std::shared_ptr<WifiStaIface> ptr =
50 ndk::SharedRefBase::make<WifiStaIface>(ifname, legacy_hal, iface_util);
51 std::weak_ptr<WifiStaIface> weak_ptr_this(ptr);
52 ptr->setWeakPtr(weak_ptr_this);
53 return ptr;
54 }
55
invalidate()56 void WifiStaIface::invalidate() {
57 legacy_hal_.reset();
58 event_cb_handler_.invalidate();
59 is_valid_ = false;
60 }
61
setWeakPtr(std::weak_ptr<WifiStaIface> ptr)62 void WifiStaIface::setWeakPtr(std::weak_ptr<WifiStaIface> ptr) {
63 weak_ptr_this_ = ptr;
64 }
65
isValid()66 bool WifiStaIface::isValid() {
67 return is_valid_;
68 }
69
getName()70 std::string WifiStaIface::getName() {
71 return ifname_;
72 }
73
getEventCallbacks()74 std::set<std::shared_ptr<IWifiStaIfaceEventCallback>> WifiStaIface::getEventCallbacks() {
75 return event_cb_handler_.getCallbacks();
76 }
77
getName(std::string * _aidl_return)78 ndk::ScopedAStatus WifiStaIface::getName(std::string* _aidl_return) {
79 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
80 &WifiStaIface::getNameInternal, _aidl_return);
81 }
82
registerEventCallback(const std::shared_ptr<IWifiStaIfaceEventCallback> & in_callback)83 ndk::ScopedAStatus WifiStaIface::registerEventCallback(
84 const std::shared_ptr<IWifiStaIfaceEventCallback>& in_callback) {
85 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
86 &WifiStaIface::registerEventCallbackInternal, in_callback);
87 }
88
getFeatureSet(int32_t * _aidl_return)89 ndk::ScopedAStatus WifiStaIface::getFeatureSet(int32_t* _aidl_return) {
90 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
91 &WifiStaIface::getFeatureSetInternal, _aidl_return);
92 }
93
getApfPacketFilterCapabilities(StaApfPacketFilterCapabilities * _aidl_return)94 ndk::ScopedAStatus WifiStaIface::getApfPacketFilterCapabilities(
95 StaApfPacketFilterCapabilities* _aidl_return) {
96 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
97 &WifiStaIface::getApfPacketFilterCapabilitiesInternal, _aidl_return);
98 }
99
installApfPacketFilter(const std::vector<uint8_t> & in_program)100 ndk::ScopedAStatus WifiStaIface::installApfPacketFilter(const std::vector<uint8_t>& in_program) {
101 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
102 &WifiStaIface::installApfPacketFilterInternal, in_program);
103 }
104
readApfPacketFilterData(std::vector<uint8_t> * _aidl_return)105 ndk::ScopedAStatus WifiStaIface::readApfPacketFilterData(std::vector<uint8_t>* _aidl_return) {
106 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
107 &WifiStaIface::readApfPacketFilterDataInternal, _aidl_return);
108 }
109
getBackgroundScanCapabilities(StaBackgroundScanCapabilities * _aidl_return)110 ndk::ScopedAStatus WifiStaIface::getBackgroundScanCapabilities(
111 StaBackgroundScanCapabilities* _aidl_return) {
112 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
113 &WifiStaIface::getBackgroundScanCapabilitiesInternal, _aidl_return);
114 }
115
startBackgroundScan(int32_t in_cmdId,const StaBackgroundScanParameters & in_params)116 ndk::ScopedAStatus WifiStaIface::startBackgroundScan(int32_t in_cmdId,
117 const StaBackgroundScanParameters& in_params) {
118 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
119 &WifiStaIface::startBackgroundScanInternal, in_cmdId, in_params);
120 }
121
stopBackgroundScan(int32_t in_cmdId)122 ndk::ScopedAStatus WifiStaIface::stopBackgroundScan(int32_t in_cmdId) {
123 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
124 &WifiStaIface::stopBackgroundScanInternal, in_cmdId);
125 }
126
enableLinkLayerStatsCollection(bool in_debug)127 ndk::ScopedAStatus WifiStaIface::enableLinkLayerStatsCollection(bool in_debug) {
128 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
129 &WifiStaIface::enableLinkLayerStatsCollectionInternal, in_debug);
130 }
131
disableLinkLayerStatsCollection()132 ndk::ScopedAStatus WifiStaIface::disableLinkLayerStatsCollection() {
133 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
134 &WifiStaIface::disableLinkLayerStatsCollectionInternal);
135 }
136
getLinkLayerStats(StaLinkLayerStats * _aidl_return)137 ndk::ScopedAStatus WifiStaIface::getLinkLayerStats(StaLinkLayerStats* _aidl_return) {
138 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
139 &WifiStaIface::getLinkLayerStatsInternal, _aidl_return);
140 }
141
startRssiMonitoring(int32_t in_cmdId,int32_t in_maxRssi,int32_t in_minRssi)142 ndk::ScopedAStatus WifiStaIface::startRssiMonitoring(int32_t in_cmdId, int32_t in_maxRssi,
143 int32_t in_minRssi) {
144 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
145 &WifiStaIface::startRssiMonitoringInternal, in_cmdId, in_maxRssi,
146 in_minRssi);
147 }
148
stopRssiMonitoring(int32_t in_cmdId)149 ndk::ScopedAStatus WifiStaIface::stopRssiMonitoring(int32_t in_cmdId) {
150 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
151 &WifiStaIface::stopRssiMonitoringInternal, in_cmdId);
152 }
153
getRoamingCapabilities(StaRoamingCapabilities * _aidl_return)154 ndk::ScopedAStatus WifiStaIface::getRoamingCapabilities(StaRoamingCapabilities* _aidl_return) {
155 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
156 &WifiStaIface::getRoamingCapabilitiesInternal, _aidl_return);
157 }
158
configureRoaming(const StaRoamingConfig & in_config)159 ndk::ScopedAStatus WifiStaIface::configureRoaming(const StaRoamingConfig& in_config) {
160 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
161 &WifiStaIface::configureRoamingInternal, in_config);
162 }
163
setRoamingState(StaRoamingState in_state)164 ndk::ScopedAStatus WifiStaIface::setRoamingState(StaRoamingState in_state) {
165 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
166 &WifiStaIface::setRoamingStateInternal, in_state);
167 }
168
enableNdOffload(bool in_enable)169 ndk::ScopedAStatus WifiStaIface::enableNdOffload(bool in_enable) {
170 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
171 &WifiStaIface::enableNdOffloadInternal, in_enable);
172 }
173
startSendingKeepAlivePackets(int32_t in_cmdId,const std::vector<uint8_t> & in_ipPacketData,char16_t in_etherType,const std::array<uint8_t,6> & in_srcAddress,const std::array<uint8_t,6> & in_dstAddress,int32_t in_periodInMs)174 ndk::ScopedAStatus WifiStaIface::startSendingKeepAlivePackets(
175 int32_t in_cmdId, const std::vector<uint8_t>& in_ipPacketData, char16_t in_etherType,
176 const std::array<uint8_t, 6>& in_srcAddress, const std::array<uint8_t, 6>& in_dstAddress,
177 int32_t in_periodInMs) {
178 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
179 &WifiStaIface::startSendingKeepAlivePacketsInternal, in_cmdId,
180 in_ipPacketData, in_etherType, in_srcAddress, in_dstAddress,
181 in_periodInMs);
182 }
183
stopSendingKeepAlivePackets(int32_t in_cmdId)184 ndk::ScopedAStatus WifiStaIface::stopSendingKeepAlivePackets(int32_t in_cmdId) {
185 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
186 &WifiStaIface::stopSendingKeepAlivePacketsInternal, in_cmdId);
187 }
188
startDebugPacketFateMonitoring()189 ndk::ScopedAStatus WifiStaIface::startDebugPacketFateMonitoring() {
190 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
191 &WifiStaIface::startDebugPacketFateMonitoringInternal);
192 }
193
getDebugTxPacketFates(std::vector<WifiDebugTxPacketFateReport> * _aidl_return)194 ndk::ScopedAStatus WifiStaIface::getDebugTxPacketFates(
195 std::vector<WifiDebugTxPacketFateReport>* _aidl_return) {
196 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
197 &WifiStaIface::getDebugTxPacketFatesInternal, _aidl_return);
198 }
199
getDebugRxPacketFates(std::vector<WifiDebugRxPacketFateReport> * _aidl_return)200 ndk::ScopedAStatus WifiStaIface::getDebugRxPacketFates(
201 std::vector<WifiDebugRxPacketFateReport>* _aidl_return) {
202 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
203 &WifiStaIface::getDebugRxPacketFatesInternal, _aidl_return);
204 }
205
setMacAddress(const std::array<uint8_t,6> & in_mac)206 ndk::ScopedAStatus WifiStaIface::setMacAddress(const std::array<uint8_t, 6>& in_mac) {
207 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
208 &WifiStaIface::setMacAddressInternal, in_mac);
209 }
210
getFactoryMacAddress(std::array<uint8_t,6> * _aidl_return)211 ndk::ScopedAStatus WifiStaIface::getFactoryMacAddress(std::array<uint8_t, 6>* _aidl_return) {
212 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
213 &WifiStaIface::getFactoryMacAddressInternal, _aidl_return);
214 }
215
setScanMode(bool in_enable)216 ndk::ScopedAStatus WifiStaIface::setScanMode(bool in_enable) {
217 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
218 &WifiStaIface::setScanModeInternal, in_enable);
219 }
220
setDtimMultiplier(int32_t in_multiplier)221 ndk::ScopedAStatus WifiStaIface::setDtimMultiplier(int32_t in_multiplier) {
222 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
223 &WifiStaIface::setDtimMultiplierInternal, in_multiplier);
224 }
225
getCachedScanData(CachedScanData * _aidl_return)226 ndk::ScopedAStatus WifiStaIface::getCachedScanData(CachedScanData* _aidl_return) {
227 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
228 &WifiStaIface::getCachedScanDataInternal, _aidl_return);
229 }
230
twtGetCapabilities(TwtCapabilities * _aidl_return)231 ndk::ScopedAStatus WifiStaIface::twtGetCapabilities(TwtCapabilities* _aidl_return) {
232 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
233 &WifiStaIface::twtGetCapabilitiesInternal, _aidl_return);
234 }
235
twtSessionSetup(int32_t in_cmdId,const TwtRequest & in_twtRequest)236 ndk::ScopedAStatus WifiStaIface::twtSessionSetup(int32_t in_cmdId,
237 const TwtRequest& in_twtRequest) {
238 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
239 &WifiStaIface::twtSessionSetupInternal, in_cmdId, in_twtRequest);
240 }
241
twtSessionUpdate(int32_t in_cmdId,int32_t in_sessionId,const TwtRequest & in_twtRequest)242 ndk::ScopedAStatus WifiStaIface::twtSessionUpdate(int32_t in_cmdId, int32_t in_sessionId,
243 const TwtRequest& in_twtRequest) {
244 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
245 &WifiStaIface::twtSessionUpdateInternal, in_cmdId, in_sessionId,
246 in_twtRequest);
247 }
248
twtSessionSuspend(int32_t in_cmdId,int32_t in_sessionId)249 ndk::ScopedAStatus WifiStaIface::twtSessionSuspend(int32_t in_cmdId, int32_t in_sessionId) {
250 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
251 &WifiStaIface::twtSessionSuspendInternal, in_cmdId, in_sessionId);
252 }
253
twtSessionResume(int32_t in_cmdId,int32_t in_sessionId)254 ndk::ScopedAStatus WifiStaIface::twtSessionResume(int32_t in_cmdId, int32_t in_sessionId) {
255 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
256 &WifiStaIface::twtSessionResumeInternal, in_cmdId, in_sessionId);
257 }
258
twtSessionTeardown(int32_t in_cmdId,int32_t in_sessionId)259 ndk::ScopedAStatus WifiStaIface::twtSessionTeardown(int32_t in_cmdId, int32_t in_sessionId) {
260 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
261 &WifiStaIface::twtSessionTeardownInternal, in_cmdId, in_sessionId);
262 }
263
twtSessionGetStats(int32_t in_cmdId,int32_t in_sessionId)264 ndk::ScopedAStatus WifiStaIface::twtSessionGetStats(int32_t in_cmdId, int32_t in_sessionId) {
265 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
266 &WifiStaIface::twtSessionGetStatsInternal, in_cmdId, in_sessionId);
267 }
268
getNameInternal()269 std::pair<std::string, ndk::ScopedAStatus> WifiStaIface::getNameInternal() {
270 return {ifname_, ndk::ScopedAStatus::ok()};
271 }
272
registerTwtEventCallbackInternal()273 ndk::ScopedAStatus WifiStaIface::registerTwtEventCallbackInternal() {
274 std::weak_ptr<WifiStaIface> weak_ptr_this = weak_ptr_this_;
275
276 // onTwtFailure callback
277 const auto& on_twt_failure = [weak_ptr_this](legacy_hal::wifi_request_id id,
278 legacy_hal::wifi_twt_error_code error_code) {
279 const auto shared_ptr_this = weak_ptr_this.lock();
280 IWifiStaIfaceEventCallback::TwtErrorCode aidl_error_code =
281 aidl_struct_util::convertLegacyHalTwtErrorCodeToAidl(error_code);
282 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
283 LOG(ERROR) << "Callback invoked on an invalid object";
284 return;
285 }
286 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
287 if (!callback->onTwtFailure(id, aidl_error_code).isOk()) {
288 LOG(ERROR) << "Failed to invoke onTwtFailure callback";
289 }
290 }
291 };
292 // onTwtSessionCreate callback
293 const auto& on_twt_session_create = [weak_ptr_this](legacy_hal::wifi_request_id id,
294 legacy_hal::wifi_twt_session twt_session) {
295 const auto shared_ptr_this = weak_ptr_this.lock();
296 TwtSession aidl_twt_session;
297 if (!aidl_struct_util::convertLegacyHalTwtSessionToAidl(twt_session, &aidl_twt_session)) {
298 LOG(ERROR) << "convertLegacyHalTwtSessionToAidl failed";
299 return;
300 }
301
302 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
303 LOG(ERROR) << "Callback invoked on an invalid object";
304 return;
305 }
306 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
307 if (!callback->onTwtSessionCreate(id, aidl_twt_session).isOk()) {
308 LOG(ERROR) << "Failed to invoke onTwtSessionCreate callback";
309 }
310 }
311 };
312 // onTwtSessionUpdate callback
313 const auto& on_twt_session_update = [weak_ptr_this](legacy_hal::wifi_request_id id,
314 legacy_hal::wifi_twt_session twt_session) {
315 const auto shared_ptr_this = weak_ptr_this.lock();
316 TwtSession aidl_twt_session;
317 if (!aidl_struct_util::convertLegacyHalTwtSessionToAidl(twt_session, &aidl_twt_session)) {
318 LOG(ERROR) << "convertLegacyHalTwtSessionToAidl failed";
319 return;
320 }
321
322 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
323 LOG(ERROR) << "Callback invoked on an invalid object";
324 return;
325 }
326 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
327 if (!callback->onTwtSessionUpdate(id, aidl_twt_session).isOk()) {
328 LOG(ERROR) << "Failed to invoke onTwtSessionUpdate callback";
329 }
330 }
331 };
332 // onTwtSessionTeardown callback
333 const auto& on_twt_session_teardown =
334 [weak_ptr_this](legacy_hal::wifi_request_id id, int session_id,
335 legacy_hal::wifi_twt_teardown_reason_code reason_code) {
336 const auto shared_ptr_this = weak_ptr_this.lock();
337 IWifiStaIfaceEventCallback::TwtTeardownReasonCode aidl_reason_code =
338 aidl_struct_util::convertLegacyHalTwtReasonCodeToAidl(reason_code);
339 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
340 LOG(ERROR) << "Callback invoked on an invalid object";
341 return;
342 }
343 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
344 if (!callback->onTwtSessionTeardown(id, session_id, aidl_reason_code).isOk()) {
345 LOG(ERROR) << "Failed to invoke onTwtSessionTeardown callback";
346 }
347 }
348 };
349 // onTwtSessionStats callback
350 const auto& on_twt_session_stats = [weak_ptr_this](legacy_hal::wifi_request_id id,
351 int session_id,
352 legacy_hal::wifi_twt_session_stats stats) {
353 const auto shared_ptr_this = weak_ptr_this.lock();
354 TwtSessionStats aidl_session_stats;
355 if (!aidl_struct_util::convertLegacyHalTwtSessionStatsToAidl(stats, &aidl_session_stats)) {
356 LOG(ERROR) << "convertLegacyHalTwtSessionStatsToAidl failed";
357 return;
358 }
359 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
360 LOG(ERROR) << "Callback invoked on an invalid object";
361 return;
362 }
363 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
364 if (!callback->onTwtSessionStats(id, session_id, aidl_session_stats).isOk()) {
365 LOG(ERROR) << "Failed to invoke onTwtSessionStats callback";
366 }
367 }
368 };
369 // onTwtSessionSuspend callback
370 const auto& on_twt_session_suspend = [weak_ptr_this](legacy_hal::wifi_request_id id,
371 int session_id) {
372 const auto shared_ptr_this = weak_ptr_this.lock();
373 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
374 LOG(ERROR) << "Callback invoked on an invalid object";
375 return;
376 }
377 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
378 if (!callback->onTwtSessionSuspend(id, session_id).isOk()) {
379 LOG(ERROR) << "Failed to invoke onTwtSessionSuspend callback";
380 }
381 }
382 };
383 // onTwtSessionResume callback
384 const auto& on_twt_session_resume = [weak_ptr_this](legacy_hal::wifi_request_id id,
385 int session_id) {
386 const auto shared_ptr_this = weak_ptr_this.lock();
387 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
388 LOG(ERROR) << "Callback invoked on an invalid object";
389 return;
390 }
391 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
392 if (!callback->onTwtSessionResume(id, session_id).isOk()) {
393 LOG(ERROR) << "Failed to invoke onTwtSessionResume callback";
394 }
395 }
396 };
397
398 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->twtRegisterEvents(
399 ifname_, on_twt_failure, on_twt_session_create, on_twt_session_update,
400 on_twt_session_teardown, on_twt_session_stats, on_twt_session_suspend,
401 on_twt_session_resume);
402
403 if (legacy_status == legacy_hal::WIFI_ERROR_NOT_SUPPORTED) {
404 LOG(INFO) << "twtRegisterEvents is not supported" << legacy_status;
405 } else if (legacy_status != legacy_hal::WIFI_SUCCESS) {
406 LOG(ERROR) << "twtRegisterEvents failed - %d" << legacy_status;
407 }
408 return createWifiStatusFromLegacyError(legacy_status);
409 }
410
registerEventCallbackInternal(const std::shared_ptr<IWifiStaIfaceEventCallback> & callback)411 ndk::ScopedAStatus WifiStaIface::registerEventCallbackInternal(
412 const std::shared_ptr<IWifiStaIfaceEventCallback>& callback) {
413 if (!event_cb_handler_.addCallback(callback)) {
414 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
415 }
416 is_twt_registered_ = registerTwtEventCallbackInternal().isOk();
417 return ndk::ScopedAStatus::ok();
418 }
419
getFeatureSetInternal()420 std::pair<int32_t, ndk::ScopedAStatus> WifiStaIface::getFeatureSetInternal() {
421 legacy_hal::wifi_error legacy_status;
422 uint64_t legacy_feature_set;
423 std::tie(legacy_status, legacy_feature_set) =
424 legacy_hal_.lock()->getSupportedFeatureSet(ifname_);
425 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
426 return {0, createWifiStatusFromLegacyError(legacy_status)};
427 }
428 uint32_t aidl_feature_set;
429 if (!aidl_struct_util::convertLegacyStaIfaceFeaturesToAidl(legacy_feature_set,
430 &aidl_feature_set)) {
431 return {0, createWifiStatus(WifiStatusCode::ERROR_UNKNOWN)};
432 }
433 return {aidl_feature_set, ndk::ScopedAStatus::ok()};
434 }
435
436 std::pair<StaApfPacketFilterCapabilities, ndk::ScopedAStatus>
getApfPacketFilterCapabilitiesInternal()437 WifiStaIface::getApfPacketFilterCapabilitiesInternal() {
438 legacy_hal::wifi_error legacy_status;
439 legacy_hal::PacketFilterCapabilities legacy_caps;
440 std::tie(legacy_status, legacy_caps) = legacy_hal_.lock()->getPacketFilterCapabilities(ifname_);
441 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
442 return {StaApfPacketFilterCapabilities{}, createWifiStatusFromLegacyError(legacy_status)};
443 }
444 StaApfPacketFilterCapabilities aidl_caps;
445 if (!aidl_struct_util::convertLegacyApfCapabilitiesToAidl(legacy_caps, &aidl_caps)) {
446 return {StaApfPacketFilterCapabilities{}, createWifiStatus(WifiStatusCode::ERROR_UNKNOWN)};
447 }
448 return {aidl_caps, ndk::ScopedAStatus::ok()};
449 }
450
installApfPacketFilterInternal(const std::vector<uint8_t> & program)451 ndk::ScopedAStatus WifiStaIface::installApfPacketFilterInternal(
452 const std::vector<uint8_t>& program) {
453 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->setPacketFilter(ifname_, program);
454 return createWifiStatusFromLegacyError(legacy_status);
455 }
456
457 std::pair<std::vector<uint8_t>, ndk::ScopedAStatus>
readApfPacketFilterDataInternal()458 WifiStaIface::readApfPacketFilterDataInternal() {
459 const std::pair<legacy_hal::wifi_error, std::vector<uint8_t>> legacy_status_and_data =
460 legacy_hal_.lock()->readApfPacketFilterData(ifname_);
461 return {std::move(legacy_status_and_data.second),
462 createWifiStatusFromLegacyError(legacy_status_and_data.first)};
463 }
464
465 std::pair<StaBackgroundScanCapabilities, ndk::ScopedAStatus>
getBackgroundScanCapabilitiesInternal()466 WifiStaIface::getBackgroundScanCapabilitiesInternal() {
467 legacy_hal::wifi_error legacy_status;
468 legacy_hal::wifi_gscan_capabilities legacy_caps;
469 std::tie(legacy_status, legacy_caps) = legacy_hal_.lock()->getGscanCapabilities(ifname_);
470 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
471 return {StaBackgroundScanCapabilities{}, createWifiStatusFromLegacyError(legacy_status)};
472 }
473 StaBackgroundScanCapabilities aidl_caps;
474 if (!aidl_struct_util::convertLegacyGscanCapabilitiesToAidl(legacy_caps, &aidl_caps)) {
475 return {StaBackgroundScanCapabilities{}, createWifiStatus(WifiStatusCode::ERROR_UNKNOWN)};
476 }
477 return {aidl_caps, ndk::ScopedAStatus::ok()};
478 }
479
startBackgroundScanInternal(int32_t cmd_id,const StaBackgroundScanParameters & params)480 ndk::ScopedAStatus WifiStaIface::startBackgroundScanInternal(
481 int32_t cmd_id, const StaBackgroundScanParameters& params) {
482 legacy_hal::wifi_scan_cmd_params legacy_params;
483 if (!aidl_struct_util::convertAidlGscanParamsToLegacy(params, &legacy_params)) {
484 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
485 }
486 std::weak_ptr<WifiStaIface> weak_ptr_this = weak_ptr_this_;
487 const auto& on_failure_callback = [weak_ptr_this](legacy_hal::wifi_request_id id) {
488 const auto shared_ptr_this = weak_ptr_this.lock();
489 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
490 LOG(ERROR) << "Callback invoked on an invalid object";
491 return;
492 }
493 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
494 if (!callback->onBackgroundScanFailure(id).isOk()) {
495 LOG(ERROR) << "Failed to invoke onBackgroundScanFailure callback";
496 }
497 }
498 };
499 const auto& on_results_callback =
500 [weak_ptr_this](legacy_hal::wifi_request_id id,
501 const std::vector<legacy_hal::wifi_cached_scan_results>& results) {
502 const auto shared_ptr_this = weak_ptr_this.lock();
503 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
504 LOG(ERROR) << "Callback invoked on an invalid object";
505 return;
506 }
507 std::vector<StaScanData> aidl_scan_datas;
508 if (!aidl_struct_util::convertLegacyVectorOfCachedGscanResultsToAidl(
509 results, &aidl_scan_datas)) {
510 LOG(ERROR) << "Failed to convert scan results to AIDL structs";
511 return;
512 }
513 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
514 if (!callback->onBackgroundScanResults(id, aidl_scan_datas).isOk()) {
515 LOG(ERROR) << "Failed to invoke onBackgroundScanResults callback";
516 }
517 }
518 };
519 const auto& on_full_result_callback = [weak_ptr_this](
520 legacy_hal::wifi_request_id id,
521 const legacy_hal::wifi_scan_result* result,
522 uint32_t buckets_scanned) {
523 const auto shared_ptr_this = weak_ptr_this.lock();
524 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
525 LOG(ERROR) << "Callback invoked on an invalid object";
526 return;
527 }
528 StaScanResult aidl_scan_result;
529 if (!aidl_struct_util::convertLegacyGscanResultToAidl(*result, true, &aidl_scan_result)) {
530 LOG(ERROR) << "Failed to convert full scan results to AIDL structs";
531 return;
532 }
533 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
534 if (!callback->onBackgroundFullScanResult(id, buckets_scanned, aidl_scan_result)
535 .isOk()) {
536 LOG(ERROR) << "Failed to invoke onBackgroundFullScanResult callback";
537 }
538 }
539 };
540 legacy_hal::wifi_error legacy_status =
541 legacy_hal_.lock()->startGscan(ifname_, cmd_id, legacy_params, on_failure_callback,
542 on_results_callback, on_full_result_callback);
543 return createWifiStatusFromLegacyError(legacy_status);
544 }
545
stopBackgroundScanInternal(int32_t cmd_id)546 ndk::ScopedAStatus WifiStaIface::stopBackgroundScanInternal(int32_t cmd_id) {
547 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->stopGscan(ifname_, cmd_id);
548 return createWifiStatusFromLegacyError(legacy_status);
549 }
550
enableLinkLayerStatsCollectionInternal(bool debug)551 ndk::ScopedAStatus WifiStaIface::enableLinkLayerStatsCollectionInternal(bool debug) {
552 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->enableLinkLayerStats(ifname_, debug);
553 return createWifiStatusFromLegacyError(legacy_status);
554 }
555
disableLinkLayerStatsCollectionInternal()556 ndk::ScopedAStatus WifiStaIface::disableLinkLayerStatsCollectionInternal() {
557 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->disableLinkLayerStats(ifname_);
558 return createWifiStatusFromLegacyError(legacy_status);
559 }
560
getLinkLayerStatsInternal()561 std::pair<StaLinkLayerStats, ndk::ScopedAStatus> WifiStaIface::getLinkLayerStatsInternal() {
562 legacy_hal::wifi_error legacy_status;
563 legacy_hal::LinkLayerStats legacy_stats{};
564 legacy_hal::LinkLayerMlStats legacy_ml_stats{};
565 legacy_status = legacy_hal_.lock()->getLinkLayerStats(ifname_, legacy_stats, legacy_ml_stats);
566 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
567 return {StaLinkLayerStats{}, createWifiStatusFromLegacyError(legacy_status)};
568 }
569 StaLinkLayerStats aidl_stats;
570 if (legacy_stats.valid) {
571 if (!aidl_struct_util::convertLegacyLinkLayerStatsToAidl(legacy_stats, &aidl_stats)) {
572 return {StaLinkLayerStats{}, createWifiStatus(WifiStatusCode::ERROR_UNKNOWN)};
573 }
574 } else if (legacy_ml_stats.valid) {
575 if (!aidl_struct_util::convertLegacyLinkLayerMlStatsToAidl(legacy_ml_stats, &aidl_stats)) {
576 return {StaLinkLayerStats{}, createWifiStatus(WifiStatusCode::ERROR_UNKNOWN)};
577 }
578 } else {
579 return {StaLinkLayerStats{}, createWifiStatus(WifiStatusCode::ERROR_UNKNOWN)};
580 }
581 aidl_struct_util::logAidlLinkLayerStatsSize(aidl_stats);
582 return {aidl_stats, ndk::ScopedAStatus::ok()};
583 }
584
startRssiMonitoringInternal(int32_t cmd_id,int32_t max_rssi,int32_t min_rssi)585 ndk::ScopedAStatus WifiStaIface::startRssiMonitoringInternal(int32_t cmd_id, int32_t max_rssi,
586 int32_t min_rssi) {
587 std::weak_ptr<WifiStaIface> weak_ptr_this = weak_ptr_this_;
588 const auto& on_threshold_breached_callback =
589 [weak_ptr_this](legacy_hal::wifi_request_id id, std::array<uint8_t, ETH_ALEN> bssid,
590 int8_t rssi) {
591 const auto shared_ptr_this = weak_ptr_this.lock();
592 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
593 LOG(ERROR) << "Callback invoked on an invalid object";
594 return;
595 }
596 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
597 if (!callback->onRssiThresholdBreached(id, bssid, rssi).isOk()) {
598 LOG(ERROR) << "Failed to invoke onRssiThresholdBreached callback";
599 }
600 }
601 };
602 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->startRssiMonitoring(
603 ifname_, cmd_id, max_rssi, min_rssi, on_threshold_breached_callback);
604 return createWifiStatusFromLegacyError(legacy_status);
605 }
606
stopRssiMonitoringInternal(int32_t cmd_id)607 ndk::ScopedAStatus WifiStaIface::stopRssiMonitoringInternal(int32_t cmd_id) {
608 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->stopRssiMonitoring(ifname_, cmd_id);
609 return createWifiStatusFromLegacyError(legacy_status);
610 }
611
612 std::pair<StaRoamingCapabilities, ndk::ScopedAStatus>
getRoamingCapabilitiesInternal()613 WifiStaIface::getRoamingCapabilitiesInternal() {
614 legacy_hal::wifi_error legacy_status;
615 legacy_hal::wifi_roaming_capabilities legacy_caps;
616 std::tie(legacy_status, legacy_caps) = legacy_hal_.lock()->getRoamingCapabilities(ifname_);
617 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
618 return {StaRoamingCapabilities{}, createWifiStatusFromLegacyError(legacy_status)};
619 }
620 StaRoamingCapabilities aidl_caps;
621 if (!aidl_struct_util::convertLegacyRoamingCapabilitiesToAidl(legacy_caps, &aidl_caps)) {
622 return {StaRoamingCapabilities{}, createWifiStatus(WifiStatusCode::ERROR_UNKNOWN)};
623 }
624 return {aidl_caps, ndk::ScopedAStatus::ok()};
625 }
626
configureRoamingInternal(const StaRoamingConfig & config)627 ndk::ScopedAStatus WifiStaIface::configureRoamingInternal(const StaRoamingConfig& config) {
628 legacy_hal::wifi_roaming_config legacy_config;
629 if (!aidl_struct_util::convertAidlRoamingConfigToLegacy(config, &legacy_config)) {
630 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
631 }
632 legacy_hal::wifi_error legacy_status =
633 legacy_hal_.lock()->configureRoaming(ifname_, legacy_config);
634 return createWifiStatusFromLegacyError(legacy_status);
635 }
636
setRoamingStateInternal(StaRoamingState state)637 ndk::ScopedAStatus WifiStaIface::setRoamingStateInternal(StaRoamingState state) {
638 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->enableFirmwareRoaming(
639 ifname_, aidl_struct_util::convertAidlRoamingStateToLegacy(state));
640 return createWifiStatusFromLegacyError(legacy_status);
641 }
642
enableNdOffloadInternal(bool enable)643 ndk::ScopedAStatus WifiStaIface::enableNdOffloadInternal(bool enable) {
644 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->configureNdOffload(ifname_, enable);
645 return createWifiStatusFromLegacyError(legacy_status);
646 }
647
startSendingKeepAlivePacketsInternal(int32_t cmd_id,const std::vector<uint8_t> & ip_packet_data,char16_t ether_type,const std::array<uint8_t,6> & src_address,const std::array<uint8_t,6> & dst_address,int32_t period_in_ms)648 ndk::ScopedAStatus WifiStaIface::startSendingKeepAlivePacketsInternal(
649 int32_t cmd_id, const std::vector<uint8_t>& ip_packet_data, char16_t ether_type,
650 const std::array<uint8_t, 6>& src_address, const std::array<uint8_t, 6>& dst_address,
651 int32_t period_in_ms) {
652 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->startSendingOffloadedPacket(
653 ifname_, cmd_id, ether_type, ip_packet_data, src_address, dst_address, period_in_ms);
654 return createWifiStatusFromLegacyError(legacy_status);
655 }
656
stopSendingKeepAlivePacketsInternal(int32_t cmd_id)657 ndk::ScopedAStatus WifiStaIface::stopSendingKeepAlivePacketsInternal(int32_t cmd_id) {
658 legacy_hal::wifi_error legacy_status =
659 legacy_hal_.lock()->stopSendingOffloadedPacket(ifname_, cmd_id);
660 return createWifiStatusFromLegacyError(legacy_status);
661 }
662
startDebugPacketFateMonitoringInternal()663 ndk::ScopedAStatus WifiStaIface::startDebugPacketFateMonitoringInternal() {
664 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->startPktFateMonitoring(ifname_);
665 return createWifiStatusFromLegacyError(legacy_status);
666 }
667
668 std::pair<std::vector<WifiDebugTxPacketFateReport>, ndk::ScopedAStatus>
getDebugTxPacketFatesInternal()669 WifiStaIface::getDebugTxPacketFatesInternal() {
670 legacy_hal::wifi_error legacy_status;
671 std::vector<legacy_hal::wifi_tx_report> legacy_fates;
672 std::tie(legacy_status, legacy_fates) = legacy_hal_.lock()->getTxPktFates(ifname_);
673 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
674 return {std::vector<WifiDebugTxPacketFateReport>(),
675 createWifiStatusFromLegacyError(legacy_status)};
676 }
677 std::vector<WifiDebugTxPacketFateReport> aidl_fates;
678 if (!aidl_struct_util::convertLegacyVectorOfDebugTxPacketFateToAidl(legacy_fates,
679 &aidl_fates)) {
680 return {std::vector<WifiDebugTxPacketFateReport>(),
681 createWifiStatus(WifiStatusCode::ERROR_UNKNOWN)};
682 }
683 return {aidl_fates, ndk::ScopedAStatus::ok()};
684 }
685
686 std::pair<std::vector<WifiDebugRxPacketFateReport>, ndk::ScopedAStatus>
getDebugRxPacketFatesInternal()687 WifiStaIface::getDebugRxPacketFatesInternal() {
688 legacy_hal::wifi_error legacy_status;
689 std::vector<legacy_hal::wifi_rx_report> legacy_fates;
690 std::tie(legacy_status, legacy_fates) = legacy_hal_.lock()->getRxPktFates(ifname_);
691 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
692 return {std::vector<WifiDebugRxPacketFateReport>(),
693 createWifiStatusFromLegacyError(legacy_status)};
694 }
695 std::vector<WifiDebugRxPacketFateReport> aidl_fates;
696 if (!aidl_struct_util::convertLegacyVectorOfDebugRxPacketFateToAidl(legacy_fates,
697 &aidl_fates)) {
698 return {std::vector<WifiDebugRxPacketFateReport>(),
699 createWifiStatus(WifiStatusCode::ERROR_UNKNOWN)};
700 }
701 return {aidl_fates, ndk::ScopedAStatus::ok()};
702 }
703
setMacAddressInternal(const std::array<uint8_t,6> & mac)704 ndk::ScopedAStatus WifiStaIface::setMacAddressInternal(const std::array<uint8_t, 6>& mac) {
705 bool status = iface_util_.lock()->setMacAddress(ifname_, mac);
706 if (!status) {
707 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
708 }
709 return ndk::ScopedAStatus::ok();
710 }
711
getFactoryMacAddressInternal()712 std::pair<std::array<uint8_t, 6>, ndk::ScopedAStatus> WifiStaIface::getFactoryMacAddressInternal() {
713 std::array<uint8_t, 6> mac = iface_util_.lock()->getFactoryMacAddress(ifname_);
714 if (mac[0] == 0 && mac[1] == 0 && mac[2] == 0 && mac[3] == 0 && mac[4] == 0 && mac[5] == 0) {
715 return {mac, createWifiStatus(WifiStatusCode::ERROR_UNKNOWN)};
716 }
717 return {mac, ndk::ScopedAStatus::ok()};
718 }
719
setScanModeInternal(bool enable)720 ndk::ScopedAStatus WifiStaIface::setScanModeInternal(bool enable) {
721 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->setScanMode(ifname_, enable);
722 return createWifiStatusFromLegacyError(legacy_status);
723 }
724
setDtimMultiplierInternal(const int multiplier)725 ndk::ScopedAStatus WifiStaIface::setDtimMultiplierInternal(const int multiplier) {
726 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->setDtimConfig(ifname_, multiplier);
727 return createWifiStatusFromLegacyError(legacy_status);
728 }
729
getCachedScanDataInternal()730 std::pair<CachedScanData, ndk::ScopedAStatus> WifiStaIface::getCachedScanDataInternal() {
731 legacy_hal::WifiCachedScanReport cached_scan_report;
732 legacy_hal::wifi_error legacy_status =
733 legacy_hal_.lock()->getWifiCachedScanResults(ifname_, cached_scan_report);
734 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
735 return {CachedScanData{}, createWifiStatusFromLegacyError(legacy_status)};
736 }
737 CachedScanData aidl_scan_data;
738 if (!aidl_struct_util::convertCachedScanReportToAidl(cached_scan_report, &aidl_scan_data)) {
739 return {CachedScanData{}, createWifiStatus(WifiStatusCode::ERROR_UNKNOWN)};
740 }
741
742 return {aidl_scan_data, ndk::ScopedAStatus::ok()};
743 }
744
twtGetCapabilitiesInternal()745 std::pair<TwtCapabilities, ndk::ScopedAStatus> WifiStaIface::twtGetCapabilitiesInternal() {
746 legacy_hal::wifi_twt_capabilities legacyHaltwtCapabilities;
747 legacy_hal::wifi_error legacy_status;
748 std::tie(legacyHaltwtCapabilities, legacy_status) =
749 legacy_hal_.lock()->twtGetCapabilities(ifname_);
750 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
751 return {TwtCapabilities{}, createWifiStatusFromLegacyError(legacy_status)};
752 }
753 TwtCapabilities aidlTwtCapabilities;
754 if (!aidl_struct_util::convertTwtCapabilitiesToAidl(legacyHaltwtCapabilities,
755 &aidlTwtCapabilities)) {
756 return {TwtCapabilities{}, createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS)};
757 }
758 return {aidlTwtCapabilities, ndk::ScopedAStatus::ok()};
759 }
760
twtSessionSetupInternal(int32_t cmdId,const TwtRequest & aidlTwtRequest)761 ndk::ScopedAStatus WifiStaIface::twtSessionSetupInternal(int32_t cmdId,
762 const TwtRequest& aidlTwtRequest) {
763 if (!is_twt_registered_) {
764 LOG(INFO) << "twtSessionSetup is not supported as twtRegisterEvents failed";
765 return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
766 }
767 legacy_hal::wifi_twt_request legacyHalTwtRequest;
768 if (!aidl_struct_util::convertAidlTwtRequestToLegacy(aidlTwtRequest, &legacyHalTwtRequest)) {
769 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
770 }
771 legacy_hal::wifi_error legacy_status =
772 legacy_hal_.lock()->twtSessionSetup(ifname_, cmdId, legacyHalTwtRequest);
773 return createWifiStatusFromLegacyError(legacy_status);
774 }
775
twtSessionUpdateInternal(int32_t cmdId,int32_t sessionId,const TwtRequest & aidlTwtRequest)776 ndk::ScopedAStatus WifiStaIface::twtSessionUpdateInternal(int32_t cmdId, int32_t sessionId,
777 const TwtRequest& aidlTwtRequest) {
778 legacy_hal::wifi_twt_request legacyHalTwtRequest;
779 if (!aidl_struct_util::convertAidlTwtRequestToLegacy(aidlTwtRequest, &legacyHalTwtRequest)) {
780 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
781 }
782 legacy_hal::wifi_error legacy_status =
783 legacy_hal_.lock()->twtSessionUpdate(ifname_, cmdId, sessionId, legacyHalTwtRequest);
784 return createWifiStatusFromLegacyError(legacy_status);
785 }
786
twtSessionSuspendInternal(int32_t cmdId,int32_t sessionId)787 ndk::ScopedAStatus WifiStaIface::twtSessionSuspendInternal(int32_t cmdId, int32_t sessionId) {
788 legacy_hal::wifi_error legacy_status =
789 legacy_hal_.lock()->twtSessionSuspend(ifname_, cmdId, sessionId);
790 return createWifiStatusFromLegacyError(legacy_status);
791 }
792
twtSessionResumeInternal(int32_t cmdId,int32_t sessionId)793 ndk::ScopedAStatus WifiStaIface::twtSessionResumeInternal(int32_t cmdId, int32_t sessionId) {
794 legacy_hal::wifi_error legacy_status =
795 legacy_hal_.lock()->twtSessionResume(ifname_, cmdId, sessionId);
796 return createWifiStatusFromLegacyError(legacy_status);
797 }
798
twtSessionTeardownInternal(int32_t cmdId,int32_t sessionId)799 ndk::ScopedAStatus WifiStaIface::twtSessionTeardownInternal(int32_t cmdId, int32_t sessionId) {
800 legacy_hal::wifi_error legacy_status =
801 legacy_hal_.lock()->twtSessionTeardown(ifname_, cmdId, sessionId);
802 return createWifiStatusFromLegacyError(legacy_status);
803 }
804
twtSessionGetStatsInternal(int32_t cmdId,int32_t sessionId)805 ndk::ScopedAStatus WifiStaIface::twtSessionGetStatsInternal(int32_t cmdId, int32_t sessionId) {
806 legacy_hal::wifi_error legacy_status =
807 legacy_hal_.lock()->twtSessionGetStats(ifname_, cmdId, sessionId);
808 return createWifiStatusFromLegacyError(legacy_status);
809 }
810
811 } // namespace wifi
812 } // namespace hardware
813 } // namespace android
814 } // namespace aidl
815