Home | History | Annotate | Download | only in default
      1 /*
      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 
     24 namespace android {
     25 namespace hardware {
     26 namespace wifi {
     27 namespace V1_3 {
     28 namespace implementation {
     29 using hidl_return_util::validateAndCall;
     30 
     31 WifiRttController::WifiRttController(
     32     const std::string& iface_name, const sp<IWifiIface>& bound_iface,
     33     const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal)
     34     : ifname_(iface_name),
     35       bound_iface_(bound_iface),
     36       legacy_hal_(legacy_hal),
     37       is_valid_(true) {}
     38 
     39 void WifiRttController::invalidate() {
     40     legacy_hal_.reset();
     41     event_callbacks_.clear();
     42     is_valid_ = false;
     43 }
     44 
     45 bool WifiRttController::isValid() { return is_valid_; }
     46 
     47 std::vector<sp<IWifiRttControllerEventCallback>>
     48 WifiRttController::getEventCallbacks() {
     49     return event_callbacks_;
     50 }
     51 
     52 std::string WifiRttController::getIfaceName() { return ifname_; }
     53 
     54 Return<void> WifiRttController::getBoundIface(getBoundIface_cb hidl_status_cb) {
     55     return validateAndCall(
     56         this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
     57         &WifiRttController::getBoundIfaceInternal, hidl_status_cb);
     58 }
     59 
     60 Return<void> WifiRttController::registerEventCallback(
     61     const sp<IWifiRttControllerEventCallback>& callback,
     62     registerEventCallback_cb hidl_status_cb) {
     63     return validateAndCall(this,
     64                            WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
     65                            &WifiRttController::registerEventCallbackInternal,
     66                            hidl_status_cb, callback);
     67 }
     68 
     69 Return<void> WifiRttController::rangeRequest(
     70     uint32_t cmd_id, const hidl_vec<RttConfig>& rtt_configs,
     71     rangeRequest_cb hidl_status_cb) {
     72     return validateAndCall(this,
     73                            WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
     74                            &WifiRttController::rangeRequestInternal,
     75                            hidl_status_cb, cmd_id, rtt_configs);
     76 }
     77 
     78 Return<void> WifiRttController::rangeCancel(
     79     uint32_t cmd_id, const hidl_vec<hidl_array<uint8_t, 6>>& addrs,
     80     rangeCancel_cb hidl_status_cb) {
     81     return validateAndCall(
     82         this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
     83         &WifiRttController::rangeCancelInternal, hidl_status_cb, cmd_id, addrs);
     84 }
     85 
     86 Return<void> WifiRttController::getCapabilities(
     87     getCapabilities_cb hidl_status_cb) {
     88     return validateAndCall(
     89         this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
     90         &WifiRttController::getCapabilitiesInternal, hidl_status_cb);
     91 }
     92 
     93 Return<void> WifiRttController::setLci(uint32_t cmd_id,
     94                                        const RttLciInformation& lci,
     95                                        setLci_cb hidl_status_cb) {
     96     return validateAndCall(
     97         this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
     98         &WifiRttController::setLciInternal, hidl_status_cb, cmd_id, lci);
     99 }
    100 
    101 Return<void> WifiRttController::setLcr(uint32_t cmd_id,
    102                                        const RttLcrInformation& lcr,
    103                                        setLcr_cb hidl_status_cb) {
    104     return validateAndCall(
    105         this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
    106         &WifiRttController::setLcrInternal, hidl_status_cb, cmd_id, lcr);
    107 }
    108 
    109 Return<void> WifiRttController::getResponderInfo(
    110     getResponderInfo_cb hidl_status_cb) {
    111     return validateAndCall(
    112         this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
    113         &WifiRttController::getResponderInfoInternal, hidl_status_cb);
    114 }
    115 
    116 Return<void> WifiRttController::enableResponder(
    117     uint32_t cmd_id, const WifiChannelInfo& channel_hint,
    118     uint32_t max_duration_seconds, const RttResponder& info,
    119     enableResponder_cb hidl_status_cb) {
    120     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);
    124 }
    125 
    126 Return<void> WifiRttController::disableResponder(
    127     uint32_t cmd_id, disableResponder_cb hidl_status_cb) {
    128     return validateAndCall(
    129         this, WifiStatusCode::ERROR_WIFI_RTT_CONTROLLER_INVALID,
    130         &WifiRttController::disableResponderInternal, hidl_status_cb, cmd_id);
    131 }
    132 
    133 std::pair<WifiStatus, sp<IWifiIface>>
    134 WifiRttController::getBoundIfaceInternal() {
    135     return {createWifiStatus(WifiStatusCode::SUCCESS), bound_iface_};
    136 }
    137 
    138 WifiStatus WifiRttController::registerEventCallbackInternal(
    139     const sp<IWifiRttControllerEventCallback>& callback) {
    140     // TODO(b/31632518): remove the callback when the client is destroyed
    141     event_callbacks_.emplace_back(callback);
    142     return createWifiStatus(WifiStatusCode::SUCCESS);
    143 }
    144 
    145 WifiStatus WifiRttController::rangeRequestInternal(
    146     uint32_t cmd_id, const std::vector<RttConfig>& rtt_configs) {
    147     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);
    151     }
    152     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);
    176 }
    177 
    178 WifiStatus WifiRttController::rangeCancelInternal(
    179     uint32_t cmd_id, const std::vector<hidl_array<uint8_t, 6>>& addrs) {
    180     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);
    188 }
    189 
    190 std::pair<WifiStatus, RttCapabilities>
    191 WifiRttController::getCapabilitiesInternal() {
    192     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};
    205 }
    206 
    207 WifiStatus WifiRttController::setLciInternal(uint32_t cmd_id,
    208                                              const RttLciInformation& lci) {
    209     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);
    217 }
    218 
    219 WifiStatus WifiRttController::setLcrInternal(uint32_t cmd_id,
    220                                              const RttLcrInformation& lcr) {
    221     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);
    229 }
    230 
    231 std::pair<WifiStatus, RttResponder>
    232 WifiRttController::getResponderInfoInternal() {
    233     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};
    246 }
    247 
    248 WifiStatus WifiRttController::enableResponderInternal(
    249     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);
    266 }
    267 
    268 WifiStatus WifiRttController::disableResponderInternal(uint32_t cmd_id) {
    269     legacy_hal::wifi_error legacy_status =
    270         legacy_hal_.lock()->disableRttResponder(ifname_, cmd_id);
    271     return createWifiStatusFromLegacyError(legacy_status);
    272 }
    273 }  // namespace implementation
    274 }  // namespace V1_3
    275 }  // namespace wifi
    276 }  // namespace hardware
    277 }  // namespace android
    278