blob: aa9ee2f52017c9421382ece68d4484fa8e22d5e5 [file] [log] [blame]
Ahmed ElArabawy687ce132022-01-11 16:42:48 -08001/*
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
17#include <android-base/logging.h>
18
19#include "hidl_return_util.h"
20#include "hidl_struct_util.h"
21#include "wifi_rtt_controller.h"
22#include "wifi_status_util.h"
23
24namespace android {
25namespace hardware {
26namespace wifi {
27namespace V1_6 {
28namespace implementation {
29using hidl_return_util::validateAndCall;
30
31WifiRttController::WifiRttController(const std::string& iface_name,
32 const sp<IWifiIface>& bound_iface,
33 const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal)
34 : ifname_(iface_name), bound_iface_(bound_iface), legacy_hal_(legacy_hal), is_valid_(true) {}
35
36void WifiRttController::invalidate() {
37 legacy_hal_.reset();
38 event_callbacks_.clear();
39 is_valid_ = false;
40}
41
42bool WifiRttController::isValid() {
43 return is_valid_;
44}
45
Ahmed ElArabawy05571e42022-01-19 11:54:11 -080046std::vector<sp<V1_6::IWifiRttControllerEventCallback>> WifiRttController::getEventCallbacks() {
Ahmed ElArabawy687ce132022-01-11 16:42:48 -080047 return event_callbacks_;
48}
49
50std::string WifiRttController::getIfaceName() {
51 return ifname_;
52}
53
54Return<void> WifiRttController::getBoundIface(getBoundIface_cb hidl_status_cb) {
55 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
56 &WifiRttController::getBoundIfaceInternal, hidl_status_cb);
57}
58
59Return<void> WifiRttController::registerEventCallback(
60 const sp<V1_0::IWifiRttControllerEventCallback>& callback,
61 registerEventCallback_cb hidl_status_cb) {
62 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
63 &WifiRttController::registerEventCallbackInternal, hidl_status_cb,
64 callback);
65}
66
67Return<void> WifiRttController::rangeRequest(uint32_t cmd_id,
68 const hidl_vec<V1_0::RttConfig>& rtt_configs,
69 rangeRequest_cb hidl_status_cb) {
70 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
71 &WifiRttController::rangeRequestInternal, hidl_status_cb, cmd_id,
72 rtt_configs);
73}
74
75Return<void> WifiRttController::rangeCancel(uint32_t cmd_id,
76 const hidl_vec<hidl_array<uint8_t, 6>>& addrs,
77 rangeCancel_cb hidl_status_cb) {
78 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
79 &WifiRttController::rangeCancelInternal, hidl_status_cb, cmd_id, addrs);
80}
81
82Return<void> WifiRttController::getCapabilities(getCapabilities_cb hidl_status_cb) {
83 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
84 &WifiRttController::getCapabilitiesInternal, hidl_status_cb);
85}
86
87Return<void> WifiRttController::setLci(uint32_t cmd_id, const RttLciInformation& lci,
88 setLci_cb hidl_status_cb) {
89 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
90 &WifiRttController::setLciInternal, hidl_status_cb, cmd_id, lci);
91}
92
93Return<void> WifiRttController::setLcr(uint32_t cmd_id, const RttLcrInformation& lcr,
94 setLcr_cb hidl_status_cb) {
95 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
96 &WifiRttController::setLcrInternal, hidl_status_cb, cmd_id, lcr);
97}
98
99Return<void> WifiRttController::getResponderInfo(getResponderInfo_cb hidl_status_cb) {
100 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
101 &WifiRttController::getResponderInfoInternal, hidl_status_cb);
102}
103
104Return<void> WifiRttController::enableResponder(uint32_t cmd_id,
Ahmed ElArabawy05571e42022-01-19 11:54:11 -0800105 const V1_0::WifiChannelInfo& channel_hint,
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800106 uint32_t max_duration_seconds,
107 const V1_0::RttResponder& info,
108 enableResponder_cb hidl_status_cb) {
109 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
110 &WifiRttController::enableResponderInternal, hidl_status_cb, cmd_id,
111 channel_hint, max_duration_seconds, info);
112}
113
114Return<void> WifiRttController::disableResponder(uint32_t cmd_id,
115 disableResponder_cb hidl_status_cb) {
116 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
117 &WifiRttController::disableResponderInternal, hidl_status_cb, cmd_id);
118}
119
120Return<void> WifiRttController::registerEventCallback_1_4(
121 const sp<V1_4::IWifiRttControllerEventCallback>& callback,
122 registerEventCallback_1_4_cb hidl_status_cb) {
123 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
124 &WifiRttController::registerEventCallbackInternal_1_4, hidl_status_cb,
125 callback);
126}
127
128Return<void> WifiRttController::rangeRequest_1_4(uint32_t cmd_id,
129 const hidl_vec<V1_4::RttConfig>& rtt_configs,
130 rangeRequest_1_4_cb hidl_status_cb) {
131 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
132 &WifiRttController::rangeRequestInternal_1_4, hidl_status_cb, cmd_id,
133 rtt_configs);
134}
135
136Return<void> WifiRttController::getCapabilities_1_4(getCapabilities_1_4_cb hidl_status_cb) {
137 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
138 &WifiRttController::getCapabilitiesInternal_1_4, hidl_status_cb);
139}
140
141Return<void> WifiRttController::getResponderInfo_1_4(getResponderInfo_1_4_cb hidl_status_cb) {
142 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
143 &WifiRttController::getResponderInfoInternal_1_4, hidl_status_cb);
144}
145
146Return<void> WifiRttController::enableResponder_1_4(uint32_t cmd_id,
Ahmed ElArabawy05571e42022-01-19 11:54:11 -0800147 const V1_0::WifiChannelInfo& channel_hint,
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800148 uint32_t max_duration_seconds,
149 const V1_4::RttResponder& info,
150 enableResponder_1_4_cb hidl_status_cb) {
151 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
152 &WifiRttController::enableResponderInternal_1_4, hidl_status_cb, cmd_id,
153 channel_hint, max_duration_seconds, info);
154}
155
Ahmed ElArabawy05571e42022-01-19 11:54:11 -0800156Return<void> WifiRttController::registerEventCallback_1_6(
157 const sp<V1_6::IWifiRttControllerEventCallback>& callback,
158 registerEventCallback_1_6_cb hidl_status_cb) {
159 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
160 &WifiRttController::registerEventCallbackInternal_1_6, hidl_status_cb,
161 callback);
162}
163
164Return<void> WifiRttController::rangeRequest_1_6(uint32_t cmd_id,
165 const hidl_vec<V1_6::RttConfig>& rtt_configs,
166 rangeRequest_1_6_cb hidl_status_cb) {
167 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
168 &WifiRttController::rangeRequestInternal_1_6, hidl_status_cb, cmd_id,
169 rtt_configs);
170}
171
172Return<void> WifiRttController::getCapabilities_1_6(getCapabilities_1_6_cb hidl_status_cb) {
173 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
174 &WifiRttController::getCapabilitiesInternal_1_6, hidl_status_cb);
175}
176
177Return<void> WifiRttController::getResponderInfo_1_6(getResponderInfo_1_6_cb hidl_status_cb) {
178 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
179 &WifiRttController::getResponderInfoInternal_1_6, hidl_status_cb);
180}
181
182Return<void> WifiRttController::enableResponder_1_6(uint32_t cmd_id,
183 const V1_6::WifiChannelInfo& channel_hint,
184 uint32_t max_duration_seconds,
185 const V1_6::RttResponder& info,
186 enableResponder_1_6_cb hidl_status_cb) {
187 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
188 &WifiRttController::enableResponderInternal_1_6, hidl_status_cb, cmd_id,
189 channel_hint, max_duration_seconds, info);
190}
191
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800192std::pair<WifiStatus, sp<IWifiIface>> WifiRttController::getBoundIfaceInternal() {
193 return {createWifiStatus(WifiStatusCode::SUCCESS), bound_iface_};
194}
195
196WifiStatus WifiRttController::registerEventCallbackInternal(
197 const sp<V1_0::IWifiRttControllerEventCallback>& /* callback */) {
198 // Deprecated support for this api
199 return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
200}
201
202WifiStatus WifiRttController::rangeRequestInternal(
203 uint32_t /* cmd_id */, const std::vector<V1_0::RttConfig>& /* rtt_configs */) {
204 // Deprecated support for this api
205 return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
206}
207
208WifiStatus WifiRttController::rangeCancelInternal(
209 uint32_t cmd_id, const std::vector<hidl_array<uint8_t, 6>>& addrs) {
210 std::vector<std::array<uint8_t, 6>> legacy_addrs;
211 for (const auto& addr : addrs) {
212 legacy_addrs.push_back(addr);
213 }
214 legacy_hal::wifi_error legacy_status =
215 legacy_hal_.lock()->cancelRttRangeRequest(ifname_, cmd_id, legacy_addrs);
216 return createWifiStatusFromLegacyError(legacy_status);
217}
218
219std::pair<WifiStatus, V1_0::RttCapabilities> WifiRttController::getCapabilitiesInternal() {
220 // Deprecated support for this api
221 return {createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED), {}};
222}
223
224WifiStatus WifiRttController::setLciInternal(uint32_t cmd_id, const RttLciInformation& lci) {
225 legacy_hal::wifi_lci_information legacy_lci;
226 if (!hidl_struct_util::convertHidlRttLciInformationToLegacy(lci, &legacy_lci)) {
227 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
228 }
229 legacy_hal::wifi_error legacy_status =
230 legacy_hal_.lock()->setRttLci(ifname_, cmd_id, legacy_lci);
231 return createWifiStatusFromLegacyError(legacy_status);
232}
233
234WifiStatus WifiRttController::setLcrInternal(uint32_t cmd_id, const RttLcrInformation& lcr) {
235 legacy_hal::wifi_lcr_information legacy_lcr;
236 if (!hidl_struct_util::convertHidlRttLcrInformationToLegacy(lcr, &legacy_lcr)) {
237 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
238 }
239 legacy_hal::wifi_error legacy_status =
240 legacy_hal_.lock()->setRttLcr(ifname_, cmd_id, legacy_lcr);
241 return createWifiStatusFromLegacyError(legacy_status);
242}
243
244std::pair<WifiStatus, V1_0::RttResponder> WifiRttController::getResponderInfoInternal() {
245 // Deprecated support for this api
246 return {createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED), {}};
247}
248
Ahmed ElArabawy05571e42022-01-19 11:54:11 -0800249WifiStatus WifiRttController::enableResponderInternal(
250 uint32_t /* cmd_id */, const V1_0::WifiChannelInfo& /* channel_hint */,
251 uint32_t /* max_duration_seconds */, const V1_0::RttResponder& /* info */) {
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800252 // Deprecated support for this api
253 return {createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED)};
254}
255
256WifiStatus WifiRttController::disableResponderInternal(uint32_t cmd_id) {
257 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->disableRttResponder(ifname_, cmd_id);
258 return createWifiStatusFromLegacyError(legacy_status);
259}
260
261WifiStatus WifiRttController::registerEventCallbackInternal_1_4(
Ahmed ElArabawy05571e42022-01-19 11:54:11 -0800262 const sp<V1_4::IWifiRttControllerEventCallback>& /* callback */) {
263 // Deprecated support for this api
264 return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
265}
266
267WifiStatus WifiRttController::rangeRequestInternal_1_4(
268 uint32_t /* cmd_id */, const std::vector<V1_4::RttConfig>& /* rtt_configs */) {
269 // Deprecated support for this api
270 return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
271}
272
273std::pair<WifiStatus, V1_4::RttCapabilities> WifiRttController::getCapabilitiesInternal_1_4() {
274 // Deprecated support for this api
275 return {createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED), {}};
276}
277
278std::pair<WifiStatus, V1_4::RttResponder> WifiRttController::getResponderInfoInternal_1_4() {
279 // Deprecated support for this api
280 return {createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED), {}};
281}
282
283WifiStatus WifiRttController::enableResponderInternal_1_4(
284 uint32_t /* cmd_id */, const V1_0::WifiChannelInfo& /* channel_hint */,
285 uint32_t /* max_duration_seconds */, const V1_4::RttResponder& /* info */) {
286 // Deprecated support for this api
287 return {createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED)};
288}
289
290WifiStatus WifiRttController::registerEventCallbackInternal_1_6(
291 const sp<V1_6::IWifiRttControllerEventCallback>& callback) {
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800292 // TODO(b/31632518): remove the callback when the client is destroyed
293 event_callbacks_.emplace_back(callback);
294 return createWifiStatus(WifiStatusCode::SUCCESS);
295}
296
Ahmed ElArabawy05571e42022-01-19 11:54:11 -0800297WifiStatus WifiRttController::rangeRequestInternal_1_6(
298 uint32_t cmd_id, const std::vector<V1_6::RttConfig>& rtt_configs) {
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800299 std::vector<legacy_hal::wifi_rtt_config> legacy_configs;
300 if (!hidl_struct_util::convertHidlVectorOfRttConfigToLegacy(rtt_configs, &legacy_configs)) {
301 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
302 }
303 android::wp<WifiRttController> weak_ptr_this(this);
304 const auto& on_results_callback =
305 [weak_ptr_this](legacy_hal::wifi_request_id id,
306 const std::vector<const legacy_hal::wifi_rtt_result*>& results) {
307 const auto shared_ptr_this = weak_ptr_this.promote();
308 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
309 LOG(ERROR) << "Callback invoked on an invalid object";
310 return;
311 }
Ahmed ElArabawy05571e42022-01-19 11:54:11 -0800312 std::vector<V1_6::RttResult> hidl_results;
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800313 if (!hidl_struct_util::convertLegacyVectorOfRttResultToHidl(results,
314 &hidl_results)) {
315 LOG(ERROR) << "Failed to convert rtt results to HIDL structs";
316 return;
317 }
318 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Nate Jiang95939ed2022-04-25 13:08:38 -0700319 if (!callback->onResults_1_6(id, hidl_results).isOk()) {
320 LOG(ERROR) << "Failed to invoke the callback";
321 }
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800322 }
323 };
324 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->startRttRangeRequest(
325 ifname_, cmd_id, legacy_configs, on_results_callback);
326 return createWifiStatusFromLegacyError(legacy_status);
327}
328
Ahmed ElArabawy05571e42022-01-19 11:54:11 -0800329std::pair<WifiStatus, V1_6::RttCapabilities> WifiRttController::getCapabilitiesInternal_1_6() {
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800330 legacy_hal::wifi_error legacy_status;
331 legacy_hal::wifi_rtt_capabilities legacy_caps;
332 std::tie(legacy_status, legacy_caps) = legacy_hal_.lock()->getRttCapabilities(ifname_);
333 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
334 return {createWifiStatusFromLegacyError(legacy_status), {}};
335 }
Ahmed ElArabawy05571e42022-01-19 11:54:11 -0800336 V1_6::RttCapabilities hidl_caps;
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800337 if (!hidl_struct_util::convertLegacyRttCapabilitiesToHidl(legacy_caps, &hidl_caps)) {
338 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
339 }
340 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
341}
342
Ahmed ElArabawy05571e42022-01-19 11:54:11 -0800343std::pair<WifiStatus, V1_6::RttResponder> WifiRttController::getResponderInfoInternal_1_6() {
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800344 legacy_hal::wifi_error legacy_status;
345 legacy_hal::wifi_rtt_responder legacy_responder;
346 std::tie(legacy_status, legacy_responder) = legacy_hal_.lock()->getRttResponderInfo(ifname_);
347 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
348 return {createWifiStatusFromLegacyError(legacy_status), {}};
349 }
Ahmed ElArabawy05571e42022-01-19 11:54:11 -0800350 V1_6::RttResponder hidl_responder;
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800351 if (!hidl_struct_util::convertLegacyRttResponderToHidl(legacy_responder, &hidl_responder)) {
352 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
353 }
354 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_responder};
355}
356
Ahmed ElArabawy05571e42022-01-19 11:54:11 -0800357WifiStatus WifiRttController::enableResponderInternal_1_6(uint32_t cmd_id,
358 const V1_6::WifiChannelInfo& channel_hint,
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800359 uint32_t max_duration_seconds,
Ahmed ElArabawy05571e42022-01-19 11:54:11 -0800360 const V1_6::RttResponder& info) {
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800361 legacy_hal::wifi_channel_info legacy_channel_info;
362 if (!hidl_struct_util::convertHidlWifiChannelInfoToLegacy(channel_hint, &legacy_channel_info)) {
363 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
364 }
365 legacy_hal::wifi_rtt_responder legacy_responder;
366 if (!hidl_struct_util::convertHidlRttResponderToLegacy(info, &legacy_responder)) {
367 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
368 }
369 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->enableRttResponder(
370 ifname_, cmd_id, legacy_channel_info, max_duration_seconds, legacy_responder);
371 return createWifiStatusFromLegacyError(legacy_status);
372}
373} // namespace implementation
374} // namespace V1_6
375} // namespace wifi
376} // namespace hardware
377} // namespace android