blob: f5e1d5aafc58f4ef0c6dee6539d79959bddb2195 [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
46std::vector<sp<V1_4::IWifiRttControllerEventCallback>> WifiRttController::getEventCallbacks() {
47 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,
105 const WifiChannelInfo& channel_hint,
106 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,
147 const WifiChannelInfo& channel_hint,
148 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
156std::pair<WifiStatus, sp<IWifiIface>> WifiRttController::getBoundIfaceInternal() {
157 return {createWifiStatus(WifiStatusCode::SUCCESS), bound_iface_};
158}
159
160WifiStatus WifiRttController::registerEventCallbackInternal(
161 const sp<V1_0::IWifiRttControllerEventCallback>& /* callback */) {
162 // Deprecated support for this api
163 return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
164}
165
166WifiStatus WifiRttController::rangeRequestInternal(
167 uint32_t /* cmd_id */, const std::vector<V1_0::RttConfig>& /* rtt_configs */) {
168 // Deprecated support for this api
169 return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
170}
171
172WifiStatus WifiRttController::rangeCancelInternal(
173 uint32_t cmd_id, const std::vector<hidl_array<uint8_t, 6>>& addrs) {
174 std::vector<std::array<uint8_t, 6>> legacy_addrs;
175 for (const auto& addr : addrs) {
176 legacy_addrs.push_back(addr);
177 }
178 legacy_hal::wifi_error legacy_status =
179 legacy_hal_.lock()->cancelRttRangeRequest(ifname_, cmd_id, legacy_addrs);
180 return createWifiStatusFromLegacyError(legacy_status);
181}
182
183std::pair<WifiStatus, V1_0::RttCapabilities> WifiRttController::getCapabilitiesInternal() {
184 // Deprecated support for this api
185 return {createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED), {}};
186}
187
188WifiStatus WifiRttController::setLciInternal(uint32_t cmd_id, const RttLciInformation& lci) {
189 legacy_hal::wifi_lci_information legacy_lci;
190 if (!hidl_struct_util::convertHidlRttLciInformationToLegacy(lci, &legacy_lci)) {
191 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
192 }
193 legacy_hal::wifi_error legacy_status =
194 legacy_hal_.lock()->setRttLci(ifname_, cmd_id, legacy_lci);
195 return createWifiStatusFromLegacyError(legacy_status);
196}
197
198WifiStatus WifiRttController::setLcrInternal(uint32_t cmd_id, const RttLcrInformation& lcr) {
199 legacy_hal::wifi_lcr_information legacy_lcr;
200 if (!hidl_struct_util::convertHidlRttLcrInformationToLegacy(lcr, &legacy_lcr)) {
201 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
202 }
203 legacy_hal::wifi_error legacy_status =
204 legacy_hal_.lock()->setRttLcr(ifname_, cmd_id, legacy_lcr);
205 return createWifiStatusFromLegacyError(legacy_status);
206}
207
208std::pair<WifiStatus, V1_0::RttResponder> WifiRttController::getResponderInfoInternal() {
209 // Deprecated support for this api
210 return {createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED), {}};
211}
212
213WifiStatus WifiRttController::enableResponderInternal(uint32_t /* cmd_id */,
214 const WifiChannelInfo& /* channel_hint */,
215 uint32_t /* max_duration_seconds */,
216 const V1_0::RttResponder& /* info */) {
217 // Deprecated support for this api
218 return {createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED)};
219}
220
221WifiStatus WifiRttController::disableResponderInternal(uint32_t cmd_id) {
222 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->disableRttResponder(ifname_, cmd_id);
223 return createWifiStatusFromLegacyError(legacy_status);
224}
225
226WifiStatus WifiRttController::registerEventCallbackInternal_1_4(
227 const sp<V1_4::IWifiRttControllerEventCallback>& callback) {
228 // TODO(b/31632518): remove the callback when the client is destroyed
229 event_callbacks_.emplace_back(callback);
230 return createWifiStatus(WifiStatusCode::SUCCESS);
231}
232
233WifiStatus WifiRttController::rangeRequestInternal_1_4(
234 uint32_t cmd_id, const std::vector<V1_4::RttConfig>& rtt_configs) {
235 std::vector<legacy_hal::wifi_rtt_config> legacy_configs;
236 if (!hidl_struct_util::convertHidlVectorOfRttConfigToLegacy(rtt_configs, &legacy_configs)) {
237 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
238 }
239 android::wp<WifiRttController> weak_ptr_this(this);
240 const auto& on_results_callback =
241 [weak_ptr_this](legacy_hal::wifi_request_id id,
242 const std::vector<const legacy_hal::wifi_rtt_result*>& results) {
243 const auto shared_ptr_this = weak_ptr_this.promote();
244 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
245 LOG(ERROR) << "Callback invoked on an invalid object";
246 return;
247 }
248 std::vector<V1_4::RttResult> hidl_results;
249 if (!hidl_struct_util::convertLegacyVectorOfRttResultToHidl(results,
250 &hidl_results)) {
251 LOG(ERROR) << "Failed to convert rtt results to HIDL structs";
252 return;
253 }
254 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
255 callback->onResults_1_4(id, hidl_results);
256 }
257 };
258 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->startRttRangeRequest(
259 ifname_, cmd_id, legacy_configs, on_results_callback);
260 return createWifiStatusFromLegacyError(legacy_status);
261}
262
263std::pair<WifiStatus, V1_4::RttCapabilities> WifiRttController::getCapabilitiesInternal_1_4() {
264 legacy_hal::wifi_error legacy_status;
265 legacy_hal::wifi_rtt_capabilities legacy_caps;
266 std::tie(legacy_status, legacy_caps) = legacy_hal_.lock()->getRttCapabilities(ifname_);
267 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
268 return {createWifiStatusFromLegacyError(legacy_status), {}};
269 }
270 V1_4::RttCapabilities hidl_caps;
271 if (!hidl_struct_util::convertLegacyRttCapabilitiesToHidl(legacy_caps, &hidl_caps)) {
272 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
273 }
274 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
275}
276
277std::pair<WifiStatus, V1_4::RttResponder> WifiRttController::getResponderInfoInternal_1_4() {
278 legacy_hal::wifi_error legacy_status;
279 legacy_hal::wifi_rtt_responder legacy_responder;
280 std::tie(legacy_status, legacy_responder) = legacy_hal_.lock()->getRttResponderInfo(ifname_);
281 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
282 return {createWifiStatusFromLegacyError(legacy_status), {}};
283 }
284 V1_4::RttResponder hidl_responder;
285 if (!hidl_struct_util::convertLegacyRttResponderToHidl(legacy_responder, &hidl_responder)) {
286 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
287 }
288 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_responder};
289}
290
291WifiStatus WifiRttController::enableResponderInternal_1_4(uint32_t cmd_id,
292 const WifiChannelInfo& channel_hint,
293 uint32_t max_duration_seconds,
294 const V1_4::RttResponder& info) {
295 legacy_hal::wifi_channel_info legacy_channel_info;
296 if (!hidl_struct_util::convertHidlWifiChannelInfoToLegacy(channel_hint, &legacy_channel_info)) {
297 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
298 }
299 legacy_hal::wifi_rtt_responder legacy_responder;
300 if (!hidl_struct_util::convertHidlRttResponderToLegacy(info, &legacy_responder)) {
301 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
302 }
303 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->enableRttResponder(
304 ifname_, cmd_id, legacy_channel_info, max_duration_seconds, legacy_responder);
305 return createWifiStatusFromLegacyError(legacy_status);
306}
307} // namespace implementation
308} // namespace V1_6
309} // namespace wifi
310} // namespace hardware
311} // namespace android