diff --git a/wlan/README_zh.md b/wlan/README_zh.md index b8e05ccfdad98bc116e555e5b4b057620c5a3f3c..93c9ea22dfc7666c2728fcced4c88d42914b293c 100644 --- a/wlan/README_zh.md +++ b/wlan/README_zh.md @@ -51,7 +51,7 @@ WLAN驱动模块通过HAL/HDI层(HAL是直调,HDI是通过IPC调用)对Wi-Fi S
int32_t (*Start)(struct IWlanInterface *self);
@@ -371,7 +371,7 @@ HDI接口使用步骤: 代码示例: ``` -#include "v1_1/iwlan_interface.h" +#include "v1_2/iwlan_interface.h" #include "wlan_callback_impl.h" #include "wlan_impl.h" diff --git a/wlan/client/include/wifi_driver_client.h b/wlan/client/include/wifi_driver_client.h index e50b1ed71b90e3ef45b4b846b7309c8eb54b4a8c..f6154e53c26aed43c53f7bc321b6240a3b6aa711 100644 --- a/wlan/client/include/wifi_driver_client.h +++ b/wlan/client/include/wifi_driver_client.h @@ -345,6 +345,7 @@ int32_t GetStationInfo(const char *ifName, StationInfo *info, const uint8_t *mac int32_t WifiStartPnoScan(const char *ifName, const WifiPnoSettings *pnoSettings); int32_t WifiStopPnoScan(const char *ifName); int32_t WifiGetSignalPollInfo(const char *ifName, struct SignalResult *signalResult); +int32_t ClientGetApBandwidth(const char *ifName, uint8_t *bandwidth); /* wpa related interface */ #define MAX_NR_CIPHER_SUITES 5 diff --git a/wlan/client/src/netlink/netlink_cmd_adapter.c b/wlan/client/src/netlink/netlink_cmd_adapter.c index cabc2813b70634d8c0f17ca71b6cba1eec860576..cdd50b1430715388aef0d07890db173d6e9d59fd 100644 --- a/wlan/client/src/netlink/netlink_cmd_adapter.c +++ b/wlan/client/src/netlink/netlink_cmd_adapter.c @@ -69,6 +69,8 @@ #define CMD_SET_GO_DETECT_RADAR "CMD_SET_GO_DETECT_RADAR" #define CMD_SET_DYNAMIC_DBAC_MODE "SET_DYNAMIC_DBAC_MODE" #define CMD_SET_P2P_SCENES "CMD_SET_P2P_SCENES" +#define CMD_GET_AP_BANDWIDTH "GET_AP_BANDWIDTH" + #define P2P_BUF_SIZE 64 #define MAX_PRIV_CMD_SIZE 4096 #define LOW_LITMIT_FREQ_2_4G 2400 @@ -1599,18 +1601,16 @@ int32_t GetChannelMeasResult(const char *ifName, struct MeasResult *measResult) return RET_CODE_NOT_SUPPORT; } -static int32_t SendCommandToDriver(const char *cmd, uint32_t len, const char *ifName) +static int32_t SendCommandToDriver(const char *cmd, uint32_t len, const char *ifName, WifiPrivCmd *out) { struct ifreq ifr; - WifiPrivCmd privCmd = {0}; - uint8_t buf[MAX_PRIV_CMD_SIZE] = {0}; int32_t ret = RET_CODE_FAILURE; - if (cmd == NULL) { - HILOG_ERROR(LOG_CORE, "%{public}s: cmd is null", __FUNCTION__); + if (cmd == NULL || out == NULL) { + HILOG_ERROR(LOG_CORE, "%{public}s: cmd or out is null", __FUNCTION__); return RET_CODE_INVALID_PARAM; } - if (len > MAX_PRIV_CMD_SIZE) { + if (len > out->size) { HILOG_ERROR(LOG_CORE, "%{public}s: Size of command is too large", __FUNCTION__); return RET_CODE_INVALID_PARAM; } @@ -1618,14 +1618,12 @@ static int32_t SendCommandToDriver(const char *cmd, uint32_t len, const char *if HILOG_ERROR(LOG_CORE, "%s: memset_s ifr failed", __FUNCTION__); return RET_CODE_FAILURE; } - if (memcpy_s(buf, MAX_PRIV_CMD_SIZE, cmd, len) != EOK) { + if (memcpy_s(out->buf, out->size, cmd, len) != EOK) { HILOG_ERROR(LOG_CORE, "%{public}s: memcpy_s error", __FUNCTION__); return RET_CODE_FAILURE; } - privCmd.buf = buf; - privCmd.size = sizeof(buf); - privCmd.len = len; - ifr.ifr_data = (void *)&privCmd; + out->len = len; + ifr.ifr_data = (void *)out; if (strcpy_s(ifr.ifr_name, IFNAMSIZ, ifName) != EOK) { HILOG_ERROR(LOG_CORE, "%s: strcpy_s error", __FUNCTION__); return RET_CODE_FAILURE; @@ -1644,11 +1642,6 @@ static int32_t SendCommandToDriver(const char *cmd, uint32_t len, const char *if ret = (errno == EOPNOTSUPP) ? RET_CODE_NOT_SUPPORT : RET_CODE_FAILURE; break; } - (void)memset_s((void *)cmd, len, 0, len); - if (memcpy_s((void *)cmd, len, privCmd.buf, len - 1) != EOK) { - HILOG_ERROR(LOG_CORE, "%{public}s: memcpy_s error", __FUNCTION__); - ret = RET_CODE_FAILURE; - } } while (0); close(sock); @@ -1694,7 +1687,11 @@ static int32_t DisableNextCacOnce(const char *ifName) { char cmdBuf[P2P_BUF_SIZE] = {CMD_SET_CLOSE_GO_CAC}; - return SendCommandToDriver(cmdBuf, P2P_BUF_SIZE, ifName); + uint8_t buf[MAX_PRIV_CMD_SIZE] = {0}; + WifiPrivCmd out = {0}; + out.buf = buf; + out.size = MAX_PRIV_CMD_SIZE; + return SendCommandToDriver(cmdBuf, P2P_BUF_SIZE, ifName, &out); } static int32_t SetGoChannel(const char *ifName, const int8_t *data, uint32_t len) @@ -1718,7 +1715,12 @@ static int32_t SetGoChannel(const char *ifName, const int8_t *data, uint32_t len HILOG_ERROR(LOG_CORE, "%{public}s: interface state is not OK.", __FUNCTION__); return RET_CODE_NETDOWN; } - return SendCommandToDriver(cmdBuf, P2P_BUF_SIZE, ifName); + + uint8_t buf[MAX_PRIV_CMD_SIZE] = {0}; + WifiPrivCmd out = {0}; + out.buf = buf; + out.size = MAX_PRIV_CMD_SIZE; + return SendCommandToDriver(cmdBuf, P2P_BUF_SIZE, ifName, &out); } static int32_t SetGoDetectRadar(const char *ifName, const int8_t *data, uint32_t len) @@ -1742,7 +1744,12 @@ static int32_t SetGoDetectRadar(const char *ifName, const int8_t *data, uint32_t HILOG_ERROR(LOG_CORE, "%{public}s: interface state is not OK.", __FUNCTION__); return RET_CODE_NETDOWN; } - return SendCommandToDriver(cmdBuf, P2P_BUF_SIZE, ifName); + + uint8_t buf[MAX_PRIV_CMD_SIZE] = {0}; + WifiPrivCmd out = {0}; + out.buf = buf; + out.size = MAX_PRIV_CMD_SIZE; + return SendCommandToDriver(cmdBuf, P2P_BUF_SIZE, ifName, &out); } static int32_t SetP2pScenes(const char *ifName, const int8_t *data, uint32_t len) @@ -1766,7 +1773,12 @@ static int32_t SetP2pScenes(const char *ifName, const int8_t *data, uint32_t len HILOG_ERROR(LOG_CORE, "%{public}s: interface state is not OK.", __FUNCTION__); return RET_CODE_NETDOWN; } - return SendCommandToDriver(cmdBuf, P2P_BUF_SIZE, ifName); + + uint8_t buf[MAX_PRIV_CMD_SIZE] = {0}; + WifiPrivCmd out = {0}; + out.buf = buf; + out.size = MAX_PRIV_CMD_SIZE; + return SendCommandToDriver(cmdBuf, P2P_BUF_SIZE, ifName, &out); } static int32_t SetDynamicDbacMode(const char *ifName, const int8_t *data, uint32_t len) @@ -1790,7 +1802,12 @@ static int32_t SetDynamicDbacMode(const char *ifName, const int8_t *data, uint32 HILOG_ERROR(LOG_CORE, "%{public}s: interface state is not OK.", __FUNCTION__); return RET_CODE_NETDOWN; } - return SendCommandToDriver(cmdBuf, P2P_BUF_SIZE, ifName); + + uint8_t buf[MAX_PRIV_CMD_SIZE] = {0}; + WifiPrivCmd out = {0}; + out.buf = buf; + out.size = MAX_PRIV_CMD_SIZE; + return SendCommandToDriver(cmdBuf, P2P_BUF_SIZE, ifName, &out); } int32_t SetProjectionScreenParam(const char *ifName, const ProjectionScreenParam *param) @@ -2647,6 +2664,29 @@ static int32_t SignalInfoHandler(struct nl_msg *msg, void *arg) return NL_SKIP; } +int32_t ClientGetApBandwidth(const char *ifName, uint8_t *bandwidth) +{ + if (ifName == NULL || bandwidth == NULL) { + HILOG_ERROR(LOG_CORE, "%s: param is NULL.", __FUNCTION__); + return RET_CODE_FAILURE; + } + + const char *cmd = CMD_GET_AP_BANDWIDTH; + uint8_t buf[MAX_PRIV_CMD_SIZE] = {0}; + WifiPrivCmd out = {0}; + out.buf = buf; + out.size = MAX_PRIV_CMD_SIZE; + int32_t ret = SendCommandToDriver(cmd, strlen(cmd), ifName, &out); + if (ret != RET_CODE_SUCCESS) { + HILOG_ERROR(LOG_CORE, "%s: send command to driver failed, code=%d", __FUNCTION__, ret); + return ret; + } + *bandwidth = *out.buf; + + HILOG_INFO(LOG_CORE, "%s: AP bandwidth: %d", __FUNCTION__, *bandwidth); + return RET_CODE_SUCCESS; +} + int32_t WifiGetSignalPollInfo(const char *ifName, struct SignalResult *signalResult) { struct nl_msg *msg = NULL; diff --git a/wlan/client/src/sbuf/sbuf_cmd_adapter.c b/wlan/client/src/sbuf/sbuf_cmd_adapter.c index a6a2d8c185f6173bec9d8d81a3dc19c80caf7cc4..5e6fe4c090425cc9e96c48d6568c53911e7d08ad 100644 --- a/wlan/client/src/sbuf/sbuf_cmd_adapter.c +++ b/wlan/client/src/sbuf/sbuf_cmd_adapter.c @@ -1083,6 +1083,40 @@ int32_t WifiStopPnoScan(const char *ifName) return ret; } +int32_t ClientGetApBandwidth(const char *ifName, uint8_t *bandwidth) +{ + int32_t ret; + struct HdfSBuf *data = NULL; + struct HdfSBuf *reply = NULL; + + if (HdfSbufObtainDefault(&data, &reply) != RET_CODE_SUCCESS) { + HDF_LOGE("%s: HdfSbufObtainDefault fail", __FUNCTION__); + return RET_CODE_FAILURE; + } + + do { + if (!HdfSbufWriteString(data, ifName)) { + HDF_LOGE("%s: write ifName fail!", __FUNCTION__); + ret = RET_CODE_FAILURE; + break; + } + ret = SendCmdSync(WIFI_HAL_CMD_GET_AP_BANDWIDTH, data, reply); + if (ret != RET_CODE_SUCCESS) { + HDF_LOGE("%s: SendCmdSync fail, code=%d", __FUNCTION__, ret); + break; + } + if (!HdfSbufReadUint8(reply, bandwidth)) { + HDF_LOGE("%s: HdfSbufReadUint8 failed", __FUNCTION__); + ret = RET_CODE_FAILURE; + break; + } + } while (0); + + HdfSbufRecycle(data); + HdfSbufRecycle(reply); + return ret; +} + int32_t WifiGetSignalPollInfo(const char *ifName, struct SignalResult *signalResult) { int32_t ret = RET_CODE_FAILURE; diff --git a/wlan/client/src/wifi_common_cmd.h b/wlan/client/src/wifi_common_cmd.h index 35cd5c49569f27d01876dd16fe05f24eb16ffce6..3ba0c2e636f576ee8b1c188aa568dc94e82735f2 100644 --- a/wlan/client/src/wifi_common_cmd.h +++ b/wlan/client/src/wifi_common_cmd.h @@ -69,6 +69,7 @@ enum APCommands { CMD_AP_DEL_STATION, CMD_AP_GET_ASSOC_STA, CMD_AP_SET_COUNTRY_CODE, + CMD_AP_GET_BANDWIDTH, }; enum STACommands { @@ -119,6 +120,7 @@ typedef enum { WIFI_HAL_CMD_START_PNO_SCAN = HDF_WIFI_CMD(STA_SERVICE_ID, CMD_STA_START_PNO_SCAN), WIFI_HAL_CMD_STOP_PNO_SCAN = HDF_WIFI_CMD(STA_SERVICE_ID, CMD_STA_STOP_PNO_SCAN), WIFI_HAL_CMD_GET_SIGNAL_INFO = HDF_WIFI_CMD(STA_SERVICE_ID, CMD_STA_GET_SIGNAL_INFO), + WIFI_HAL_CMD_GET_AP_BANDWIDTH = HDF_WIFI_CMD(AP_SERVICE_ID, CMD_AP_GET_BANDWIDTH), } WifiHalCmd; typedef enum { diff --git a/wlan/hal/include/wifi_hal_cmd.h b/wlan/hal/include/wifi_hal_cmd.h index 352aea6d6b14ca43b36ac9340fd4ee1e0c1d4759..80ccfc5664d3f879e029cbb95eb2db83f0bb622d 100644 --- a/wlan/hal/include/wifi_hal_cmd.h +++ b/wlan/hal/include/wifi_hal_cmd.h @@ -44,6 +44,9 @@ int32_t HalCmdStartScanInner(const char *ifName, WifiScan *scan); int32_t HalCmdStartPnoScan(const char *ifName, const WifiPnoSettings *pnoSettings); int32_t HalCmdStopPnoScan(const char *ifName); int32_t HalCmdGetSignalPollInfo(const char *ifName, struct SignalResult *signalResult); +int32_t HalCmdGetFeatureByIfName(const char *ifName, struct IWiFiBaseFeature **ifeature); +int32_t HalCmdGetApBandwidth(const char *ifName, uint8_t *bandwidth); +int32_t HalCmdResetToFactoryMacAddress(const char *ifNames); struct DListHead *GetNetworkHead(void); void ClearIWiFiList(void); diff --git a/wlan/hal/src/wifi_hal.c b/wlan/hal/src/wifi_hal.c index 7fa39533cb04a61f9293b59d51af8e5d603c6bb7..72c20b80a5e819dda425309a44e3cb1ba4e6ea3a 100644 --- a/wlan/hal/src/wifi_hal.c +++ b/wlan/hal/src/wifi_hal.c @@ -182,25 +182,6 @@ static int32_t CreateFeatureInner(int32_t type, struct IWiFiBaseFeature **ifeatu return HDF_SUCCESS; } -static int32_t GetFeatureByIfNameInner(const char *ifName, struct IWiFiBaseFeature **ifeature) -{ - struct DListHead *networkHead = GetNetworkHead(); - struct IWiFiList *networkNode = NULL; - - if (ifName == NULL) { - HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); - return HDF_ERR_INVALID_PARAM; - } - DLIST_FOR_EACH_ENTRY(networkNode, networkHead, struct IWiFiList, entry) { - if (strcmp(networkNode->ifName, ifName) == HDF_SUCCESS) { - *ifeature = networkNode->ifeature; - return HDF_SUCCESS; - } - } - HDF_LOGE("%s: cannot find feature by ifName, line: %d", __FUNCTION__, __LINE__); - return HDF_FAILURE; -} - static int32_t DestroyFeatureInner(struct IWiFiBaseFeature *ifeature) { struct DListHead *networkHead = GetNetworkHead(); @@ -394,7 +375,7 @@ static int32_t CreateFeature(int32_t type, struct IWiFiBaseFeature **ifeature) static int32_t GetFeatureByIfName(const char *ifName, struct IWiFiBaseFeature **ifeature) { HalMutexLock(); - int32_t ret = GetFeatureByIfNameInner(ifName, ifeature); + int32_t ret = HalCmdGetFeatureByIfName(ifName, ifeature); HalMutexUnlock(); return ret; } diff --git a/wlan/hal/src/wifi_hal_ap_feature.c b/wlan/hal/src/wifi_hal_ap_feature.c index 9303993d13822501a506be87bfe55dd46607d213..7de24ea75d665cb5a9bfa8229282cf3bc32a4acf 100644 --- a/wlan/hal/src/wifi_hal_ap_feature.c +++ b/wlan/hal/src/wifi_hal_ap_feature.c @@ -62,6 +62,14 @@ static int32_t HalSetCountryCode(const struct IWiFiAp *apFeature, const char *co return ret; } +static int32_t HalGetApBandwidth(const char *ifName, uint8_t *bandwidth) +{ + HalMutexLock(); + int32_t ret = HalCmdGetApBandwidth(ifName, bandwidth); + HalMutexUnlock(); + return ret; +} + int32_t InitApFeature(struct IWiFiAp **fe) { if (fe == NULL || *fe == NULL) { @@ -74,6 +82,7 @@ int32_t InitApFeature(struct IWiFiAp **fe) } (*fe)->getAssociatedStas = HalGetAssociatedStas; (*fe)->setCountryCode = HalSetCountryCode; + (*fe)->getApBandwidth = HalGetApBandwidth; return HDF_SUCCESS; } diff --git a/wlan/hal/src/wifi_hal_base_feature.c b/wlan/hal/src/wifi_hal_base_feature.c index 35c568d7a2199c9cb7430024aabb6ea4e9969f07..6d5cf1110247e2eda99b380f3e7866bd9d7570db 100644 --- a/wlan/hal/src/wifi_hal_base_feature.c +++ b/wlan/hal/src/wifi_hal_base_feature.c @@ -164,6 +164,14 @@ static int32_t HalGetIfNamesByChipId(const uint8_t chipId, char **ifNames, uint3 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) { @@ -178,6 +186,7 @@ int32_t InitBaseFeature(struct IWiFiBaseFeature **fe) (*fe)->setTxPower = HalSetTxPower; (*fe)->getChipId = HalGetChipId; (*fe)->getIfNamesByChipId = HalGetIfNamesByChipId; + (*fe)->resetToFactoryMacAddress = HalResetToFactoryMacAddress; return HDF_SUCCESS; } diff --git a/wlan/hal/src/wifi_hal_cmd.c b/wlan/hal/src/wifi_hal_cmd.c index fbd7e23edbca15a82238406c394a1733bd130da4..4dd6cc72649fce7df4d3dbdb7c27608b3fc181ff 100644 --- a/wlan/hal/src/wifi_hal_cmd.c +++ b/wlan/hal/src/wifi_hal_cmd.c @@ -296,6 +296,58 @@ int32_t HalCmdSetResetDriver(const uint8_t chipId, const char *ifName) return ret; } +int32_t HalCmdGetFeatureByIfName(const char *ifName, struct IWiFiBaseFeature **ifeature) +{ + struct DListHead *networkHead = GetNetworkHead(); + struct IWiFiList *networkNode = NULL; + + if (ifName == NULL || ifeature == NULL) { + HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); + return HDF_ERR_INVALID_PARAM; + } + DLIST_FOR_EACH_ENTRY(networkNode, networkHead, struct IWiFiList, entry) { + if (strcmp(networkNode->ifName, ifName) == HDF_SUCCESS) { + *ifeature = networkNode->ifeature; + return HDF_SUCCESS; + } + } + HDF_LOGE("%s: cannot find feature by ifName, line: %d", __FUNCTION__, __LINE__); + return HDF_FAILURE; +} + +int32_t HalCmdGetApBandwidth(const char *ifName, uint8_t *bandwidth) +{ + int32_t ret = ClientGetApBandwidth(ifName, bandwidth); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: get ap bandwidth failed, code=%d", __FUNCTION__, ret); + } + return ret; +} + +int32_t HalCmdResetToFactoryMacAddress(const char *ifName) +{ + int32_t ret; + struct IWiFiBaseFeature *ifeature = NULL; + ret = HalCmdGetFeatureByIfName(ifName, &ifeature); + if (ret != HDF_SUCCESS || ifeature == NULL) { + HDF_LOGE("%s: hal cmd get devmac addr failed, code=%d", __FUNCTION__, ret); + return ret; + } + + unsigned char mac[ETH_ADDR_LEN] = {0}; + ret = HalCmdGetDevMacAddr(ifName, ifeature->type, mac, ETH_ADDR_LEN); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: hal cmd get devmac addr failed, code=%d", __FUNCTION__, ret); + return ret; + } + + ret = HalCmdSetMacAddr(ifName, mac, ETH_ADDR_LEN); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: hal cmd set mac addr failed, code=%d", __FUNCTION__, ret); + } + return ret; +} + void ClearIWiFiList(void) { struct IWiFiList *networkList = NULL; diff --git a/wlan/hdi_service/BUILD.gn b/wlan/hdi_service/BUILD.gn index e086c1e868feefeb08947be89d86f5b77770fc9f..c2f6da757597c05d7ed9f5f42dd148e954890393 100644 --- a/wlan/hdi_service/BUILD.gn +++ b/wlan/hdi_service/BUILD.gn @@ -13,7 +13,7 @@ import("//build/ohos.gni") -ohos_shared_library("libwlan_interface_service_1.1") { +ohos_shared_library("libwlan_interface_service_1.2") { include_dirs = [ "../interfaces/include", "../client/include", @@ -30,7 +30,7 @@ ohos_shared_library("libwlan_interface_service_1.1") { "../hal:wifi_hal", "service_extend:libwlan_service_extend", ] - external_deps = [ "drivers_interface_wlan:libwlan_stub_1.1" ] + external_deps = [ "drivers_interface_wlan:libwlan_stub_1.2" ] defines = [ "__OHOS__USER__" ] @@ -70,10 +70,10 @@ ohos_shared_library("libwifi_hdi_c_device") { sources = [ "wlan_interface_drivers.c" ] deps = [ - ":libwlan_interface_service_1.1", + ":libwlan_interface_service_1.2", "service_extend:libwlan_service_extend", ] - external_deps = [ "drivers_interface_wlan:libwlan_stub_1.1" ] + external_deps = [ "drivers_interface_wlan:libwlan_stub_1.2" ] cflags = [ "-Wall", @@ -106,6 +106,6 @@ ohos_shared_library("libwifi_hdi_c_device") { group("hdi_wlan_service") { deps = [ ":libwifi_hdi_c_device", - ":libwlan_interface_service_1.1", + ":libwlan_interface_service_1.2", ] } diff --git a/wlan/hdi_service/service_common/wlan_common_cmd.c b/wlan/hdi_service/service_common/wlan_common_cmd.c index 41f4bd692add64aeb9f01d0cb8b28c6fffeb563c..d9e172daeefc6bbe02bb868dbec62737f073c320 100644 --- a/wlan/hdi_service/service_common/wlan_common_cmd.c +++ b/wlan/hdi_service/service_common/wlan_common_cmd.c @@ -19,8 +19,8 @@ #include