blob: d98aa4579a4cea722dfbeede23a304e1ab293b4a [file] [log] [blame]
Roshan Pius3e2d6712016-10-06 13:16:23 -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 Pius3e2d6712016-10-06 13:16:23 -070017#include <android-base/logging.h>
18
Roshan Pius907d4a22016-10-27 12:48:12 -070019#include "hidl_return_util.h"
Roshan Pius7f4574d2017-02-22 09:48:03 -080020#include "hidl_struct_util.h"
Roshan Pius907d4a22016-10-27 12:48:12 -070021#include "wifi_ap_iface.h"
Roshan Pius734fea02016-10-11 08:30:28 -070022#include "wifi_status_util.h"
Roshan Pius3e2d6712016-10-06 13:16:23 -070023
24namespace android {
25namespace hardware {
26namespace wifi {
Jimmy Chend460df32019-11-29 17:31:22 +020027namespace V1_5 {
Roshan Pius3e2d6712016-10-06 13:16:23 -070028namespace implementation {
Roshan Pius907d4a22016-10-27 12:48:12 -070029using hidl_return_util::validateAndCall;
Roshan Pius3e2d6712016-10-06 13:16:23 -070030
Roshan Pius6cedc972016-10-28 10:11:17 -070031WifiApIface::WifiApIface(
lesl420c4fc2020-11-23 19:33:04 +080032 const std::string& ifname, const std::vector<std::string>& instances,
Roshan Pius99dab382019-02-14 07:57:10 -080033 const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal,
Patrik Fimml6beae322019-10-09 17:34:01 +020034 const std::weak_ptr<iface_util::WifiIfaceUtil> iface_util)
Roshan Pius99dab382019-02-14 07:57:10 -080035 : ifname_(ifname),
lesl420c4fc2020-11-23 19:33:04 +080036 instances_(instances),
Roshan Pius99dab382019-02-14 07:57:10 -080037 legacy_hal_(legacy_hal),
38 iface_util_(iface_util),
Patrik Fimml6beae322019-10-09 17:34:01 +020039 is_valid_(true) {}
Roshan Pius3e2d6712016-10-06 13:16:23 -070040
41void WifiApIface::invalidate() {
Roshan Piusabcf78f2017-10-06 16:30:38 -070042 legacy_hal_.reset();
43 is_valid_ = false;
Roshan Pius3e2d6712016-10-06 13:16:23 -070044}
45
Roshan Piusabcf78f2017-10-06 16:30:38 -070046bool WifiApIface::isValid() { return is_valid_; }
Roshan Pius907d4a22016-10-27 12:48:12 -070047
Roshan Pius675609b2017-10-31 14:24:58 -070048std::string WifiApIface::getName() { return ifname_; }
49
Roshan Pius734fea02016-10-11 08:30:28 -070050Return<void> WifiApIface::getName(getName_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070051 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
52 &WifiApIface::getNameInternal, hidl_status_cb);
Roshan Pius3e2d6712016-10-06 13:16:23 -070053}
54
Roshan Pius734fea02016-10-11 08:30:28 -070055Return<void> WifiApIface::getType(getType_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070056 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
57 &WifiApIface::getTypeInternal, hidl_status_cb);
Roshan Pius907d4a22016-10-27 12:48:12 -070058}
59
Roshan Pius32fc12e2017-01-25 17:44:42 -080060Return<void> WifiApIface::setCountryCode(const hidl_array<int8_t, 2>& code,
61 setCountryCode_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070062 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
63 &WifiApIface::setCountryCodeInternal, hidl_status_cb,
64 code);
Roshan Pius32fc12e2017-01-25 17:44:42 -080065}
66
Roshan Pius7f4574d2017-02-22 09:48:03 -080067Return<void> WifiApIface::getValidFrequenciesForBand(
Ahmed ElArabawyfd809fc2019-11-15 18:19:15 -080068 V1_0::WifiBand band, getValidFrequenciesForBand_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070069 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
70 &WifiApIface::getValidFrequenciesForBandInternal,
71 hidl_status_cb, band);
Roshan Pius7f4574d2017-02-22 09:48:03 -080072}
73
Patrik Fimmlc919f962019-09-11 14:31:56 +020074Return<void> WifiApIface::setMacAddress(const hidl_array<uint8_t, 6>& mac,
75 setMacAddress_cb hidl_status_cb) {
76 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
77 &WifiApIface::setMacAddressInternal, hidl_status_cb,
78 mac);
79}
80
81Return<void> WifiApIface::getFactoryMacAddress(
82 getFactoryMacAddress_cb hidl_status_cb) {
83 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
84 &WifiApIface::getFactoryMacAddressInternal,
lesl420c4fc2020-11-23 19:33:04 +080085 hidl_status_cb,
86 instances_.size() > 0 ? instances_[0] : ifname_);
87}
88
89Return<void> WifiApIface::resetToFactoryMacAddress(
90 resetToFactoryMacAddress_cb hidl_status_cb) {
91 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
92 &WifiApIface::resetToFactoryMacAddressInternal,
Patrik Fimmlc919f962019-09-11 14:31:56 +020093 hidl_status_cb);
94}
95
Roshan Pius907d4a22016-10-27 12:48:12 -070096std::pair<WifiStatus, std::string> WifiApIface::getNameInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -070097 return {createWifiStatus(WifiStatusCode::SUCCESS), ifname_};
Roshan Pius907d4a22016-10-27 12:48:12 -070098}
99
100std::pair<WifiStatus, IfaceType> WifiApIface::getTypeInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700101 return {createWifiStatus(WifiStatusCode::SUCCESS), IfaceType::AP};
Roshan Pius3e2d6712016-10-06 13:16:23 -0700102}
103
Roshan Pius32fc12e2017-01-25 17:44:42 -0800104WifiStatus WifiApIface::setCountryCodeInternal(
105 const std::array<int8_t, 2>& code) {
lesl420c4fc2020-11-23 19:33:04 +0800106 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->setCountryCode(
107 instances_.size() > 0 ? instances_[0] : ifname_, code);
Roshan Piusabcf78f2017-10-06 16:30:38 -0700108 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius32fc12e2017-01-25 17:44:42 -0800109}
110
Roshan Pius7f4574d2017-02-22 09:48:03 -0800111std::pair<WifiStatus, std::vector<WifiChannelInMhz>>
Ahmed ElArabawyfd809fc2019-11-15 18:19:15 -0800112WifiApIface::getValidFrequenciesForBandInternal(V1_0::WifiBand band) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700113 static_assert(sizeof(WifiChannelInMhz) == sizeof(uint32_t),
114 "Size mismatch");
115 legacy_hal::wifi_error legacy_status;
116 std::vector<uint32_t> valid_frequencies;
117 std::tie(legacy_status, valid_frequencies) =
118 legacy_hal_.lock()->getValidFrequenciesForBand(
lesl420c4fc2020-11-23 19:33:04 +0800119 instances_.size() > 0 ? instances_[0] : ifname_,
120 hidl_struct_util::convertHidlWifiBandToLegacy(band));
Roshan Piusabcf78f2017-10-06 16:30:38 -0700121 return {createWifiStatusFromLegacyError(legacy_status), valid_frequencies};
Roshan Pius7f4574d2017-02-22 09:48:03 -0800122}
Patrik Fimmlc919f962019-09-11 14:31:56 +0200123
124WifiStatus WifiApIface::setMacAddressInternal(
125 const std::array<uint8_t, 6>& mac) {
lesl420c4fc2020-11-23 19:33:04 +0800126 bool status;
127 // Support random MAC up to 2 interfaces
128 if (instances_.size() == 2) {
129 int rbyte = 1;
130 for (auto const& intf : instances_) {
131 std::array<uint8_t, 6> rmac = mac;
132 // reverse the bits to avoid clision
133 rmac[rbyte] = 0xff - rmac[rbyte];
134 status = iface_util_.lock()->setMacAddress(intf, rmac);
135 if (!status) {
136 LOG(INFO) << "Failed to set random mac address on " << intf;
137 }
138 rbyte++;
139 }
140 } else {
141 status = iface_util_.lock()->setMacAddress(ifname_, mac);
142 }
Patrik Fimmlc919f962019-09-11 14:31:56 +0200143 if (!status) {
144 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
145 }
146 return createWifiStatus(WifiStatusCode::SUCCESS);
147}
148
149std::pair<WifiStatus, std::array<uint8_t, 6>>
lesl420c4fc2020-11-23 19:33:04 +0800150WifiApIface::getFactoryMacAddressInternal(const std::string& ifaceName) {
Patrik Fimmlc919f962019-09-11 14:31:56 +0200151 std::array<uint8_t, 6> mac =
lesl420c4fc2020-11-23 19:33:04 +0800152 iface_util_.lock()->getFactoryMacAddress(ifaceName);
Patrik Fimmlc919f962019-09-11 14:31:56 +0200153 if (mac[0] == 0 && mac[1] == 0 && mac[2] == 0 && mac[3] == 0 &&
154 mac[4] == 0 && mac[5] == 0) {
155 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), mac};
156 }
157 return {createWifiStatus(WifiStatusCode::SUCCESS), mac};
158}
lesl420c4fc2020-11-23 19:33:04 +0800159
160WifiStatus WifiApIface::resetToFactoryMacAddressInternal() {
161 std::pair<WifiStatus, std::array<uint8_t, 6>> getMacResult;
162 if (instances_.size() == 2) {
163 for (auto const& intf : instances_) {
164 getMacResult = getFactoryMacAddressInternal(intf);
165 LOG(DEBUG) << "Reset MAC to factory MAC on " << intf;
166 if (getMacResult.first.code != WifiStatusCode::SUCCESS ||
167 !iface_util_.lock()->setMacAddress(intf, getMacResult.second)) {
168 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
169 }
170 }
171 } else {
172 getMacResult = getFactoryMacAddressInternal(ifname_);
173 LOG(DEBUG) << "Reset MAC to factory MAC on " << ifname_;
174 if (getMacResult.first.code != WifiStatusCode::SUCCESS ||
175 !iface_util_.lock()->setMacAddress(ifname_, getMacResult.second)) {
176 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
177 }
178 }
179 return createWifiStatus(WifiStatusCode::SUCCESS);
180}
Roshan Pius3e2d6712016-10-06 13:16:23 -0700181} // namespace implementation
Jimmy Chend460df32019-11-29 17:31:22 +0200182} // namespace V1_5
Roshan Pius3e2d6712016-10-06 13:16:23 -0700183} // namespace wifi
184} // namespace hardware
185} // namespace android