diff --git a/services/netconnmanager/include/net_conn_service.h b/services/netconnmanager/include/net_conn_service.h index 25b89145085258d3c068c75883305cc4210f880e..f8007cf85f75e7617856d5f26b1638e2a7b937aa 100644 --- a/services/netconnmanager/include/net_conn_service.h +++ b/services/netconnmanager/include/net_conn_service.h @@ -276,6 +276,7 @@ private: bool FindSameCallback(const sptr &callback, uint32_t &reqId); void GetDumpMessage(std::string &message); sptr FindNetSupplier(uint32_t supplierId); + void RequestAllNetworkExceptDefaut(); private: enum ServiceRunningState { diff --git a/services/netconnmanager/include/net_monitor.h b/services/netconnmanager/include/net_monitor.h index f0079270dbf673ee37368b1b995c79a19b6b1d38..695d8ad03c468def06bc2dc652e89ebd0c3b90a7 100644 --- a/services/netconnmanager/include/net_monitor.h +++ b/services/netconnmanager/include/net_monitor.h @@ -85,7 +85,7 @@ private: NetDetectionStatus dealRecvResult(const std::string &strResponse); int32_t GetDefaultNetDetectionUrlFromCfg(std::string &strUrl); int32_t ParseUrl(const std::string &url, std::string &domain, std::string &urlPath); - int32_t GetIpAddr(const char *domain, std::string &ip_addr, int &socketType); + int32_t GetIpAddr(const std::string &domain, std::string &ip_addr, int &socketType); /** * Non blocking socket connection diff --git a/services/netconnmanager/src/net_conn_service.cpp b/services/netconnmanager/src/net_conn_service.cpp index 3302196a62848c0d9cd7060299f774b562f5b1f5..e9aef8b5eaa5e19a3a4d0072d1a7a9c141bef935 100644 --- a/services/netconnmanager/src/net_conn_service.cpp +++ b/services/netconnmanager/src/net_conn_service.cpp @@ -830,6 +830,32 @@ int32_t NetConnService::BindSocket(int32_t socket_fd, int32_t netId) return NetsysController::GetInstance().BindSocket(socket_fd, netId); } +void NetConnService::RequestAllNetworkExceptDefaut() +{ + if ((defaultNetSupplier_ == nullptr) || (defaultNetSupplier_->IsNetValidated())) { + return; + } + NETMGR_LOG_I("Default supplier[%{public}d, %{public}s] is not valid,request to activate another network", + defaultNetSupplier_->GetSupplierId(), defaultNetSupplier_->GetNetSupplierIdent().c_str()); + if (defaultNetActivate_ == nullptr) { + NETMGR_LOG_E("Default net request is null"); + return; + } + // Request activation of all networks except the default network + uint32_t reqId = defaultNetActivate_->GetRequestId(); + for (const auto &netSupplier : netSuppliers_) { + if (netSupplier.second == nullptr || netSupplier.second == defaultNetSupplier_) { + continue; + } + if (!defaultNetActivate_->MatchRequestAndNetwork(netSupplier.second)) { + continue; + } + if (!netSupplier.second->RequestToConnect(reqId)) { + NETMGR_LOG_E("Request to connect failed"); + } + } +} + void NetConnService::NotFindBestSupplier(uint32_t reqId, const sptr &active, const sptr &supplier, const sptr &callback) { @@ -881,6 +907,7 @@ void NetConnService::FindBestNetworkForAllRequest() CallbackForAvailable(bestSupplier, callback); bestSupplier->SelectAsBestNetwork(iterActive->first); } + RequestAllNetworkExceptDefaut(); } uint32_t NetConnService::FindBestNetworkForRequest(sptr &supplier, sptr &netActivateNetwork) diff --git a/services/netconnmanager/src/net_monitor.cpp b/services/netconnmanager/src/net_monitor.cpp index bb49fce59ed5e1f22f31d17ecfc0d1d20255b162..9e9a55def6cfe2a0931873707eec82d68745e6a5 100644 --- a/services/netconnmanager/src/net_monitor.cpp +++ b/services/netconnmanager/src/net_monitor.cpp @@ -162,7 +162,7 @@ NetDetectionStatus NetMonitor::SendHttpProbe(const std::string &defaultDomain, c { int socketType = AF_INET; std::string ipAddr; - if (GetIpAddr(defaultDomain.c_str(), ipAddr, socketType)) { + if (GetIpAddr(defaultDomain, ipAddr, socketType)) { NETMGR_LOG_E("NetMonitor::Error at GetIpAddr"); return INVALID_DETECTION_STATE; } @@ -460,11 +460,11 @@ int32_t NetMonitor::GetUrlRedirectFromResponse(const std::string &strResponse, s return -1; } -int32_t NetMonitor::GetIpAddr(const char *domain, std::string &ip_addr, int &socketType) +int32_t NetMonitor::GetIpAddr(const std::string &domain, std::string &ip_addr, int &socketType) { struct addrinfo *result = nullptr; - int ret = getaddrinfo(domain, nullptr, nullptr, &result); - if (ret < 0) { + std::string serverName; + if (NetsysController::GetInstance().GetAddrInfo(domain, serverName, nullptr, netId_, &result) < 0) { NETMGR_LOG_E("Get net[%{public}d] address info failed,errno[%{public}d]:%{public}s", netId_, errno, strerror(errno)); return -1; @@ -474,18 +474,28 @@ int32_t NetMonitor::GetIpAddr(const char *domain, std::string &ip_addr, int &soc return -1; } char ip[DOMAINIPADDR] = {0}; - if (result->ai_family == AF_INET) { - auto addr = reinterpret_cast(result->ai_addr); - inet_ntop(AF_INET, &addr->sin_addr, ip, sizeof(ip)); + for (addrinfo *node = result; node != nullptr; node = node->ai_next) { + if (node->ai_family != AF_INET) { + continue; + } + auto addr = reinterpret_cast(node->ai_addr); + if (!inet_ntop(AF_INET, &addr->sin_addr, ip, sizeof(ip))) { + continue; + } ip_addr = ip; - } else if (result->ai_family == AF_INET6) { + socketType = AF_INET; + NetsysController::GetInstance().FreeAddrInfo(result); + NETMGR_LOG_D("Get net[%{public}d] monitor ip:%{public}s", netId_, CommonUtils::ToAnonymousIp(ip_addr).c_str()); + return 0; + } + if (result->ai_family == AF_INET6) { auto addr = reinterpret_cast(result->ai_addr); inet_ntop(AF_INET6, &addr->sin6_addr, ip, sizeof(ip)); ip_addr = ip; + socketType = AF_INET6; } - socketType = result->ai_family; + NetsysController::GetInstance().FreeAddrInfo(result); NETMGR_LOG_D("Get net[%{public}d] monitor ip:%{public}s", netId_, CommonUtils::ToAnonymousIp(ip_addr).c_str()); - freeaddrinfo(result); return 0; } diff --git a/test/netconnmanager/unittest/net_conn_manager_test/net_conn_service_test.cpp b/test/netconnmanager/unittest/net_conn_manager_test/net_conn_service_test.cpp index 064856143c37fe573ea447bb2f579845c3342e08..81b99a446398d1be83e499333e22ec46ae751ef0 100644 --- a/test/netconnmanager/unittest/net_conn_manager_test/net_conn_service_test.cpp +++ b/test/netconnmanager/unittest/net_conn_manager_test/net_conn_service_test.cpp @@ -472,7 +472,7 @@ HWTEST_F(NetConnServiceTest, GetTest001, TestSize.Level1) EXPECT_EQ(ret, NETMANAGER_SUCCESS); ret = DelayedSingleton::GetInstance()->RestrictBackgroundChanged(true); - EXPECT_EQ(ret, NETMANAGER_ERROR); + EXPECT_EQ(ret, NETMANAGER_SUCCESS); std::vector args; args.emplace_back(u"dummy data");