blob: 3dcbee687b0c503883485428142d5c44abb616aa [file] [log] [blame]
Roshan Pius59268282016-10-06 20:23:47 -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 Pius59268282016-10-06 20:23:47 -070017#include <android-base/logging.h>
18
Roshan Pius907d4a22016-10-27 12:48:12 -070019#include "hidl_return_util.h"
Roshan Piuse3f72ff2016-12-05 16:18:43 -080020#include "hidl_struct_util.h"
Roshan Pius907d4a22016-10-27 12:48:12 -070021#include "wifi_rtt_controller.h"
Roshan Pius734fea02016-10-11 08:30:28 -070022#include "wifi_status_util.h"
Roshan Pius59268282016-10-06 20:23:47 -070023
24namespace android {
25namespace hardware {
26namespace wifi {
Jong Wook Kimda830c92018-07-23 15:29:38 -070027namespace V1_3 {
Roshan Pius59268282016-10-06 20:23:47 -070028namespace implementation {
Roshan Pius907d4a22016-10-27 12:48:12 -070029using hidl_return_util::validateAndCall;
Roshan Pius59268282016-10-06 20:23:47 -070030
31WifiRttController::WifiRttController(
Roshan Piusabcf78f2017-10-06 16:30:38 -070032 const std::string& iface_name, const sp<IWifiIface>& bound_iface,
Roshan Pius6cedc972016-10-28 10:11:17 -070033 const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal)
Roshan Piusabcf78f2017-10-06 16:30:38 -070034 : ifname_(iface_name),
35 bound_iface_(bound_iface),
36 legacy_hal_(legacy_hal),
Roshan Pius9377a0d2017-10-06 13:18:54 -070037 is_valid_(true) {}
Roshan Pius59268282016-10-06 20:23:47 -070038
39void WifiRttController::invalidate() {
Roshan Piusabcf78f2017-10-06 16:30:38 -070040 legacy_hal_.reset();
41 event_callbacks_.clear();
42 is_valid_ = false;
Roshan Pius59268282016-10-06 20:23:47 -070043}
44
Roshan Piusabcf78f2017-10-06 16:30:38 -070045bool WifiRttController::isValid() { return is_valid_; }
Roshan Pius907d4a22016-10-27 12:48:12 -070046
Roshan Piuse3f72ff2016-12-05 16:18:43 -080047std::vector<sp<IWifiRttControllerEventCallback>>
48WifiRttController::getEventCallbacks() {
Roshan Piusabcf78f2017-10-06 16:30:38 -070049 return event_callbacks_;
Roshan Piuse3f72ff2016-12-05 16:18:43 -080050}
51
Roshan Pius82368502019-05-16 12:53:02 -070052std::string WifiRttController::getIfaceName() { return ifname_; }
53
Roshan Pius734fea02016-10-11 08:30:28 -070054Return<void> WifiRttController::getBoundIface(getBoundIface_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070055 return validateAndCall(
56 this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
57 &WifiRttController::getBoundIfaceInternal, hidl_status_cb);
Roshan Pius907d4a22016-10-27 12:48:12 -070058}
59
Roshan Pius7913f5e2016-10-27 17:09:30 -070060Return<void> WifiRttController::registerEventCallback(
61 const sp<IWifiRttControllerEventCallback>& callback,
62 registerEventCallback_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070063 return validateAndCall(this,
64 WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
65 &WifiRttController::registerEventCallbackInternal,
66 hidl_status_cb, callback);
Roshan Pius7913f5e2016-10-27 17:09:30 -070067}
68
69Return<void> WifiRttController::rangeRequest(
Roshan Piusabcf78f2017-10-06 16:30:38 -070070 uint32_t cmd_id, const hidl_vec<RttConfig>& rtt_configs,
Roshan Pius7913f5e2016-10-27 17:09:30 -070071 rangeRequest_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070072 return validateAndCall(this,
73 WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
74 &WifiRttController::rangeRequestInternal,
75 hidl_status_cb, cmd_id, rtt_configs);
Roshan Pius7913f5e2016-10-27 17:09:30 -070076}
77
78Return<void> WifiRttController::rangeCancel(
Roshan Piusabcf78f2017-10-06 16:30:38 -070079 uint32_t cmd_id, const hidl_vec<hidl_array<uint8_t, 6>>& addrs,
Roshan Pius7913f5e2016-10-27 17:09:30 -070080 rangeCancel_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070081 return validateAndCall(
82 this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
83 &WifiRttController::rangeCancelInternal, hidl_status_cb, cmd_id, addrs);
Roshan Pius7913f5e2016-10-27 17:09:30 -070084}
85
Roshan Pius7913f5e2016-10-27 17:09:30 -070086Return<void> WifiRttController::getCapabilities(
87 getCapabilities_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070088 return validateAndCall(
89 this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
90 &WifiRttController::getCapabilitiesInternal, hidl_status_cb);
Roshan Pius7913f5e2016-10-27 17:09:30 -070091}
92
Roshan Pius7913f5e2016-10-27 17:09:30 -070093Return<void> WifiRttController::setLci(uint32_t cmd_id,
94 const RttLciInformation& lci,
95 setLci_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070096 return validateAndCall(
97 this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
98 &WifiRttController::setLciInternal, hidl_status_cb, cmd_id, lci);
Roshan Pius7913f5e2016-10-27 17:09:30 -070099}
100
101Return<void> WifiRttController::setLcr(uint32_t cmd_id,
102 const RttLcrInformation& lcr,
103 setLcr_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700104 return validateAndCall(
105 this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
106 &WifiRttController::setLcrInternal, hidl_status_cb, cmd_id, lcr);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700107}
108
109Return<void> WifiRttController::getResponderInfo(
110 getResponderInfo_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700111 return validateAndCall(
112 this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
113 &WifiRttController::getResponderInfoInternal, hidl_status_cb);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700114}
115
116Return<void> WifiRttController::enableResponder(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700117 uint32_t cmd_id, const WifiChannelInfo& channel_hint,
118 uint32_t max_duration_seconds, const RttResponder& info,
Roshan Pius7913f5e2016-10-27 17:09:30 -0700119 enableResponder_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700120 return validateAndCall(
121 this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
122 &WifiRttController::enableResponderInternal, hidl_status_cb, cmd_id,
123 channel_hint, max_duration_seconds, info);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700124}
125
126Return<void> WifiRttController::disableResponder(
127 uint32_t cmd_id, disableResponder_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700128 return validateAndCall(
129 this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
130 &WifiRttController::disableResponderInternal, hidl_status_cb, cmd_id);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700131}
132
Roshan Pius907d4a22016-10-27 12:48:12 -0700133std::pair<WifiStatus, sp<IWifiIface>>
134WifiRttController::getBoundIfaceInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700135 return {createWifiStatus(WifiStatusCode::SUCCESS), bound_iface_};
Roshan Pius59268282016-10-06 20:23:47 -0700136}
137
Roshan Pius7913f5e2016-10-27 17:09:30 -0700138WifiStatus WifiRttController::registerEventCallbackInternal(
139 const sp<IWifiRttControllerEventCallback>& callback) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700140 // TODO(b/31632518): remove the callback when the client is destroyed
141 event_callbacks_.emplace_back(callback);
142 return createWifiStatus(WifiStatusCode::SUCCESS);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700143}
144
145WifiStatus WifiRttController::rangeRequestInternal(
Roshan Piuse3f72ff2016-12-05 16:18:43 -0800146 uint32_t cmd_id, const std::vector<RttConfig>& rtt_configs) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700147 std::vector<legacy_hal::wifi_rtt_config> legacy_configs;
148 if (!hidl_struct_util::convertHidlVectorOfRttConfigToLegacy(
149 rtt_configs, &legacy_configs)) {
150 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
Roshan Piuse3f72ff2016-12-05 16:18:43 -0800151 }
Roshan Piusabcf78f2017-10-06 16:30:38 -0700152 android::wp<WifiRttController> weak_ptr_this(this);
153 const auto& on_results_callback =
154 [weak_ptr_this](
155 legacy_hal::wifi_request_id id,
156 const std::vector<const legacy_hal::wifi_rtt_result*>& results) {
157 const auto shared_ptr_this = weak_ptr_this.promote();
158 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
159 LOG(ERROR) << "Callback invoked on an invalid object";
160 return;
161 }
162 std::vector<RttResult> hidl_results;
163 if (!hidl_struct_util::convertLegacyVectorOfRttResultToHidl(
164 results, &hidl_results)) {
165 LOG(ERROR) << "Failed to convert rtt results to HIDL structs";
166 return;
167 }
168 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
169 callback->onResults(id, hidl_results);
170 }
171 };
172 legacy_hal::wifi_error legacy_status =
173 legacy_hal_.lock()->startRttRangeRequest(
174 ifname_, cmd_id, legacy_configs, on_results_callback);
175 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700176}
177
178WifiStatus WifiRttController::rangeCancelInternal(
Roshan Piuse3f72ff2016-12-05 16:18:43 -0800179 uint32_t cmd_id, const std::vector<hidl_array<uint8_t, 6>>& addrs) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700180 std::vector<std::array<uint8_t, 6>> legacy_addrs;
181 for (const auto& addr : addrs) {
182 legacy_addrs.push_back(addr);
183 }
184 legacy_hal::wifi_error legacy_status =
185 legacy_hal_.lock()->cancelRttRangeRequest(ifname_, cmd_id,
186 legacy_addrs);
187 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700188}
189
Roshan Pius7913f5e2016-10-27 17:09:30 -0700190std::pair<WifiStatus, RttCapabilities>
191WifiRttController::getCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700192 legacy_hal::wifi_error legacy_status;
193 legacy_hal::wifi_rtt_capabilities legacy_caps;
194 std::tie(legacy_status, legacy_caps) =
195 legacy_hal_.lock()->getRttCapabilities(ifname_);
196 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
197 return {createWifiStatusFromLegacyError(legacy_status), {}};
198 }
199 RttCapabilities hidl_caps;
200 if (!hidl_struct_util::convertLegacyRttCapabilitiesToHidl(legacy_caps,
201 &hidl_caps)) {
202 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
203 }
204 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Pius7913f5e2016-10-27 17:09:30 -0700205}
206
Roshan Piuse3f72ff2016-12-05 16:18:43 -0800207WifiStatus WifiRttController::setLciInternal(uint32_t cmd_id,
208 const RttLciInformation& lci) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700209 legacy_hal::wifi_lci_information legacy_lci;
210 if (!hidl_struct_util::convertHidlRttLciInformationToLegacy(lci,
211 &legacy_lci)) {
212 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
213 }
214 legacy_hal::wifi_error legacy_status =
215 legacy_hal_.lock()->setRttLci(ifname_, cmd_id, legacy_lci);
216 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700217}
218
Roshan Piuse3f72ff2016-12-05 16:18:43 -0800219WifiStatus WifiRttController::setLcrInternal(uint32_t cmd_id,
220 const RttLcrInformation& lcr) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700221 legacy_hal::wifi_lcr_information legacy_lcr;
222 if (!hidl_struct_util::convertHidlRttLcrInformationToLegacy(lcr,
223 &legacy_lcr)) {
224 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
225 }
226 legacy_hal::wifi_error legacy_status =
227 legacy_hal_.lock()->setRttLcr(ifname_, cmd_id, legacy_lcr);
228 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700229}
230
231std::pair<WifiStatus, RttResponder>
232WifiRttController::getResponderInfoInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700233 legacy_hal::wifi_error legacy_status;
234 legacy_hal::wifi_rtt_responder legacy_responder;
235 std::tie(legacy_status, legacy_responder) =
236 legacy_hal_.lock()->getRttResponderInfo(ifname_);
237 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
238 return {createWifiStatusFromLegacyError(legacy_status), {}};
239 }
240 RttResponder hidl_responder;
241 if (!hidl_struct_util::convertLegacyRttResponderToHidl(legacy_responder,
242 &hidl_responder)) {
243 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
244 }
245 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_responder};
Roshan Pius7913f5e2016-10-27 17:09:30 -0700246}
247
248WifiStatus WifiRttController::enableResponderInternal(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700249 uint32_t cmd_id, const WifiChannelInfo& channel_hint,
250 uint32_t max_duration_seconds, const RttResponder& info) {
251 legacy_hal::wifi_channel_info legacy_channel_info;
252 if (!hidl_struct_util::convertHidlWifiChannelInfoToLegacy(
253 channel_hint, &legacy_channel_info)) {
254 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
255 }
256 legacy_hal::wifi_rtt_responder legacy_responder;
257 if (!hidl_struct_util::convertHidlRttResponderToLegacy(info,
258 &legacy_responder)) {
259 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
260 }
261 legacy_hal::wifi_error legacy_status =
262 legacy_hal_.lock()->enableRttResponder(
263 ifname_, cmd_id, legacy_channel_info, max_duration_seconds,
264 legacy_responder);
265 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700266}
267
Roshan Piuse3f72ff2016-12-05 16:18:43 -0800268WifiStatus WifiRttController::disableResponderInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700269 legacy_hal::wifi_error legacy_status =
270 legacy_hal_.lock()->disableRttResponder(ifname_, cmd_id);
271 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700272}
Roshan Pius59268282016-10-06 20:23:47 -0700273} // namespace implementation
Jong Wook Kimda830c92018-07-23 15:29:38 -0700274} // namespace V1_3
Roshan Pius59268282016-10-06 20:23:47 -0700275} // namespace wifi
276} // namespace hardware
277} // namespace android