blob: b68445bf83ed70389c31ee5056699e7c8e7e345a [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 {
Etan Cohen6ce50902017-09-14 07:30:57 -070027namespace V1_2 {
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 Pius734fea02016-10-11 08:30:28 -070052Return<void> WifiRttController::getBoundIface(getBoundIface_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070053 return validateAndCall(
54 this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
55 &WifiRttController::getBoundIfaceInternal, hidl_status_cb);
Roshan Pius907d4a22016-10-27 12:48:12 -070056}
57
Roshan Pius7913f5e2016-10-27 17:09:30 -070058Return<void> WifiRttController::registerEventCallback(
59 const sp<IWifiRttControllerEventCallback>& callback,
60 registerEventCallback_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070061 return validateAndCall(this,
62 WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
63 &WifiRttController::registerEventCallbackInternal,
64 hidl_status_cb, callback);
Roshan Pius7913f5e2016-10-27 17:09:30 -070065}
66
67Return<void> WifiRttController::rangeRequest(
Roshan Piusabcf78f2017-10-06 16:30:38 -070068 uint32_t cmd_id, const hidl_vec<RttConfig>& rtt_configs,
Roshan Pius7913f5e2016-10-27 17:09:30 -070069 rangeRequest_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070070 return validateAndCall(this,
71 WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
72 &WifiRttController::rangeRequestInternal,
73 hidl_status_cb, cmd_id, rtt_configs);
Roshan Pius7913f5e2016-10-27 17:09:30 -070074}
75
76Return<void> WifiRttController::rangeCancel(
Roshan Piusabcf78f2017-10-06 16:30:38 -070077 uint32_t cmd_id, const hidl_vec<hidl_array<uint8_t, 6>>& addrs,
Roshan Pius7913f5e2016-10-27 17:09:30 -070078 rangeCancel_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070079 return validateAndCall(
80 this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
81 &WifiRttController::rangeCancelInternal, hidl_status_cb, cmd_id, addrs);
Roshan Pius7913f5e2016-10-27 17:09:30 -070082}
83
Roshan Pius7913f5e2016-10-27 17:09:30 -070084Return<void> WifiRttController::getCapabilities(
85 getCapabilities_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070086 return validateAndCall(
87 this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
88 &WifiRttController::getCapabilitiesInternal, hidl_status_cb);
Roshan Pius7913f5e2016-10-27 17:09:30 -070089}
90
Roshan Pius7913f5e2016-10-27 17:09:30 -070091Return<void> WifiRttController::setLci(uint32_t cmd_id,
92 const RttLciInformation& lci,
93 setLci_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070094 return validateAndCall(
95 this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
96 &WifiRttController::setLciInternal, hidl_status_cb, cmd_id, lci);
Roshan Pius7913f5e2016-10-27 17:09:30 -070097}
98
99Return<void> WifiRttController::setLcr(uint32_t cmd_id,
100 const RttLcrInformation& lcr,
101 setLcr_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700102 return validateAndCall(
103 this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
104 &WifiRttController::setLcrInternal, hidl_status_cb, cmd_id, lcr);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700105}
106
107Return<void> WifiRttController::getResponderInfo(
108 getResponderInfo_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700109 return validateAndCall(
110 this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
111 &WifiRttController::getResponderInfoInternal, hidl_status_cb);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700112}
113
114Return<void> WifiRttController::enableResponder(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700115 uint32_t cmd_id, const WifiChannelInfo& channel_hint,
116 uint32_t max_duration_seconds, const RttResponder& info,
Roshan Pius7913f5e2016-10-27 17:09:30 -0700117 enableResponder_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700118 return validateAndCall(
119 this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
120 &WifiRttController::enableResponderInternal, hidl_status_cb, cmd_id,
121 channel_hint, max_duration_seconds, info);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700122}
123
124Return<void> WifiRttController::disableResponder(
125 uint32_t cmd_id, disableResponder_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700126 return validateAndCall(
127 this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
128 &WifiRttController::disableResponderInternal, hidl_status_cb, cmd_id);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700129}
130
Roshan Pius907d4a22016-10-27 12:48:12 -0700131std::pair<WifiStatus, sp<IWifiIface>>
132WifiRttController::getBoundIfaceInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700133 return {createWifiStatus(WifiStatusCode::SUCCESS), bound_iface_};
Roshan Pius59268282016-10-06 20:23:47 -0700134}
135
Roshan Pius7913f5e2016-10-27 17:09:30 -0700136WifiStatus WifiRttController::registerEventCallbackInternal(
137 const sp<IWifiRttControllerEventCallback>& callback) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700138 // TODO(b/31632518): remove the callback when the client is destroyed
139 event_callbacks_.emplace_back(callback);
140 return createWifiStatus(WifiStatusCode::SUCCESS);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700141}
142
143WifiStatus WifiRttController::rangeRequestInternal(
Roshan Piuse3f72ff2016-12-05 16:18:43 -0800144 uint32_t cmd_id, const std::vector<RttConfig>& rtt_configs) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700145 std::vector<legacy_hal::wifi_rtt_config> legacy_configs;
146 if (!hidl_struct_util::convertHidlVectorOfRttConfigToLegacy(
147 rtt_configs, &legacy_configs)) {
148 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
Roshan Piuse3f72ff2016-12-05 16:18:43 -0800149 }
Roshan Piusabcf78f2017-10-06 16:30:38 -0700150 android::wp<WifiRttController> weak_ptr_this(this);
151 const auto& on_results_callback =
152 [weak_ptr_this](
153 legacy_hal::wifi_request_id id,
154 const std::vector<const legacy_hal::wifi_rtt_result*>& results) {
155 const auto shared_ptr_this = weak_ptr_this.promote();
156 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
157 LOG(ERROR) << "Callback invoked on an invalid object";
158 return;
159 }
160 std::vector<RttResult> hidl_results;
161 if (!hidl_struct_util::convertLegacyVectorOfRttResultToHidl(
162 results, &hidl_results)) {
163 LOG(ERROR) << "Failed to convert rtt results to HIDL structs";
164 return;
165 }
166 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
167 callback->onResults(id, hidl_results);
168 }
169 };
170 legacy_hal::wifi_error legacy_status =
171 legacy_hal_.lock()->startRttRangeRequest(
172 ifname_, cmd_id, legacy_configs, on_results_callback);
173 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700174}
175
176WifiStatus WifiRttController::rangeCancelInternal(
Roshan Piuse3f72ff2016-12-05 16:18:43 -0800177 uint32_t cmd_id, const std::vector<hidl_array<uint8_t, 6>>& addrs) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700178 std::vector<std::array<uint8_t, 6>> legacy_addrs;
179 for (const auto& addr : addrs) {
180 legacy_addrs.push_back(addr);
181 }
182 legacy_hal::wifi_error legacy_status =
183 legacy_hal_.lock()->cancelRttRangeRequest(ifname_, cmd_id,
184 legacy_addrs);
185 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700186}
187
Roshan Pius7913f5e2016-10-27 17:09:30 -0700188std::pair<WifiStatus, RttCapabilities>
189WifiRttController::getCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700190 legacy_hal::wifi_error legacy_status;
191 legacy_hal::wifi_rtt_capabilities legacy_caps;
192 std::tie(legacy_status, legacy_caps) =
193 legacy_hal_.lock()->getRttCapabilities(ifname_);
194 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
195 return {createWifiStatusFromLegacyError(legacy_status), {}};
196 }
197 RttCapabilities hidl_caps;
198 if (!hidl_struct_util::convertLegacyRttCapabilitiesToHidl(legacy_caps,
199 &hidl_caps)) {
200 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
201 }
202 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Pius7913f5e2016-10-27 17:09:30 -0700203}
204
Roshan Piuse3f72ff2016-12-05 16:18:43 -0800205WifiStatus WifiRttController::setLciInternal(uint32_t cmd_id,
206 const RttLciInformation& lci) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700207 legacy_hal::wifi_lci_information legacy_lci;
208 if (!hidl_struct_util::convertHidlRttLciInformationToLegacy(lci,
209 &legacy_lci)) {
210 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
211 }
212 legacy_hal::wifi_error legacy_status =
213 legacy_hal_.lock()->setRttLci(ifname_, cmd_id, legacy_lci);
214 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700215}
216
Roshan Piuse3f72ff2016-12-05 16:18:43 -0800217WifiStatus WifiRttController::setLcrInternal(uint32_t cmd_id,
218 const RttLcrInformation& lcr) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700219 legacy_hal::wifi_lcr_information legacy_lcr;
220 if (!hidl_struct_util::convertHidlRttLcrInformationToLegacy(lcr,
221 &legacy_lcr)) {
222 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
223 }
224 legacy_hal::wifi_error legacy_status =
225 legacy_hal_.lock()->setRttLcr(ifname_, cmd_id, legacy_lcr);
226 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700227}
228
229std::pair<WifiStatus, RttResponder>
230WifiRttController::getResponderInfoInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700231 legacy_hal::wifi_error legacy_status;
232 legacy_hal::wifi_rtt_responder legacy_responder;
233 std::tie(legacy_status, legacy_responder) =
234 legacy_hal_.lock()->getRttResponderInfo(ifname_);
235 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
236 return {createWifiStatusFromLegacyError(legacy_status), {}};
237 }
238 RttResponder hidl_responder;
239 if (!hidl_struct_util::convertLegacyRttResponderToHidl(legacy_responder,
240 &hidl_responder)) {
241 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
242 }
243 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_responder};
Roshan Pius7913f5e2016-10-27 17:09:30 -0700244}
245
246WifiStatus WifiRttController::enableResponderInternal(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700247 uint32_t cmd_id, const WifiChannelInfo& channel_hint,
248 uint32_t max_duration_seconds, const RttResponder& info) {
249 legacy_hal::wifi_channel_info legacy_channel_info;
250 if (!hidl_struct_util::convertHidlWifiChannelInfoToLegacy(
251 channel_hint, &legacy_channel_info)) {
252 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
253 }
254 legacy_hal::wifi_rtt_responder legacy_responder;
255 if (!hidl_struct_util::convertHidlRttResponderToLegacy(info,
256 &legacy_responder)) {
257 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
258 }
259 legacy_hal::wifi_error legacy_status =
260 legacy_hal_.lock()->enableRttResponder(
261 ifname_, cmd_id, legacy_channel_info, max_duration_seconds,
262 legacy_responder);
263 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700264}
265
Roshan Piuse3f72ff2016-12-05 16:18:43 -0800266WifiStatus WifiRttController::disableResponderInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700267 legacy_hal::wifi_error legacy_status =
268 legacy_hal_.lock()->disableRttResponder(ifname_, cmd_id);
269 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius7913f5e2016-10-27 17:09:30 -0700270}
Roshan Pius59268282016-10-06 20:23:47 -0700271} // namespace implementation
Etan Cohen6ce50902017-09-14 07:30:57 -0700272} // namespace V1_2
Roshan Pius59268282016-10-06 20:23:47 -0700273} // namespace wifi
274} // namespace hardware
275} // namespace android