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 <array> 17094332d3Sopenharmony_ci#include <chrono> 18094332d3Sopenharmony_ci#include <net/if.h> 19094332d3Sopenharmony_ci#include <csignal> 20094332d3Sopenharmony_ci#include "wifi_vendor_hal.h" 21094332d3Sopenharmony_ci#include <hdf_log.h> 22094332d3Sopenharmony_ci#include "hdi_sync_util.h" 23094332d3Sopenharmony_ci#include "parameter.h" 24094332d3Sopenharmony_ci#include "wifi_sta_iface.h" 25094332d3Sopenharmony_ci 26094332d3Sopenharmony_cistatic constexpr uint32_t K_MAX_STOP_COMPLETE_WAIT_MS = 1000; 27094332d3Sopenharmony_ci 28094332d3Sopenharmony_cinamespace OHOS { 29094332d3Sopenharmony_cinamespace HDI { 30094332d3Sopenharmony_cinamespace Wlan { 31094332d3Sopenharmony_cinamespace Chip { 32094332d3Sopenharmony_cinamespace V1_0 { 33094332d3Sopenharmony_cistd::function<void(wifiHandle handle)> onStopCompleteCallback; 34094332d3Sopenharmony_cistd::function<void(const char*)> onVendorHalRestartCallback; 35094332d3Sopenharmony_cistd::function<void(int)> onFullScanResultCallback; 36094332d3Sopenharmony_ci 37094332d3Sopenharmony_civoid OnAsyncStopComplete(wifiHandle handle) 38094332d3Sopenharmony_ci{ 39094332d3Sopenharmony_ci const auto lock = AcquireGlobalLock(); 40094332d3Sopenharmony_ci if (onStopCompleteCallback) { 41094332d3Sopenharmony_ci onStopCompleteCallback(handle); 42094332d3Sopenharmony_ci onStopCompleteCallback = nullptr; 43094332d3Sopenharmony_ci } 44094332d3Sopenharmony_ci} 45094332d3Sopenharmony_ci 46094332d3Sopenharmony_civoid OnAsyncSubsystemRestart(const char* error) 47094332d3Sopenharmony_ci{ 48094332d3Sopenharmony_ci const auto lock = AcquireGlobalLock(); 49094332d3Sopenharmony_ci if (onVendorHalRestartCallback) { 50094332d3Sopenharmony_ci onVendorHalRestartCallback(error); 51094332d3Sopenharmony_ci } 52094332d3Sopenharmony_ci} 53094332d3Sopenharmony_ci 54094332d3Sopenharmony_ciCallbackHandler<IChipIfaceCallback> WifiVendorHal::vendorHalCbHandler_; 55094332d3Sopenharmony_ciCallbackHandler<IChipIfaceCallback> WifiVendorHal::vendorHalExtCbHandler_; 56094332d3Sopenharmony_ciWifiVendorHal::WifiVendorHal( 57094332d3Sopenharmony_ci const std::weak_ptr<IfaceTool> ifaceTool, 58094332d3Sopenharmony_ci const WifiHalFn& fn, bool isPrimary) 59094332d3Sopenharmony_ci : globalFuncTable_(fn), 60094332d3Sopenharmony_ci globalHandle_(nullptr), 61094332d3Sopenharmony_ci awaitingEventLoopTermination_(false), 62094332d3Sopenharmony_ci isInited_(false), 63094332d3Sopenharmony_ci ifaceTool_(ifaceTool), 64094332d3Sopenharmony_ci isPrimary_(isPrimary) { 65094332d3Sopenharmony_ci} 66094332d3Sopenharmony_ci 67094332d3Sopenharmony_ciWifiError WifiVendorHal::Initialize() 68094332d3Sopenharmony_ci{ 69094332d3Sopenharmony_ci HDF_LOGI("Initialize vendor HAL"); 70094332d3Sopenharmony_ci return HAL_SUCCESS; 71094332d3Sopenharmony_ci} 72094332d3Sopenharmony_ci 73094332d3Sopenharmony_ciWifiError WifiVendorHal::Start() 74094332d3Sopenharmony_ci{ 75094332d3Sopenharmony_ci if (!globalFuncTable_.vendorHalInit || globalHandle_ || 76094332d3Sopenharmony_ci !ifaceNameHandle_.empty() || awaitingEventLoopTermination_) { 77094332d3Sopenharmony_ci return HAL_UNKNOWN; 78094332d3Sopenharmony_ci } 79094332d3Sopenharmony_ci if (isInited_) { 80094332d3Sopenharmony_ci HDF_LOGI("Vendor HAL already started"); 81094332d3Sopenharmony_ci return HAL_SUCCESS; 82094332d3Sopenharmony_ci } 83094332d3Sopenharmony_ci HDF_LOGI("Waiting for the driver ready"); 84094332d3Sopenharmony_ci WifiError status = globalFuncTable_.waitDriverStart(); 85094332d3Sopenharmony_ci if (status == HAL_TIMED_OUT || status == HAL_UNKNOWN) { 86094332d3Sopenharmony_ci HDF_LOGE("Failed or timed out awaiting driver ready"); 87094332d3Sopenharmony_ci return status; 88094332d3Sopenharmony_ci } 89094332d3Sopenharmony_ci HDF_LOGI("Starting vendor HAL"); 90094332d3Sopenharmony_ci status = globalFuncTable_.vendorHalInit(&globalHandle_); 91094332d3Sopenharmony_ci if (status != HAL_SUCCESS || !globalHandle_) { 92094332d3Sopenharmony_ci HDF_LOGE("Failed to retrieve global handle"); 93094332d3Sopenharmony_ci return status; 94094332d3Sopenharmony_ci } 95094332d3Sopenharmony_ci std::thread(&WifiVendorHal::RunEventLoop, this).detach(); 96094332d3Sopenharmony_ci status = RetrieveIfaceHandles(); 97094332d3Sopenharmony_ci if (status != HAL_SUCCESS || ifaceNameHandle_.empty()) { 98094332d3Sopenharmony_ci HDF_LOGE("Failed to retrieve wlan interface handle"); 99094332d3Sopenharmony_ci return status; 100094332d3Sopenharmony_ci } 101094332d3Sopenharmony_ci HDF_LOGI("Vendor HAL start complete"); 102094332d3Sopenharmony_ci isInited_ = true; 103094332d3Sopenharmony_ci return HAL_SUCCESS; 104094332d3Sopenharmony_ci} 105094332d3Sopenharmony_ci 106094332d3Sopenharmony_civoid WifiVendorHal::RunEventLoop() 107094332d3Sopenharmony_ci{ 108094332d3Sopenharmony_ci pthread_setname_np(pthread_self(), "VendorHalThread"); 109094332d3Sopenharmony_ci HDF_LOGD("Starting vendor HAL event loop"); 110094332d3Sopenharmony_ci globalFuncTable_.startHalLoop(globalHandle_); 111094332d3Sopenharmony_ci const auto lock = AcquireGlobalLock(); 112094332d3Sopenharmony_ci if (!awaitingEventLoopTermination_) { 113094332d3Sopenharmony_ci HDF_LOGE("Vendor HAL event loop terminated, but HAL was not stopping"); 114094332d3Sopenharmony_ci } 115094332d3Sopenharmony_ci HDF_LOGD("Vendor HAL event loop terminated"); 116094332d3Sopenharmony_ci awaitingEventLoopTermination_ = false; 117094332d3Sopenharmony_ci stopWaitCv_.notify_one(); 118094332d3Sopenharmony_ci} 119094332d3Sopenharmony_ci 120094332d3Sopenharmony_civoid WifiVendorHal::OnAsyncGscanFullResult(int event) 121094332d3Sopenharmony_ci{ 122094332d3Sopenharmony_ci const auto lock = AcquireGlobalLock(); 123094332d3Sopenharmony_ci 124094332d3Sopenharmony_ci HDF_LOGD("OnAsyncGscanFullResult::OnScanResultsCallback"); 125094332d3Sopenharmony_ci for (const auto& callback : vendorHalCbHandler_.GetCallbacks()) { 126094332d3Sopenharmony_ci if (callback) { 127094332d3Sopenharmony_ci callback->OnScanResultsCallback(event); 128094332d3Sopenharmony_ci } 129094332d3Sopenharmony_ci } 130094332d3Sopenharmony_ci} 131094332d3Sopenharmony_ci 132094332d3Sopenharmony_civoid WifiVendorHal::OnAsyncRssiReport(int32_t index, int32_t c0Rssi, int32_t c1Rssi) 133094332d3Sopenharmony_ci{ 134094332d3Sopenharmony_ci const auto lock = AcquireGlobalLock(); 135094332d3Sopenharmony_ci 136094332d3Sopenharmony_ci HDF_LOGD("OnAsyncRssiReport::OnRssiReport"); 137094332d3Sopenharmony_ci for (const auto& callback : vendorHalCbHandler_.GetCallbacks()) { 138094332d3Sopenharmony_ci if (callback) { 139094332d3Sopenharmony_ci callback->OnRssiReport(index, c0Rssi, c1Rssi); 140094332d3Sopenharmony_ci } 141094332d3Sopenharmony_ci } 142094332d3Sopenharmony_ci} 143094332d3Sopenharmony_ci 144094332d3Sopenharmony_civoid WifiVendorHal::OnAsyncWifiNetlinkMsgReport(uint32_t type, const std::vector<uint8_t>& recvMsg) 145094332d3Sopenharmony_ci{ 146094332d3Sopenharmony_ci const auto lock = AcquireGlobalLock(); 147094332d3Sopenharmony_ci HDF_LOGD("OnAsyncWifiNetlinkMsgReport::OnWifiNetlinkMessage"); 148094332d3Sopenharmony_ci for (const auto& callback : vendorHalExtCbHandler_.GetCallbacks()) { 149094332d3Sopenharmony_ci if (callback) { 150094332d3Sopenharmony_ci callback->OnWifiNetlinkMessage(type, recvMsg); 151094332d3Sopenharmony_ci } 152094332d3Sopenharmony_ci } 153094332d3Sopenharmony_ci} 154094332d3Sopenharmony_ci 155094332d3Sopenharmony_ciWifiError WifiVendorHal::Stop(std::unique_lock<std::recursive_mutex>* lock, 156094332d3Sopenharmony_ci const std::function<void()>& onStopCompleteUserCallback) 157094332d3Sopenharmony_ci{ 158094332d3Sopenharmony_ci if (!isInited_) { 159094332d3Sopenharmony_ci HDF_LOGE("Vendor HAL already stopped"); 160094332d3Sopenharmony_ci onStopCompleteUserCallback(); 161094332d3Sopenharmony_ci return HAL_SUCCESS; 162094332d3Sopenharmony_ci } 163094332d3Sopenharmony_ci HDF_LOGD("Stopping vendor HAL"); 164094332d3Sopenharmony_ci onStopCompleteCallback = [onStopCompleteUserCallback, 165094332d3Sopenharmony_ci this](wifiHandle handle) { 166094332d3Sopenharmony_ci if (globalHandle_ != handle) { 167094332d3Sopenharmony_ci HDF_LOGE("handle mismatch"); 168094332d3Sopenharmony_ci } 169094332d3Sopenharmony_ci HDF_LOGI("Vendor HAL stop complete callback received"); 170094332d3Sopenharmony_ci Invalidate(); 171094332d3Sopenharmony_ci if (isPrimary_) ifaceTool_.lock()->SetWifiUpState(false); 172094332d3Sopenharmony_ci onStopCompleteUserCallback(); 173094332d3Sopenharmony_ci isInited_ = false; 174094332d3Sopenharmony_ci }; 175094332d3Sopenharmony_ci awaitingEventLoopTermination_ = true; 176094332d3Sopenharmony_ci globalFuncTable_.vendorHalExit(globalHandle_, OnAsyncStopComplete); 177094332d3Sopenharmony_ci const auto status = stopWaitCv_.wait_for( 178094332d3Sopenharmony_ci *lock, std::chrono::milliseconds(K_MAX_STOP_COMPLETE_WAIT_MS), 179094332d3Sopenharmony_ci [this] { return !awaitingEventLoopTermination_; }); 180094332d3Sopenharmony_ci if (!status) { 181094332d3Sopenharmony_ci HDF_LOGE("Vendor HAL stop failed or timed out"); 182094332d3Sopenharmony_ci return HAL_UNKNOWN; 183094332d3Sopenharmony_ci } 184094332d3Sopenharmony_ci HDF_LOGE("Vendor HAL stop complete"); 185094332d3Sopenharmony_ci return HAL_SUCCESS; 186094332d3Sopenharmony_ci} 187094332d3Sopenharmony_ci 188094332d3Sopenharmony_ciwifiInterfaceHandle WifiVendorHal::GetIfaceHandle(const std::string& ifaceName) 189094332d3Sopenharmony_ci{ 190094332d3Sopenharmony_ci const auto iface_handle_iter = ifaceNameHandle_.find(ifaceName); 191094332d3Sopenharmony_ci if (iface_handle_iter == ifaceNameHandle_.end()) { 192094332d3Sopenharmony_ci HDF_LOGE("Unknown iface name: %{public}s", ifaceName.c_str()); 193094332d3Sopenharmony_ci return nullptr; 194094332d3Sopenharmony_ci } 195094332d3Sopenharmony_ci return iface_handle_iter->second; 196094332d3Sopenharmony_ci} 197094332d3Sopenharmony_ci 198094332d3Sopenharmony_ciWifiError WifiVendorHal::GetChipCaps(const std::string& ifaceName, uint32_t& capabilities) 199094332d3Sopenharmony_ci{ 200094332d3Sopenharmony_ci capabilities = globalFuncTable_.getChipCaps(ifaceName.c_str()); 201094332d3Sopenharmony_ci if (capabilities == 0) { 202094332d3Sopenharmony_ci return HAL_UNKNOWN; 203094332d3Sopenharmony_ci } 204094332d3Sopenharmony_ci return HAL_SUCCESS; 205094332d3Sopenharmony_ci} 206094332d3Sopenharmony_ci 207094332d3Sopenharmony_ciWifiError WifiVendorHal::GetSupportedFeatureSet(const std::string& ifaceName, uint32_t& capabilities) 208094332d3Sopenharmony_ci{ 209094332d3Sopenharmony_ci capabilities = globalFuncTable_.wifiGetSupportedFeatureSet(ifaceName.c_str()); 210094332d3Sopenharmony_ci if (capabilities == 0) { 211094332d3Sopenharmony_ci return HAL_UNKNOWN; 212094332d3Sopenharmony_ci } 213094332d3Sopenharmony_ci return HAL_SUCCESS; 214094332d3Sopenharmony_ci} 215094332d3Sopenharmony_ci 216094332d3Sopenharmony_cistd::pair<WifiError, std::vector<uint32_t>>WifiVendorHal::GetValidFrequenciesForBand( 217094332d3Sopenharmony_ci const std::string& ifaceName, int band) 218094332d3Sopenharmony_ci{ 219094332d3Sopenharmony_ci std::vector<uint32_t> freqs; 220094332d3Sopenharmony_ci 221094332d3Sopenharmony_ci WifiError status = globalFuncTable_.vendorHalGetChannelsInBand( 222094332d3Sopenharmony_ci GetIfaceHandle(ifaceName), band, freqs); 223094332d3Sopenharmony_ci return {status, std::move(freqs)}; 224094332d3Sopenharmony_ci} 225094332d3Sopenharmony_ci 226094332d3Sopenharmony_ciWifiError WifiVendorHal::CreateVirtualInterface(const std::string& ifname, HalIfaceType iftype) 227094332d3Sopenharmony_ci{ 228094332d3Sopenharmony_ci WifiError status = globalFuncTable_.vendorHalCreateIface( 229094332d3Sopenharmony_ci globalHandle_, ifname.c_str(), iftype); 230094332d3Sopenharmony_ci status = HandleIfaceChangeStatus(ifname, status); 231094332d3Sopenharmony_ci if (status == HAL_SUCCESS && iftype == HalIfaceType::HAL_TYPE_STA) { 232094332d3Sopenharmony_ci ifaceTool_.lock()->SetUpState(ifname.c_str(), true); 233094332d3Sopenharmony_ci } 234094332d3Sopenharmony_ci return status; 235094332d3Sopenharmony_ci} 236094332d3Sopenharmony_ci 237094332d3Sopenharmony_ciWifiError WifiVendorHal::DeleteVirtualInterface(const std::string& ifname) 238094332d3Sopenharmony_ci{ 239094332d3Sopenharmony_ci WifiError status = globalFuncTable_.vendorHalDeleteIface( 240094332d3Sopenharmony_ci globalHandle_, ifname.c_str()); 241094332d3Sopenharmony_ci return HandleIfaceChangeStatus(ifname, status); 242094332d3Sopenharmony_ci} 243094332d3Sopenharmony_ci 244094332d3Sopenharmony_ciWifiError WifiVendorHal::HandleIfaceChangeStatus( 245094332d3Sopenharmony_ci const std::string& ifname, WifiError status) 246094332d3Sopenharmony_ci{ 247094332d3Sopenharmony_ci if (status == HAL_SUCCESS) { 248094332d3Sopenharmony_ci status = RetrieveIfaceHandles(); 249094332d3Sopenharmony_ci } else if (status == HAL_NOT_SUPPORTED) { 250094332d3Sopenharmony_ci if (if_nametoindex(ifname.c_str())) { 251094332d3Sopenharmony_ci status = RetrieveIfaceHandles(); 252094332d3Sopenharmony_ci } 253094332d3Sopenharmony_ci } 254094332d3Sopenharmony_ci return status; 255094332d3Sopenharmony_ci} 256094332d3Sopenharmony_ci 257094332d3Sopenharmony_ciWifiError WifiVendorHal::RetrieveIfaceHandles() 258094332d3Sopenharmony_ci{ 259094332d3Sopenharmony_ci wifiInterfaceHandle* ifaceHandles = nullptr; 260094332d3Sopenharmony_ci int numIfaceHandles = 0; 261094332d3Sopenharmony_ci WifiError status = globalFuncTable_.vendorHalGetIfaces( 262094332d3Sopenharmony_ci globalHandle_, &numIfaceHandles, &ifaceHandles); 263094332d3Sopenharmony_ci if (status != HAL_SUCCESS) { 264094332d3Sopenharmony_ci HDF_LOGE("Failed to enumerate interface handles"); 265094332d3Sopenharmony_ci return status; 266094332d3Sopenharmony_ci } 267094332d3Sopenharmony_ci ifaceNameHandle_.clear(); 268094332d3Sopenharmony_ci for (int i = 0; i < numIfaceHandles; ++i) { 269094332d3Sopenharmony_ci std::array<char, IFNAMSIZ> iface_name_arr = {}; 270094332d3Sopenharmony_ci status = globalFuncTable_.vendorHalGetIfName( 271094332d3Sopenharmony_ci ifaceHandles[i], iface_name_arr.data(), iface_name_arr.size()); 272094332d3Sopenharmony_ci if (status != HAL_SUCCESS) { 273094332d3Sopenharmony_ci HDF_LOGE("Failed to get interface handle name"); 274094332d3Sopenharmony_ci continue; 275094332d3Sopenharmony_ci } 276094332d3Sopenharmony_ci std::string ifaceName(iface_name_arr.data()); 277094332d3Sopenharmony_ci HDF_LOGI("Adding interface handle for %{public}s", ifaceName.c_str()); 278094332d3Sopenharmony_ci ifaceNameHandle_[ifaceName] = ifaceHandles[i]; 279094332d3Sopenharmony_ci } 280094332d3Sopenharmony_ci return HAL_SUCCESS; 281094332d3Sopenharmony_ci} 282094332d3Sopenharmony_ci 283094332d3Sopenharmony_ciWifiError WifiVendorHal::RegisterRestartCallback( 284094332d3Sopenharmony_ci const OnVendorHalRestartCallback& onRestartCallback) 285094332d3Sopenharmony_ci{ 286094332d3Sopenharmony_ci if (onVendorHalRestartCallback) { 287094332d3Sopenharmony_ci return HAL_NOT_AVAILABLE; 288094332d3Sopenharmony_ci } 289094332d3Sopenharmony_ci onVendorHalRestartCallback = 290094332d3Sopenharmony_ci [onRestartCallback](const char* error) { 291094332d3Sopenharmony_ci onRestartCallback(error); 292094332d3Sopenharmony_ci }; 293094332d3Sopenharmony_ci WifiError status = globalFuncTable_.vendorHalSetRestartHandler( 294094332d3Sopenharmony_ci globalHandle_, {OnAsyncSubsystemRestart}); 295094332d3Sopenharmony_ci if (status != HAL_SUCCESS) { 296094332d3Sopenharmony_ci onVendorHalRestartCallback = nullptr; 297094332d3Sopenharmony_ci } 298094332d3Sopenharmony_ci return status; 299094332d3Sopenharmony_ci} 300094332d3Sopenharmony_ci 301094332d3Sopenharmony_civoid WifiVendorHal::Invalidate() 302094332d3Sopenharmony_ci{ 303094332d3Sopenharmony_ci globalHandle_ = nullptr; 304094332d3Sopenharmony_ci ifaceNameHandle_.clear(); 305094332d3Sopenharmony_ci vendorHalCbHandler_.Invalidate(); 306094332d3Sopenharmony_ci vendorHalExtCbHandler_.Invalidate(); 307094332d3Sopenharmony_ci} 308094332d3Sopenharmony_ci 309094332d3Sopenharmony_ciWifiError WifiVendorHal::SetCountryCode(const std::string& ifaceName, const std::string& code) 310094332d3Sopenharmony_ci{ 311094332d3Sopenharmony_ci return globalFuncTable_.wifiSetCountryCode(GetIfaceHandle(ifaceName), code.c_str()); 312094332d3Sopenharmony_ci} 313094332d3Sopenharmony_ci 314094332d3Sopenharmony_ciWifiError WifiVendorHal::GetSignalPollInfo(const std::string& ifaceName, 315094332d3Sopenharmony_ci SignalPollResult& signalPollResult) 316094332d3Sopenharmony_ci{ 317094332d3Sopenharmony_ci return globalFuncTable_.getSignalPollInfo(GetIfaceHandle(ifaceName), signalPollResult); 318094332d3Sopenharmony_ci} 319094332d3Sopenharmony_ci 320094332d3Sopenharmony_cistd::pair<WifiError, int> WifiVendorHal::GetPowerMode(const std::string& ifaceName) 321094332d3Sopenharmony_ci{ 322094332d3Sopenharmony_ci int mode; 323094332d3Sopenharmony_ci WifiError status = globalFuncTable_.getPowerMode(ifaceName.c_str(), &mode); 324094332d3Sopenharmony_ci return {status, mode}; 325094332d3Sopenharmony_ci} 326094332d3Sopenharmony_ci 327094332d3Sopenharmony_ciWifiError WifiVendorHal::SetPowerMode(const std::string& ifaceName, int mode) 328094332d3Sopenharmony_ci{ 329094332d3Sopenharmony_ci return globalFuncTable_.setPowerMode(ifaceName.c_str(), mode); 330094332d3Sopenharmony_ci} 331094332d3Sopenharmony_ci 332094332d3Sopenharmony_ciWifiError WifiVendorHal::IsSupportCoex(bool& isCoex) 333094332d3Sopenharmony_ci{ 334094332d3Sopenharmony_ci return globalFuncTable_.isSupportCoex(isCoex); 335094332d3Sopenharmony_ci} 336094332d3Sopenharmony_ci 337094332d3Sopenharmony_ciWifiError WifiVendorHal::EnablePowerMode(const std::string& ifaceName, int mode) 338094332d3Sopenharmony_ci{ 339094332d3Sopenharmony_ci return globalFuncTable_.enablePowerMode(ifaceName.c_str(), mode); 340094332d3Sopenharmony_ci} 341094332d3Sopenharmony_ci 342094332d3Sopenharmony_ciWifiError WifiVendorHal::StartScan( 343094332d3Sopenharmony_ci const std::string& ifaceName, const ScanParams& params) 344094332d3Sopenharmony_ci{ 345094332d3Sopenharmony_ci WifiError status = globalFuncTable_.wifiStartScan(GetIfaceHandle(ifaceName), params); 346094332d3Sopenharmony_ci return status; 347094332d3Sopenharmony_ci} 348094332d3Sopenharmony_ci 349094332d3Sopenharmony_ciWifiError WifiVendorHal::StartPnoScan(const std::string& ifaceName, const PnoScanParams& pnoParams) 350094332d3Sopenharmony_ci{ 351094332d3Sopenharmony_ci WifiError status = globalFuncTable_.wifiStartPnoScan(GetIfaceHandle(ifaceName), pnoParams); 352094332d3Sopenharmony_ci return status; 353094332d3Sopenharmony_ci} 354094332d3Sopenharmony_ci 355094332d3Sopenharmony_ciWifiError WifiVendorHal::StopPnoScan(const std::string& ifaceName) 356094332d3Sopenharmony_ci{ 357094332d3Sopenharmony_ci WifiError status = globalFuncTable_.wifiStopPnoScan(GetIfaceHandle(ifaceName)); 358094332d3Sopenharmony_ci return status; 359094332d3Sopenharmony_ci} 360094332d3Sopenharmony_ci 361094332d3Sopenharmony_ciWifiError WifiVendorHal::GetScanInfos(const std::string& ifaceName, 362094332d3Sopenharmony_ci std::vector<ScanResultsInfo>& scanResultsInfo) 363094332d3Sopenharmony_ci{ 364094332d3Sopenharmony_ci WifiError status = globalFuncTable_.getScanResults(GetIfaceHandle(ifaceName), scanResultsInfo); 365094332d3Sopenharmony_ci return status; 366094332d3Sopenharmony_ci} 367094332d3Sopenharmony_ci 368094332d3Sopenharmony_ciWifiError WifiVendorHal::SetDpiMarkRule(int32_t uid, int32_t protocol, int32_t enable) 369094332d3Sopenharmony_ci{ 370094332d3Sopenharmony_ci return globalFuncTable_.setDpiMarkRule(uid, protocol, enable); 371094332d3Sopenharmony_ci} 372094332d3Sopenharmony_ci 373094332d3Sopenharmony_ciWifiError WifiVendorHal::RegisterIfaceCallBack(const std::string& ifaceName, 374094332d3Sopenharmony_ci const sptr<IChipIfaceCallback>& chipIfaceCallback) 375094332d3Sopenharmony_ci{ 376094332d3Sopenharmony_ci vendorHalCbHandler_.AddCallback(chipIfaceCallback); 377094332d3Sopenharmony_ci WifiCallbackHandler handler = {OnAsyncGscanFullResult, OnAsyncRssiReport}; 378094332d3Sopenharmony_ci globalFuncTable_.registerIfaceCallBack(ifaceName.c_str(), handler); 379094332d3Sopenharmony_ci return HAL_SUCCESS; 380094332d3Sopenharmony_ci} 381094332d3Sopenharmony_ci 382094332d3Sopenharmony_ciWifiError WifiVendorHal::UnRegisterIfaceCallBack(const std::string& ifaceName, 383094332d3Sopenharmony_ci const sptr<IChipIfaceCallback>& chipIfaceCallback) 384094332d3Sopenharmony_ci{ 385094332d3Sopenharmony_ci WifiCallbackHandler handler = {}; 386094332d3Sopenharmony_ci globalFuncTable_.registerIfaceCallBack(ifaceName.c_str(), handler); 387094332d3Sopenharmony_ci vendorHalCbHandler_.Invalidate(); // instead of RemoveCallback temporarily 388094332d3Sopenharmony_ci return HAL_SUCCESS; 389094332d3Sopenharmony_ci} 390094332d3Sopenharmony_ci 391094332d3Sopenharmony_ciWifiError WifiVendorHal::RegisterExtIfaceCallBack(const std::string& ifaceName, 392094332d3Sopenharmony_ci const sptr<IChipIfaceCallback>& chipIfaceCallback) 393094332d3Sopenharmony_ci{ 394094332d3Sopenharmony_ci vendorHalExtCbHandler_.AddCallback(chipIfaceCallback); 395094332d3Sopenharmony_ci WifiExtCallbackHandler handler = {OnAsyncWifiNetlinkMsgReport}; 396094332d3Sopenharmony_ci globalFuncTable_.registerExtIfaceCallBack(ifaceName.c_str(), handler); 397094332d3Sopenharmony_ci return HAL_SUCCESS; 398094332d3Sopenharmony_ci} 399094332d3Sopenharmony_ci 400094332d3Sopenharmony_ciWifiError WifiVendorHal::UnRegisterExtIfaceCallBack(const std::string& ifaceName, 401094332d3Sopenharmony_ci const sptr<IChipIfaceCallback>& chipIfaceCallback) 402094332d3Sopenharmony_ci{ 403094332d3Sopenharmony_ci WifiExtCallbackHandler handler = {}; 404094332d3Sopenharmony_ci globalFuncTable_.registerExtIfaceCallBack(ifaceName.c_str(), handler); 405094332d3Sopenharmony_ci vendorHalExtCbHandler_.Invalidate(); // instead of RemoveCallback temporarily 406094332d3Sopenharmony_ci return HAL_SUCCESS; 407094332d3Sopenharmony_ci} 408094332d3Sopenharmony_ci 409094332d3Sopenharmony_ciWifiError WifiVendorHal::SetTxPower(const std::string& ifaceName, int mode) 410094332d3Sopenharmony_ci{ 411094332d3Sopenharmony_ci return globalFuncTable_.setTxPower(ifaceName.c_str(), mode); 412094332d3Sopenharmony_ci} 413094332d3Sopenharmony_ci 414094332d3Sopenharmony_ciWifiError WifiVendorHal::SendCmdToDriver(const std::string& ifaceName, int32_t cmdId, 415094332d3Sopenharmony_ci const std::vector<int8_t>& paramBuf) 416094332d3Sopenharmony_ci{ 417094332d3Sopenharmony_ci return globalFuncTable_.sendCmdToDriver(ifaceName.c_str(), cmdId, paramBuf); 418094332d3Sopenharmony_ci} 419094332d3Sopenharmony_ci 420094332d3Sopenharmony_ciWifiError WifiVendorHal::SendActionFrame(const std::string& ifaceName, uint32_t freq, 421094332d3Sopenharmony_ci const std::vector<uint8_t>& frameData) 422094332d3Sopenharmony_ci{ 423094332d3Sopenharmony_ci return globalFuncTable_.sendActionFrame(GetIfaceHandle(ifaceName), freq, frameData); 424094332d3Sopenharmony_ci} 425094332d3Sopenharmony_ci 426094332d3Sopenharmony_ciWifiError WifiVendorHal::RegisterActionFrameReceiver(const std::string& ifaceName, const std::vector<uint8_t>& match) 427094332d3Sopenharmony_ci{ 428094332d3Sopenharmony_ci return globalFuncTable_.registerActionFrameReceiver(GetIfaceHandle(ifaceName), match); 429094332d3Sopenharmony_ci} 430094332d3Sopenharmony_ci 431094332d3Sopenharmony_ciWifiError WifiVendorHal::GetCoexictenceChannelList(const std::string& ifaceName, std::vector<uint8_t>& paramBuf) 432094332d3Sopenharmony_ci{ 433094332d3Sopenharmony_ci return globalFuncTable_.getCoexictenceChannelList(ifaceName, paramBuf); 434094332d3Sopenharmony_ci} 435094332d3Sopenharmony_ci 436094332d3Sopenharmony_ci} // namespace v1_0 437094332d3Sopenharmony_ci} // namespace Chip 438094332d3Sopenharmony_ci} // namespace Wlan 439094332d3Sopenharmony_ci} // namespace HDI 440094332d3Sopenharmony_ci} // namespace OHOS