1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2022-2023 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#include "wlan_common_cmd.h" 16094332d3Sopenharmony_ci#include <securec.h> 17094332d3Sopenharmony_ci#include <hdf_base.h> 18094332d3Sopenharmony_ci#include <hdf_log.h> 19094332d3Sopenharmony_ci#include <osal_time.h> 20094332d3Sopenharmony_ci#include <osal_mem.h> 21094332d3Sopenharmony_ci#include "wlan_extend_cmd.h" 22094332d3Sopenharmony_ci#include "v1_3/iwlan_callback.h" 23094332d3Sopenharmony_ci#include "v1_3/iwlan_interface.h" 24094332d3Sopenharmony_ci 25094332d3Sopenharmony_cistruct IWiFi *g_wifi = NULL; 26094332d3Sopenharmony_cistruct IWiFiAp *g_apFeature = NULL; 27094332d3Sopenharmony_cistruct IWiFiSta *g_staFeature = NULL; 28094332d3Sopenharmony_cistruct IWiFiP2p *g_p2pFeature = NULL; 29094332d3Sopenharmony_cistruct IWiFiBaseFeature *g_baseFeature = NULL; 30094332d3Sopenharmony_cistatic uint32_t g_wifiCount = 0; 31094332d3Sopenharmony_cistatic uint32_t g_apFeatureCount = 0; 32094332d3Sopenharmony_cistatic uint32_t g_staFeatureCount = 0; 33094332d3Sopenharmony_cistatic uint32_t g_p2pFeatureCount = 0; 34094332d3Sopenharmony_ciconst uint32_t RESET_TIME = 3; 35094332d3Sopenharmony_ci#define DEFAULT_COMBO_SIZE 10 36094332d3Sopenharmony_ci#define WLAN_FREQ_MAX_NUM 14 37094332d3Sopenharmony_ci#define WLAN_MAX_NUM_STA_WITH_AP 4 38094332d3Sopenharmony_ci#define ETH_ADDR_LEN 6 39094332d3Sopenharmony_ci 40094332d3Sopenharmony_cistruct HdfWlanStubData *HdfStubDriver(void) 41094332d3Sopenharmony_ci{ 42094332d3Sopenharmony_ci static struct HdfWlanStubData registerManager; 43094332d3Sopenharmony_ci return ®isterManager; 44094332d3Sopenharmony_ci} 45094332d3Sopenharmony_ci 46094332d3Sopenharmony_ciint32_t WlanInterfaceStart(struct IWlanInterface *self) 47094332d3Sopenharmony_ci{ 48094332d3Sopenharmony_ci int32_t ret; 49094332d3Sopenharmony_ci HDF_LOGI("hal enter %{public}s", __FUNCTION__); 50094332d3Sopenharmony_ci (void)self; 51094332d3Sopenharmony_ci if (g_wifi == NULL || g_wifi->start == NULL) { 52094332d3Sopenharmony_ci HDF_LOGE("%{public}s: g_wifi or g_wifi->start is NULL", __func__); 53094332d3Sopenharmony_ci return HDF_FAILURE; 54094332d3Sopenharmony_ci } 55094332d3Sopenharmony_ci ret = g_wifi->start(g_wifi); 56094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 57094332d3Sopenharmony_ci HDF_LOGE("%{public}s start WiFi failed! error code: %{public}d", __func__, ret); 58094332d3Sopenharmony_ci } else { 59094332d3Sopenharmony_ci g_wifiCount++; 60094332d3Sopenharmony_ci } 61094332d3Sopenharmony_ci HDF_LOGI("hal exit %{public}s, g_wifiCount:%{public}u", __FUNCTION__, g_wifiCount); 62094332d3Sopenharmony_ci return ret; 63094332d3Sopenharmony_ci} 64094332d3Sopenharmony_ci 65094332d3Sopenharmony_ciint32_t WlanInterfaceStop(struct IWlanInterface *self) 66094332d3Sopenharmony_ci{ 67094332d3Sopenharmony_ci int32_t ret; 68094332d3Sopenharmony_ci HDF_LOGI("hal enter %{public}s", __FUNCTION__); 69094332d3Sopenharmony_ci (void)self; 70094332d3Sopenharmony_ci if (g_wifi == NULL || g_wifi->stop == NULL) { 71094332d3Sopenharmony_ci HDF_LOGE("%{public}s: g_wifi or g_wifi->stop is NULL", __func__); 72094332d3Sopenharmony_ci return HDF_FAILURE; 73094332d3Sopenharmony_ci } 74094332d3Sopenharmony_ci g_wifiCount--; 75094332d3Sopenharmony_ci if (g_wifiCount > 0) { 76094332d3Sopenharmony_ci HDF_LOGE("%{public}s: g_wifi is used!", __func__); 77094332d3Sopenharmony_ci return HDF_SUCCESS; 78094332d3Sopenharmony_ci } 79094332d3Sopenharmony_ci ret = g_wifi->stop(g_wifi); 80094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 81094332d3Sopenharmony_ci HDF_LOGE("%{public}s stop WiFi failed! error code: %{public}d", __func__, ret); 82094332d3Sopenharmony_ci } 83094332d3Sopenharmony_ci HDF_LOGI("hal exit %{public}s, g_wifiCount:%{public}u", __FUNCTION__, g_wifiCount); 84094332d3Sopenharmony_ci return ret; 85094332d3Sopenharmony_ci} 86094332d3Sopenharmony_ci 87094332d3Sopenharmony_ciint32_t WlanInterfaceCreateFeature(struct IWlanInterface *self, int32_t type, struct HdfFeatureInfo *ifeature) 88094332d3Sopenharmony_ci{ 89094332d3Sopenharmony_ci int32_t ret = HDF_FAILURE; 90094332d3Sopenharmony_ci HDF_LOGI("hal enter %{public}s type:%{public}d", __FUNCTION__, type); 91094332d3Sopenharmony_ci (void)self; 92094332d3Sopenharmony_ci if (ifeature == NULL) { 93094332d3Sopenharmony_ci HDF_LOGE("%{public}s: input parameter invalid!", __func__); 94094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 95094332d3Sopenharmony_ci } 96094332d3Sopenharmony_ci if (g_wifi == NULL || g_wifi->createFeature == NULL) { 97094332d3Sopenharmony_ci HDF_LOGE("%{public}s: g_wifi or g_wifi->createFeature is NULL", __func__); 98094332d3Sopenharmony_ci return HDF_FAILURE; 99094332d3Sopenharmony_ci } 100094332d3Sopenharmony_ci if (type == PROTOCOL_80211_IFTYPE_AP) { 101094332d3Sopenharmony_ci ret = g_wifi->createFeature(type, (struct IWiFiBaseFeature **)&g_apFeature); 102094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 103094332d3Sopenharmony_ci HDF_LOGE("%{public}s: createAPFeature failed, error code: %{public}d", __func__, ret); 104094332d3Sopenharmony_ci return HDF_FAILURE; 105094332d3Sopenharmony_ci } 106094332d3Sopenharmony_ci if (g_apFeature != NULL) { 107094332d3Sopenharmony_ci g_apFeatureCount++; 108094332d3Sopenharmony_ci ifeature->type = g_apFeature->baseFeature.type; 109094332d3Sopenharmony_ci ifeature->ifName = strdup((g_apFeature->baseFeature).ifName); 110094332d3Sopenharmony_ci } 111094332d3Sopenharmony_ci } else if (type == PROTOCOL_80211_IFTYPE_STATION) { 112094332d3Sopenharmony_ci ret = g_wifi->createFeature(type, (struct IWiFiBaseFeature **)&g_staFeature); 113094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 114094332d3Sopenharmony_ci HDF_LOGE("%{public}s: createSTAFeature failed, error code: %{public}d", __func__, ret); 115094332d3Sopenharmony_ci return HDF_FAILURE; 116094332d3Sopenharmony_ci } 117094332d3Sopenharmony_ci if (g_staFeature != NULL) { 118094332d3Sopenharmony_ci g_staFeatureCount++; 119094332d3Sopenharmony_ci ifeature->type = g_staFeature->baseFeature.type; 120094332d3Sopenharmony_ci ifeature->ifName = strdup((g_staFeature->baseFeature).ifName); 121094332d3Sopenharmony_ci } 122094332d3Sopenharmony_ci } else if (type == PROTOCOL_80211_IFTYPE_P2P_DEVICE) { 123094332d3Sopenharmony_ci ret = g_wifi->createFeature(type, (struct IWiFiBaseFeature **)&g_p2pFeature); 124094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 125094332d3Sopenharmony_ci HDF_LOGE("%{public}s: failed to create p2p feature, errorCode: %{public}d", __func__, ret); 126094332d3Sopenharmony_ci return HDF_FAILURE; 127094332d3Sopenharmony_ci } 128094332d3Sopenharmony_ci if (g_p2pFeature != NULL) { 129094332d3Sopenharmony_ci g_p2pFeatureCount++; 130094332d3Sopenharmony_ci ifeature->type = g_p2pFeature->baseFeature.type; 131094332d3Sopenharmony_ci ifeature->ifName = strdup((g_p2pFeature->baseFeature).ifName); 132094332d3Sopenharmony_ci } 133094332d3Sopenharmony_ci } 134094332d3Sopenharmony_ci if (ifeature->ifName == NULL) { 135094332d3Sopenharmony_ci return HDF_FAILURE; 136094332d3Sopenharmony_ci } 137094332d3Sopenharmony_ci HDF_LOGI("ap:%{public}u sta:%{public}u p2p:%{public}u", g_apFeatureCount, g_staFeatureCount, g_p2pFeatureCount); 138094332d3Sopenharmony_ci return ret; 139094332d3Sopenharmony_ci} 140094332d3Sopenharmony_ci 141094332d3Sopenharmony_ciint32_t WlanInterfaceDestroyFeature(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature) 142094332d3Sopenharmony_ci{ 143094332d3Sopenharmony_ci int32_t ret = HDF_FAILURE; 144094332d3Sopenharmony_ci 145094332d3Sopenharmony_ci (void)self; 146094332d3Sopenharmony_ci if (ifeature == NULL || ifeature->ifName == NULL) { 147094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 148094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 149094332d3Sopenharmony_ci } 150094332d3Sopenharmony_ci if (g_wifi == NULL || g_wifi->destroyFeature == NULL) { 151094332d3Sopenharmony_ci HDF_LOGE("%{public}s: g_wifi or g_wifi->destroyFeature is NULL", __func__); 152094332d3Sopenharmony_ci return HDF_FAILURE; 153094332d3Sopenharmony_ci } 154094332d3Sopenharmony_ci HDF_LOGI("hal enter %{public}s type:%{public}d", __FUNCTION__, ifeature->type); 155094332d3Sopenharmony_ci if (ifeature->type == PROTOCOL_80211_IFTYPE_AP) { 156094332d3Sopenharmony_ci if (g_apFeature == NULL) { 157094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_apFeature is NULL!", __func__); 158094332d3Sopenharmony_ci return HDF_FAILURE; 159094332d3Sopenharmony_ci } 160094332d3Sopenharmony_ci g_apFeatureCount--; 161094332d3Sopenharmony_ci if (g_apFeatureCount > 0) { 162094332d3Sopenharmony_ci HDF_LOGI("%{public}s: apFeature is used!", __func__); 163094332d3Sopenharmony_ci return HDF_SUCCESS; 164094332d3Sopenharmony_ci } 165094332d3Sopenharmony_ci ret = strcpy_s((g_apFeature->baseFeature).ifName, IFNAMSIZ, ifeature->ifName); 166094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 167094332d3Sopenharmony_ci HDF_LOGE("%{public}s: strcpy_s apFeature ifName is failed!", __func__); 168094332d3Sopenharmony_ci return HDF_FAILURE; 169094332d3Sopenharmony_ci } 170094332d3Sopenharmony_ci ret = g_wifi->destroyFeature(&(g_apFeature->baseFeature)); 171094332d3Sopenharmony_ci g_apFeature = NULL; 172094332d3Sopenharmony_ci } else if (ifeature->type == PROTOCOL_80211_IFTYPE_STATION) { 173094332d3Sopenharmony_ci if (g_staFeature == NULL) { 174094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_staFeature is NULL!", __func__); 175094332d3Sopenharmony_ci return HDF_FAILURE; 176094332d3Sopenharmony_ci } 177094332d3Sopenharmony_ci g_staFeatureCount--; 178094332d3Sopenharmony_ci if (g_staFeatureCount > 0) { 179094332d3Sopenharmony_ci HDF_LOGI("%{public}s: staFeature is used!", __func__); 180094332d3Sopenharmony_ci return HDF_SUCCESS; 181094332d3Sopenharmony_ci } 182094332d3Sopenharmony_ci ret = strcpy_s((g_staFeature->baseFeature).ifName, IFNAMSIZ, ifeature->ifName); 183094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 184094332d3Sopenharmony_ci HDF_LOGE("%{public}s: strcpy_s staFeature ifName is failed!", __func__); 185094332d3Sopenharmony_ci return HDF_FAILURE; 186094332d3Sopenharmony_ci } 187094332d3Sopenharmony_ci ret = g_wifi->destroyFeature(&(g_staFeature->baseFeature)); 188094332d3Sopenharmony_ci g_staFeature = NULL; 189094332d3Sopenharmony_ci } else if (ifeature->type == PROTOCOL_80211_IFTYPE_P2P_DEVICE) { 190094332d3Sopenharmony_ci if (g_p2pFeature == NULL) { 191094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_p2pFeature is NULL!", __func__); 192094332d3Sopenharmony_ci return HDF_FAILURE; 193094332d3Sopenharmony_ci } 194094332d3Sopenharmony_ci g_p2pFeatureCount--; 195094332d3Sopenharmony_ci if (g_p2pFeatureCount > 0) { 196094332d3Sopenharmony_ci HDF_LOGI("%{public}s: p2pFeature is used!", __func__); 197094332d3Sopenharmony_ci return HDF_SUCCESS; 198094332d3Sopenharmony_ci } 199094332d3Sopenharmony_ci ret = strcpy_s((g_p2pFeature->baseFeature).ifName, IFNAMSIZ, ifeature->ifName); 200094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 201094332d3Sopenharmony_ci HDF_LOGE("%{public}s: failed to copy the ifName! ret: %{public}d", __func__, ret); 202094332d3Sopenharmony_ci return HDF_FAILURE; 203094332d3Sopenharmony_ci } 204094332d3Sopenharmony_ci ret = g_wifi->destroyFeature(&(g_p2pFeature->baseFeature)); 205094332d3Sopenharmony_ci g_p2pFeature = NULL; 206094332d3Sopenharmony_ci } else { 207094332d3Sopenharmony_ci HDF_LOGE("%{public}s: wlan type is invalid", __func__); 208094332d3Sopenharmony_ci } 209094332d3Sopenharmony_ci HDF_LOGI("hal exit %{public}s, apFeatureCount:%{public}u staFeatureCount:%{public}u p2pFeatureCount:%{public}u", 210094332d3Sopenharmony_ci __FUNCTION__, g_apFeatureCount, g_staFeatureCount, g_p2pFeatureCount); 211094332d3Sopenharmony_ci return ret; 212094332d3Sopenharmony_ci} 213094332d3Sopenharmony_ci 214094332d3Sopenharmony_ciint32_t WlanInterfaceGetAssociatedStas(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, 215094332d3Sopenharmony_ci struct HdfStaInfo *staInfo, uint32_t *staInfoLen, uint32_t *num) 216094332d3Sopenharmony_ci{ 217094332d3Sopenharmony_ci int32_t ret; 218094332d3Sopenharmony_ci 219094332d3Sopenharmony_ci (void)self; 220094332d3Sopenharmony_ci if (ifeature == NULL || ifeature->ifName == NULL || staInfo == NULL || staInfoLen == NULL || num == NULL) { 221094332d3Sopenharmony_ci HDF_LOGE("%{public}s:input parameter invalid!", __func__); 222094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 223094332d3Sopenharmony_ci } 224094332d3Sopenharmony_ci if (g_apFeature == NULL || g_apFeature->getAssociatedStas == NULL) { 225094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_apFeature or g_apFeature->getAssociatedStas is NULL!", __func__); 226094332d3Sopenharmony_ci return HDF_FAILURE; 227094332d3Sopenharmony_ci } 228094332d3Sopenharmony_ci ret = strcpy_s((g_apFeature->baseFeature).ifName, IFNAMSIZ, ifeature->ifName); 229094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 230094332d3Sopenharmony_ci HDF_LOGE("%{public}s: strcpy_s apFeature ifName is failed!", __func__); 231094332d3Sopenharmony_ci return HDF_FAILURE; 232094332d3Sopenharmony_ci } 233094332d3Sopenharmony_ci 234094332d3Sopenharmony_ci struct StaInfo *wifiStaInfo = (struct StaInfo *)OsalMemCalloc(sizeof(struct StaInfo) * (*staInfoLen)); 235094332d3Sopenharmony_ci if (wifiStaInfo == NULL) { 236094332d3Sopenharmony_ci HDF_LOGE("%{public}s:OsalMemCalloc failed!", __func__); 237094332d3Sopenharmony_ci return HDF_FAILURE; 238094332d3Sopenharmony_ci } 239094332d3Sopenharmony_ci ret = g_apFeature->getAssociatedStas(g_apFeature, wifiStaInfo, *staInfoLen, num); 240094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 241094332d3Sopenharmony_ci HDF_LOGE("%{public}s get associated sta failed!, error code: %{public}d", __func__, ret); 242094332d3Sopenharmony_ci OsalMemFree(wifiStaInfo); 243094332d3Sopenharmony_ci return ret; 244094332d3Sopenharmony_ci } 245094332d3Sopenharmony_ci for (uint32_t i = 0; i < (*num); i++) { 246094332d3Sopenharmony_ci staInfo[i].mac = (uint8_t *)OsalMemCalloc(sizeof(uint8_t) * ETH_ADDR_LEN); 247094332d3Sopenharmony_ci if (staInfo[i].mac != NULL) { 248094332d3Sopenharmony_ci if (memcpy_s(staInfo[i].mac, WIFI_MAC_ADDR_LENGTH, wifiStaInfo[i].mac, WIFI_MAC_ADDR_LENGTH) != EOK) { 249094332d3Sopenharmony_ci HDF_LOGE("%{public}s fail : memcpy_s mac fail!", __func__); 250094332d3Sopenharmony_ci ret = HDF_FAILURE; 251094332d3Sopenharmony_ci break; 252094332d3Sopenharmony_ci } 253094332d3Sopenharmony_ci staInfo[i].macLen = WIFI_MAC_ADDR_LENGTH; 254094332d3Sopenharmony_ci } 255094332d3Sopenharmony_ci } 256094332d3Sopenharmony_ci OsalMemFree(wifiStaInfo); 257094332d3Sopenharmony_ci return ret; 258094332d3Sopenharmony_ci} 259094332d3Sopenharmony_ci 260094332d3Sopenharmony_cistatic int32_t GetBasefeature(const struct HdfFeatureInfo *ifeature, struct IWiFiBaseFeature **baseFeature) 261094332d3Sopenharmony_ci{ 262094332d3Sopenharmony_ci if (ifeature->type == PROTOCOL_80211_IFTYPE_AP) { 263094332d3Sopenharmony_ci if (g_apFeature == NULL) { 264094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_apFeature is NULL!", __func__); 265094332d3Sopenharmony_ci return HDF_FAILURE; 266094332d3Sopenharmony_ci } 267094332d3Sopenharmony_ci *baseFeature = &(g_apFeature->baseFeature); 268094332d3Sopenharmony_ci } else if (ifeature->type == PROTOCOL_80211_IFTYPE_STATION) { 269094332d3Sopenharmony_ci if (g_staFeature == NULL) { 270094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_staFeature is NULL!", __func__); 271094332d3Sopenharmony_ci return HDF_FAILURE; 272094332d3Sopenharmony_ci } 273094332d3Sopenharmony_ci *baseFeature = &(g_staFeature->baseFeature); 274094332d3Sopenharmony_ci } else if (ifeature->type == PROTOCOL_80211_IFTYPE_P2P_DEVICE) { 275094332d3Sopenharmony_ci if (g_p2pFeature == NULL) { 276094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_p2pFeature is NULL!", __func__); 277094332d3Sopenharmony_ci return HDF_FAILURE; 278094332d3Sopenharmony_ci } 279094332d3Sopenharmony_ci *baseFeature = &(g_p2pFeature->baseFeature); 280094332d3Sopenharmony_ci } else { 281094332d3Sopenharmony_ci HDF_LOGE("%{public}s: wlan type is Invalid, featureType is %{public}d", __func__, ifeature->type); 282094332d3Sopenharmony_ci return HDF_FAILURE; 283094332d3Sopenharmony_ci } 284094332d3Sopenharmony_ci return HDF_SUCCESS; 285094332d3Sopenharmony_ci} 286094332d3Sopenharmony_ci 287094332d3Sopenharmony_ciint32_t WlanInterfaceGetChipId(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, uint8_t *chipId) 288094332d3Sopenharmony_ci{ 289094332d3Sopenharmony_ci int32_t ret = HDF_FAILURE; 290094332d3Sopenharmony_ci struct IWiFiBaseFeature *baseFeature = NULL; 291094332d3Sopenharmony_ci 292094332d3Sopenharmony_ci (void)self; 293094332d3Sopenharmony_ci if (ifeature == NULL || ifeature->ifName == NULL || chipId == NULL) { 294094332d3Sopenharmony_ci HDF_LOGE("%{public}s ifeature or ifName is NULL!", __func__); 295094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 296094332d3Sopenharmony_ci } 297094332d3Sopenharmony_ci ret = GetBasefeature(ifeature, &baseFeature); 298094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 299094332d3Sopenharmony_ci HDF_LOGE("%{public}s GetBasefeature failed!", __func__); 300094332d3Sopenharmony_ci return HDF_FAILURE; 301094332d3Sopenharmony_ci } 302094332d3Sopenharmony_ci ret = strcpy_s(baseFeature->ifName, IFNAMSIZ, ifeature->ifName); 303094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 304094332d3Sopenharmony_ci HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret); 305094332d3Sopenharmony_ci return HDF_FAILURE; 306094332d3Sopenharmony_ci } 307094332d3Sopenharmony_ci 308094332d3Sopenharmony_ci return baseFeature->getChipId(baseFeature, chipId); 309094332d3Sopenharmony_ci} 310094332d3Sopenharmony_ci 311094332d3Sopenharmony_ciint32_t WlanInterfaceGetDeviceMacAddress(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, 312094332d3Sopenharmony_ci uint8_t *mac, uint32_t *macLen, uint8_t len) 313094332d3Sopenharmony_ci{ 314094332d3Sopenharmony_ci int32_t ret = HDF_FAILURE; 315094332d3Sopenharmony_ci struct IWiFiBaseFeature *baseFeature = NULL; 316094332d3Sopenharmony_ci 317094332d3Sopenharmony_ci (void)self; 318094332d3Sopenharmony_ci if (ifeature == NULL || ifeature->ifName == NULL || mac == NULL || macLen == NULL) { 319094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 320094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 321094332d3Sopenharmony_ci } 322094332d3Sopenharmony_ci ret = GetBasefeature(ifeature, &baseFeature); 323094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 324094332d3Sopenharmony_ci HDF_LOGE("%{public}s GetBasefeature failed!", __func__); 325094332d3Sopenharmony_ci return HDF_FAILURE; 326094332d3Sopenharmony_ci } 327094332d3Sopenharmony_ci ret = strcpy_s(baseFeature->ifName, IFNAMSIZ, ifeature->ifName); 328094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 329094332d3Sopenharmony_ci HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret); 330094332d3Sopenharmony_ci return HDF_FAILURE; 331094332d3Sopenharmony_ci } 332094332d3Sopenharmony_ci ret = baseFeature->getDeviceMacAddress(baseFeature, mac, len); 333094332d3Sopenharmony_ci *macLen = ETH_ADDR_LEN; 334094332d3Sopenharmony_ci return ret; 335094332d3Sopenharmony_ci} 336094332d3Sopenharmony_ci 337094332d3Sopenharmony_ciint32_t WlanInterfaceGetFeatureByIfName(struct IWlanInterface *self, const char *ifName, 338094332d3Sopenharmony_ci struct HdfFeatureInfo *ifeature) 339094332d3Sopenharmony_ci{ 340094332d3Sopenharmony_ci int32_t ret; 341094332d3Sopenharmony_ci struct IWiFiBaseFeature *baseFeature = NULL; 342094332d3Sopenharmony_ci 343094332d3Sopenharmony_ci (void)self; 344094332d3Sopenharmony_ci if (ifName == NULL || ifeature == NULL) { 345094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 346094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 347094332d3Sopenharmony_ci } 348094332d3Sopenharmony_ci if (g_wifi == NULL || g_wifi->getFeatureByIfName == NULL) { 349094332d3Sopenharmony_ci HDF_LOGE("%{public}s gwifi or g_wifi->getFeatureByIfName is NULL!", __func__); 350094332d3Sopenharmony_ci return HDF_FAILURE; 351094332d3Sopenharmony_ci } 352094332d3Sopenharmony_ci ret = g_wifi->getFeatureByIfName(ifName, (struct IWiFiBaseFeature **)&baseFeature); 353094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 354094332d3Sopenharmony_ci HDF_LOGE("%{public}s get FeatureByIfName failed!, error code: %{public}d", __func__, ret); 355094332d3Sopenharmony_ci return ret; 356094332d3Sopenharmony_ci } 357094332d3Sopenharmony_ci if (baseFeature == NULL) { 358094332d3Sopenharmony_ci HDF_LOGE("%{public}s baseFeature is NULL!", __func__); 359094332d3Sopenharmony_ci return HDF_FAILURE; 360094332d3Sopenharmony_ci } 361094332d3Sopenharmony_ci ifeature->type = baseFeature->type; 362094332d3Sopenharmony_ci ifeature->ifName = strdup(baseFeature->ifName); 363094332d3Sopenharmony_ci if (!ifeature->ifName) { 364094332d3Sopenharmony_ci HDF_LOGE("ifName is NULL!"); 365094332d3Sopenharmony_ci return HDF_FAILURE; 366094332d3Sopenharmony_ci } 367094332d3Sopenharmony_ci 368094332d3Sopenharmony_ci return ret; 369094332d3Sopenharmony_ci} 370094332d3Sopenharmony_ci 371094332d3Sopenharmony_ciint32_t WlanInterfaceGetFeatureType(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, 372094332d3Sopenharmony_ci int32_t *featureType) 373094332d3Sopenharmony_ci{ 374094332d3Sopenharmony_ci (void)self; 375094332d3Sopenharmony_ci int32_t ret; 376094332d3Sopenharmony_ci int32_t type; 377094332d3Sopenharmony_ci struct IWiFiBaseFeature *baseFeature = NULL; 378094332d3Sopenharmony_ci 379094332d3Sopenharmony_ci if (ifeature == NULL || featureType == NULL) { 380094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 381094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 382094332d3Sopenharmony_ci } 383094332d3Sopenharmony_ci ret = GetBasefeature(ifeature, &baseFeature); 384094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 385094332d3Sopenharmony_ci HDF_LOGE("%{public}s GetBasefeature failed!", __func__); 386094332d3Sopenharmony_ci return HDF_FAILURE; 387094332d3Sopenharmony_ci } 388094332d3Sopenharmony_ci baseFeature->type = ifeature->type; 389094332d3Sopenharmony_ci type = baseFeature->getFeatureType(baseFeature); 390094332d3Sopenharmony_ci *featureType = type; 391094332d3Sopenharmony_ci return HDF_SUCCESS; 392094332d3Sopenharmony_ci} 393094332d3Sopenharmony_ci 394094332d3Sopenharmony_ciint32_t WlanInterfaceGetFreqsWithBand(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, 395094332d3Sopenharmony_ci const struct HdfWifiInfo *wifiInfo, int32_t *freq, uint32_t *freqLen) 396094332d3Sopenharmony_ci{ 397094332d3Sopenharmony_ci int32_t ret; 398094332d3Sopenharmony_ci struct IWiFiBaseFeature *baseFeature = NULL; 399094332d3Sopenharmony_ci 400094332d3Sopenharmony_ci (void)self; 401094332d3Sopenharmony_ci if (ifeature == NULL || ifeature->ifName == NULL || freq == NULL || freqLen == NULL || wifiInfo == NULL) { 402094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 403094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 404094332d3Sopenharmony_ci } 405094332d3Sopenharmony_ci ret = GetBasefeature(ifeature, &baseFeature); 406094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 407094332d3Sopenharmony_ci HDF_LOGE("%{public}s GetBasefeature failed!", __func__); 408094332d3Sopenharmony_ci return HDF_FAILURE; 409094332d3Sopenharmony_ci } 410094332d3Sopenharmony_ci ret = strcpy_s(baseFeature->ifName, IFNAMSIZ, ifeature->ifName); 411094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 412094332d3Sopenharmony_ci HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret); 413094332d3Sopenharmony_ci return HDF_FAILURE; 414094332d3Sopenharmony_ci } 415094332d3Sopenharmony_ci 416094332d3Sopenharmony_ci return baseFeature->getValidFreqsWithBand(baseFeature, wifiInfo->band, freq, wifiInfo->size, freqLen); 417094332d3Sopenharmony_ci} 418094332d3Sopenharmony_ci 419094332d3Sopenharmony_ciint32_t WlanInterfaceGetIfNamesByChipId(struct IWlanInterface *self, uint8_t chipId, char *ifName, 420094332d3Sopenharmony_ci uint32_t ifNameLen, uint32_t *num) 421094332d3Sopenharmony_ci{ 422094332d3Sopenharmony_ci int32_t ret; 423094332d3Sopenharmony_ci 424094332d3Sopenharmony_ci (void)self; 425094332d3Sopenharmony_ci if (ifName == NULL || num == NULL) { 426094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 427094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 428094332d3Sopenharmony_ci } 429094332d3Sopenharmony_ci char *name = NULL; 430094332d3Sopenharmony_ci 431094332d3Sopenharmony_ci if (g_staFeature != NULL) { 432094332d3Sopenharmony_ci HDF_LOGD("%{public}s g_staFeature is not NULL!", __func__); 433094332d3Sopenharmony_ci ret = g_staFeature->baseFeature.getIfNamesByChipId(chipId, &name, num); 434094332d3Sopenharmony_ci } else if (g_apFeature != NULL) { 435094332d3Sopenharmony_ci HDF_LOGD("%{public}s g_apFeature is not NULL!", __func__); 436094332d3Sopenharmony_ci ret = g_apFeature->baseFeature.getIfNamesByChipId(chipId, &name, num); 437094332d3Sopenharmony_ci } else if (g_p2pFeature != NULL) { 438094332d3Sopenharmony_ci HDF_LOGD("%{public}s g_p2pFeature is not NULL!", __func__); 439094332d3Sopenharmony_ci ret = g_p2pFeature->baseFeature.getIfNamesByChipId(chipId, &name, num); 440094332d3Sopenharmony_ci } else { 441094332d3Sopenharmony_ci HDF_LOGE("%{public}s: ap and sta feature is Invalid.", __func__); 442094332d3Sopenharmony_ci ret = HDF_FAILURE; 443094332d3Sopenharmony_ci } 444094332d3Sopenharmony_ci 445094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 446094332d3Sopenharmony_ci HDF_LOGE("%{public}s get name failed!, error code: %{public}d", __func__, ret); 447094332d3Sopenharmony_ci return ret; 448094332d3Sopenharmony_ci } 449094332d3Sopenharmony_ci 450094332d3Sopenharmony_ci if (name != NULL) { 451094332d3Sopenharmony_ci if (strcpy_s(ifName, ifNameLen, name) != EOK) { 452094332d3Sopenharmony_ci HDF_LOGE("%{public}s: copy ifName failed!", __func__); 453094332d3Sopenharmony_ci return HDF_FAILURE; 454094332d3Sopenharmony_ci } 455094332d3Sopenharmony_ci } 456094332d3Sopenharmony_ci return ret; 457094332d3Sopenharmony_ci} 458094332d3Sopenharmony_ci 459094332d3Sopenharmony_ciint32_t WlanInterfaceGetNetworkIfaceName(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, 460094332d3Sopenharmony_ci char *ifName, uint32_t ifNameLen) 461094332d3Sopenharmony_ci{ 462094332d3Sopenharmony_ci int32_t ret; 463094332d3Sopenharmony_ci const char *name = NULL; 464094332d3Sopenharmony_ci struct IWiFiBaseFeature *baseFeature = NULL; 465094332d3Sopenharmony_ci 466094332d3Sopenharmony_ci (void)self; 467094332d3Sopenharmony_ci if (ifeature == NULL || ifeature->ifName == NULL || ifName == NULL) { 468094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 469094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 470094332d3Sopenharmony_ci } 471094332d3Sopenharmony_ci ret = GetBasefeature(ifeature, &baseFeature); 472094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 473094332d3Sopenharmony_ci HDF_LOGE("%{public}s GetBasefeature failed!", __func__); 474094332d3Sopenharmony_ci return HDF_FAILURE; 475094332d3Sopenharmony_ci } 476094332d3Sopenharmony_ci ret = strcpy_s(baseFeature->ifName, IFNAMSIZ, ifeature->ifName); 477094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 478094332d3Sopenharmony_ci HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret); 479094332d3Sopenharmony_ci return HDF_FAILURE; 480094332d3Sopenharmony_ci } 481094332d3Sopenharmony_ci name = baseFeature->getNetworkIfaceName(baseFeature); 482094332d3Sopenharmony_ci if (name == NULL) { 483094332d3Sopenharmony_ci HDF_LOGE("%{public}s get network iface name failed!", __func__); 484094332d3Sopenharmony_ci return HDF_FAILURE; 485094332d3Sopenharmony_ci } 486094332d3Sopenharmony_ci if (strcpy_s(ifName, ifNameLen, name) != EOK) { 487094332d3Sopenharmony_ci HDF_LOGE("%{public}s: copy ifName failed!", __func__); 488094332d3Sopenharmony_ci return HDF_FAILURE; 489094332d3Sopenharmony_ci } 490094332d3Sopenharmony_ci return HDF_SUCCESS; 491094332d3Sopenharmony_ci} 492094332d3Sopenharmony_ci 493094332d3Sopenharmony_ciint32_t WlanInterfaceGetSupportCombo(struct IWlanInterface *self, uint64_t *combo) 494094332d3Sopenharmony_ci{ 495094332d3Sopenharmony_ci int32_t ret; 496094332d3Sopenharmony_ci 497094332d3Sopenharmony_ci (void)self; 498094332d3Sopenharmony_ci if (combo == NULL) { 499094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 500094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 501094332d3Sopenharmony_ci } 502094332d3Sopenharmony_ci if (g_wifi == NULL || g_wifi->getSupportCombo == NULL) { 503094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_wifi or g_wifi->getSupportCombo is NULL!", __func__); 504094332d3Sopenharmony_ci return HDF_FAILURE; 505094332d3Sopenharmony_ci } 506094332d3Sopenharmony_ci ret = g_wifi->getSupportCombo(combo, DEFAULT_COMBO_SIZE); 507094332d3Sopenharmony_ci if (ret == HDF_ERR_NOT_SUPPORT) { 508094332d3Sopenharmony_ci HDF_LOGW("%{public}s: not support to getting combo!, error code: %{public}d", __func__, ret); 509094332d3Sopenharmony_ci } 510094332d3Sopenharmony_ci return ret; 511094332d3Sopenharmony_ci} 512094332d3Sopenharmony_ci 513094332d3Sopenharmony_ciint32_t WlanInterfaceGetSupportFeature(struct IWlanInterface *self, uint8_t *supType, uint32_t *supTypeLen) 514094332d3Sopenharmony_ci{ 515094332d3Sopenharmony_ci int32_t ret; 516094332d3Sopenharmony_ci 517094332d3Sopenharmony_ci (void)self; 518094332d3Sopenharmony_ci if (supType == NULL || supTypeLen == NULL) { 519094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 520094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 521094332d3Sopenharmony_ci } 522094332d3Sopenharmony_ci if (g_wifi == NULL || g_wifi->getSupportFeature == NULL) { 523094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_wifi or g_wifi->getSupportFeature is NULL!", __func__); 524094332d3Sopenharmony_ci return HDF_FAILURE; 525094332d3Sopenharmony_ci } 526094332d3Sopenharmony_ci ret = g_wifi->getSupportFeature(supType, *supTypeLen); 527094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 528094332d3Sopenharmony_ci HDF_LOGE("%{public}s get support feature failed! error code: %{public}d", __func__, ret); 529094332d3Sopenharmony_ci } 530094332d3Sopenharmony_ci return ret; 531094332d3Sopenharmony_ci} 532094332d3Sopenharmony_ci 533094332d3Sopenharmony_cistatic int32_t HdfWlanAddRemoteObj(struct IWlanCallback *self) 534094332d3Sopenharmony_ci{ 535094332d3Sopenharmony_ci struct HdfWlanRemoteNode *pos = NULL; 536094332d3Sopenharmony_ci struct DListHead *head = &HdfStubDriver()->remoteListHead; 537094332d3Sopenharmony_ci 538094332d3Sopenharmony_ci if (self == NULL) { 539094332d3Sopenharmony_ci HDF_LOGE("%{public}s:self == NULL", __func__); 540094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 541094332d3Sopenharmony_ci } 542094332d3Sopenharmony_ci if (!DListIsEmpty(head)) { 543094332d3Sopenharmony_ci DLIST_FOR_EACH_ENTRY(pos, head, struct HdfWlanRemoteNode, node) { 544094332d3Sopenharmony_ci if (pos->service == self->AsObject(self)) { 545094332d3Sopenharmony_ci HDF_LOGE("%{public}s: pos->service == self", __func__); 546094332d3Sopenharmony_ci return HDF_FAILURE; 547094332d3Sopenharmony_ci } 548094332d3Sopenharmony_ci } 549094332d3Sopenharmony_ci } 550094332d3Sopenharmony_ci 551094332d3Sopenharmony_ci struct HdfWlanRemoteNode *newRemoteNode = 552094332d3Sopenharmony_ci (struct HdfWlanRemoteNode *)OsalMemCalloc(sizeof(struct HdfWlanRemoteNode)); 553094332d3Sopenharmony_ci if (newRemoteNode == NULL) { 554094332d3Sopenharmony_ci HDF_LOGE("%{public}s:newRemoteNode is NULL", __func__); 555094332d3Sopenharmony_ci return HDF_FAILURE; 556094332d3Sopenharmony_ci } 557094332d3Sopenharmony_ci 558094332d3Sopenharmony_ci newRemoteNode->callbackObj = self; 559094332d3Sopenharmony_ci newRemoteNode->service = self->AsObject(self); 560094332d3Sopenharmony_ci DListInsertTail(&newRemoteNode->node, head); 561094332d3Sopenharmony_ci return HDF_SUCCESS; 562094332d3Sopenharmony_ci} 563094332d3Sopenharmony_ci 564094332d3Sopenharmony_cistatic int32_t FillData(uint8_t **dst, uint32_t *dstLen, uint8_t *src, uint32_t srcLen) 565094332d3Sopenharmony_ci{ 566094332d3Sopenharmony_ci if (src == NULL || dst == NULL || dstLen == NULL) { 567094332d3Sopenharmony_ci HDF_LOGE("%{public}s: Invalid parameter!", __func__); 568094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 569094332d3Sopenharmony_ci } 570094332d3Sopenharmony_ci *dst = (uint8_t *)OsalMemCalloc(sizeof(uint8_t) * srcLen); 571094332d3Sopenharmony_ci if (*dst == NULL) { 572094332d3Sopenharmony_ci HDF_LOGE("%{public}s: OsalMemCalloc fail!", __func__); 573094332d3Sopenharmony_ci return HDF_FAILURE; 574094332d3Sopenharmony_ci } 575094332d3Sopenharmony_ci if (memcpy_s(*dst, srcLen, src, srcLen) != EOK) { 576094332d3Sopenharmony_ci HDF_LOGE("%{public}s: memcpy_s fail!", __func__); 577094332d3Sopenharmony_ci OsalMemFree(*dst); 578094332d3Sopenharmony_ci *dst = NULL; 579094332d3Sopenharmony_ci return HDF_FAILURE; 580094332d3Sopenharmony_ci } 581094332d3Sopenharmony_ci *dstLen = srcLen; 582094332d3Sopenharmony_ci return HDF_SUCCESS; 583094332d3Sopenharmony_ci} 584094332d3Sopenharmony_ci 585094332d3Sopenharmony_cistatic int32_t WlanFillScanResultInfo(WifiScanResult *wifiScanResult, struct HdfWifiScanResult *scanResult) 586094332d3Sopenharmony_ci{ 587094332d3Sopenharmony_ci int32_t ret = HDF_SUCCESS; 588094332d3Sopenharmony_ci if (wifiScanResult == NULL || scanResult == NULL) { 589094332d3Sopenharmony_ci HDF_LOGE("%{public}s: wifiScanResult or scanResult is NULL!", __func__); 590094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 591094332d3Sopenharmony_ci } 592094332d3Sopenharmony_ci scanResult->flags = wifiScanResult->flags; 593094332d3Sopenharmony_ci scanResult->caps = wifiScanResult->caps; 594094332d3Sopenharmony_ci scanResult->freq = wifiScanResult->freq; 595094332d3Sopenharmony_ci scanResult->beaconInt = wifiScanResult->beaconInt; 596094332d3Sopenharmony_ci scanResult->qual = wifiScanResult->qual; 597094332d3Sopenharmony_ci scanResult->level = wifiScanResult->level; 598094332d3Sopenharmony_ci scanResult->age = wifiScanResult->age; 599094332d3Sopenharmony_ci do { 600094332d3Sopenharmony_ci if (wifiScanResult->bssid != NULL && 601094332d3Sopenharmony_ci FillData(&scanResult->bssid, &scanResult->bssidLen, wifiScanResult->bssid, ETH_ADDR_LEN) != HDF_SUCCESS) { 602094332d3Sopenharmony_ci HDF_LOGE("%{public}s: fill bssid fail!", __func__); 603094332d3Sopenharmony_ci ret = HDF_FAILURE; 604094332d3Sopenharmony_ci break; 605094332d3Sopenharmony_ci } 606094332d3Sopenharmony_ci if ((wifiScanResult->ie != NULL) && (wifiScanResult->ieLen != 0) && 607094332d3Sopenharmony_ci FillData(&scanResult->ie, &scanResult->ieLen, wifiScanResult->ie, wifiScanResult->ieLen) != HDF_SUCCESS) { 608094332d3Sopenharmony_ci HDF_LOGE("%{public}s: fill ie fail!", __func__); 609094332d3Sopenharmony_ci ret = HDF_FAILURE; 610094332d3Sopenharmony_ci break; 611094332d3Sopenharmony_ci } 612094332d3Sopenharmony_ci if ((wifiScanResult->beaconIe != NULL) && (wifiScanResult->beaconIeLen != 0) && 613094332d3Sopenharmony_ci FillData(&scanResult->beaconIe, &scanResult->beaconIeLen, wifiScanResult->beaconIe, 614094332d3Sopenharmony_ci wifiScanResult->beaconIeLen) != HDF_SUCCESS) { 615094332d3Sopenharmony_ci HDF_LOGE("%{public}s: fill beaconIe fail!", __func__); 616094332d3Sopenharmony_ci ret = HDF_FAILURE; 617094332d3Sopenharmony_ci } 618094332d3Sopenharmony_ci } while (0); 619094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 620094332d3Sopenharmony_ci if (scanResult->bssid != NULL) { 621094332d3Sopenharmony_ci OsalMemFree(scanResult->bssid); 622094332d3Sopenharmony_ci } 623094332d3Sopenharmony_ci if (scanResult->ie != NULL) { 624094332d3Sopenharmony_ci OsalMemFree(scanResult->ie); 625094332d3Sopenharmony_ci } 626094332d3Sopenharmony_ci if (scanResult->beaconIe != NULL) { 627094332d3Sopenharmony_ci OsalMemFree(scanResult->beaconIe); 628094332d3Sopenharmony_ci } 629094332d3Sopenharmony_ci } 630094332d3Sopenharmony_ci return ret; 631094332d3Sopenharmony_ci} 632094332d3Sopenharmony_ci 633094332d3Sopenharmony_cistatic int32_t WlanFillScanResultInfoExt(WifiScanResult *wifiScanResult, struct HdfWifiScanResultExt *scanResult) 634094332d3Sopenharmony_ci{ 635094332d3Sopenharmony_ci int32_t ret = HDF_SUCCESS; 636094332d3Sopenharmony_ci if (wifiScanResult == NULL || scanResult == NULL) { 637094332d3Sopenharmony_ci HDF_LOGE("%{public}s: wifiScanResult or scanResult is NULL!", __func__); 638094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 639094332d3Sopenharmony_ci } 640094332d3Sopenharmony_ci scanResult->flags = wifiScanResult->flags; 641094332d3Sopenharmony_ci scanResult->caps = wifiScanResult->caps; 642094332d3Sopenharmony_ci scanResult->freq = wifiScanResult->freq; 643094332d3Sopenharmony_ci scanResult->beaconInt = wifiScanResult->beaconInt; 644094332d3Sopenharmony_ci scanResult->qual = wifiScanResult->qual; 645094332d3Sopenharmony_ci scanResult->level = wifiScanResult->level; 646094332d3Sopenharmony_ci scanResult->age = wifiScanResult->age; 647094332d3Sopenharmony_ci scanResult->tsf = wifiScanResult->tsf; 648094332d3Sopenharmony_ci do { 649094332d3Sopenharmony_ci if (wifiScanResult->bssid != NULL && 650094332d3Sopenharmony_ci FillData(&scanResult->bssid, &scanResult->bssidLen, wifiScanResult->bssid, ETH_ADDR_LEN) != HDF_SUCCESS) { 651094332d3Sopenharmony_ci HDF_LOGE("%{public}s: fill bssid fail!", __func__); 652094332d3Sopenharmony_ci ret = HDF_FAILURE; 653094332d3Sopenharmony_ci break; 654094332d3Sopenharmony_ci } 655094332d3Sopenharmony_ci if ((wifiScanResult->ie != NULL) && (wifiScanResult->ieLen != 0) && 656094332d3Sopenharmony_ci FillData(&scanResult->ie, &scanResult->ieLen, wifiScanResult->ie, wifiScanResult->ieLen) != HDF_SUCCESS) { 657094332d3Sopenharmony_ci HDF_LOGE("%{public}s: fill ie fail!", __func__); 658094332d3Sopenharmony_ci ret = HDF_FAILURE; 659094332d3Sopenharmony_ci break; 660094332d3Sopenharmony_ci } 661094332d3Sopenharmony_ci if ((wifiScanResult->beaconIe != NULL) && (wifiScanResult->beaconIeLen != 0) && 662094332d3Sopenharmony_ci FillData(&scanResult->beaconIe, &scanResult->beaconIeLen, wifiScanResult->beaconIe, 663094332d3Sopenharmony_ci wifiScanResult->beaconIeLen) != HDF_SUCCESS) { 664094332d3Sopenharmony_ci HDF_LOGE("%{public}s: fill beaconIe fail!", __func__); 665094332d3Sopenharmony_ci ret = HDF_FAILURE; 666094332d3Sopenharmony_ci } 667094332d3Sopenharmony_ci } while (0); 668094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 669094332d3Sopenharmony_ci if (scanResult->bssid != NULL) { 670094332d3Sopenharmony_ci OsalMemFree(scanResult->bssid); 671094332d3Sopenharmony_ci } 672094332d3Sopenharmony_ci if (scanResult->ie != NULL) { 673094332d3Sopenharmony_ci OsalMemFree(scanResult->ie); 674094332d3Sopenharmony_ci } 675094332d3Sopenharmony_ci if (scanResult->beaconIe != NULL) { 676094332d3Sopenharmony_ci OsalMemFree(scanResult->beaconIe); 677094332d3Sopenharmony_ci } 678094332d3Sopenharmony_ci } 679094332d3Sopenharmony_ci return ret; 680094332d3Sopenharmony_ci} 681094332d3Sopenharmony_ci 682094332d3Sopenharmony_cistatic int32_t WlanFillScanResultsInfo(WifiScanResults *wifiScanResults, struct HdfWifiScanResults *scanResults) 683094332d3Sopenharmony_ci{ 684094332d3Sopenharmony_ci uint32_t i; 685094332d3Sopenharmony_ci if (wifiScanResults == NULL || scanResults == NULL) { 686094332d3Sopenharmony_ci HDF_LOGE("%{public}s: wifiScanResults or scanResults is NULL!", __func__); 687094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 688094332d3Sopenharmony_ci } 689094332d3Sopenharmony_ci for (i = 0; i < wifiScanResults->num; i++) { 690094332d3Sopenharmony_ci if (WlanFillScanResultInfoExt(&wifiScanResults->scanResult[i], &scanResults->res[i]) != HDF_SUCCESS) { 691094332d3Sopenharmony_ci return HDF_FAILURE; 692094332d3Sopenharmony_ci } 693094332d3Sopenharmony_ci } 694094332d3Sopenharmony_ci scanResults->resLen = wifiScanResults->num; 695094332d3Sopenharmony_ci return HDF_SUCCESS; 696094332d3Sopenharmony_ci} 697094332d3Sopenharmony_ci 698094332d3Sopenharmony_cistatic int32_t ProcessEventScanResult(struct HdfWlanRemoteNode *node, uint32_t event, WifiScanResult *wifiScanResult, 699094332d3Sopenharmony_ci const char *ifName) 700094332d3Sopenharmony_ci{ 701094332d3Sopenharmony_ci HDF_LOGI("hal enter %{public}s, event:%{public}u ifName:%{public}s", __FUNCTION__, event, ifName); 702094332d3Sopenharmony_ci struct HdfWifiScanResult *scanResult = NULL; 703094332d3Sopenharmony_ci int32_t ret = HDF_FAILURE; 704094332d3Sopenharmony_ci 705094332d3Sopenharmony_ci if (node == NULL || node->callbackObj == NULL || node->callbackObj->ScanResult == NULL) { 706094332d3Sopenharmony_ci HDF_LOGE("%{public}s: hdf wlan remote node or callbackObj is NULL!", __func__); 707094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 708094332d3Sopenharmony_ci } 709094332d3Sopenharmony_ci scanResult = (struct HdfWifiScanResult *)OsalMemCalloc(sizeof(struct HdfWifiScanResult)); 710094332d3Sopenharmony_ci if ((scanResult == NULL) || (WlanFillScanResultInfo(wifiScanResult, scanResult) != HDF_SUCCESS)) { 711094332d3Sopenharmony_ci HDF_LOGE("%{public}s: scanResult is NULL or WlanFillScanResultInfo fialed!", __func__); 712094332d3Sopenharmony_ci } else { 713094332d3Sopenharmony_ci ret = node->callbackObj->ScanResult(node->callbackObj, event, scanResult, ifName); 714094332d3Sopenharmony_ci } 715094332d3Sopenharmony_ci HdfWifiScanResultFree(scanResult, true); 716094332d3Sopenharmony_ci HDF_LOGI("hal exit %{public}s", __FUNCTION__); 717094332d3Sopenharmony_ci return ret; 718094332d3Sopenharmony_ci} 719094332d3Sopenharmony_ci 720094332d3Sopenharmony_cistatic int32_t ProcessEventScanResults(struct HdfWlanRemoteNode *node, uint32_t event, 721094332d3Sopenharmony_ci WifiScanResults *wifiScanResults, const char *ifName) 722094332d3Sopenharmony_ci{ 723094332d3Sopenharmony_ci HDF_LOGD("hal enter %{public}s, event:%{public}u ifName:%{public}s", __FUNCTION__, event, ifName); 724094332d3Sopenharmony_ci struct HdfWifiScanResults *scanResults = NULL; 725094332d3Sopenharmony_ci uint32_t size; 726094332d3Sopenharmony_ci int32_t ret = HDF_FAILURE; 727094332d3Sopenharmony_ci 728094332d3Sopenharmony_ci if (node == NULL || node->callbackObj == NULL || node->callbackObj->ScanResults == NULL) { 729094332d3Sopenharmony_ci HDF_LOGE("%{public}s: hdf wlan remote node or callbackObj is NULL!", __func__); 730094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 731094332d3Sopenharmony_ci } 732094332d3Sopenharmony_ci scanResults = (struct HdfWifiScanResults *)OsalMemCalloc(sizeof(struct HdfWifiScanResults)); 733094332d3Sopenharmony_ci if (scanResults == NULL) { 734094332d3Sopenharmony_ci HDF_LOGE("%{public}s: scanResults is NULL!", __func__); 735094332d3Sopenharmony_ci return HDF_ERR_MALLOC_FAIL; 736094332d3Sopenharmony_ci } 737094332d3Sopenharmony_ci if (wifiScanResults->num == 0) { 738094332d3Sopenharmony_ci scanResults->res = NULL; 739094332d3Sopenharmony_ci scanResults->resLen = 0; 740094332d3Sopenharmony_ci ret = node->callbackObj->ScanResults(node->callbackObj, event, scanResults, ifName); 741094332d3Sopenharmony_ci HdfWifiScanResultsFree(scanResults, true); 742094332d3Sopenharmony_ci HDF_LOGD("%{public}s: scanResults num is 0!", __func__); 743094332d3Sopenharmony_ci return ret; 744094332d3Sopenharmony_ci } 745094332d3Sopenharmony_ci scanResults->resLen = wifiScanResults->num; 746094332d3Sopenharmony_ci size = sizeof(struct HdfWifiScanResultExt); 747094332d3Sopenharmony_ci scanResults->res = (struct HdfWifiScanResultExt *)OsalMemCalloc(size * scanResults->resLen); 748094332d3Sopenharmony_ci if ((scanResults->res == NULL) || (WlanFillScanResultsInfo(wifiScanResults, scanResults) != HDF_SUCCESS)) { 749094332d3Sopenharmony_ci HDF_LOGE("%{public}s: scanResults->res is NULL or WlanFillScanResultsInfo fialed!", __func__); 750094332d3Sopenharmony_ci } else { 751094332d3Sopenharmony_ci ret = node->callbackObj->ScanResults(node->callbackObj, event, scanResults, ifName); 752094332d3Sopenharmony_ci } 753094332d3Sopenharmony_ci HdfWifiScanResultsFree(scanResults, true); 754094332d3Sopenharmony_ci HDF_LOGD("hal exit %{public}s, wifiScanResults num:%{public}u", __FUNCTION__, wifiScanResults->num); 755094332d3Sopenharmony_ci return ret; 756094332d3Sopenharmony_ci} 757094332d3Sopenharmony_ci 758094332d3Sopenharmony_cistatic int32_t ProcessEventScanAborted(struct HdfWlanRemoteNode *node, uint32_t event, const char *ifName) 759094332d3Sopenharmony_ci{ 760094332d3Sopenharmony_ci HDF_LOGI("hal enter %{public}s, event:%{public}u ifName:%{public}s", __FUNCTION__, event, ifName); 761094332d3Sopenharmony_ci int32_t ret = HDF_FAILURE; 762094332d3Sopenharmony_ci struct HdfWifiScanResults scanResults = {0}; 763094332d3Sopenharmony_ci 764094332d3Sopenharmony_ci if (node == NULL || node->callbackObj == NULL || node->callbackObj->ScanResults == NULL) { 765094332d3Sopenharmony_ci HDF_LOGE("%{public}s: hdf wlan remote node or callbackObj is NULL!", __func__); 766094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 767094332d3Sopenharmony_ci } 768094332d3Sopenharmony_ci ret = node->callbackObj->ScanResults(node->callbackObj, event, &scanResults, ifName); 769094332d3Sopenharmony_ci HDF_LOGI("hal exit %{public}s, ScanResults ret:%{public}d", __FUNCTION__, ret); 770094332d3Sopenharmony_ci return ret; 771094332d3Sopenharmony_ci} 772094332d3Sopenharmony_ci 773094332d3Sopenharmony_cistatic int32_t ProcessEventActionReceived(struct HdfWlanRemoteNode *node, uint32_t event, 774094332d3Sopenharmony_ci WifiActionData *wifiActionData, const char *ifName) 775094332d3Sopenharmony_ci{ 776094332d3Sopenharmony_ci HDF_LOGI("hal enter %{public}s, event:%{public}u ifName:%{public}s", __FUNCTION__, event, ifName); 777094332d3Sopenharmony_ci int32_t ret = HDF_FAILURE; 778094332d3Sopenharmony_ci 779094332d3Sopenharmony_ci if (node == NULL || wifiActionData == NULL || ifName == NULL || node->callbackObj == NULL || 780094332d3Sopenharmony_ci node->callbackObj->WifiNetlinkMessage == NULL) { 781094332d3Sopenharmony_ci HDF_LOGE("%{public}s: hdf wlan remote node or callbackObj is NULL!", __func__); 782094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 783094332d3Sopenharmony_ci } 784094332d3Sopenharmony_ci ret = node->callbackObj->WifiNetlinkMessage(node->callbackObj, wifiActionData->data, wifiActionData->dataLen); 785094332d3Sopenharmony_ci HDF_LOGI("hal exit %{public}s, WifiNetlinkMessage ret:%{public}d", __FUNCTION__, ret); 786094332d3Sopenharmony_ci return ret; 787094332d3Sopenharmony_ci} 788094332d3Sopenharmony_ci 789094332d3Sopenharmony_cistatic int32_t ProcessEventDataFrameReceived(struct HdfWlanRemoteNode *node, uint32_t event, 790094332d3Sopenharmony_ci WifiDataFrame *dataFrame, const char *ifName) 791094332d3Sopenharmony_ci{ 792094332d3Sopenharmony_ci HDF_LOGI("hal enter %{public}s, event:%{public}u ifName:%{public}s", __FUNCTION__, event, ifName); 793094332d3Sopenharmony_ci int32_t ret = HDF_FAILURE; 794094332d3Sopenharmony_ci 795094332d3Sopenharmony_ci if ((node == NULL) || (dataFrame == NULL) || (ifName == NULL) || (node->callbackObj == NULL) || 796094332d3Sopenharmony_ci (node->callbackObj->WifiNetlinkMessage == NULL)) { 797094332d3Sopenharmony_ci HDF_LOGE("%{public}s: hdf wlan remote node or callbackObj is NULL!", __func__); 798094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 799094332d3Sopenharmony_ci } 800094332d3Sopenharmony_ci ret = node->callbackObj->WifiNetlinkMessage(node->callbackObj, dataFrame->data, dataFrame->dataLen); 801094332d3Sopenharmony_ci HDF_LOGI("hal exit %{public}s, WifiNetlinkMessage ret:%{public}d", __FUNCTION__, ret); 802094332d3Sopenharmony_ci return ret; 803094332d3Sopenharmony_ci} 804094332d3Sopenharmony_ci 805094332d3Sopenharmony_cistatic int32_t HandleWifiEvent(uint32_t event, void *data, const char *ifName, struct HdfWlanRemoteNode *pos) 806094332d3Sopenharmony_ci{ 807094332d3Sopenharmony_ci int ret = HDF_FAILURE; 808094332d3Sopenharmony_ci int32_t *code = NULL; 809094332d3Sopenharmony_ci if (data == NULL || ifName == NULL || pos == NULL) { 810094332d3Sopenharmony_ci HDF_LOGE("%{public}s: invalid input", __func__); 811094332d3Sopenharmony_ci return ret; 812094332d3Sopenharmony_ci } 813094332d3Sopenharmony_ci switch (event) { 814094332d3Sopenharmony_ci case WIFI_EVENT_RESET_DRIVER: 815094332d3Sopenharmony_ci code = (int32_t *)data; 816094332d3Sopenharmony_ci ret = pos->callbackObj->ResetDriverResult(pos->callbackObj, event, *code, ifName); 817094332d3Sopenharmony_ci break; 818094332d3Sopenharmony_ci case WIFI_EVENT_SCAN_RESULT: 819094332d3Sopenharmony_ci ret = ProcessEventScanResult(pos, event, (WifiScanResult *)data, ifName); 820094332d3Sopenharmony_ci break; 821094332d3Sopenharmony_ci case WIFI_EVENT_SCAN_RESULTS: 822094332d3Sopenharmony_ci ret = ProcessEventScanResults(pos, event, (WifiScanResults *)data, ifName); 823094332d3Sopenharmony_ci break; 824094332d3Sopenharmony_ci case WIFI_EVENT_SCAN_ABORTED: 825094332d3Sopenharmony_ci ret = ProcessEventScanAborted(pos, event, ifName); 826094332d3Sopenharmony_ci break; 827094332d3Sopenharmony_ci case WIFI_EVENT_ACTION_RECEIVED: 828094332d3Sopenharmony_ci ret = ProcessEventActionReceived(pos, event, (WifiActionData *)data, ifName); 829094332d3Sopenharmony_ci break; 830094332d3Sopenharmony_ci case WIFI_EVENT_DATA_FRAME_RECEIVED: 831094332d3Sopenharmony_ci ret = ProcessEventDataFrameReceived(pos, event, (WifiDataFrame *)data, ifName); 832094332d3Sopenharmony_ci break; 833094332d3Sopenharmony_ci default: 834094332d3Sopenharmony_ci HDF_LOGE("%{public}s: unknown eventId:%{public}d", __func__, event); 835094332d3Sopenharmony_ci break; 836094332d3Sopenharmony_ci } 837094332d3Sopenharmony_ci return ret; 838094332d3Sopenharmony_ci} 839094332d3Sopenharmony_ci 840094332d3Sopenharmony_cistatic int32_t HdfWLanCallbackFun(uint32_t event, void *data, const char *ifName) 841094332d3Sopenharmony_ci{ 842094332d3Sopenharmony_ci HDF_LOGD("%{public}s, event:%{public}u ifName:%{public}s", __FUNCTION__, event, ifName); 843094332d3Sopenharmony_ci struct HdfWlanRemoteNode *pos = NULL; 844094332d3Sopenharmony_ci struct DListHead *head = NULL; 845094332d3Sopenharmony_ci int32_t ret = HDF_FAILURE; 846094332d3Sopenharmony_ci (void)OsalMutexLock(&HdfStubDriver()->mutex); 847094332d3Sopenharmony_ci head = &HdfStubDriver()->remoteListHead; 848094332d3Sopenharmony_ci 849094332d3Sopenharmony_ci if (data == NULL || ifName == NULL) { 850094332d3Sopenharmony_ci HDF_LOGE("%{public}s: data or ifName is NULL!", __func__); 851094332d3Sopenharmony_ci (void)OsalMutexUnlock(&HdfStubDriver()->mutex); 852094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 853094332d3Sopenharmony_ci } 854094332d3Sopenharmony_ci DLIST_FOR_EACH_ENTRY(pos, head, struct HdfWlanRemoteNode, node) { 855094332d3Sopenharmony_ci if (pos == NULL) { 856094332d3Sopenharmony_ci HDF_LOGE("%{public}s: pos is NULL", __func__); 857094332d3Sopenharmony_ci break; 858094332d3Sopenharmony_ci } 859094332d3Sopenharmony_ci if (pos->service == NULL || pos->callbackObj == NULL) { 860094332d3Sopenharmony_ci HDF_LOGW("%{public}s: pos->service or pos->callbackObj NULL", __func__); 861094332d3Sopenharmony_ci continue; 862094332d3Sopenharmony_ci } 863094332d3Sopenharmony_ci ret = HandleWifiEvent(event, data, ifName, pos); 864094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 865094332d3Sopenharmony_ci HDF_LOGE("%{public}s: dispatch code fialed, error code: %{public}d", __func__, ret); 866094332d3Sopenharmony_ci } 867094332d3Sopenharmony_ci } 868094332d3Sopenharmony_ci (void)OsalMutexUnlock(&HdfStubDriver()->mutex); 869094332d3Sopenharmony_ci return ret; 870094332d3Sopenharmony_ci} 871094332d3Sopenharmony_ci 872094332d3Sopenharmony_cistatic int32_t HdfWlanNetlinkCallbackFun(const uint8_t *recvMsg, uint32_t recvMsgLen) 873094332d3Sopenharmony_ci{ 874094332d3Sopenharmony_ci struct HdfWlanRemoteNode *pos = NULL; 875094332d3Sopenharmony_ci struct DListHead *head = NULL; 876094332d3Sopenharmony_ci int32_t ret = HDF_FAILURE; 877094332d3Sopenharmony_ci (void)OsalMutexLock(&HdfStubDriver()->mutex); 878094332d3Sopenharmony_ci head = &HdfStubDriver()->remoteListHead; 879094332d3Sopenharmony_ci 880094332d3Sopenharmony_ci if (recvMsg == NULL) { 881094332d3Sopenharmony_ci HDF_LOGE("%{public}s: recvMsg or ifName is NULL!", __func__); 882094332d3Sopenharmony_ci (void)OsalMutexUnlock(&HdfStubDriver()->mutex); 883094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 884094332d3Sopenharmony_ci } 885094332d3Sopenharmony_ci DLIST_FOR_EACH_ENTRY(pos, head, struct HdfWlanRemoteNode, node) { 886094332d3Sopenharmony_ci if (pos->service == NULL || pos->callbackObj == NULL) { 887094332d3Sopenharmony_ci HDF_LOGW("%{public}s: pos->service or pos->callbackObj NULL", __func__); 888094332d3Sopenharmony_ci continue; 889094332d3Sopenharmony_ci } 890094332d3Sopenharmony_ci ret = pos->callbackObj->WifiNetlinkMessage(pos->callbackObj, recvMsg, recvMsgLen); 891094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 892094332d3Sopenharmony_ci HDF_LOGD("%{public}s: dispatch code fialed, error code: %{public}d", __func__, ret); 893094332d3Sopenharmony_ci } 894094332d3Sopenharmony_ci } 895094332d3Sopenharmony_ci (void)OsalMutexUnlock(&HdfStubDriver()->mutex); 896094332d3Sopenharmony_ci return ret; 897094332d3Sopenharmony_ci} 898094332d3Sopenharmony_ci 899094332d3Sopenharmony_cistatic void HdfWlanDelRemoteObj(struct IWlanCallback *self) 900094332d3Sopenharmony_ci{ 901094332d3Sopenharmony_ci struct HdfWlanRemoteNode *pos = NULL; 902094332d3Sopenharmony_ci struct HdfWlanRemoteNode *tmp = NULL; 903094332d3Sopenharmony_ci struct DListHead *head = &HdfStubDriver()->remoteListHead; 904094332d3Sopenharmony_ci 905094332d3Sopenharmony_ci DLIST_FOR_EACH_ENTRY_SAFE(pos, tmp, head, struct HdfWlanRemoteNode, node) { 906094332d3Sopenharmony_ci if (pos->service->index == self->AsObject(self)->index) { 907094332d3Sopenharmony_ci DListRemove(&(pos->node)); 908094332d3Sopenharmony_ci IWlanCallbackRelease(pos->callbackObj); 909094332d3Sopenharmony_ci OsalMemFree(pos); 910094332d3Sopenharmony_ci break; 911094332d3Sopenharmony_ci } 912094332d3Sopenharmony_ci } 913094332d3Sopenharmony_ci IWlanCallbackRelease(self); 914094332d3Sopenharmony_ci} 915094332d3Sopenharmony_ci 916094332d3Sopenharmony_ciint32_t WlanInterfaceRegisterEventCallback(struct IWlanInterface *self, struct IWlanCallback *cbFunc, 917094332d3Sopenharmony_ci const char *ifName) 918094332d3Sopenharmony_ci{ 919094332d3Sopenharmony_ci int32_t ret; 920094332d3Sopenharmony_ci HDF_LOGI("hal enter %{public}s, ifName:%{public}s", __FUNCTION__, ifName); 921094332d3Sopenharmony_ci (void)self; 922094332d3Sopenharmony_ci if (cbFunc == NULL || ifName == NULL) { 923094332d3Sopenharmony_ci HDF_LOGE("%{public}s: input parameter invalid!", __func__); 924094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 925094332d3Sopenharmony_ci } 926094332d3Sopenharmony_ci if (g_wifi == NULL || g_wifi->registerEventCallback == NULL) { 927094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_wifi or g_wifi->registerEventCallback is NULL!", __func__); 928094332d3Sopenharmony_ci return HDF_FAILURE; 929094332d3Sopenharmony_ci } 930094332d3Sopenharmony_ci (void)OsalMutexLock(&HdfStubDriver()->mutex); 931094332d3Sopenharmony_ci 932094332d3Sopenharmony_ci do { 933094332d3Sopenharmony_ci ret = HdfWlanAddRemoteObj(cbFunc); 934094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 935094332d3Sopenharmony_ci HDF_LOGE("%{public}s: HdfSensorAddRemoteObj false", __func__); 936094332d3Sopenharmony_ci break; 937094332d3Sopenharmony_ci } 938094332d3Sopenharmony_ci ret = g_wifi->registerEventCallback(HdfWLanCallbackFun, ifName); 939094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 940094332d3Sopenharmony_ci HDF_LOGE("%{public}s: Register failed!, error code: %{public}d", __func__, ret); 941094332d3Sopenharmony_ci HdfWlanDelRemoteObj(cbFunc); 942094332d3Sopenharmony_ci break; 943094332d3Sopenharmony_ci } 944094332d3Sopenharmony_ci ret = WlanInterfaceRegisterHid2dCallback(HdfWlanNetlinkCallbackFun, ifName); 945094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 946094332d3Sopenharmony_ci HDF_LOGE("%{public}s: Register failed!, error code: %{public}d", __func__, ret); 947094332d3Sopenharmony_ci g_wifi->unregisterEventCallback(HdfWLanCallbackFun, ifName); 948094332d3Sopenharmony_ci HdfWlanDelRemoteObj(cbFunc); 949094332d3Sopenharmony_ci } 950094332d3Sopenharmony_ci } while (0); 951094332d3Sopenharmony_ci 952094332d3Sopenharmony_ci (void)OsalMutexUnlock(&HdfStubDriver()->mutex); 953094332d3Sopenharmony_ci HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret); 954094332d3Sopenharmony_ci return ret; 955094332d3Sopenharmony_ci} 956094332d3Sopenharmony_ci 957094332d3Sopenharmony_ciint32_t WlanInterfaceUnregisterEventCallback(struct IWlanInterface *self, struct IWlanCallback *cbFunc, 958094332d3Sopenharmony_ci const char *ifName) 959094332d3Sopenharmony_ci{ 960094332d3Sopenharmony_ci HDF_LOGI("hal enter %{public}s, ifName:%{public}s", __FUNCTION__, ifName); 961094332d3Sopenharmony_ci int32_t ret; 962094332d3Sopenharmony_ci 963094332d3Sopenharmony_ci (void)self; 964094332d3Sopenharmony_ci if (cbFunc == NULL || ifName == NULL) { 965094332d3Sopenharmony_ci HDF_LOGE("%{public}s: input parameter invalid!", __func__); 966094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 967094332d3Sopenharmony_ci } 968094332d3Sopenharmony_ci if (g_wifi == NULL || g_wifi->unregisterEventCallback == NULL) { 969094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_wifi or g_wifi->unregisterEventCallback is NULL!", __func__); 970094332d3Sopenharmony_ci return HDF_FAILURE; 971094332d3Sopenharmony_ci } 972094332d3Sopenharmony_ci (void)OsalMutexLock(&HdfStubDriver()->mutex); 973094332d3Sopenharmony_ci HdfWlanDelRemoteObj(cbFunc); 974094332d3Sopenharmony_ci if (DListIsEmpty(&HdfStubDriver()->remoteListHead)) { 975094332d3Sopenharmony_ci ret = g_wifi->unregisterEventCallback(HdfWLanCallbackFun, ifName); 976094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 977094332d3Sopenharmony_ci HDF_LOGE("%{public}s: Unregister failed!, error code: %{public}d", __func__, ret); 978094332d3Sopenharmony_ci } 979094332d3Sopenharmony_ci ret = WlanInterfaceUnregisterHid2dCallback(HdfWlanNetlinkCallbackFun, ifName); 980094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 981094332d3Sopenharmony_ci HDF_LOGE("%{public}s: Unregister Hid2dCallback failed!, error code: %{public}d", __func__, ret); 982094332d3Sopenharmony_ci } 983094332d3Sopenharmony_ci } 984094332d3Sopenharmony_ci (void)OsalMutexUnlock(&HdfStubDriver()->mutex); 985094332d3Sopenharmony_ci HDF_LOGI("hal exit %{public}s", __FUNCTION__); 986094332d3Sopenharmony_ci return HDF_SUCCESS; 987094332d3Sopenharmony_ci} 988094332d3Sopenharmony_ci 989094332d3Sopenharmony_ciint32_t WlanInterfaceResetDriver(struct IWlanInterface *self, uint8_t chipId, const char *ifName) 990094332d3Sopenharmony_ci{ 991094332d3Sopenharmony_ci int32_t ret; 992094332d3Sopenharmony_ci 993094332d3Sopenharmony_ci (void)self; 994094332d3Sopenharmony_ci if (ifName == NULL) { 995094332d3Sopenharmony_ci HDF_LOGE("%{public}s: input parameter invalid!", __func__); 996094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 997094332d3Sopenharmony_ci } 998094332d3Sopenharmony_ci if (g_wifi == NULL || g_wifi->resetDriver == NULL) { 999094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_wifi or g_wifi->resetDriver is NULL!", __func__); 1000094332d3Sopenharmony_ci return HDF_FAILURE; 1001094332d3Sopenharmony_ci } 1002094332d3Sopenharmony_ci ret = g_wifi->resetDriver(chipId, ifName); 1003094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1004094332d3Sopenharmony_ci HDF_LOGE("%{public}s reset driver failed! error code: %{public}d", __func__, ret); 1005094332d3Sopenharmony_ci return ret; 1006094332d3Sopenharmony_ci } 1007094332d3Sopenharmony_ci OsalMSleep(RESET_TIME); 1008094332d3Sopenharmony_ci return ret; 1009094332d3Sopenharmony_ci} 1010094332d3Sopenharmony_ci 1011094332d3Sopenharmony_ciint32_t WlanInterfaceSetCountryCode(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, 1012094332d3Sopenharmony_ci const char *code, uint32_t len) 1013094332d3Sopenharmony_ci{ 1014094332d3Sopenharmony_ci int32_t ret; 1015094332d3Sopenharmony_ci 1016094332d3Sopenharmony_ci (void)self; 1017094332d3Sopenharmony_ci if (ifeature == NULL || ifeature->ifName == NULL || code == NULL) { 1018094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 1019094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1020094332d3Sopenharmony_ci } 1021094332d3Sopenharmony_ci if (g_apFeature == NULL || g_apFeature->setCountryCode == NULL) { 1022094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_apFeature or g_apFeature->setCountryCode is NULL!", __func__); 1023094332d3Sopenharmony_ci return HDF_FAILURE; 1024094332d3Sopenharmony_ci } 1025094332d3Sopenharmony_ci ret = strcpy_s((g_apFeature->baseFeature).ifName, IFNAMSIZ, ifeature->ifName); 1026094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1027094332d3Sopenharmony_ci HDF_LOGE("%{public}s: strcpy_s apFeature ifName is failed!", __func__); 1028094332d3Sopenharmony_ci return HDF_FAILURE; 1029094332d3Sopenharmony_ci } 1030094332d3Sopenharmony_ci ret = g_apFeature->setCountryCode(g_apFeature, code, strlen(code)); 1031094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1032094332d3Sopenharmony_ci HDF_LOGE("%{public}s set country code failed!, error code: %{public}d", __func__, ret); 1033094332d3Sopenharmony_ci } 1034094332d3Sopenharmony_ci return ret; 1035094332d3Sopenharmony_ci} 1036094332d3Sopenharmony_ci 1037094332d3Sopenharmony_ciint32_t WlanInterfaceSetMacAddress(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, 1038094332d3Sopenharmony_ci const uint8_t *mac, uint32_t macLen) 1039094332d3Sopenharmony_ci{ 1040094332d3Sopenharmony_ci int32_t ret = HDF_FAILURE; 1041094332d3Sopenharmony_ci struct IWiFiBaseFeature *baseFeature = NULL; 1042094332d3Sopenharmony_ci 1043094332d3Sopenharmony_ci (void)self; 1044094332d3Sopenharmony_ci if (ifeature == NULL || mac == NULL || ifeature->ifName == NULL) { 1045094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 1046094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1047094332d3Sopenharmony_ci } 1048094332d3Sopenharmony_ci ret = GetBasefeature(ifeature, &baseFeature); 1049094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1050094332d3Sopenharmony_ci HDF_LOGE("%{public}s GetBasefeature failed!", __func__); 1051094332d3Sopenharmony_ci return HDF_FAILURE; 1052094332d3Sopenharmony_ci } 1053094332d3Sopenharmony_ci ret = strcpy_s(baseFeature->ifName, IFNAMSIZ, ifeature->ifName); 1054094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1055094332d3Sopenharmony_ci HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret); 1056094332d3Sopenharmony_ci return HDF_FAILURE; 1057094332d3Sopenharmony_ci } 1058094332d3Sopenharmony_ci return baseFeature->setMacAddress(baseFeature, (uint8_t *)mac, ETH_ADDR_LEN); 1059094332d3Sopenharmony_ci} 1060094332d3Sopenharmony_ci 1061094332d3Sopenharmony_ciint32_t WlanInterfaceSetScanningMacAddress(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, 1062094332d3Sopenharmony_ci const uint8_t *scanMac, uint32_t scanMacLen) 1063094332d3Sopenharmony_ci{ 1064094332d3Sopenharmony_ci int32_t ret; 1065094332d3Sopenharmony_ci 1066094332d3Sopenharmony_ci (void)self; 1067094332d3Sopenharmony_ci if (ifeature == NULL || ifeature->ifName == NULL || scanMac == NULL) { 1068094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 1069094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1070094332d3Sopenharmony_ci } 1071094332d3Sopenharmony_ci if (g_staFeature == NULL || g_staFeature->setScanningMacAddress == NULL) { 1072094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_staFeature or g_staFeature->setScanningMacAddress is NULL!", __func__); 1073094332d3Sopenharmony_ci return HDF_FAILURE; 1074094332d3Sopenharmony_ci } 1075094332d3Sopenharmony_ci ret = strcpy_s((g_staFeature->baseFeature).ifName, IFNAMSIZ, ifeature->ifName); 1076094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1077094332d3Sopenharmony_ci HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret); 1078094332d3Sopenharmony_ci return HDF_FAILURE; 1079094332d3Sopenharmony_ci } 1080094332d3Sopenharmony_ci ret = g_staFeature->setScanningMacAddress(g_staFeature, (uint8_t *)scanMac, (uint8_t)scanMacLen); 1081094332d3Sopenharmony_ci 1082094332d3Sopenharmony_ci return ret; 1083094332d3Sopenharmony_ci} 1084094332d3Sopenharmony_ci 1085094332d3Sopenharmony_ciint32_t WlanInterfaceSetTxPower(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, int32_t power) 1086094332d3Sopenharmony_ci{ 1087094332d3Sopenharmony_ci int32_t ret; 1088094332d3Sopenharmony_ci struct IWiFiBaseFeature *baseFeature = NULL; 1089094332d3Sopenharmony_ci 1090094332d3Sopenharmony_ci (void)self; 1091094332d3Sopenharmony_ci if (ifeature == NULL || ifeature->ifName == NULL) { 1092094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 1093094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1094094332d3Sopenharmony_ci } 1095094332d3Sopenharmony_ci ret = GetBasefeature(ifeature, &baseFeature); 1096094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1097094332d3Sopenharmony_ci HDF_LOGE("%{public}s GetBasefeature failed!", __func__); 1098094332d3Sopenharmony_ci return HDF_FAILURE; 1099094332d3Sopenharmony_ci } 1100094332d3Sopenharmony_ci ret = strcpy_s(baseFeature->ifName, IFNAMSIZ, ifeature->ifName); 1101094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1102094332d3Sopenharmony_ci HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret); 1103094332d3Sopenharmony_ci return HDF_FAILURE; 1104094332d3Sopenharmony_ci } 1105094332d3Sopenharmony_ci 1106094332d3Sopenharmony_ci return baseFeature->setTxPower(baseFeature, power); 1107094332d3Sopenharmony_ci} 1108094332d3Sopenharmony_ci 1109094332d3Sopenharmony_ciint32_t WlanInterfaceGetNetDevInfo(struct IWlanInterface *self, struct HdfNetDeviceInfoResult *netDeviceInfoResult) 1110094332d3Sopenharmony_ci{ 1111094332d3Sopenharmony_ci int32_t ret = HDF_FAILURE; 1112094332d3Sopenharmony_ci 1113094332d3Sopenharmony_ci (void)self; 1114094332d3Sopenharmony_ci if (g_wifi == NULL || g_wifi->getNetDevInfo == NULL ||netDeviceInfoResult == NULL) { 1115094332d3Sopenharmony_ci HDF_LOGE("%{public}s: input parameter invalid!", __func__); 1116094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1117094332d3Sopenharmony_ci } 1118094332d3Sopenharmony_ci struct NetDeviceInfoResult *netDeviceInfo = 1119094332d3Sopenharmony_ci (struct NetDeviceInfoResult *)OsalMemCalloc(sizeof(struct NetDeviceInfoResult)); 1120094332d3Sopenharmony_ci if (netDeviceInfo == NULL) { 1121094332d3Sopenharmony_ci HDF_LOGE("%{public}s:OsalMemCalloc failed!", __func__); 1122094332d3Sopenharmony_ci return HDF_FAILURE; 1123094332d3Sopenharmony_ci } 1124094332d3Sopenharmony_ci ret = g_wifi->getNetDevInfo(netDeviceInfo); 1125094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1126094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get netdev info failed!, error code: %{public}d", __func__, ret); 1127094332d3Sopenharmony_ci OsalMemFree(netDeviceInfo); 1128094332d3Sopenharmony_ci return HDF_FAILURE; 1129094332d3Sopenharmony_ci } 1130094332d3Sopenharmony_ci 1131094332d3Sopenharmony_ci netDeviceInfoResult->deviceInfos = 1132094332d3Sopenharmony_ci (struct HdfNetDeviceInfo *)OsalMemCalloc(sizeof(struct HdfNetDeviceInfo) * MAX_NETDEVICE_COUNT); 1133094332d3Sopenharmony_ci if (netDeviceInfoResult->deviceInfos == NULL) { 1134094332d3Sopenharmony_ci HDF_LOGE("%{public}s:netDeviceInfoResult->deviceInfos OsalMemCalloc failed", __func__); 1135094332d3Sopenharmony_ci OsalMemFree(netDeviceInfo); 1136094332d3Sopenharmony_ci return HDF_FAILURE; 1137094332d3Sopenharmony_ci } 1138094332d3Sopenharmony_ci netDeviceInfoResult->deviceInfosLen = MAX_NETDEVICE_COUNT; 1139094332d3Sopenharmony_ci for (uint32_t i = 0; i < netDeviceInfoResult->deviceInfosLen; i++) { 1140094332d3Sopenharmony_ci netDeviceInfoResult->deviceInfos[i].index = netDeviceInfo->deviceInfos[i].index; 1141094332d3Sopenharmony_ci netDeviceInfoResult->deviceInfos[i].iftype = netDeviceInfo->deviceInfos[i].iftype; 1142094332d3Sopenharmony_ci netDeviceInfoResult->deviceInfos[i].ifName = (char *)OsalMemCalloc(sizeof(char) * IFNAMSIZ); 1143094332d3Sopenharmony_ci if (netDeviceInfoResult->deviceInfos != NULL) { 1144094332d3Sopenharmony_ci if (memcpy_s(netDeviceInfoResult->deviceInfos[i].ifName, IFNAMSIZ, netDeviceInfo->deviceInfos[i].ifName, 1145094332d3Sopenharmony_ci IFNAMSIZ) != EOK) { 1146094332d3Sopenharmony_ci OsalMemFree(netDeviceInfoResult->deviceInfos[i].ifName); 1147094332d3Sopenharmony_ci break; 1148094332d3Sopenharmony_ci } 1149094332d3Sopenharmony_ci netDeviceInfoResult->deviceInfos[i].ifNameLen = IFNAMSIZ; 1150094332d3Sopenharmony_ci } 1151094332d3Sopenharmony_ci netDeviceInfoResult->deviceInfos[i].mac = (uint8_t *)OsalMemCalloc(sizeof(uint8_t) * ETH_ADDR_LEN); 1152094332d3Sopenharmony_ci if (netDeviceInfoResult->deviceInfos[i].mac != NULL) { 1153094332d3Sopenharmony_ci if (memcpy_s(netDeviceInfoResult->deviceInfos[i].mac, ETH_ADDR_LEN, netDeviceInfo->deviceInfos[i].mac, 1154094332d3Sopenharmony_ci ETH_ADDR_LEN) != EOK) { 1155094332d3Sopenharmony_ci OsalMemFree(netDeviceInfoResult->deviceInfos[i].mac); 1156094332d3Sopenharmony_ci break; 1157094332d3Sopenharmony_ci } 1158094332d3Sopenharmony_ci netDeviceInfoResult->deviceInfos[i].macLen = ETH_ADDR_LEN; 1159094332d3Sopenharmony_ci } 1160094332d3Sopenharmony_ci } 1161094332d3Sopenharmony_ci OsalMemFree(netDeviceInfo); 1162094332d3Sopenharmony_ci return ret; 1163094332d3Sopenharmony_ci} 1164094332d3Sopenharmony_ci 1165094332d3Sopenharmony_cistatic int32_t WLanFillSsid(WifiScan *wifiScan, const struct HdfWifiScan *scan) 1166094332d3Sopenharmony_ci{ 1167094332d3Sopenharmony_ci uint32_t loop; 1168094332d3Sopenharmony_ci 1169094332d3Sopenharmony_ci for (loop = 0; loop < scan->ssidsLen; loop++) { 1170094332d3Sopenharmony_ci if (scan->ssids[loop].ssidLen > MAX_SSID_LEN) { 1171094332d3Sopenharmony_ci HDF_LOGW("%{public}s fail : ssidLen is invalid!", __func__); 1172094332d3Sopenharmony_ci scan->ssids[loop].ssidLen = MAX_SSID_LEN - 1; 1173094332d3Sopenharmony_ci } 1174094332d3Sopenharmony_ci if (memcpy_s(wifiScan->ssids[loop].ssid, scan->ssids[loop].ssidLen, scan->ssids[loop].ssid, 1175094332d3Sopenharmony_ci scan->ssids[loop].ssidLen) != EOK) { 1176094332d3Sopenharmony_ci HDF_LOGE("%{public}s fail : memcpy_s ssids fail!", __func__); 1177094332d3Sopenharmony_ci return HDF_FAILURE; 1178094332d3Sopenharmony_ci } 1179094332d3Sopenharmony_ci wifiScan->ssids[loop].ssidLen = (uint32_t)(scan->ssids[loop].ssidLen); 1180094332d3Sopenharmony_ci } 1181094332d3Sopenharmony_ci return HDF_SUCCESS; 1182094332d3Sopenharmony_ci} 1183094332d3Sopenharmony_ci 1184094332d3Sopenharmony_cistatic int32_t WLanFillScanData(WifiScan *wifiScan, const struct HdfWifiScan *scan) 1185094332d3Sopenharmony_ci{ 1186094332d3Sopenharmony_ci if ((scan->ssids != NULL) && (scan->ssidsLen != 0)) { 1187094332d3Sopenharmony_ci wifiScan->ssids = (WifiDriverScanSsid *)OsalMemCalloc(sizeof(WifiDriverScanSsid) * scan->ssidsLen); 1188094332d3Sopenharmony_ci if (wifiScan->ssids != NULL) { 1189094332d3Sopenharmony_ci if (WLanFillSsid(wifiScan, scan) != HDF_SUCCESS) { 1190094332d3Sopenharmony_ci HDF_LOGE("%{public}s fail : fill ssids fail!", __func__); 1191094332d3Sopenharmony_ci OsalMemFree(wifiScan->ssids); 1192094332d3Sopenharmony_ci return HDF_FAILURE; 1193094332d3Sopenharmony_ci } 1194094332d3Sopenharmony_ci wifiScan->numSsids = scan->ssidsLen; 1195094332d3Sopenharmony_ci } 1196094332d3Sopenharmony_ci } 1197094332d3Sopenharmony_ci 1198094332d3Sopenharmony_ci if ((scan->freqs != NULL) && (scan->freqsLen != 0)) { 1199094332d3Sopenharmony_ci wifiScan->freqs = (int32_t *)OsalMemCalloc(sizeof(int32_t) * scan->freqsLen); 1200094332d3Sopenharmony_ci if (wifiScan->freqs != NULL) { 1201094332d3Sopenharmony_ci if (memcpy_s(wifiScan->freqs, sizeof(int32_t) * (scan->freqsLen), scan->freqs, 1202094332d3Sopenharmony_ci sizeof(int32_t) * (scan->freqsLen)) != EOK) { 1203094332d3Sopenharmony_ci HDF_LOGE("%{public}s fail : memcpy_s freqs fail!", __func__); 1204094332d3Sopenharmony_ci OsalMemFree(wifiScan->freqs); 1205094332d3Sopenharmony_ci return HDF_FAILURE; 1206094332d3Sopenharmony_ci } 1207094332d3Sopenharmony_ci wifiScan->numFreqs = scan->freqsLen; 1208094332d3Sopenharmony_ci } 1209094332d3Sopenharmony_ci } 1210094332d3Sopenharmony_ci 1211094332d3Sopenharmony_ci if ((scan->bssid != NULL) && (scan->bssidLen != 0)) { 1212094332d3Sopenharmony_ci wifiScan->bssid = (uint8_t *)OsalMemCalloc(sizeof(uint8_t) * scan->bssidLen); 1213094332d3Sopenharmony_ci if (wifiScan->bssid != NULL) { 1214094332d3Sopenharmony_ci if (memcpy_s(wifiScan->bssid, sizeof(uint8_t) * (scan->bssidLen), scan->bssid, 1215094332d3Sopenharmony_ci sizeof(uint8_t) * (scan->bssidLen)) != EOK) { 1216094332d3Sopenharmony_ci HDF_LOGE("%{public}s fail : memcpy_s bssid fail!", __func__); 1217094332d3Sopenharmony_ci OsalMemFree(wifiScan->bssid); 1218094332d3Sopenharmony_ci return HDF_FAILURE; 1219094332d3Sopenharmony_ci } 1220094332d3Sopenharmony_ci } 1221094332d3Sopenharmony_ci } 1222094332d3Sopenharmony_ci if ((scan->extraIes != NULL) && (scan->extraIesLen != 0)) { 1223094332d3Sopenharmony_ci wifiScan->extraIes = (uint8_t *)OsalMemCalloc(sizeof(uint8_t) * scan->extraIesLen); 1224094332d3Sopenharmony_ci if (wifiScan->extraIes != NULL) { 1225094332d3Sopenharmony_ci if (memcpy_s(wifiScan->extraIes, sizeof(uint8_t) * (scan->extraIesLen), scan->extraIes, 1226094332d3Sopenharmony_ci sizeof(uint8_t) * (scan->extraIesLen)) != EOK) { 1227094332d3Sopenharmony_ci HDF_LOGE("%{public}s fail : memcpy_s extraIes fail!", __func__); 1228094332d3Sopenharmony_ci OsalMemFree(wifiScan->extraIes); 1229094332d3Sopenharmony_ci return HDF_FAILURE; 1230094332d3Sopenharmony_ci } 1231094332d3Sopenharmony_ci wifiScan->extraIesLen = scan->extraIesLen; 1232094332d3Sopenharmony_ci } 1233094332d3Sopenharmony_ci } 1234094332d3Sopenharmony_ci 1235094332d3Sopenharmony_ci wifiScan->prefixSsidScanFlag = scan->prefixSsidScanFlag; 1236094332d3Sopenharmony_ci wifiScan->fastConnectFlag = scan->fastConnectFlag; 1237094332d3Sopenharmony_ci return HDF_SUCCESS; 1238094332d3Sopenharmony_ci} 1239094332d3Sopenharmony_ci 1240094332d3Sopenharmony_cistatic void WifiScanFree(WifiScan *dataBlock) 1241094332d3Sopenharmony_ci{ 1242094332d3Sopenharmony_ci if (dataBlock == NULL) { 1243094332d3Sopenharmony_ci return; 1244094332d3Sopenharmony_ci } 1245094332d3Sopenharmony_ci 1246094332d3Sopenharmony_ci if (dataBlock->ssids != NULL) { 1247094332d3Sopenharmony_ci OsalMemFree(dataBlock->ssids); 1248094332d3Sopenharmony_ci dataBlock->ssids = NULL; 1249094332d3Sopenharmony_ci } 1250094332d3Sopenharmony_ci if (dataBlock->freqs != NULL) { 1251094332d3Sopenharmony_ci OsalMemFree(dataBlock->freqs); 1252094332d3Sopenharmony_ci dataBlock->freqs = NULL; 1253094332d3Sopenharmony_ci } 1254094332d3Sopenharmony_ci if (dataBlock->bssid != NULL) { 1255094332d3Sopenharmony_ci OsalMemFree(dataBlock->bssid); 1256094332d3Sopenharmony_ci dataBlock->bssid = NULL; 1257094332d3Sopenharmony_ci } 1258094332d3Sopenharmony_ci if (dataBlock->extraIes != NULL) { 1259094332d3Sopenharmony_ci OsalMemFree(dataBlock->extraIes); 1260094332d3Sopenharmony_ci dataBlock->extraIes = NULL; 1261094332d3Sopenharmony_ci } 1262094332d3Sopenharmony_ci OsalMemFree(dataBlock); 1263094332d3Sopenharmony_ci} 1264094332d3Sopenharmony_ci 1265094332d3Sopenharmony_ciint32_t WlanInterfaceStartScan(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, 1266094332d3Sopenharmony_ci const struct HdfWifiScan *scan) 1267094332d3Sopenharmony_ci{ 1268094332d3Sopenharmony_ci HDF_LOGI("hal enter %{public}s", __FUNCTION__); 1269094332d3Sopenharmony_ci int32_t ret = HDF_FAILURE; 1270094332d3Sopenharmony_ci 1271094332d3Sopenharmony_ci (void)self; 1272094332d3Sopenharmony_ci if (ifeature == NULL || ifeature->ifName == NULL || scan == NULL) { 1273094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 1274094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1275094332d3Sopenharmony_ci } 1276094332d3Sopenharmony_ci WifiScan *wifiScan = (WifiScan *)OsalMemCalloc(sizeof(WifiScan)); 1277094332d3Sopenharmony_ci if (wifiScan == NULL) { 1278094332d3Sopenharmony_ci HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__); 1279094332d3Sopenharmony_ci return HDF_FAILURE; 1280094332d3Sopenharmony_ci } 1281094332d3Sopenharmony_ci if (WLanFillScanData(wifiScan, scan) != HDF_SUCCESS) { 1282094332d3Sopenharmony_ci HDF_LOGE("%{public}s fail : fill scan data fail!", __func__); 1283094332d3Sopenharmony_ci WifiScanFree(wifiScan); 1284094332d3Sopenharmony_ci return HDF_FAILURE; 1285094332d3Sopenharmony_ci } 1286094332d3Sopenharmony_ci if (g_staFeature == NULL || g_staFeature->startScan == NULL) { 1287094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_staFeature or g_staFeature->startScan is NULL!", __func__); 1288094332d3Sopenharmony_ci WifiScanFree(wifiScan); 1289094332d3Sopenharmony_ci return HDF_FAILURE; 1290094332d3Sopenharmony_ci } 1291094332d3Sopenharmony_ci ret = g_staFeature->startScan(ifeature->ifName, wifiScan); 1292094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1293094332d3Sopenharmony_ci HDF_LOGE("%{public}s start scan failed!, error code: %{public}d", __func__, ret); 1294094332d3Sopenharmony_ci } 1295094332d3Sopenharmony_ci WifiScanFree(wifiScan); 1296094332d3Sopenharmony_ci HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret); 1297094332d3Sopenharmony_ci return ret; 1298094332d3Sopenharmony_ci} 1299094332d3Sopenharmony_ci 1300094332d3Sopenharmony_ciint32_t WlanInterfaceGetPowerMode(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, uint8_t *mode) 1301094332d3Sopenharmony_ci{ 1302094332d3Sopenharmony_ci int32_t ret; 1303094332d3Sopenharmony_ci 1304094332d3Sopenharmony_ci (void)self; 1305094332d3Sopenharmony_ci if (ifeature == NULL || ifeature->ifName == NULL || mode == NULL) { 1306094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 1307094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1308094332d3Sopenharmony_ci } 1309094332d3Sopenharmony_ci if (g_wifi == NULL || g_wifi->getPowerMode == NULL) { 1310094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_wifi or g_wifi->getPowerMode is NULL!", __func__); 1311094332d3Sopenharmony_ci return HDF_FAILURE; 1312094332d3Sopenharmony_ci } 1313094332d3Sopenharmony_ci ret = g_wifi->getPowerMode(ifeature->ifName, mode); 1314094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1315094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get power mode failed!, error code: %{public}d", __func__, ret); 1316094332d3Sopenharmony_ci } 1317094332d3Sopenharmony_ci return ret; 1318094332d3Sopenharmony_ci} 1319094332d3Sopenharmony_ci 1320094332d3Sopenharmony_ciint32_t WlanInterfaceSetPowerMode(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, uint8_t mode) 1321094332d3Sopenharmony_ci{ 1322094332d3Sopenharmony_ci int32_t ret; 1323094332d3Sopenharmony_ci 1324094332d3Sopenharmony_ci (void)self; 1325094332d3Sopenharmony_ci if (ifeature == NULL || ifeature->ifName == NULL) { 1326094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 1327094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1328094332d3Sopenharmony_ci } 1329094332d3Sopenharmony_ci if (g_wifi == NULL || g_wifi->setPowerMode == NULL) { 1330094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_wifi or g_wifi->setPowerMode is NULL!", __func__); 1331094332d3Sopenharmony_ci return HDF_FAILURE; 1332094332d3Sopenharmony_ci } 1333094332d3Sopenharmony_ci ret = g_wifi->setPowerMode(ifeature->ifName, mode); 1334094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1335094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get power mode failed!, error code: %{public}d", __func__, ret); 1336094332d3Sopenharmony_ci } 1337094332d3Sopenharmony_ci return ret; 1338094332d3Sopenharmony_ci} 1339094332d3Sopenharmony_ci 1340094332d3Sopenharmony_ciint32_t WlanInterfaceSetProjectionScreenParam(struct IWlanInterface *self, const char *ifName, 1341094332d3Sopenharmony_ci const struct ProjectionScreenCmdParam *param) 1342094332d3Sopenharmony_ci{ 1343094332d3Sopenharmony_ci int32_t ret; 1344094332d3Sopenharmony_ci ProjectionScreenParam *projectionScreenParam = NULL; 1345094332d3Sopenharmony_ci 1346094332d3Sopenharmony_ci (void)self; 1347094332d3Sopenharmony_ci if (ifName == NULL || param == NULL) { 1348094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 1349094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1350094332d3Sopenharmony_ci } 1351094332d3Sopenharmony_ci if (g_wifi == NULL || g_wifi->setProjectionScreenParam == NULL) { 1352094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_wifi or g_wifi->setProjectionScreenParam is NULL!", __func__); 1353094332d3Sopenharmony_ci return HDF_FAILURE; 1354094332d3Sopenharmony_ci } 1355094332d3Sopenharmony_ci 1356094332d3Sopenharmony_ci projectionScreenParam = OsalMemCalloc(sizeof(ProjectionScreenParam) + param->bufLen); 1357094332d3Sopenharmony_ci if (projectionScreenParam == NULL) { 1358094332d3Sopenharmony_ci HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__); 1359094332d3Sopenharmony_ci return HDF_FAILURE; 1360094332d3Sopenharmony_ci } 1361094332d3Sopenharmony_ci projectionScreenParam->cmdId = param->cmdId; 1362094332d3Sopenharmony_ci projectionScreenParam->bufLen = param->bufLen; 1363094332d3Sopenharmony_ci do { 1364094332d3Sopenharmony_ci if (memcpy_s(projectionScreenParam->buf, projectionScreenParam->bufLen, param->buf, param->bufLen) != EOK) { 1365094332d3Sopenharmony_ci HDF_LOGE("%{public}s: memcpy_s failed", __func__); 1366094332d3Sopenharmony_ci ret = HDF_FAILURE; 1367094332d3Sopenharmony_ci break; 1368094332d3Sopenharmony_ci } 1369094332d3Sopenharmony_ci ret = g_wifi->setProjectionScreenParam(ifName, projectionScreenParam); 1370094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1371094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get channel meas result failed!, error code: %{public}d", __func__, ret); 1372094332d3Sopenharmony_ci } 1373094332d3Sopenharmony_ci } while (0); 1374094332d3Sopenharmony_ci 1375094332d3Sopenharmony_ci OsalMemFree(projectionScreenParam); 1376094332d3Sopenharmony_ci return ret; 1377094332d3Sopenharmony_ci} 1378094332d3Sopenharmony_ci 1379094332d3Sopenharmony_ciint32_t WlanInterfaceGetStaInfo(struct IWlanInterface *self, const char *ifName, struct WifiStationInfo *info, 1380094332d3Sopenharmony_ci const uint8_t *mac, uint32_t macLen) 1381094332d3Sopenharmony_ci{ 1382094332d3Sopenharmony_ci int32_t ret; 1383094332d3Sopenharmony_ci 1384094332d3Sopenharmony_ci (void)self; 1385094332d3Sopenharmony_ci if (ifName == NULL || info == NULL || mac == NULL) { 1386094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 1387094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1388094332d3Sopenharmony_ci } 1389094332d3Sopenharmony_ci if (g_wifi == NULL || g_wifi->getStationInfo == NULL) { 1390094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_wifi or g_wifi->getStationInfo is NULL!", __func__); 1391094332d3Sopenharmony_ci return HDF_FAILURE; 1392094332d3Sopenharmony_ci } 1393094332d3Sopenharmony_ci ret = g_wifi->getStationInfo(ifName, (StationInfo *)info, mac, macLen); 1394094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1395094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get station information failed!, error code: %{public}d", __func__, ret); 1396094332d3Sopenharmony_ci } 1397094332d3Sopenharmony_ci return ret; 1398094332d3Sopenharmony_ci} 1399094332d3Sopenharmony_ci 1400094332d3Sopenharmony_cistatic int32_t FillPnoSettings(WifiPnoSettings *wifiPnoSettings, const struct PnoSettings *pnoSettings) 1401094332d3Sopenharmony_ci{ 1402094332d3Sopenharmony_ci wifiPnoSettings->min2gRssi = pnoSettings->min2gRssi; 1403094332d3Sopenharmony_ci wifiPnoSettings->min5gRssi = pnoSettings->min5gRssi; 1404094332d3Sopenharmony_ci wifiPnoSettings->scanIntervalMs = pnoSettings->scanIntervalMs; 1405094332d3Sopenharmony_ci wifiPnoSettings->scanIterations = pnoSettings->scanIterations; 1406094332d3Sopenharmony_ci 1407094332d3Sopenharmony_ci if ((pnoSettings->pnoNetworks == NULL) || (pnoSettings->pnoNetworksLen == 0)) { 1408094332d3Sopenharmony_ci HDF_LOGE("%{public}s: scan networks is NULL.", __func__); 1409094332d3Sopenharmony_ci return HDF_FAILURE; 1410094332d3Sopenharmony_ci } 1411094332d3Sopenharmony_ci 1412094332d3Sopenharmony_ci wifiPnoSettings->pnoNetworksLen = pnoSettings->pnoNetworksLen; 1413094332d3Sopenharmony_ci wifiPnoSettings->pnoNetworks = 1414094332d3Sopenharmony_ci (WifiPnoNetwork *)OsalMemCalloc(sizeof(WifiPnoNetwork) * (pnoSettings->pnoNetworksLen)); 1415094332d3Sopenharmony_ci if (wifiPnoSettings->pnoNetworks == NULL) { 1416094332d3Sopenharmony_ci HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__); 1417094332d3Sopenharmony_ci return HDF_FAILURE; 1418094332d3Sopenharmony_ci } 1419094332d3Sopenharmony_ci for (uint32_t i = 0; i < pnoSettings->pnoNetworksLen; i++) { 1420094332d3Sopenharmony_ci wifiPnoSettings->pnoNetworks[i].isHidden = pnoSettings->pnoNetworks[i].isHidden; 1421094332d3Sopenharmony_ci wifiPnoSettings->pnoNetworks[i].ssid.ssidLen = (uint32_t)(pnoSettings->pnoNetworks[i].ssid.ssidLen); 1422094332d3Sopenharmony_ci if (memcpy_s(wifiPnoSettings->pnoNetworks[i].ssid.ssid, MAX_SSID_LEN, pnoSettings->pnoNetworks[i].ssid.ssid, 1423094332d3Sopenharmony_ci pnoSettings->pnoNetworks[i].ssid.ssidLen) != EOK) { 1424094332d3Sopenharmony_ci HDF_LOGE("%{public}s fail : memcpy_s ssids fail!", __func__); 1425094332d3Sopenharmony_ci return HDF_FAILURE; 1426094332d3Sopenharmony_ci } 1427094332d3Sopenharmony_ci if (pnoSettings->pnoNetworks[i].freqsLen != 0) { 1428094332d3Sopenharmony_ci wifiPnoSettings->pnoNetworks[i].freqs = 1429094332d3Sopenharmony_ci (int32_t *)OsalMemCalloc(sizeof(int32_t) * (pnoSettings->pnoNetworks[i].freqsLen)); 1430094332d3Sopenharmony_ci if (wifiPnoSettings->pnoNetworks[i].freqs == NULL) { 1431094332d3Sopenharmony_ci HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__); 1432094332d3Sopenharmony_ci return HDF_FAILURE; 1433094332d3Sopenharmony_ci } 1434094332d3Sopenharmony_ci wifiPnoSettings->pnoNetworks[i].freqsLen = pnoSettings->pnoNetworks[i].freqsLen; 1435094332d3Sopenharmony_ci if (memcpy_s(wifiPnoSettings->pnoNetworks[i].freqs, 1436094332d3Sopenharmony_ci sizeof(int32_t) * (pnoSettings->pnoNetworks[i].freqsLen), pnoSettings->pnoNetworks[i].freqs, 1437094332d3Sopenharmony_ci sizeof(int32_t) * (pnoSettings->pnoNetworks[i].freqsLen)) != EOK) { 1438094332d3Sopenharmony_ci HDF_LOGE("%{public}s fail : memcpy_s freqs fail!", __func__); 1439094332d3Sopenharmony_ci return HDF_FAILURE; 1440094332d3Sopenharmony_ci } 1441094332d3Sopenharmony_ci } 1442094332d3Sopenharmony_ci } 1443094332d3Sopenharmony_ci return HDF_SUCCESS; 1444094332d3Sopenharmony_ci} 1445094332d3Sopenharmony_ci 1446094332d3Sopenharmony_cistatic void WifiPnoSettingsFree(WifiPnoSettings *wifiPnoSettings) 1447094332d3Sopenharmony_ci{ 1448094332d3Sopenharmony_ci if (wifiPnoSettings == NULL) { 1449094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 1450094332d3Sopenharmony_ci return; 1451094332d3Sopenharmony_ci } 1452094332d3Sopenharmony_ci for (uint32_t i = 0; i < wifiPnoSettings->pnoNetworksLen; i++) { 1453094332d3Sopenharmony_ci if (wifiPnoSettings->pnoNetworks[i].freqs != NULL) { 1454094332d3Sopenharmony_ci OsalMemFree(wifiPnoSettings->pnoNetworks[i].freqs); 1455094332d3Sopenharmony_ci wifiPnoSettings->pnoNetworks[i].freqs = NULL; 1456094332d3Sopenharmony_ci } 1457094332d3Sopenharmony_ci } 1458094332d3Sopenharmony_ci OsalMemFree(wifiPnoSettings->pnoNetworks); 1459094332d3Sopenharmony_ci wifiPnoSettings->pnoNetworks = NULL; 1460094332d3Sopenharmony_ci OsalMemFree(wifiPnoSettings); 1461094332d3Sopenharmony_ci} 1462094332d3Sopenharmony_ci 1463094332d3Sopenharmony_ciint32_t WlanInterfaceStartPnoScan(struct IWlanInterface *self, const char *ifName, 1464094332d3Sopenharmony_ci const struct PnoSettings *pnoSettings) 1465094332d3Sopenharmony_ci{ 1466094332d3Sopenharmony_ci HDF_LOGI("hal enter %{public}s ifName:%{public}s", __FUNCTION__, ifName); 1467094332d3Sopenharmony_ci int32_t ret; 1468094332d3Sopenharmony_ci (void)self; 1469094332d3Sopenharmony_ci 1470094332d3Sopenharmony_ci if (ifName == NULL || pnoSettings == NULL) { 1471094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 1472094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1473094332d3Sopenharmony_ci } 1474094332d3Sopenharmony_ci if (g_staFeature == NULL || g_staFeature->startPnoScan == NULL) { 1475094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_staFeature or g_staFeature->startPnoScan is NULL!", __func__); 1476094332d3Sopenharmony_ci return HDF_FAILURE; 1477094332d3Sopenharmony_ci } 1478094332d3Sopenharmony_ci WifiPnoSettings *wifiPnoSettings = (WifiPnoSettings *)OsalMemCalloc(sizeof(WifiPnoSettings)); 1479094332d3Sopenharmony_ci if (wifiPnoSettings == NULL) { 1480094332d3Sopenharmony_ci HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__); 1481094332d3Sopenharmony_ci return HDF_FAILURE; 1482094332d3Sopenharmony_ci } 1483094332d3Sopenharmony_ci if (FillPnoSettings(wifiPnoSettings, pnoSettings) != HDF_SUCCESS) { 1484094332d3Sopenharmony_ci HDF_LOGE("%{public}s fail : memcpy_s ssids fail!", __func__); 1485094332d3Sopenharmony_ci WifiPnoSettingsFree(wifiPnoSettings); 1486094332d3Sopenharmony_ci return HDF_FAILURE; 1487094332d3Sopenharmony_ci } 1488094332d3Sopenharmony_ci 1489094332d3Sopenharmony_ci ret = strcpy_s((g_staFeature->baseFeature).ifName, IFNAMSIZ, ifName); 1490094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1491094332d3Sopenharmony_ci HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret); 1492094332d3Sopenharmony_ci WifiPnoSettingsFree(wifiPnoSettings); 1493094332d3Sopenharmony_ci return HDF_FAILURE; 1494094332d3Sopenharmony_ci } 1495094332d3Sopenharmony_ci ret = g_staFeature->startPnoScan(ifName, wifiPnoSettings); 1496094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1497094332d3Sopenharmony_ci HDF_LOGE("%{public}s: startPnoScan failed!, error code: %{public}d", __func__, ret); 1498094332d3Sopenharmony_ci } 1499094332d3Sopenharmony_ci WifiPnoSettingsFree(wifiPnoSettings); 1500094332d3Sopenharmony_ci HDF_LOGI("hal exit %{public}s", __FUNCTION__); 1501094332d3Sopenharmony_ci return ret; 1502094332d3Sopenharmony_ci} 1503094332d3Sopenharmony_ci 1504094332d3Sopenharmony_ciint32_t WlanInterfaceStopPnoScan(struct IWlanInterface *self, const char *ifName) 1505094332d3Sopenharmony_ci{ 1506094332d3Sopenharmony_ci HDF_LOGI("hal enter %{public}s ifName:%{public}s", __FUNCTION__, ifName); 1507094332d3Sopenharmony_ci int32_t ret; 1508094332d3Sopenharmony_ci (void)self; 1509094332d3Sopenharmony_ci 1510094332d3Sopenharmony_ci if (ifName == NULL) { 1511094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 1512094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1513094332d3Sopenharmony_ci } 1514094332d3Sopenharmony_ci if (g_staFeature == NULL || g_staFeature->stopPnoScan == NULL) { 1515094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_staFeature or g_staFeature->stopPnoScan is NULL!", __func__); 1516094332d3Sopenharmony_ci return HDF_FAILURE; 1517094332d3Sopenharmony_ci } 1518094332d3Sopenharmony_ci ret = strcpy_s((g_staFeature->baseFeature).ifName, IFNAMSIZ, ifName); 1519094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1520094332d3Sopenharmony_ci HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret); 1521094332d3Sopenharmony_ci return HDF_FAILURE; 1522094332d3Sopenharmony_ci } 1523094332d3Sopenharmony_ci ret = g_staFeature->stopPnoScan(ifName); 1524094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1525094332d3Sopenharmony_ci HDF_LOGE("%{public}s: stopPnoScan failed!, error code: %{public}d", __func__, ret); 1526094332d3Sopenharmony_ci } 1527094332d3Sopenharmony_ci HDF_LOGI("hal exit %{public}s", __FUNCTION__); 1528094332d3Sopenharmony_ci return ret; 1529094332d3Sopenharmony_ci} 1530094332d3Sopenharmony_ci 1531094332d3Sopenharmony_ciint32_t WlanInterfaceGetSignalPollInfo(struct IWlanInterface *self, const char *ifName, 1532094332d3Sopenharmony_ci struct SignalPollResult *signalResult) 1533094332d3Sopenharmony_ci{ 1534094332d3Sopenharmony_ci int32_t ret; 1535094332d3Sopenharmony_ci (void)self; 1536094332d3Sopenharmony_ci 1537094332d3Sopenharmony_ci if (ifName == NULL || signalResult == NULL) { 1538094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 1539094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1540094332d3Sopenharmony_ci } 1541094332d3Sopenharmony_ci if (g_staFeature == NULL || g_staFeature->getSignalPollInfo == NULL) { 1542094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_staFeature or g_staFeature->getSignalPollInfo is NULL!", __func__); 1543094332d3Sopenharmony_ci return HDF_FAILURE; 1544094332d3Sopenharmony_ci } 1545094332d3Sopenharmony_ci ret = strcpy_s((g_staFeature->baseFeature).ifName, IFNAMSIZ, ifName); 1546094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1547094332d3Sopenharmony_ci HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret); 1548094332d3Sopenharmony_ci return HDF_FAILURE; 1549094332d3Sopenharmony_ci } 1550094332d3Sopenharmony_ci ret = g_staFeature->getSignalPollInfo(ifName, (struct SignalResult *)signalResult); 1551094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1552094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get signal information failed!, error code: %{public}d", __func__, ret); 1553094332d3Sopenharmony_ci } 1554094332d3Sopenharmony_ci return ret; 1555094332d3Sopenharmony_ci} 1556094332d3Sopenharmony_ci 1557094332d3Sopenharmony_ciint32_t WlanInterfaceGetApBandwidth(struct IWlanInterface *self, const char *ifName, 1558094332d3Sopenharmony_ci uint8_t *bandwidth) 1559094332d3Sopenharmony_ci{ 1560094332d3Sopenharmony_ci int32_t ret; 1561094332d3Sopenharmony_ci (void)self; 1562094332d3Sopenharmony_ci 1563094332d3Sopenharmony_ci if (ifName == NULL || bandwidth == NULL) { 1564094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 1565094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1566094332d3Sopenharmony_ci } 1567094332d3Sopenharmony_ci if (g_apFeature == NULL || g_apFeature->getApBandwidth == NULL) { 1568094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_apFeature or g_staFeature->getApBandwidth is NULL!", __func__); 1569094332d3Sopenharmony_ci return HDF_FAILURE; 1570094332d3Sopenharmony_ci } 1571094332d3Sopenharmony_ci ret = g_apFeature->getApBandwidth(ifName, bandwidth); 1572094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1573094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get signal information failed!, error code: %d", __func__, ret); 1574094332d3Sopenharmony_ci } 1575094332d3Sopenharmony_ci return ret; 1576094332d3Sopenharmony_ci} 1577094332d3Sopenharmony_ci 1578094332d3Sopenharmony_ciint32_t WlanInterfaceResetToFactoryMacAddress(struct IWlanInterface *self, const char *ifName) 1579094332d3Sopenharmony_ci{ 1580094332d3Sopenharmony_ci int32_t ret; 1581094332d3Sopenharmony_ci 1582094332d3Sopenharmony_ci (void)self; 1583094332d3Sopenharmony_ci if (ifName == NULL) { 1584094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 1585094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1586094332d3Sopenharmony_ci } 1587094332d3Sopenharmony_ci 1588094332d3Sopenharmony_ci if (g_staFeature != NULL) { 1589094332d3Sopenharmony_ci HDF_LOGD("%{public}s g_staFeature is not NULL!", __func__); 1590094332d3Sopenharmony_ci ret = g_staFeature->baseFeature.resetToFactoryMacAddress(ifName); 1591094332d3Sopenharmony_ci } else if (g_apFeature != NULL) { 1592094332d3Sopenharmony_ci HDF_LOGD("%{public}s g_apFeature is not NULL!", __func__); 1593094332d3Sopenharmony_ci ret = g_apFeature->baseFeature.resetToFactoryMacAddress(ifName); 1594094332d3Sopenharmony_ci } else { 1595094332d3Sopenharmony_ci HDF_LOGE("%{public}s: ap and sta feature is Invalid.", __func__); 1596094332d3Sopenharmony_ci ret = HDF_FAILURE; 1597094332d3Sopenharmony_ci } 1598094332d3Sopenharmony_ci 1599094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1600094332d3Sopenharmony_ci HDF_LOGE("%{public}s get name failed!, error code: %{public}d", __func__, ret); 1601094332d3Sopenharmony_ci } 1602094332d3Sopenharmony_ci return ret; 1603094332d3Sopenharmony_ci} 1604094332d3Sopenharmony_ci 1605094332d3Sopenharmony_ciint32_t WlanInterfaceSendActionFrame(struct IWlanInterface *self, const char *ifName, uint32_t freq, 1606094332d3Sopenharmony_ci const uint8_t *frameData, uint32_t frameDataLen) 1607094332d3Sopenharmony_ci{ 1608094332d3Sopenharmony_ci int32_t ret; 1609094332d3Sopenharmony_ci (void)self; 1610094332d3Sopenharmony_ci if (ifName == NULL || freq == 0 || frameData == NULL || frameDataLen == 0) { 1611094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 1612094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1613094332d3Sopenharmony_ci } 1614094332d3Sopenharmony_ci if (g_wifi == NULL || g_wifi->sendActionFrame == NULL) { 1615094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_wifi or g_wifi->sendActionFrame is NULL!", __func__); 1616094332d3Sopenharmony_ci return HDF_FAILURE; 1617094332d3Sopenharmony_ci } 1618094332d3Sopenharmony_ci ret = g_wifi->sendActionFrame(ifName, freq, frameData, frameDataLen); 1619094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1620094332d3Sopenharmony_ci HDF_LOGE("%{public}s failed!, error code: %{public}d", __func__, ret); 1621094332d3Sopenharmony_ci } 1622094332d3Sopenharmony_ci return ret; 1623094332d3Sopenharmony_ci} 1624094332d3Sopenharmony_ci 1625094332d3Sopenharmony_ciint32_t WlanInterfaceRegisterActionFrameReceiver(struct IWlanInterface *self, const char *ifName, 1626094332d3Sopenharmony_ci const uint8_t *match, uint32_t matchLen) 1627094332d3Sopenharmony_ci{ 1628094332d3Sopenharmony_ci int32_t ret; 1629094332d3Sopenharmony_ci (void)self; 1630094332d3Sopenharmony_ci if (ifName == NULL || match == NULL || matchLen == 0) { 1631094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 1632094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1633094332d3Sopenharmony_ci } 1634094332d3Sopenharmony_ci if (g_wifi == NULL || g_wifi->registerActionFrameReceiver == NULL) { 1635094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_wifi or g_wifi->registerActionFrameReceiver is NULL!", __func__); 1636094332d3Sopenharmony_ci return HDF_FAILURE; 1637094332d3Sopenharmony_ci } 1638094332d3Sopenharmony_ci ret = g_wifi->registerActionFrameReceiver(ifName, match, matchLen); 1639094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1640094332d3Sopenharmony_ci HDF_LOGE("%{public}s failed!, error code: %{public}d", __func__, ret); 1641094332d3Sopenharmony_ci } 1642094332d3Sopenharmony_ci return ret; 1643094332d3Sopenharmony_ci} 1644094332d3Sopenharmony_ci 1645094332d3Sopenharmony_ciint32_t WlanInterfaceSetPowerSaveMode(struct IWlanInterface *self, const char * ifName, int32_t frequency, int32_t mode) 1646094332d3Sopenharmony_ci{ 1647094332d3Sopenharmony_ci int32_t ret; 1648094332d3Sopenharmony_ci (void)self; 1649094332d3Sopenharmony_ci 1650094332d3Sopenharmony_ci HDF_LOGI("Enter %{public}s.", __FUNCTION__); 1651094332d3Sopenharmony_ci if (ifName == NULL) { 1652094332d3Sopenharmony_ci HDF_LOGE("%{public}s input parameter invalid!", __func__); 1653094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1654094332d3Sopenharmony_ci } 1655094332d3Sopenharmony_ci 1656094332d3Sopenharmony_ci if (g_wifi == NULL || g_wifi->setPowerSaveMode == NULL) { 1657094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_wifi or g_wifi->setPowerSaveMode is NULL!", __func__); 1658094332d3Sopenharmony_ci return HDF_FAILURE; 1659094332d3Sopenharmony_ci } 1660094332d3Sopenharmony_ci 1661094332d3Sopenharmony_ci ret = g_wifi->setPowerSaveMode(ifName, frequency, mode); 1662094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1663094332d3Sopenharmony_ci HDF_LOGE("%{public}s failed!, error code: %{public}d", __func__, ret); 1664094332d3Sopenharmony_ci } 1665094332d3Sopenharmony_ci return ret; 1666094332d3Sopenharmony_ci} 1667094332d3Sopenharmony_ci 1668094332d3Sopenharmony_ciint32_t WlanInterfaceSetDpiMarkRule(struct IWlanInterface *self, int32_t uid, int32_t protocol, int32_t enable) 1669094332d3Sopenharmony_ci{ 1670094332d3Sopenharmony_ci int32_t ret; 1671094332d3Sopenharmony_ci (void)self; 1672094332d3Sopenharmony_ci 1673094332d3Sopenharmony_ci HDF_LOGI("Enter %{public}s.", __FUNCTION__); 1674094332d3Sopenharmony_ci if (g_wifi == NULL || g_wifi->setDpiMarkRule == NULL) { 1675094332d3Sopenharmony_ci HDF_LOGE("%{public}s g_wifi or g_wifi->setDpiMarkRule is NULL!", __func__); 1676094332d3Sopenharmony_ci return HDF_FAILURE; 1677094332d3Sopenharmony_ci } 1678094332d3Sopenharmony_ci 1679094332d3Sopenharmony_ci ret = g_wifi->setDpiMarkRule(uid, protocol, enable); 1680094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1681094332d3Sopenharmony_ci HDF_LOGE("%{public}s failed!, error code: %{public}d", __func__, ret); 1682094332d3Sopenharmony_ci } 1683094332d3Sopenharmony_ci return ret; 1684094332d3Sopenharmony_ci} 1685094332d3Sopenharmony_ci 1686094332d3Sopenharmony_ciint32_t WlanInterfaceWifiConstruct(void) 1687094332d3Sopenharmony_ci{ 1688094332d3Sopenharmony_ci int32_t ret; 1689094332d3Sopenharmony_ci 1690094332d3Sopenharmony_ci ret = WifiConstruct(&g_wifi); 1691094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1692094332d3Sopenharmony_ci HDF_LOGE("%{public}s construct WiFi failed! error code: %{public}d", __func__, ret); 1693094332d3Sopenharmony_ci } 1694094332d3Sopenharmony_ci return ret; 1695094332d3Sopenharmony_ci} 1696094332d3Sopenharmony_ci 1697094332d3Sopenharmony_ciint32_t WlanInterfaceWifiDestruct(void) 1698094332d3Sopenharmony_ci{ 1699094332d3Sopenharmony_ci int32_t ret; 1700094332d3Sopenharmony_ci 1701094332d3Sopenharmony_ci ret = WifiDestruct(&g_wifi); 1702094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1703094332d3Sopenharmony_ci HDF_LOGE("%{public}s destruct WiFi failed! error code: %{public}d", __func__, ret); 1704094332d3Sopenharmony_ci } 1705094332d3Sopenharmony_ci return ret; 1706094332d3Sopenharmony_ci} 1707