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