diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_manager.cpp b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_manager.cpp index 8d41032a1cc97df650e083e8ac6424c9f27c1430..07321a7579b8215628cc585de1d6b629cfcc766f 100644 --- a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_manager.cpp +++ b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_manager.cpp @@ -1236,6 +1236,12 @@ void WifiManager::DealStaConnChanged(OperateResState state, const WifiLinkedInfo WifiInternalEventDispatcher::GetInstance().AddBroadCastMsg(cbMsg); } + if(info.detailedState == DetailedState::PASSWORD_ERROR){ + IStaService *pService = WifiServiceManager::GetInstance().GetStaServiceInst(); + if (pService != nullptr) { + pService->EnableOrDisableBssid(info.bssid, false, static_cast(info.detailedState)); + } + } if (state == OperateResState::CONNECT_CONNECTING || state == OperateResState::CONNECT_AP_CONNECTED || state == OperateResState::DISCONNECT_DISCONNECTING || state == OperateResState::DISCONNECT_DISCONNECTED || state == OperateResState::CONNECT_OBTAINING_IP || state == OperateResState::CONNECT_ASSOCIATING || diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/ista_service.h b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/ista_service.h index 2c9228aa96c6efd0eae3950856e18bfb6a4d92e9..bfba73b38e12dccc96522a688a982edc0fc707f0 100644 --- a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/ista_service.h +++ b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/ista_service.h @@ -228,7 +228,16 @@ public: * @return success: WIFI_OPT_SUCCESS, failed: WIFI_OPT_FAILED */ virtual ErrCode OnScreenStateChanged(int screenState) = 0; + /** + * @Description EnableOrDisableBssid + * + * @param enable: true to delete bssid from blocklist, false to add bssid to blocklist. + * @return WifiErrorNo + */ + + virtual ErrCode EnableOrDisableBssid(std::string bssid, bool enable, int reason) = 0; + /** * @Description start portal certification. * * @return success: WIFI_OPT_SUCCESS, failed: WIFI_OPT_FAILED @@ -237,4 +246,4 @@ public: }; } // namespace Wifi } // namespace OHOS -#endif \ No newline at end of file +#endif diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_auto_connect_service.cpp b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_auto_connect_service.cpp index 280f39d223e80d31c15ca6419659f4272358b593..6efc82ce86ade5cca26618a9fabcaae9735e4138 100644 --- a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_auto_connect_service.cpp +++ b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_auto_connect_service.cpp @@ -79,7 +79,7 @@ void StaAutoConnectService::OnScanInfosReadyHandler(const std::vector blockedBssids; GetBlockedBssids(blockedBssids); @@ -218,11 +218,20 @@ void StaAutoConnectService::ConnectElectedDevice(WifiDeviceConfig &electedDevice currentConnectedNetwork.detailedState == DetailedState::PASSWORD_ERROR || currentConnectedNetwork.detailedState == DetailedState::CONNECTION_FULL || currentConnectedNetwork.detailedState == DetailedState::CONNECTION_REJECT) { - pStaStateMachine->SendMessage(WIFI_SVR_CMD_STA_CONNECT_SAVED_NETWORK, + if (electedDevice.userSelectBssid != electedDevice.bssid) { + pStaStateMachine->SendMessage(WIFI_SVR_CMD_STA_CONNECT_DIFF_BSSID_NETWORK, + electedDevice.networkId, + NETWORK_SELECTED_BY_AUTO, + electedDevice.bssid); + WIFI_LOGI("connectTo same ssid, networkId: %{public}d, new bssid: %{public}s.\n", + electedDevice.networkId, electedDevice.bssid.c_str()); + } else { + pStaStateMachine->SendMessage(WIFI_SVR_CMD_STA_CONNECT_SAVED_NETWORK, electedDevice.networkId, NETWORK_SELECTED_BY_AUTO); WIFI_LOGI("connectTo save networkId: %{public}d, preShareKey len: %{public}d.\n", electedDevice.networkId, (int)electedDevice.preSharedKey.length()); + } } else { WIFI_LOGE("The current connection status is %{public}d.\n", currentConnectedNetwork.detailedState); } @@ -261,7 +270,8 @@ bool StaAutoConnectService::ObtainRoamCapFromFirmware() if (WifiStaHalInterface::GetInstance().GetStaCapabilities(capabilities) == WIFI_IDL_OPT_OK) { if ((capabilities & STA_CAP_ROAMING) == 0) { WIFI_LOGE("Firmware roaming is not supported.\n"); - return false; + firmwareRoamFlag = false; + return false; } } diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_auto_connect_service.h b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_auto_connect_service.h index a5f4c26527de4d1fa7c64f0c54d9fd0d41760074..b775d04cc77d185a58f7b1a7241261d6a2d905ff 100644 --- a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_auto_connect_service.h +++ b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_auto_connect_service.h @@ -32,6 +32,7 @@ namespace OHOS { namespace Wifi { static const int MAX_BSSID_BLOCKLIST_COUNT = 3; static const int AP_CANNOT_HANDLE_NEW_STA = 17; +static const int PASSWORD_ERROR = 15; static const int MAX_BSSID_BLOCKLIST_TIME = 60; // 60s static const int BLOCKLIST_INVALID_SIZE = -1; static const int STA_CAP_ROAMING = 0x800000; @@ -232,4 +233,4 @@ private: }; } // namespace Wifi } // namespace OHOS -#endif \ No newline at end of file +#endif diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_define.h b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_define.h index 48bd0f9b9290c35462275c9f8a9e6ea05535f4dc..e035af202baa449e39bad5c3d5ff74250a8862c3 100644 --- a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_define.h +++ b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_define.h @@ -34,6 +34,7 @@ namespace Wifi { #define WIFI_SVR_CMD_STA_STARTWPS 0x2009 #define WIFI_SVR_CMD_STA_CANCELWPS 0x200A #define WIFI_SVR_COM_STA_START_ROAM 0x200B +#define WIFI_SVR_CMD_STA_CONNECT_DIFF_BSSID_NETWORK 0x200C #define WIFI_SVR_CMD_STA_ERROR 0x3001 #define WIFI_SVR_CMD_STA_SUP_CONNECTION_EVENT 0x3002 diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_interface.cpp b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_interface.cpp index 934289c6813e78365a6e3e58e66449446b7e6045..fe07fe49093f6c57077e6e036452eacc2d0c607b 100644 --- a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_interface.cpp +++ b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_interface.cpp @@ -340,6 +340,17 @@ ErrCode StaInterface::OnScreenStateChanged(int screenState) return WIFI_OPT_SUCCESS; } +ErrCode StaInterface::EnableOrDisableBssid(std::string bssid, bool enable, int reason) +{ + LOGD("Enter StaInterface::EnableOrDisableBssid.\n"); + std::lock_guard lock(mutex); + CHECK_NULL_AND_RETURN(pStaService, WIFI_OPT_FAILED); + if (pStaService->EnableOrDisableBssid(bssid,enable,reason) != WIFI_OPT_SUCCESS) { + LOGD("EnableOrDisableBssid success.\n"); + return WIFI_OPT_SUCCESS; + } + return WIFI_OPT_FAILED; +} ErrCode StaInterface::StartPortalCertification() { WIFI_LOGI("Enter StaInterface::StartPortalCertification"); diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_interface.h b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_interface.h index 074025bf6dafe9ab8831fe94401f65336ae7c25e..8e6c3358d71acdf12b3d3a7326e78eb45f81774d 100644 --- a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_interface.h +++ b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_interface.h @@ -227,6 +227,14 @@ public: * @return success: WIFI_OPT_SUCCESS, failed: WIFI_OPT_FAILED */ virtual ErrCode OnScreenStateChanged(int screenState) override; + + /** + * @Description EnableOrDisableBssid + * + * @param enable: true to delete bssid from blocklist, false to add bssid to blocklist. + * @return WifiErrorNo + */ + virtual ErrCode EnableOrDisableBssid(std::string bssid, bool enable, int reason) override; /** * @Description start portal certification. * @@ -241,4 +249,4 @@ private: }; } // namespace Wifi } // namespace OHOS -#endif \ No newline at end of file +#endif diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_saved_device_appraisal.cpp b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_saved_device_appraisal.cpp index 491553f57b594c1e0fa49a77698a2a9fdb719100..fb20f0f3b5b6e592b233b81ecf2b874100ccd6fb 100644 --- a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_saved_device_appraisal.cpp +++ b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_saved_device_appraisal.cpp @@ -70,6 +70,7 @@ ErrCode StaSavedDeviceAppraisal::DeviceAppraisals( if (CheckHigherPriority(score, highestScore, scanInfo.rssi, scanInfoElected.rssi)) { highestScore = score; scanInfoElected.rssi = scanInfo.rssi; + device.bssid = scanInfo.bssid; electedDevice = device; electedDevice.bssid = scanInfo.bssid; sign = 1; @@ -232,4 +233,4 @@ bool StaSavedDeviceAppraisal::CheckHigherPriority(int score, int lastScore, int return higerPriority; } } // namespace Wifi -} // namespace OHOS \ No newline at end of file +} // namespace OHOS diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_service.cpp b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_service.cpp index 389645ba41a92b0f3d7d1966084d98c439d770ab..ac470cf6e4dda2b399c4d9c5faa3cb342d3d5d7b 100644 --- a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_service.cpp +++ b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_service.cpp @@ -561,6 +561,16 @@ void StaService::HandleScreenStatusChanged(int screenState) #endif return; } + +bool StaService::EnableOrDisableBssid(std::string bssid, bool enable, int reason) +{ + WIFI_LOGI("Enter StaService::EnableOrDisableBssid."); + if (pStaAutoConnectService == nullptr) { + return false; + } + return pStaAutoConnectService->EnableOrDisableBssid(bssid,enable,reason); +} + ErrCode StaService::StartPortalCertification() { if (pStaStateMachine == nullptr) { diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_service.h b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_service.h index 26ece65ccd57fae1742f0c2cbe9152e97dee0a8d..82e3b3a6e910c8873040c7e70668956986c78561 100644 --- a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_service.h +++ b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_service.h @@ -237,6 +237,14 @@ public: * */ virtual void HandleScreenStatusChanged(int screenState); + + /** + * @Description To add or delete bssid from blocklist depends param enable + * + * @Return true or false + */ + virtual bool EnableOrDisableBssid(std::string bssid, bool enable, int reason); + /** * @Description start portal certification. * @@ -265,4 +273,4 @@ private: }; } // namespace Wifi } // namespace OHOS -#endif \ No newline at end of file +#endif diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_state_machine.cpp b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_state_machine.cpp index 0a427833b889b81a6c97fc928779f9c2ffa350c7..d3a52214d15ea46e3a858fd3b7d05db43ea93c1e 100644 --- a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_state_machine.cpp +++ b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_state_machine.cpp @@ -71,6 +71,7 @@ StaStateMachine::StaStateMachine(int instId) pDhcpService(nullptr), pDhcpResultNotify(nullptr), pNetcheck(nullptr), + bssidBeforePwdError(""), pRootState(nullptr), pInitState(nullptr), pWpaStartingState(nullptr), @@ -786,6 +787,7 @@ int StaStateMachine::InitStaSMHandleMap() staSmHandleFuncMap[CMD_SIGNAL_POLL] = &StaStateMachine::DealSignalPollResult; staSmHandleFuncMap[WIFI_SVR_CMD_STA_CONNECT_NETWORK] = &StaStateMachine::DealConnectToUserSelectedNetwork; staSmHandleFuncMap[WIFI_SVR_CMD_STA_CONNECT_SAVED_NETWORK] = &StaStateMachine::DealConnectToUserSelectedNetwork; + staSmHandleFuncMap[WIFI_SVR_CMD_STA_CONNECT_DIFF_BSSID_NETWORK] = &StaStateMachine::DealConnectToDiffBssidNetwork; staSmHandleFuncMap[WIFI_SVR_CMD_STA_NETWORK_DISCONNECTION_EVENT] = &StaStateMachine::DealDisconnectEvent; staSmHandleFuncMap[WIFI_SVR_CMD_STA_NETWORK_CONNECTION_EVENT] = &StaStateMachine::DealConnectionEvent; staSmHandleFuncMap[CMD_NETWORK_CONNECT_TIMEOUT] = &StaStateMachine::DealConnectTimeOutCmd; @@ -976,6 +978,18 @@ void StaStateMachine::Wpa3TransitionChangeIfNeed(int networkId) void StaStateMachine::DealConnectToUserSelectedNetwork(InternalMessage *msg) { LOGD("enter DealConnectToUserSelectedNetwork.\n"); + DealConnectToNetwork(msg, false); +} + +void StaStateMachine::DealConnectToDiffBssidNetwork(InternalMessage *msg) +{ + LOGD("enter DealConnectToDiffBssidNetwork.\n"); + DealConnectToNetwork(msg, true); +} + +void StaStateMachine::DealConnectToNetwork(InternalMessage *msg, bool changeBssid) +{ + LOGD("enter DealConnectToNetwork.\n"); if (msg == nullptr) { LOGE("msg is null.\n"); return; @@ -986,6 +1000,10 @@ void StaStateMachine::DealConnectToUserSelectedNetwork(InternalMessage *msg) if (connTriggerMode != NETWORK_SELECTED_BY_RETRY) { linkedInfo.retryedConnCount = 0; } + std::string bssid; + if (changeBssid) { + bssid = msg->GetStringFromMessage(); + } WriteWifiConnectionInfoHiSysEvent(networkId); Wpa3TransitionChangeIfNeed(networkId); if (networkId == linkedInfo.networkId) { @@ -1007,11 +1025,17 @@ void StaStateMachine::DealConnectToUserSelectedNetwork(InternalMessage *msg) /* Callback result to InterfaceService. */ InvokeOnStaConnChanged(OperateResState::CONNECT_CONNECTING, linkedInfo); - if (StartConnectToNetwork(networkId) != WIFI_OPT_SUCCESS) { - OnConnectFailed(networkId); - return; + if (changeBssid) { + if (StartConnnectToSameNameSsid(networkId,bssid) != WIFI_OPT_SUCCESS) { + OnConnectFailed(networkId); + return; + } + } else { + if (StartConnectToNetwork(networkId) != WIFI_OPT_SUCCESS) { + OnConnectFailed(networkId); + return; + } } - /* Sets network status. */ WifiSettings::GetInstance().EnableNetwork(networkId, connTriggerMode == NETWORK_SELECTED_BY_USER, m_instId); WifiSettings::GetInstance().SetDeviceState(networkId, (int)WifiDeviceConfigStatus::ENABLED, false); @@ -1122,6 +1146,9 @@ void StaStateMachine::DealDisconnectEvent(InternalMessage *msg) IfConfig::GetInstance().FlushIpAddr(IF_NAME + std::to_string(m_instId), IPTYPE_IPV4); #endif /* Initialize connection information. */ + if (!linkedInfo.bssid.empty()) { + bssidBeforePwdError = linkedInfo.bssid; + } InitWifiLinkedInfo(); if (lastLinkedInfo.detailedState == DetailedState::CONNECTING) { linkedInfo.networkId = lastLinkedInfo.networkId; @@ -1154,11 +1181,12 @@ void StaStateMachine::DealWpaLinkFailEvent(InternalMessage *msg) } StopTimer(static_cast(CMD_NETWORK_CONNECT_TIMEOUT)); - InitWifiLinkedInfo(); - WifiSettings::GetInstance().SaveLinkedInfo(linkedInfo, m_instId); if (msg->GetMessageName() == WIFI_SVR_CMD_STA_WPA_PASSWD_WRONG_EVENT) { SaveDiscReason(DisconnectedReason::DISC_REASON_WRONG_PWD); SaveLinkstate(ConnState::DISCONNECTED, DetailedState::PASSWORD_ERROR); + if (!bssidBeforePwdError.empty()) { + linkedInfo.bssid = bssidBeforePwdError; + } InvokeOnStaConnChanged(OperateResState::CONNECT_PASSWORD_WRONG, linkedInfo); } else if (msg->GetMessageName() == WIFI_SVR_CMD_STA_WPA_FULL_CONNECT_EVENT) { DisableNetwork(targetNetworkId); @@ -1175,6 +1203,9 @@ void StaStateMachine::DealWpaLinkFailEvent(InternalMessage *msg) InvokeOnStaConnChanged(OperateResState::DISCONNECT_DISCONNECTED, linkedInfo); WriteWifiConnectionHiSysEvent(WifiConnectionType::DISCONNECT, ""); } + bssidBeforePwdError.clear(); + InitWifiLinkedInfo(); + WifiSettings::GetInstance().SaveLinkedInfo(linkedInfo, m_instId); } bool StaStateMachine::DealReconnectSavedNetwork() @@ -1478,12 +1509,33 @@ ErrCode StaStateMachine::StartConnectToNetwork(int networkId) WifiStaHalInterface::GetInstance().SetBssid(networkId, deviceConfig.userSelectBssid.c_str()); - if (WifiStaHalInterface::GetInstance().EnableNetwork(targetNetworkId) != WIFI_IDL_OPT_OK) { + return ConnnectToNetwork(networkId); +} + +ErrCode StaStateMachine::StartConnnectToSameNameSsid(int networkId, std::string bssid) +{ + targetNetworkId = networkId; + SetRandomMac(targetNetworkId); + + WifiDeviceConfig deviceConfig; + if (WifiSettings::GetInstance().GetDeviceConfig(networkId, deviceConfig) != 0) { + LOGE("StartConnnectToSameNameSsid get GetDeviceConfig failed!"); + return WIFI_OPT_FAILED; + } + + WifiStaHalInterface::GetInstance().SetBssid(networkId, bssid.c_str()); + + return ConnnectToNetwork(networkId); +} + +ErrCode StaStateMachine::ConnnectToNetwork(int networkId) +{ + if (WifiStaHalInterface::GetInstance().EnableNetwork(networkId) != WIFI_IDL_OPT_OK) { LOGE("EnableNetwork() failed!"); return WIFI_OPT_FAILED; } - if (WifiStaHalInterface::GetInstance().Connect(targetNetworkId) != WIFI_IDL_OPT_OK) { + if (WifiStaHalInterface::GetInstance().Connect(networkId) != WIFI_IDL_OPT_OK) { LOGE("Connect failed!"); InvokeOnStaConnChanged(OperateResState::CONNECT_SELECT_NETWORK_FAILED, linkedInfo); return WIFI_OPT_FAILED; diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_state_machine.h b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_state_machine.h index 2e96c404b4970613de9d383dc6b6b3f71c40017a..e8f62d74b04d99fef81fd98a27e42f46a9344fa3 100644 --- a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_state_machine.h +++ b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_state_machine.h @@ -556,6 +556,16 @@ private: * @Return success: WIFI_OPT_SUCCESS fail: WIFI_OPT_FAILED */ ErrCode StartConnectToNetwork(int networkId); + /** + * @Description roam to same name ssid When current link is disconectted + */ + ErrCode StartConnnectToSameNameSsid(int networkId, std::string bssid); + + ErrCode ConnnectToNetwork(int networkId); + /** + * @Description DealConnectToNetwork + */ + void DealConnectToNetwork(InternalMessage *msg, bool changeBssid); /** * @Description Disable network * @@ -653,6 +663,12 @@ private: * @param msg - Message body received by the state machine[in] */ void DealConnectToUserSelectedNetwork(InternalMessage *msg); + /** + * @Description : Connect to the network with same ssid diffrent bssid when current link is disconnectted. + * + * @param msg - Message body received by the state machine[in] + */ + void DealConnectToDiffBssidNetwork(InternalMessage *msg); /** * @Description Operations after the disconnection Event is reported. * @@ -869,6 +885,7 @@ private: std::unique_ptr pDhcpService; DhcpResultNotify *pDhcpResultNotify; StaNetworkCheck *pNetcheck; + std::string bssidBeforePwdError; RootState *pRootState; InitState *pInitState;