1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include "wifi_hal_base_feature.h" 17094332d3Sopenharmony_ci#include "hdf_base.h" 18094332d3Sopenharmony_ci#include "hdf_log.h" 19094332d3Sopenharmony_ci#include "securec.h" 20094332d3Sopenharmony_ci#include "wifi_hal_cmd.h" 21094332d3Sopenharmony_ci#include "wifi_hal_util.h" 22094332d3Sopenharmony_ci 23094332d3Sopenharmony_ci#ifdef __cplusplus 24094332d3Sopenharmony_ci#if __cplusplus 25094332d3Sopenharmony_ciextern "C" { 26094332d3Sopenharmony_ci#endif 27094332d3Sopenharmony_ci#endif 28094332d3Sopenharmony_ci 29094332d3Sopenharmony_cistatic const char *GetNetworkIfaceNameInner(const struct IWiFiBaseFeature *baseFeature) 30094332d3Sopenharmony_ci{ 31094332d3Sopenharmony_ci if (baseFeature == NULL) { 32094332d3Sopenharmony_ci HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); 33094332d3Sopenharmony_ci return NULL; 34094332d3Sopenharmony_ci } 35094332d3Sopenharmony_ci return baseFeature->ifName; 36094332d3Sopenharmony_ci} 37094332d3Sopenharmony_ci 38094332d3Sopenharmony_cistatic int32_t GetFeatureTypeInner(const struct IWiFiBaseFeature *baseFeature) 39094332d3Sopenharmony_ci{ 40094332d3Sopenharmony_ci if (baseFeature == NULL) { 41094332d3Sopenharmony_ci HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); 42094332d3Sopenharmony_ci return HDF_FAILURE; 43094332d3Sopenharmony_ci } 44094332d3Sopenharmony_ci return baseFeature->type; 45094332d3Sopenharmony_ci} 46094332d3Sopenharmony_ci 47094332d3Sopenharmony_cistatic int32_t SetMacAddressInner(const struct IWiFiBaseFeature *baseFeature, unsigned char *mac, uint8_t len) 48094332d3Sopenharmony_ci{ 49094332d3Sopenharmony_ci if (baseFeature == NULL || mac == NULL || len != WIFI_MAC_ADDR_LENGTH) { 50094332d3Sopenharmony_ci HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); 51094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 52094332d3Sopenharmony_ci } 53094332d3Sopenharmony_ci return HalCmdSetMacAddr(baseFeature->ifName, mac, len); 54094332d3Sopenharmony_ci} 55094332d3Sopenharmony_ci 56094332d3Sopenharmony_cistatic int32_t GetDeviceMacAddressInner(const struct IWiFiBaseFeature *baseFeature, unsigned char *mac, uint8_t len) 57094332d3Sopenharmony_ci{ 58094332d3Sopenharmony_ci if (baseFeature == NULL || mac == NULL || len != WIFI_MAC_ADDR_LENGTH) { 59094332d3Sopenharmony_ci HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); 60094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 61094332d3Sopenharmony_ci } 62094332d3Sopenharmony_ci return HalCmdGetDevMacAddr(baseFeature->ifName, baseFeature->type, mac, len); 63094332d3Sopenharmony_ci} 64094332d3Sopenharmony_ci 65094332d3Sopenharmony_cistatic int32_t GetValidFreqsWithBandInner(const struct IWiFiBaseFeature *baseFeature, 66094332d3Sopenharmony_ci int32_t band, int32_t *freqs, uint32_t size, uint32_t *num) 67094332d3Sopenharmony_ci{ 68094332d3Sopenharmony_ci if (baseFeature == NULL || freqs == NULL || size < MAX_CHANNEL_NUM || num == NULL || band < 0) { 69094332d3Sopenharmony_ci HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); 70094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 71094332d3Sopenharmony_ci } 72094332d3Sopenharmony_ci return HalCmdGetValidFreqWithBand(baseFeature->ifName, band, freqs, size, num); 73094332d3Sopenharmony_ci} 74094332d3Sopenharmony_ci 75094332d3Sopenharmony_cistatic int32_t SetTxPowerInner(const struct IWiFiBaseFeature *baseFeature, int32_t power) 76094332d3Sopenharmony_ci{ 77094332d3Sopenharmony_ci if (baseFeature == NULL || power <= 0) { 78094332d3Sopenharmony_ci HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); 79094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 80094332d3Sopenharmony_ci } 81094332d3Sopenharmony_ci return HalCmdSetTxPower(baseFeature->ifName, power); 82094332d3Sopenharmony_ci} 83094332d3Sopenharmony_ci 84094332d3Sopenharmony_cistatic int32_t GetChipIdInner(const struct IWiFiBaseFeature *baseFeature, uint8_t *chipId) 85094332d3Sopenharmony_ci{ 86094332d3Sopenharmony_ci if (baseFeature == NULL || chipId == NULL) { 87094332d3Sopenharmony_ci HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); 88094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 89094332d3Sopenharmony_ci } 90094332d3Sopenharmony_ci return HalCmdGetChipId(baseFeature->ifName, chipId); 91094332d3Sopenharmony_ci} 92094332d3Sopenharmony_ci 93094332d3Sopenharmony_cistatic int32_t GetIfNamesByChipIdInner(const uint8_t chipId, char **ifNames, uint32_t *num) 94094332d3Sopenharmony_ci{ 95094332d3Sopenharmony_ci if (ifNames == NULL || num == NULL) { 96094332d3Sopenharmony_ci HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); 97094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 98094332d3Sopenharmony_ci } 99094332d3Sopenharmony_ci return HalCmdGetIfNamesByChipId(chipId, ifNames, num); 100094332d3Sopenharmony_ci} 101094332d3Sopenharmony_ci 102094332d3Sopenharmony_cistatic const char *GetNetworkIfaceName(const struct IWiFiBaseFeature *baseFeature) 103094332d3Sopenharmony_ci{ 104094332d3Sopenharmony_ci HalMutexLock(); 105094332d3Sopenharmony_ci const char *ifName = GetNetworkIfaceNameInner(baseFeature); 106094332d3Sopenharmony_ci HalMutexUnlock(); 107094332d3Sopenharmony_ci return ifName; 108094332d3Sopenharmony_ci} 109094332d3Sopenharmony_ci 110094332d3Sopenharmony_cistatic int32_t GetFeatureType(const struct IWiFiBaseFeature *baseFeature) 111094332d3Sopenharmony_ci{ 112094332d3Sopenharmony_ci HalMutexLock(); 113094332d3Sopenharmony_ci int32_t type = GetFeatureTypeInner(baseFeature); 114094332d3Sopenharmony_ci HalMutexUnlock(); 115094332d3Sopenharmony_ci return type; 116094332d3Sopenharmony_ci} 117094332d3Sopenharmony_ci 118094332d3Sopenharmony_cistatic int32_t SetMacAddress(const struct IWiFiBaseFeature *baseFeature, unsigned char *mac, uint8_t len) 119094332d3Sopenharmony_ci{ 120094332d3Sopenharmony_ci HalMutexLock(); 121094332d3Sopenharmony_ci int32_t ret = SetMacAddressInner(baseFeature, mac, len); 122094332d3Sopenharmony_ci HalMutexUnlock(); 123094332d3Sopenharmony_ci return ret; 124094332d3Sopenharmony_ci} 125094332d3Sopenharmony_ci 126094332d3Sopenharmony_cistatic int32_t GetDeviceMacAddress(const struct IWiFiBaseFeature *baseFeature, unsigned char *mac, uint8_t len) 127094332d3Sopenharmony_ci{ 128094332d3Sopenharmony_ci HalMutexLock(); 129094332d3Sopenharmony_ci int32_t ret = GetDeviceMacAddressInner(baseFeature, mac, len); 130094332d3Sopenharmony_ci HalMutexUnlock(); 131094332d3Sopenharmony_ci return ret; 132094332d3Sopenharmony_ci} 133094332d3Sopenharmony_ci 134094332d3Sopenharmony_cistatic int32_t GetValidFreqsWithBand(const struct IWiFiBaseFeature *baseFeature, 135094332d3Sopenharmony_ci int32_t band, int32_t *freqs, uint32_t size, uint32_t *num) 136094332d3Sopenharmony_ci{ 137094332d3Sopenharmony_ci HalMutexLock(); 138094332d3Sopenharmony_ci int32_t ret = GetValidFreqsWithBandInner(baseFeature, band, freqs, size, num); 139094332d3Sopenharmony_ci HalMutexUnlock(); 140094332d3Sopenharmony_ci return ret; 141094332d3Sopenharmony_ci} 142094332d3Sopenharmony_ci 143094332d3Sopenharmony_cistatic int32_t HalSetTxPower(const struct IWiFiBaseFeature *baseFeature, int32_t power) 144094332d3Sopenharmony_ci{ 145094332d3Sopenharmony_ci HalMutexLock(); 146094332d3Sopenharmony_ci int32_t ret = SetTxPowerInner(baseFeature, power); 147094332d3Sopenharmony_ci HalMutexUnlock(); 148094332d3Sopenharmony_ci return ret; 149094332d3Sopenharmony_ci} 150094332d3Sopenharmony_ci 151094332d3Sopenharmony_cistatic int32_t HalGetChipId(const struct IWiFiBaseFeature *baseFeature, uint8_t *chipId) 152094332d3Sopenharmony_ci{ 153094332d3Sopenharmony_ci HalMutexLock(); 154094332d3Sopenharmony_ci int32_t ret = GetChipIdInner(baseFeature, chipId); 155094332d3Sopenharmony_ci HalMutexUnlock(); 156094332d3Sopenharmony_ci return ret; 157094332d3Sopenharmony_ci} 158094332d3Sopenharmony_ci 159094332d3Sopenharmony_cistatic int32_t HalGetIfNamesByChipId(const uint8_t chipId, char **ifNames, uint32_t *num) 160094332d3Sopenharmony_ci{ 161094332d3Sopenharmony_ci HalMutexLock(); 162094332d3Sopenharmony_ci int32_t ret = GetIfNamesByChipIdInner(chipId, ifNames, num); 163094332d3Sopenharmony_ci HalMutexUnlock(); 164094332d3Sopenharmony_ci return ret; 165094332d3Sopenharmony_ci} 166094332d3Sopenharmony_ci 167094332d3Sopenharmony_cistatic int32_t HalResetToFactoryMacAddress(const char *ifName) 168094332d3Sopenharmony_ci{ 169094332d3Sopenharmony_ci HalMutexLock(); 170094332d3Sopenharmony_ci int32_t ret = HalCmdResetToFactoryMacAddress(ifName); 171094332d3Sopenharmony_ci HalMutexUnlock(); 172094332d3Sopenharmony_ci return ret; 173094332d3Sopenharmony_ci} 174094332d3Sopenharmony_ci 175094332d3Sopenharmony_ciint32_t InitBaseFeature(struct IWiFiBaseFeature **fe) 176094332d3Sopenharmony_ci{ 177094332d3Sopenharmony_ci if (fe == NULL || *fe == NULL) { 178094332d3Sopenharmony_ci HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); 179094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 180094332d3Sopenharmony_ci } 181094332d3Sopenharmony_ci (*fe)->getNetworkIfaceName = GetNetworkIfaceName; 182094332d3Sopenharmony_ci (*fe)->getFeatureType = GetFeatureType; 183094332d3Sopenharmony_ci (*fe)->setMacAddress = SetMacAddress; 184094332d3Sopenharmony_ci (*fe)->getDeviceMacAddress = GetDeviceMacAddress; 185094332d3Sopenharmony_ci (*fe)->getValidFreqsWithBand = GetValidFreqsWithBand; 186094332d3Sopenharmony_ci (*fe)->setTxPower = HalSetTxPower; 187094332d3Sopenharmony_ci (*fe)->getChipId = HalGetChipId; 188094332d3Sopenharmony_ci (*fe)->getIfNamesByChipId = HalGetIfNamesByChipId; 189094332d3Sopenharmony_ci (*fe)->resetToFactoryMacAddress = HalResetToFactoryMacAddress; 190094332d3Sopenharmony_ci return HDF_SUCCESS; 191094332d3Sopenharmony_ci} 192094332d3Sopenharmony_ci 193094332d3Sopenharmony_ci 194094332d3Sopenharmony_ci#ifdef __cplusplus 195094332d3Sopenharmony_ci#if __cplusplus 196094332d3Sopenharmony_ci} 197094332d3Sopenharmony_ci#endif 198094332d3Sopenharmony_ci#endif