/* * Copyright (c) 2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "wifi_hal_base_feature.h" #include "hdf_base.h" #include "hdf_log.h" #include "securec.h" #include "wifi_hal_cmd.h" #include "wifi_hal_util.h" #ifdef __cplusplus #if __cplusplus extern "C" { #endif #endif static const char *GetNetworkIfaceNameInner(const struct IWiFiBaseFeature *baseFeature) { if (baseFeature == NULL) { HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); return NULL; } return baseFeature->ifName; } static int32_t GetFeatureTypeInner(const struct IWiFiBaseFeature *baseFeature) { if (baseFeature == NULL) { HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); return HDF_FAILURE; } return baseFeature->type; } static int32_t SetMacAddressInner(const struct IWiFiBaseFeature *baseFeature, unsigned char *mac, uint8_t len) { if (baseFeature == NULL || mac == NULL || len != WIFI_MAC_ADDR_LENGTH) { HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); return HDF_ERR_INVALID_PARAM; } return HalCmdSetMacAddr(baseFeature->ifName, mac, len); } static int32_t GetDeviceMacAddressInner(const struct IWiFiBaseFeature *baseFeature, unsigned char *mac, uint8_t len) { if (baseFeature == NULL || mac == NULL || len != WIFI_MAC_ADDR_LENGTH) { HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); return HDF_ERR_INVALID_PARAM; } return HalCmdGetDevMacAddr(baseFeature->ifName, baseFeature->type, mac, len); } static int32_t GetValidFreqsWithBandInner(const struct IWiFiBaseFeature *baseFeature, int32_t band, int32_t *freqs, uint32_t size, uint32_t *num) { if (baseFeature == NULL || freqs == NULL || size < MAX_CHANNEL_NUM || num == NULL || band < 0) { HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); return HDF_ERR_INVALID_PARAM; } return HalCmdGetValidFreqWithBand(baseFeature->ifName, band, freqs, size, num); } static int32_t SetTxPowerInner(const struct IWiFiBaseFeature *baseFeature, int32_t power) { if (baseFeature == NULL || power <= 0) { HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); return HDF_ERR_INVALID_PARAM; } return HalCmdSetTxPower(baseFeature->ifName, power); } static int32_t GetChipIdInner(const struct IWiFiBaseFeature *baseFeature, uint8_t *chipId) { if (baseFeature == NULL || chipId == NULL) { HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); return HDF_ERR_INVALID_PARAM; } return HalCmdGetChipId(baseFeature->ifName, chipId); } static int32_t GetIfNamesByChipIdInner(const uint8_t chipId, char **ifNames, uint32_t *num) { if (ifNames == NULL || num == NULL) { HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); return HDF_ERR_INVALID_PARAM; } return HalCmdGetIfNamesByChipId(chipId, ifNames, num); } static const char *GetNetworkIfaceName(const struct IWiFiBaseFeature *baseFeature) { HalMutexLock(); const char *ifName = GetNetworkIfaceNameInner(baseFeature); HalMutexUnlock(); return ifName; } static int32_t GetFeatureType(const struct IWiFiBaseFeature *baseFeature) { HalMutexLock(); int32_t type = GetFeatureTypeInner(baseFeature); HalMutexUnlock(); return type; } static int32_t SetMacAddress(const struct IWiFiBaseFeature *baseFeature, unsigned char *mac, uint8_t len) { HalMutexLock(); int32_t ret = SetMacAddressInner(baseFeature, mac, len); HalMutexUnlock(); return ret; } static int32_t GetDeviceMacAddress(const struct IWiFiBaseFeature *baseFeature, unsigned char *mac, uint8_t len) { HalMutexLock(); int32_t ret = GetDeviceMacAddressInner(baseFeature, mac, len); HalMutexUnlock(); return ret; } static int32_t GetValidFreqsWithBand(const struct IWiFiBaseFeature *baseFeature, int32_t band, int32_t *freqs, uint32_t size, uint32_t *num) { HalMutexLock(); int32_t ret = GetValidFreqsWithBandInner(baseFeature, band, freqs, size, num); HalMutexUnlock(); return ret; } static int32_t HalSetTxPower(const struct IWiFiBaseFeature *baseFeature, int32_t power) { HalMutexLock(); int32_t ret = SetTxPowerInner(baseFeature, power); HalMutexUnlock(); return ret; } static int32_t HalGetChipId(const struct IWiFiBaseFeature *baseFeature, uint8_t *chipId) { HalMutexLock(); int32_t ret = GetChipIdInner(baseFeature, chipId); HalMutexUnlock(); return ret; } static int32_t HalGetIfNamesByChipId(const uint8_t chipId, char **ifNames, uint32_t *num) { HalMutexLock(); int32_t ret = GetIfNamesByChipIdInner(chipId, ifNames, num); HalMutexUnlock(); return ret; } static int32_t HalResetToFactoryMacAddress(const char *ifName) { HalMutexLock(); int32_t ret = HalCmdResetToFactoryMacAddress(ifName); HalMutexUnlock(); return ret; } int32_t InitBaseFeature(struct IWiFiBaseFeature **fe) { if (fe == NULL || *fe == NULL) { HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); return HDF_ERR_INVALID_PARAM; } (*fe)->getNetworkIfaceName = GetNetworkIfaceName; (*fe)->getFeatureType = GetFeatureType; (*fe)->setMacAddress = SetMacAddress; (*fe)->getDeviceMacAddress = GetDeviceMacAddress; (*fe)->getValidFreqsWithBand = GetValidFreqsWithBand; (*fe)->setTxPower = HalSetTxPower; (*fe)->getChipId = HalGetChipId; (*fe)->getIfNamesByChipId = HalGetIfNamesByChipId; (*fe)->resetToFactoryMacAddress = HalResetToFactoryMacAddress; return HDF_SUCCESS; } #ifdef __cplusplus #if __cplusplus } #endif #endif