1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include "wifi.h" 17094332d3Sopenharmony_ci#include <hdf_base.h> 18094332d3Sopenharmony_ci#include <hdf_log.h> 19094332d3Sopenharmony_ci#include "wifi_hal.h" 20094332d3Sopenharmony_ci#include "hdi_sync_util.h" 21094332d3Sopenharmony_ci#include "iproxy_broker.h" 22094332d3Sopenharmony_ci 23094332d3Sopenharmony_cinamespace OHOS { 24094332d3Sopenharmony_cinamespace HDI { 25094332d3Sopenharmony_cinamespace Wlan { 26094332d3Sopenharmony_cinamespace Chip { 27094332d3Sopenharmony_cinamespace V1_0 { 28094332d3Sopenharmony_ci#ifdef FEATURE_ANCO_WIFI 29094332d3Sopenharmony_ciconst int CHIP_ID_STA = 1; 30094332d3Sopenharmony_ciconst int CHIP_ID_P2P = 2; 31094332d3Sopenharmony_ciconst int CHIP_ID_AP = 3; 32094332d3Sopenharmony_ci#endif 33094332d3Sopenharmony_ci 34094332d3Sopenharmony_cistatic constexpr int32_t K_PRIMARY_CHIP_ID = 0; 35094332d3Sopenharmony_cistatic std::mutex g_chipMutex; 36094332d3Sopenharmony_ci 37094332d3Sopenharmony_ciextern "C" IChipController *ChipControllerImplGetInstance(void) 38094332d3Sopenharmony_ci{ 39094332d3Sopenharmony_ci static IChipController *gWifiService = NULL; 40094332d3Sopenharmony_ci std::unique_lock<std::mutex> lock(g_chipMutex); 41094332d3Sopenharmony_ci if (gWifiService == NULL) { 42094332d3Sopenharmony_ci gWifiService = new (std::nothrow) Wifi(); 43094332d3Sopenharmony_ci } 44094332d3Sopenharmony_ci return gWifiService; 45094332d3Sopenharmony_ci} 46094332d3Sopenharmony_ci 47094332d3Sopenharmony_ciWifi::Wifi() 48094332d3Sopenharmony_ci :ifaceTool_(std::make_shared<IfaceTool>()), 49094332d3Sopenharmony_ci vendorHalList_(std::make_shared<WifiVendorHalList>(ifaceTool_)), 50094332d3Sopenharmony_ci runState_(RunState::STOPPED) { 51094332d3Sopenharmony_ci remoteDeathRecipient_ = 52094332d3Sopenharmony_ci new RemoteDeathRecipient(std::bind(&Wifi::OnRemoteDied, this, std::placeholders::_1)); 53094332d3Sopenharmony_ci} 54094332d3Sopenharmony_ci 55094332d3Sopenharmony_ciWifi::~Wifi() 56094332d3Sopenharmony_ci{ 57094332d3Sopenharmony_ci for (const auto& callback : cbHandler_.GetCallbacks()) { 58094332d3Sopenharmony_ci if (callback != nullptr) { 59094332d3Sopenharmony_ci RemoveWifiDeathRecipient(callback); 60094332d3Sopenharmony_ci } 61094332d3Sopenharmony_ci } 62094332d3Sopenharmony_ci cbHandler_.Invalidate(); 63094332d3Sopenharmony_ci} 64094332d3Sopenharmony_ci 65094332d3Sopenharmony_ciint32_t Wifi::RegisterWifiEventCallback(const sptr<IChipControllerCallback>& eventCallback) 66094332d3Sopenharmony_ci{ 67094332d3Sopenharmony_ci if (AddWifiDeathRecipient(eventCallback) != HDF_SUCCESS) { 68094332d3Sopenharmony_ci return HDF_FAILURE; 69094332d3Sopenharmony_ci } 70094332d3Sopenharmony_ci 71094332d3Sopenharmony_ci if (!cbHandler_.AddCallback(eventCallback)) { 72094332d3Sopenharmony_ci return HDF_FAILURE; 73094332d3Sopenharmony_ci } 74094332d3Sopenharmony_ci return HDF_SUCCESS; 75094332d3Sopenharmony_ci} 76094332d3Sopenharmony_ci 77094332d3Sopenharmony_ciint32_t Wifi::IsInit(bool& inited) 78094332d3Sopenharmony_ci{ 79094332d3Sopenharmony_ci inited = runState_ != RunState::STOPPED; 80094332d3Sopenharmony_ci return HDF_SUCCESS; 81094332d3Sopenharmony_ci} 82094332d3Sopenharmony_ci 83094332d3Sopenharmony_ciint32_t Wifi::Init() 84094332d3Sopenharmony_ci{ 85094332d3Sopenharmony_ci HDF_LOGI("Wifi HAL start enter"); 86094332d3Sopenharmony_ci if (runState_ == RunState::STARTED) { 87094332d3Sopenharmony_ci return HDF_SUCCESS; 88094332d3Sopenharmony_ci } else if (runState_ == RunState::STOPPING) { 89094332d3Sopenharmony_ci return HDF_FAILURE; 90094332d3Sopenharmony_ci } 91094332d3Sopenharmony_ci ErrorCode res = InitializVendorHal(); 92094332d3Sopenharmony_ci if (res == ErrorCode::SUCCESS) { 93094332d3Sopenharmony_ci const auto& onVendorHalRestartCallback = 94094332d3Sopenharmony_ci [this](const std::string& error) { 95094332d3Sopenharmony_ci ErrorCode res = ErrorCode::UNKNOWN; 96094332d3Sopenharmony_ci for (const auto& callback : cbHandler_.GetCallbacks()) { 97094332d3Sopenharmony_ci callback->OnVendorHalRestart(res); 98094332d3Sopenharmony_ci } 99094332d3Sopenharmony_ci }; 100094332d3Sopenharmony_ci 101094332d3Sopenharmony_ci int32_t chipId = K_PRIMARY_CHIP_ID; 102094332d3Sopenharmony_ci for (auto& hal : vendorHals_) { 103094332d3Sopenharmony_ci chips_.push_back(new WifiChip( 104094332d3Sopenharmony_ci chipId, chipId == K_PRIMARY_CHIP_ID, hal, 105094332d3Sopenharmony_ci std::make_shared<IfaceUtil>(ifaceTool_), 106094332d3Sopenharmony_ci onVendorHalRestartCallback)); 107094332d3Sopenharmony_ci chipId++; 108094332d3Sopenharmony_ci } 109094332d3Sopenharmony_ci runState_ = RunState::STARTED; 110094332d3Sopenharmony_ci HDF_LOGI("Wifi HAL started"); 111094332d3Sopenharmony_ci return HDF_SUCCESS; 112094332d3Sopenharmony_ci } else { 113094332d3Sopenharmony_ci HDF_LOGE("Wifi HAL start failed"); 114094332d3Sopenharmony_ci return HDF_FAILURE; 115094332d3Sopenharmony_ci } 116094332d3Sopenharmony_ci} 117094332d3Sopenharmony_ci 118094332d3Sopenharmony_ciint32_t Wifi::Release() 119094332d3Sopenharmony_ci{ 120094332d3Sopenharmony_ci if (runState_ == RunState::STOPPED) { 121094332d3Sopenharmony_ci return HDF_SUCCESS; 122094332d3Sopenharmony_ci } else if (runState_ == RunState::STOPPING) { 123094332d3Sopenharmony_ci return HDF_SUCCESS; 124094332d3Sopenharmony_ci } 125094332d3Sopenharmony_ci for (auto& chip : chips_) { 126094332d3Sopenharmony_ci if (chip) { 127094332d3Sopenharmony_ci chip->Invalidate(); 128094332d3Sopenharmony_ci } 129094332d3Sopenharmony_ci } 130094332d3Sopenharmony_ci chips_.clear(); 131094332d3Sopenharmony_ci auto lock = AcquireGlobalLock(); 132094332d3Sopenharmony_ci ErrorCode res = StopVendorHal(&lock); 133094332d3Sopenharmony_ci if (res == ErrorCode::SUCCESS) { 134094332d3Sopenharmony_ci return HDF_SUCCESS; 135094332d3Sopenharmony_ci HDF_LOGI("Wifi HAL stopped"); 136094332d3Sopenharmony_ci } else { 137094332d3Sopenharmony_ci return HDF_FAILURE; 138094332d3Sopenharmony_ci HDF_LOGE("Wifi HAL stop failed"); 139094332d3Sopenharmony_ci } 140094332d3Sopenharmony_ci} 141094332d3Sopenharmony_ci 142094332d3Sopenharmony_ciint32_t Wifi::GetAvailableChips(std::vector<uint32_t>& chipIds) 143094332d3Sopenharmony_ci{ 144094332d3Sopenharmony_ci for (auto& chip : chips_) { 145094332d3Sopenharmony_ci uint32_t chipId = GetChipIdFromWifiChip(chip); 146094332d3Sopenharmony_ci if (chipId != UINT32_MAX) chipIds.emplace_back(chipId); 147094332d3Sopenharmony_ci } 148094332d3Sopenharmony_ci#ifdef FEATURE_ANCO_WIFI 149094332d3Sopenharmony_ci if (chipIds.empty()) { 150094332d3Sopenharmony_ci chipIds.emplace_back(CHIP_ID_STA); 151094332d3Sopenharmony_ci chipIds.emplace_back(CHIP_ID_P2P); 152094332d3Sopenharmony_ci chipIds.emplace_back(CHIP_ID_AP); 153094332d3Sopenharmony_ci } 154094332d3Sopenharmony_ci#endif 155094332d3Sopenharmony_ci return HDF_SUCCESS; 156094332d3Sopenharmony_ci} 157094332d3Sopenharmony_ci 158094332d3Sopenharmony_ciint32_t Wifi::GetChipService(uint32_t chipId, sptr<IConcreteChip>& chip) 159094332d3Sopenharmony_ci{ 160094332d3Sopenharmony_ci for (auto& ch : chips_) { 161094332d3Sopenharmony_ci uint32_t cand_id = GetChipIdFromWifiChip(ch); 162094332d3Sopenharmony_ci if ((cand_id != UINT32_MAX) && (cand_id == chipId)) { 163094332d3Sopenharmony_ci chip = ch; 164094332d3Sopenharmony_ci return HDF_SUCCESS; 165094332d3Sopenharmony_ci } 166094332d3Sopenharmony_ci } 167094332d3Sopenharmony_ci chip = nullptr; 168094332d3Sopenharmony_ci return HDF_FAILURE; 169094332d3Sopenharmony_ci} 170094332d3Sopenharmony_ci 171094332d3Sopenharmony_ciErrorCode Wifi::StopVendorHal(std::unique_lock<std::recursive_mutex>* lock) 172094332d3Sopenharmony_ci{ 173094332d3Sopenharmony_ci WifiError legacyStatus = HAL_SUCCESS; 174094332d3Sopenharmony_ci int index = 0; 175094332d3Sopenharmony_ci ErrorCode res; 176094332d3Sopenharmony_ci 177094332d3Sopenharmony_ci runState_ = RunState::STOPPING; 178094332d3Sopenharmony_ci for (auto& hal : vendorHals_) { 179094332d3Sopenharmony_ci WifiError tmp = hal->Stop(lock, [&]() {}); 180094332d3Sopenharmony_ci if (tmp != HAL_SUCCESS) { 181094332d3Sopenharmony_ci HDF_LOGE("Failed to stop vendor hal index: %{public}d, error %{public}d", index, tmp); 182094332d3Sopenharmony_ci legacyStatus = tmp; 183094332d3Sopenharmony_ci } 184094332d3Sopenharmony_ci index++; 185094332d3Sopenharmony_ci } 186094332d3Sopenharmony_ci runState_ = RunState::STOPPED; 187094332d3Sopenharmony_ci 188094332d3Sopenharmony_ci if (legacyStatus != HAL_SUCCESS) { 189094332d3Sopenharmony_ci HDF_LOGE("One or more vendor hals failed to stop error is %{public}d", legacyStatus); 190094332d3Sopenharmony_ci res = ErrorCode::UNKNOWN; 191094332d3Sopenharmony_ci return res; 192094332d3Sopenharmony_ci } 193094332d3Sopenharmony_ci res = ErrorCode::SUCCESS; 194094332d3Sopenharmony_ci return res; 195094332d3Sopenharmony_ci} 196094332d3Sopenharmony_ci 197094332d3Sopenharmony_ciErrorCode Wifi::InitializVendorHal() 198094332d3Sopenharmony_ci{ 199094332d3Sopenharmony_ci ErrorCode res; 200094332d3Sopenharmony_ci 201094332d3Sopenharmony_ci vendorHals_ = vendorHalList_->GetHals(); 202094332d3Sopenharmony_ci if (vendorHals_.empty()) { 203094332d3Sopenharmony_ci res = ErrorCode::UNKNOWN; 204094332d3Sopenharmony_ci return res; 205094332d3Sopenharmony_ci } 206094332d3Sopenharmony_ci int index = 0; 207094332d3Sopenharmony_ci for (auto& hal : vendorHals_) { 208094332d3Sopenharmony_ci WifiError legacyStatus = hal->Initialize(); 209094332d3Sopenharmony_ci if (legacyStatus != HAL_SUCCESS) { 210094332d3Sopenharmony_ci res = ErrorCode::UNKNOWN; 211094332d3Sopenharmony_ci return res; 212094332d3Sopenharmony_ci } 213094332d3Sopenharmony_ci index++; 214094332d3Sopenharmony_ci } 215094332d3Sopenharmony_ci 216094332d3Sopenharmony_ci res = ErrorCode::SUCCESS; 217094332d3Sopenharmony_ci return res; 218094332d3Sopenharmony_ci} 219094332d3Sopenharmony_ci 220094332d3Sopenharmony_ciuint32_t Wifi::GetChipIdFromWifiChip(sptr <WifiChip>& chip) 221094332d3Sopenharmony_ci{ 222094332d3Sopenharmony_ci uint32_t chipId = UINT32_MAX; 223094332d3Sopenharmony_ci int32_t id; 224094332d3Sopenharmony_ci 225094332d3Sopenharmony_ci if (chip) { 226094332d3Sopenharmony_ci chip->GetChipId(id); 227094332d3Sopenharmony_ci chipId = static_cast<uint32_t>(id); 228094332d3Sopenharmony_ci } 229094332d3Sopenharmony_ci return chipId; 230094332d3Sopenharmony_ci} 231094332d3Sopenharmony_ci 232094332d3Sopenharmony_civoid Wifi::OnRemoteDied(const wptr<IRemoteObject> &object) 233094332d3Sopenharmony_ci{ 234094332d3Sopenharmony_ci HDF_LOGI("chip service OnRemoteDied"); 235094332d3Sopenharmony_ci runState_ = RunState::STOPPING; 236094332d3Sopenharmony_ci for (auto& chip : chips_) { 237094332d3Sopenharmony_ci if (chip) { 238094332d3Sopenharmony_ci chip->Invalidate(); 239094332d3Sopenharmony_ci } 240094332d3Sopenharmony_ci } 241094332d3Sopenharmony_ci chips_.clear(); 242094332d3Sopenharmony_ci auto lock = AcquireGlobalLock(); 243094332d3Sopenharmony_ci StopVendorHal(&lock); 244094332d3Sopenharmony_ci runState_ = RunState::STOPPED; 245094332d3Sopenharmony_ci} 246094332d3Sopenharmony_ci 247094332d3Sopenharmony_ciint32_t Wifi::AddWifiDeathRecipient(const sptr<IChipControllerCallback>& eventCallback) 248094332d3Sopenharmony_ci{ 249094332d3Sopenharmony_ci HDF_LOGI("AddWifiDeathRecipient"); 250094332d3Sopenharmony_ci const sptr<IRemoteObject>& remote = OHOS::HDI::hdi_objcast<IChipControllerCallback>(eventCallback); 251094332d3Sopenharmony_ci bool result = remote->AddDeathRecipient(remoteDeathRecipient_); 252094332d3Sopenharmony_ci if (!result) { 253094332d3Sopenharmony_ci HDF_LOGE("Wifi AddDeathRecipient fail"); 254094332d3Sopenharmony_ci return HDF_FAILURE; 255094332d3Sopenharmony_ci } 256094332d3Sopenharmony_ci return HDF_SUCCESS; 257094332d3Sopenharmony_ci} 258094332d3Sopenharmony_ci 259094332d3Sopenharmony_ciint32_t Wifi::RemoveWifiDeathRecipient(const sptr<IChipControllerCallback>& eventCallback) 260094332d3Sopenharmony_ci{ 261094332d3Sopenharmony_ci HDF_LOGI("RemoveWifiDeathRecipient"); 262094332d3Sopenharmony_ci const sptr<IRemoteObject>& remote = OHOS::HDI::hdi_objcast<IChipControllerCallback>(eventCallback); 263094332d3Sopenharmony_ci bool result = remote->RemoveDeathRecipient(remoteDeathRecipient_); 264094332d3Sopenharmony_ci if (!result) { 265094332d3Sopenharmony_ci HDF_LOGE("Wifi RemoveDeathRecipient fail"); 266094332d3Sopenharmony_ci return HDF_FAILURE; 267094332d3Sopenharmony_ci } 268094332d3Sopenharmony_ci return HDF_SUCCESS; 269094332d3Sopenharmony_ci} 270094332d3Sopenharmony_ci 271094332d3Sopenharmony_ci} // namespace V1_0 272094332d3Sopenharmony_ci} // namespace Chip 273094332d3Sopenharmony_ci} // namespace Wlan 274094332d3Sopenharmony_ci} // namespace HDI 275094332d3Sopenharmony_ci} // namespace OHOS