18e745fdaSopenharmony_ci/* 28e745fdaSopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd. 38e745fdaSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 48e745fdaSopenharmony_ci * you may not use this file except in compliance with the License. 58e745fdaSopenharmony_ci * You may obtain a copy of the License at 68e745fdaSopenharmony_ci * 78e745fdaSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 88e745fdaSopenharmony_ci * 98e745fdaSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 108e745fdaSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 118e745fdaSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 128e745fdaSopenharmony_ci * See the License for the specific language governing permissions and 138e745fdaSopenharmony_ci * limitations under the License. 148e745fdaSopenharmony_ci */ 158e745fdaSopenharmony_ci 168e745fdaSopenharmony_ci#include "dev_interface_state.h" 178e745fdaSopenharmony_ci 188e745fdaSopenharmony_ci#include "inet_addr.h" 198e745fdaSopenharmony_ci#include "net_manager_center.h" 208e745fdaSopenharmony_ci#include "net_manager_constants.h" 218e745fdaSopenharmony_ci#include "netmanager_base_common_utils.h" 228e745fdaSopenharmony_ci#include "netmgr_ext_log_wrapper.h" 238e745fdaSopenharmony_ci#include "netsys_controller.h" 248e745fdaSopenharmony_ci#include "route.h" 258e745fdaSopenharmony_ci#include "static_configuration.h" 268e745fdaSopenharmony_ci 278e745fdaSopenharmony_cinamespace OHOS { 288e745fdaSopenharmony_cinamespace NetManagerStandard { 298e745fdaSopenharmony_cinamespace { 308e745fdaSopenharmony_ciconstexpr const char *DEFAULT_ROUTE_ADDR = "0.0.0.0"; 318e745fdaSopenharmony_ci} // namespace 328e745fdaSopenharmony_ci 338e745fdaSopenharmony_ciDevInterfaceState::DevInterfaceState() 348e745fdaSopenharmony_ci{ 358e745fdaSopenharmony_ci netSupplierInfo_ = new (std::nothrow) NetSupplierInfo(); 368e745fdaSopenharmony_ci if (netSupplierInfo_ == nullptr) { 378e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("NetSupplierInfo new failed"); 388e745fdaSopenharmony_ci } 398e745fdaSopenharmony_ci} 408e745fdaSopenharmony_ci 418e745fdaSopenharmony_civoid DevInterfaceState::SetDevName(const std::string &devName) 428e745fdaSopenharmony_ci{ 438e745fdaSopenharmony_ci devName_ = devName; 448e745fdaSopenharmony_ci} 458e745fdaSopenharmony_ci 468e745fdaSopenharmony_civoid DevInterfaceState::SetNetCaps(const std::set<NetCap> &netCaps) 478e745fdaSopenharmony_ci{ 488e745fdaSopenharmony_ci netCaps_ = netCaps; 498e745fdaSopenharmony_ci} 508e745fdaSopenharmony_ci 518e745fdaSopenharmony_civoid DevInterfaceState::SetLinkUp(bool up) 528e745fdaSopenharmony_ci{ 538e745fdaSopenharmony_ci linkUp_ = up; 548e745fdaSopenharmony_ci} 558e745fdaSopenharmony_ci 568e745fdaSopenharmony_civoid DevInterfaceState::SetlinkInfo(sptr<NetLinkInfo> &linkInfo) 578e745fdaSopenharmony_ci{ 588e745fdaSopenharmony_ci linkInfo_ = linkInfo; 598e745fdaSopenharmony_ci} 608e745fdaSopenharmony_ci 618e745fdaSopenharmony_civoid DevInterfaceState::SetIfcfg(sptr<InterfaceConfiguration> &ifCfg) 628e745fdaSopenharmony_ci{ 638e745fdaSopenharmony_ci ifCfg_ = ifCfg; 648e745fdaSopenharmony_ci if (ifCfg_->mode_ == STATIC) { 658e745fdaSopenharmony_ci UpdateLinkInfo(); 668e745fdaSopenharmony_ci if (connLinkState_ == LINK_AVAILABLE) { 678e745fdaSopenharmony_ci RemoteUpdateNetLinkInfo(); 688e745fdaSopenharmony_ci } 698e745fdaSopenharmony_ci } 708e745fdaSopenharmony_ci} 718e745fdaSopenharmony_ci 728e745fdaSopenharmony_civoid DevInterfaceState::SetLancfg(sptr<InterfaceConfiguration> &ifCfg) 738e745fdaSopenharmony_ci{ 748e745fdaSopenharmony_ci ifCfg_ = ifCfg; 758e745fdaSopenharmony_ci if (ifCfg_->mode_ == LAN_STATIC) { 768e745fdaSopenharmony_ci UpdateLanLinkInfo(); 778e745fdaSopenharmony_ci } 788e745fdaSopenharmony_ci} 798e745fdaSopenharmony_ci 808e745fdaSopenharmony_civoid DevInterfaceState::SetDhcpReqState(bool dhcpReqState) 818e745fdaSopenharmony_ci{ 828e745fdaSopenharmony_ci dhcpReqState_ = dhcpReqState; 838e745fdaSopenharmony_ci} 848e745fdaSopenharmony_ci 858e745fdaSopenharmony_cistd::string DevInterfaceState::GetDevName() const 868e745fdaSopenharmony_ci{ 878e745fdaSopenharmony_ci return devName_; 888e745fdaSopenharmony_ci} 898e745fdaSopenharmony_ci 908e745fdaSopenharmony_ciconst std::set<NetCap> &DevInterfaceState::GetNetCaps() const 918e745fdaSopenharmony_ci{ 928e745fdaSopenharmony_ci return netCaps_; 938e745fdaSopenharmony_ci} 948e745fdaSopenharmony_ci 958e745fdaSopenharmony_cistd::set<NetCap> DevInterfaceState::GetNetCaps() 968e745fdaSopenharmony_ci{ 978e745fdaSopenharmony_ci return netCaps_; 988e745fdaSopenharmony_ci} 998e745fdaSopenharmony_ci 1008e745fdaSopenharmony_cibool DevInterfaceState::GetLinkUp() const 1018e745fdaSopenharmony_ci{ 1028e745fdaSopenharmony_ci return linkUp_; 1038e745fdaSopenharmony_ci} 1048e745fdaSopenharmony_ci 1058e745fdaSopenharmony_cisptr<NetLinkInfo> DevInterfaceState::GetLinkInfo() const 1068e745fdaSopenharmony_ci{ 1078e745fdaSopenharmony_ci return linkInfo_; 1088e745fdaSopenharmony_ci} 1098e745fdaSopenharmony_ci 1108e745fdaSopenharmony_cisptr<InterfaceConfiguration> DevInterfaceState::GetIfcfg() const 1118e745fdaSopenharmony_ci{ 1128e745fdaSopenharmony_ci return ifCfg_; 1138e745fdaSopenharmony_ci} 1148e745fdaSopenharmony_ci 1158e745fdaSopenharmony_cibool DevInterfaceState::IsLanIface() 1168e745fdaSopenharmony_ci{ 1178e745fdaSopenharmony_ci if (ifCfg_ == nullptr) { 1188e745fdaSopenharmony_ci return false; 1198e745fdaSopenharmony_ci } 1208e745fdaSopenharmony_ci if (ifCfg_->mode_ == LAN_STATIC || ifCfg_->mode_ == LAN_DHCP) { 1218e745fdaSopenharmony_ci return true; 1228e745fdaSopenharmony_ci } 1238e745fdaSopenharmony_ci return false; 1248e745fdaSopenharmony_ci} 1258e745fdaSopenharmony_ci 1268e745fdaSopenharmony_ciIPSetMode DevInterfaceState::GetIPSetMode() const 1278e745fdaSopenharmony_ci{ 1288e745fdaSopenharmony_ci if (ifCfg_ == nullptr) { 1298e745fdaSopenharmony_ci return IPSetMode::STATIC; 1308e745fdaSopenharmony_ci } 1318e745fdaSopenharmony_ci return ifCfg_->mode_; 1328e745fdaSopenharmony_ci} 1338e745fdaSopenharmony_ci 1348e745fdaSopenharmony_cibool DevInterfaceState::GetDhcpReqState() const 1358e745fdaSopenharmony_ci{ 1368e745fdaSopenharmony_ci return dhcpReqState_; 1378e745fdaSopenharmony_ci} 1388e745fdaSopenharmony_ci 1398e745fdaSopenharmony_civoid DevInterfaceState::RemoteRegisterNetSupplier() 1408e745fdaSopenharmony_ci{ 1418e745fdaSopenharmony_ci if (connLinkState_ == UNREGISTERED) { 1428e745fdaSopenharmony_ci if (netCaps_.empty()) { 1438e745fdaSopenharmony_ci netCaps_.insert(NET_CAPABILITY_INTERNET); 1448e745fdaSopenharmony_ci } 1458e745fdaSopenharmony_ci int32_t result = 1468e745fdaSopenharmony_ci NetManagerCenter::GetInstance().RegisterNetSupplier(bearerType_, devName_, netCaps_, netSupplier_); 1478e745fdaSopenharmony_ci if (result == NETMANAGER_SUCCESS) { 1488e745fdaSopenharmony_ci connLinkState_ = REGISTERED; 1498e745fdaSopenharmony_ci } 1508e745fdaSopenharmony_ci NETMGR_EXT_LOG_D("DevInterfaceCfg RemoteRegisterNetSupplier netSupplier_[%{public}d]", netSupplier_); 1518e745fdaSopenharmony_ci } 1528e745fdaSopenharmony_ci} 1538e745fdaSopenharmony_ci 1548e745fdaSopenharmony_civoid DevInterfaceState::RemoteUnregisterNetSupplier() 1558e745fdaSopenharmony_ci{ 1568e745fdaSopenharmony_ci if (connLinkState_ == UNREGISTERED) { 1578e745fdaSopenharmony_ci return; 1588e745fdaSopenharmony_ci } 1598e745fdaSopenharmony_ci int ret = NetManagerCenter::GetInstance().UnregisterNetSupplier(netSupplier_); 1608e745fdaSopenharmony_ci if (ret == NETMANAGER_SUCCESS) { 1618e745fdaSopenharmony_ci connLinkState_ = UNREGISTERED; 1628e745fdaSopenharmony_ci netSupplier_ = 0; 1638e745fdaSopenharmony_ci } 1648e745fdaSopenharmony_ci} 1658e745fdaSopenharmony_ci 1668e745fdaSopenharmony_civoid DevInterfaceState::RemoteUpdateNetLinkInfo() 1678e745fdaSopenharmony_ci{ 1688e745fdaSopenharmony_ci if (connLinkState_ == LINK_UNAVAILABLE) { 1698e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("DevInterfaceCfg RemoteUpdateNetLinkInfo regState_:LINK_UNAVAILABLE"); 1708e745fdaSopenharmony_ci return; 1718e745fdaSopenharmony_ci } 1728e745fdaSopenharmony_ci if (linkInfo_ == nullptr) { 1738e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("DevInterfaceCfg RemoteUpdateNetLinkInfo linkInfo_ is nullptr"); 1748e745fdaSopenharmony_ci return; 1758e745fdaSopenharmony_ci } 1768e745fdaSopenharmony_ci auto newNetLinkinfo = linkInfo_; 1778e745fdaSopenharmony_ci for (auto &netAddr: newNetLinkinfo->netAddrList_) { 1788e745fdaSopenharmony_ci if (netAddr.family_ == AF_INET) { 1798e745fdaSopenharmony_ci netAddr.family_ = INetAddr::IpType::IPV4; 1808e745fdaSopenharmony_ci } else if (netAddr.family_ == AF_INET6) { 1818e745fdaSopenharmony_ci netAddr.family_ = INetAddr::IpType::IPV6; 1828e745fdaSopenharmony_ci } 1838e745fdaSopenharmony_ci } 1848e745fdaSopenharmony_ci NetManagerCenter::GetInstance().UpdateNetLinkInfo(netSupplier_, newNetLinkinfo); 1858e745fdaSopenharmony_ci} 1868e745fdaSopenharmony_ci 1878e745fdaSopenharmony_civoid DevInterfaceState::RemoteUpdateNetSupplierInfo() 1888e745fdaSopenharmony_ci{ 1898e745fdaSopenharmony_ci if (connLinkState_ == UNREGISTERED) { 1908e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("DevInterfaceCfg RemoteUpdateNetSupplierInfo regState_:UNREGISTERED"); 1918e745fdaSopenharmony_ci return; 1928e745fdaSopenharmony_ci } 1938e745fdaSopenharmony_ci if (netSupplierInfo_ == nullptr) { 1948e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("DevInterfaceCfg RemoteUpdateNetSupplierInfo netSupplierInfo_ is nullptr"); 1958e745fdaSopenharmony_ci return; 1968e745fdaSopenharmony_ci } 1978e745fdaSopenharmony_ci UpdateSupplierAvailable(); 1988e745fdaSopenharmony_ci NetManagerCenter::GetInstance().UpdateNetSupplierInfo(netSupplier_, netSupplierInfo_); 1998e745fdaSopenharmony_ci} 2008e745fdaSopenharmony_ci 2018e745fdaSopenharmony_civoid DevInterfaceState::UpdateNetHttpProxy(const HttpProxy &httpProxy) 2028e745fdaSopenharmony_ci{ 2038e745fdaSopenharmony_ci if (httpProxy == ifCfg_->httpProxy_) { 2048e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("The currently set http proxy is the same as the entered http proxy"); 2058e745fdaSopenharmony_ci return; 2068e745fdaSopenharmony_ci } 2078e745fdaSopenharmony_ci ifCfg_->httpProxy_ = httpProxy; 2088e745fdaSopenharmony_ci if (connLinkState_ == LINK_AVAILABLE) { 2098e745fdaSopenharmony_ci if (linkInfo_ == nullptr) { 2108e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("linkInfo_ is nullptr"); 2118e745fdaSopenharmony_ci return; 2128e745fdaSopenharmony_ci } 2138e745fdaSopenharmony_ci linkInfo_->httpProxy_ = httpProxy; 2148e745fdaSopenharmony_ci RemoteUpdateNetLinkInfo(); 2158e745fdaSopenharmony_ci } 2168e745fdaSopenharmony_ci} 2178e745fdaSopenharmony_ci 2188e745fdaSopenharmony_civoid DevInterfaceState::UpdateLinkInfo() 2198e745fdaSopenharmony_ci{ 2208e745fdaSopenharmony_ci if (ifCfg_ == nullptr || ifCfg_->mode_ != STATIC) { 2218e745fdaSopenharmony_ci return; 2228e745fdaSopenharmony_ci } 2238e745fdaSopenharmony_ci if (linkInfo_ == nullptr) { 2248e745fdaSopenharmony_ci linkInfo_ = new (std::nothrow) NetLinkInfo(); 2258e745fdaSopenharmony_ci if (linkInfo_ == nullptr) { 2268e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("linkInfo_ is nullptr"); 2278e745fdaSopenharmony_ci return; 2288e745fdaSopenharmony_ci } 2298e745fdaSopenharmony_ci } 2308e745fdaSopenharmony_ci std::list<INetAddr>().swap(linkInfo_->netAddrList_); 2318e745fdaSopenharmony_ci std::list<Route>().swap(linkInfo_->routeList_); 2328e745fdaSopenharmony_ci std::list<INetAddr>().swap(linkInfo_->dnsList_); 2338e745fdaSopenharmony_ci linkInfo_->ifaceName_ = devName_; 2348e745fdaSopenharmony_ci for (const auto &ipAddr : ifCfg_->ipStatic_.ipAddrList_) { 2358e745fdaSopenharmony_ci linkInfo_->netAddrList_.push_back(ipAddr); 2368e745fdaSopenharmony_ci } 2378e745fdaSopenharmony_ci 2388e745fdaSopenharmony_ci for (const auto &netAddr : ifCfg_->ipStatic_.routeList_) { 2398e745fdaSopenharmony_ci Route route; 2408e745fdaSopenharmony_ci route.iface_ = devName_; 2418e745fdaSopenharmony_ci route.destination_ = netAddr; 2428e745fdaSopenharmony_ci GetTargetNetAddrWithSameFamily(netAddr.address_, ifCfg_->ipStatic_.gatewayList_, route.gateway_); 2438e745fdaSopenharmony_ci linkInfo_->routeList_.push_back(route); 2448e745fdaSopenharmony_ci } 2458e745fdaSopenharmony_ci CreateLocalRoute(devName_, ifCfg_->ipStatic_.ipAddrList_, ifCfg_->ipStatic_.netMaskList_); 2468e745fdaSopenharmony_ci 2478e745fdaSopenharmony_ci for (auto dnsServer : ifCfg_->ipStatic_.dnsServers_) { 2488e745fdaSopenharmony_ci linkInfo_->dnsList_.push_back(dnsServer); 2498e745fdaSopenharmony_ci } 2508e745fdaSopenharmony_ci linkInfo_->httpProxy_ = ifCfg_->httpProxy_; 2518e745fdaSopenharmony_ci} 2528e745fdaSopenharmony_ci 2538e745fdaSopenharmony_civoid DevInterfaceState::UpdateLanLinkInfo() 2548e745fdaSopenharmony_ci{ 2558e745fdaSopenharmony_ci if (ifCfg_ == nullptr || ifCfg_->mode_ != LAN_STATIC) { 2568e745fdaSopenharmony_ci return; 2578e745fdaSopenharmony_ci } 2588e745fdaSopenharmony_ci if (linkInfo_ == nullptr) { 2598e745fdaSopenharmony_ci linkInfo_ = new (std::nothrow) NetLinkInfo(); 2608e745fdaSopenharmony_ci if (linkInfo_ == nullptr) { 2618e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("linkInfo_ is nullptr"); 2628e745fdaSopenharmony_ci return; 2638e745fdaSopenharmony_ci } 2648e745fdaSopenharmony_ci } 2658e745fdaSopenharmony_ci std::list<INetAddr>().swap(linkInfo_->netAddrList_); 2668e745fdaSopenharmony_ci std::list<Route>().swap(linkInfo_->routeList_); 2678e745fdaSopenharmony_ci linkInfo_->ifaceName_ = devName_; 2688e745fdaSopenharmony_ci for (const auto &ipAddr : ifCfg_->ipStatic_.ipAddrList_) { 2698e745fdaSopenharmony_ci linkInfo_->netAddrList_.push_back(ipAddr); 2708e745fdaSopenharmony_ci } 2718e745fdaSopenharmony_ci 2728e745fdaSopenharmony_ci for (const auto &netAddr : ifCfg_->ipStatic_.routeList_) { 2738e745fdaSopenharmony_ci Route route; 2748e745fdaSopenharmony_ci route.iface_ = devName_; 2758e745fdaSopenharmony_ci route.destination_ = netAddr; 2768e745fdaSopenharmony_ci GetRoutePrefixlen(netAddr.address_, ifCfg_->ipStatic_.netMaskList_, route.destination_); 2778e745fdaSopenharmony_ci GetTargetNetAddrWithSameFamily(netAddr.address_, ifCfg_->ipStatic_.gatewayList_, route.gateway_); 2788e745fdaSopenharmony_ci linkInfo_->routeList_.push_back(route); 2798e745fdaSopenharmony_ci } 2808e745fdaSopenharmony_ci} 2818e745fdaSopenharmony_ci 2828e745fdaSopenharmony_civoid DevInterfaceState::UpdateLanLinkInfo(const sptr<StaticConfiguration> &config) 2838e745fdaSopenharmony_ci{ 2848e745fdaSopenharmony_ci if (config == nullptr) { 2858e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("config is nullptr"); 2868e745fdaSopenharmony_ci return; 2878e745fdaSopenharmony_ci } 2888e745fdaSopenharmony_ci if (linkInfo_ == nullptr) { 2898e745fdaSopenharmony_ci linkInfo_ = new (std::nothrow) NetLinkInfo(); 2908e745fdaSopenharmony_ci if (linkInfo_ == nullptr) { 2918e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("NetLinkInfo new failed"); 2928e745fdaSopenharmony_ci } 2938e745fdaSopenharmony_ci } 2948e745fdaSopenharmony_ci std::list<INetAddr>().swap(linkInfo_->netAddrList_); 2958e745fdaSopenharmony_ci std::list<Route>().swap(linkInfo_->routeList_); 2968e745fdaSopenharmony_ci linkInfo_->ifaceName_ = devName_; 2978e745fdaSopenharmony_ci for (const auto &ipAddr : config->ipAddrList_) { 2988e745fdaSopenharmony_ci linkInfo_->netAddrList_.push_back(ipAddr); 2998e745fdaSopenharmony_ci } 3008e745fdaSopenharmony_ci 3018e745fdaSopenharmony_ci for (const auto &routeAddr : config->routeList_) { 3028e745fdaSopenharmony_ci Route routeStc; 3038e745fdaSopenharmony_ci routeStc.iface_ = devName_; 3048e745fdaSopenharmony_ci routeStc.destination_ = routeAddr; 3058e745fdaSopenharmony_ci GetRoutePrefixlen(routeAddr.address_, config->netMaskList_, routeStc.destination_); 3068e745fdaSopenharmony_ci GetTargetNetAddrWithSameFamily(routeAddr.address_, config->gatewayList_, routeStc.gateway_); 3078e745fdaSopenharmony_ci linkInfo_->routeList_.push_back(routeStc); 3088e745fdaSopenharmony_ci } 3098e745fdaSopenharmony_ci} 3108e745fdaSopenharmony_ci 3118e745fdaSopenharmony_civoid DevInterfaceState::UpdateLinkInfo(const sptr<StaticConfiguration> &config) 3128e745fdaSopenharmony_ci{ 3138e745fdaSopenharmony_ci if (config == nullptr) { 3148e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("config is nullptr"); 3158e745fdaSopenharmony_ci return; 3168e745fdaSopenharmony_ci } 3178e745fdaSopenharmony_ci if (linkInfo_ == nullptr) { 3188e745fdaSopenharmony_ci linkInfo_ = new (std::nothrow) NetLinkInfo(); 3198e745fdaSopenharmony_ci if (linkInfo_ == nullptr) { 3208e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("NetLinkInfo new failed"); 3218e745fdaSopenharmony_ci } 3228e745fdaSopenharmony_ci } 3238e745fdaSopenharmony_ci 3248e745fdaSopenharmony_ci std::list<INetAddr>().swap(linkInfo_->netAddrList_); 3258e745fdaSopenharmony_ci std::list<Route>().swap(linkInfo_->routeList_); 3268e745fdaSopenharmony_ci std::list<INetAddr>().swap(linkInfo_->dnsList_); 3278e745fdaSopenharmony_ci linkInfo_->ifaceName_ = devName_; 3288e745fdaSopenharmony_ci for (const auto &ipAddr : config->ipAddrList_) { 3298e745fdaSopenharmony_ci linkInfo_->netAddrList_.push_back(ipAddr); 3308e745fdaSopenharmony_ci } 3318e745fdaSopenharmony_ci 3328e745fdaSopenharmony_ci for (const auto &routeAddr : config->routeList_) { 3338e745fdaSopenharmony_ci Route routeStc; 3348e745fdaSopenharmony_ci routeStc.iface_ = devName_; 3358e745fdaSopenharmony_ci routeStc.destination_ = routeAddr; 3368e745fdaSopenharmony_ci GetTargetNetAddrWithSameFamily(routeAddr.address_, config->gatewayList_, routeStc.gateway_); 3378e745fdaSopenharmony_ci linkInfo_->routeList_.push_back(routeStc); 3388e745fdaSopenharmony_ci } 3398e745fdaSopenharmony_ci CreateLocalRoute(devName_, config->ipAddrList_, config->netMaskList_); 3408e745fdaSopenharmony_ci 3418e745fdaSopenharmony_ci for (auto dns : config->dnsServers_) { 3428e745fdaSopenharmony_ci linkInfo_->dnsList_.push_back(dns); 3438e745fdaSopenharmony_ci } 3448e745fdaSopenharmony_ci if (ifCfg_) { 3458e745fdaSopenharmony_ci linkInfo_->httpProxy_ = ifCfg_->httpProxy_; 3468e745fdaSopenharmony_ci } 3478e745fdaSopenharmony_ci} 3488e745fdaSopenharmony_ci 3498e745fdaSopenharmony_civoid DevInterfaceState::UpdateSupplierAvailable() 3508e745fdaSopenharmony_ci{ 3518e745fdaSopenharmony_ci netSupplierInfo_->isAvailable_ = linkUp_; 3528e745fdaSopenharmony_ci connLinkState_ = linkUp_ ? LINK_AVAILABLE : LINK_UNAVAILABLE; 3538e745fdaSopenharmony_ci} 3548e745fdaSopenharmony_ci 3558e745fdaSopenharmony_civoid DevInterfaceState::CreateLocalRoute(const std::string &iface, const std::vector<INetAddr> &ipAddrList, 3568e745fdaSopenharmony_ci const std::vector<INetAddr> &netMaskList) 3578e745fdaSopenharmony_ci{ 3588e745fdaSopenharmony_ci if (linkInfo_ == nullptr) { 3598e745fdaSopenharmony_ci NETMGR_EXT_LOG_E("linkInfo_ is nullptr"); 3608e745fdaSopenharmony_ci return; 3618e745fdaSopenharmony_ci } 3628e745fdaSopenharmony_ci 3638e745fdaSopenharmony_ci for (const auto &ipAddr : ipAddrList) { 3648e745fdaSopenharmony_ci auto family = CommonUtils::GetAddrFamily(ipAddr.address_); 3658e745fdaSopenharmony_ci std::string routeAddr = (family == AF_INET6) ? CommonUtils::GetIpv6Prefix(ipAddr.address_, ipAddr.prefixlen_) 3668e745fdaSopenharmony_ci : GetIpv4Prefix(ipAddr.address_, netMaskList); 3678e745fdaSopenharmony_ci Route localRoute; 3688e745fdaSopenharmony_ci localRoute.iface_ = iface; 3698e745fdaSopenharmony_ci localRoute.destination_.type_ = family; 3708e745fdaSopenharmony_ci localRoute.destination_.address_ = routeAddr; 3718e745fdaSopenharmony_ci localRoute.destination_.prefixlen_ = ipAddr.prefixlen_; 3728e745fdaSopenharmony_ci localRoute.gateway_.address_ = (family == AF_INET) ? DEFAULT_ROUTE_ADDR : ""; 3738e745fdaSopenharmony_ci linkInfo_->routeList_.push_back(localRoute); 3748e745fdaSopenharmony_ci } 3758e745fdaSopenharmony_ci} 3768e745fdaSopenharmony_ci 3778e745fdaSopenharmony_cistd::string DevInterfaceState::GetIpv4Prefix(const std::string &ipv4Addr, const std::vector<INetAddr> &netMaskList) 3788e745fdaSopenharmony_ci{ 3798e745fdaSopenharmony_ci INetAddr maskAddr; 3808e745fdaSopenharmony_ci GetTargetNetAddrWithSameFamily(ipv4Addr, netMaskList, maskAddr); 3818e745fdaSopenharmony_ci uint32_t ipInt = CommonUtils::ConvertIpv4Address(ipv4Addr); 3828e745fdaSopenharmony_ci uint32_t maskInt = CommonUtils::ConvertIpv4Address(maskAddr.address_); 3838e745fdaSopenharmony_ci return CommonUtils::ConvertIpv4Address(ipInt & maskInt); 3848e745fdaSopenharmony_ci} 3858e745fdaSopenharmony_ci 3868e745fdaSopenharmony_civoid DevInterfaceState::GetTargetNetAddrWithSameFamily(const std::string &bySrcAddr, 3878e745fdaSopenharmony_ci const std::vector<INetAddr> &fromAddrList, 3888e745fdaSopenharmony_ci INetAddr &targetNetAddr) 3898e745fdaSopenharmony_ci{ 3908e745fdaSopenharmony_ci auto family = CommonUtils::GetAddrFamily(bySrcAddr); 3918e745fdaSopenharmony_ci for (const auto &addr : fromAddrList) { 3928e745fdaSopenharmony_ci if (family != CommonUtils::GetAddrFamily(addr.address_)) { 3938e745fdaSopenharmony_ci continue; 3948e745fdaSopenharmony_ci } 3958e745fdaSopenharmony_ci targetNetAddr = addr; 3968e745fdaSopenharmony_ci return; 3978e745fdaSopenharmony_ci } 3988e745fdaSopenharmony_ci} 3998e745fdaSopenharmony_ci 4008e745fdaSopenharmony_civoid DevInterfaceState::GetRoutePrefixlen(const std::string &bySrcAddr, 4018e745fdaSopenharmony_ci const std::vector<INetAddr> &fromAddrList, 4028e745fdaSopenharmony_ci INetAddr &targetNetAddr) 4038e745fdaSopenharmony_ci{ 4048e745fdaSopenharmony_ci auto route_family = CommonUtils::GetAddrFamily(bySrcAddr); 4058e745fdaSopenharmony_ci for (const auto &netMask : fromAddrList) { 4068e745fdaSopenharmony_ci auto route_mask_family = CommonUtils::GetAddrFamily(netMask.address_); 4078e745fdaSopenharmony_ci if (route_family == route_mask_family) { 4088e745fdaSopenharmony_ci targetNetAddr.prefixlen_ = (route_family == AF_INET6) 4098e745fdaSopenharmony_ci ? static_cast<uint32_t>(CommonUtils::Ipv6PrefixLen(netMask.address_)) 4108e745fdaSopenharmony_ci : static_cast<uint32_t>(CommonUtils::Ipv4PrefixLen(netMask.address_)); 4118e745fdaSopenharmony_ci } 4128e745fdaSopenharmony_ci } 4138e745fdaSopenharmony_ci} 4148e745fdaSopenharmony_ci 4158e745fdaSopenharmony_civoid DevInterfaceState::GetDumpInfo(std::string &info) 4168e745fdaSopenharmony_ci{ 4178e745fdaSopenharmony_ci const std::string TAB = " "; 4188e745fdaSopenharmony_ci std::list<std::string> dumpInfo = { 4198e745fdaSopenharmony_ci "DevName: " + devName_, 4208e745fdaSopenharmony_ci "ConnLinkState: " + std::to_string(connLinkState_), 4218e745fdaSopenharmony_ci "LinkUp: " + std::to_string(linkUp_), 4228e745fdaSopenharmony_ci "DHCPReqState: " + std::to_string(dhcpReqState_), 4238e745fdaSopenharmony_ci }; 4248e745fdaSopenharmony_ci std::string data = "DevInterfaceState: \n"; 4258e745fdaSopenharmony_ci std::for_each(dumpInfo.begin(), dumpInfo.end(), 4268e745fdaSopenharmony_ci [&data, &TAB](const auto &msg) { data.append(TAB + TAB + msg + "\n"); }); 4278e745fdaSopenharmony_ci if (linkInfo_ != nullptr) { 4288e745fdaSopenharmony_ci data.append(linkInfo_->ToString(TAB) + "\n"); 4298e745fdaSopenharmony_ci } 4308e745fdaSopenharmony_ci if (netSupplierInfo_ != nullptr) { 4318e745fdaSopenharmony_ci data.append(netSupplierInfo_->ToString(TAB) + "\n"); 4328e745fdaSopenharmony_ci } 4338e745fdaSopenharmony_ci if (ifCfg_ != nullptr) { 4348e745fdaSopenharmony_ci data.append("\n" + TAB + TAB + "InterfaceConfig: \n" + TAB + TAB + TAB + 4358e745fdaSopenharmony_ci "Mode: " + std::to_string(ifCfg_->mode_) + "\n"); 4368e745fdaSopenharmony_ci data.append("\nConfig: \n"); 4378e745fdaSopenharmony_ci data.append(TAB + TAB + "IpAddr: "); 4388e745fdaSopenharmony_ci std::for_each(ifCfg_->ipStatic_.ipAddrList_.begin(), ifCfg_->ipStatic_.ipAddrList_.end(), 4398e745fdaSopenharmony_ci [&data, &TAB](const auto &ipAddr) { data.append(TAB + TAB + ipAddr.ToString(TAB)); }); 4408e745fdaSopenharmony_ci 4418e745fdaSopenharmony_ci data.append("\n" + TAB + TAB + "Route: "); 4428e745fdaSopenharmony_ci std::for_each(ifCfg_->ipStatic_.routeList_.begin(), ifCfg_->ipStatic_.routeList_.end(), 4438e745fdaSopenharmony_ci [&data, &TAB](const auto &routeAddr) { data.append(TAB + TAB + routeAddr.ToString(TAB)); }); 4448e745fdaSopenharmony_ci 4458e745fdaSopenharmony_ci data.append("\n" + TAB + TAB + "GateWay: "); 4468e745fdaSopenharmony_ci std::for_each(ifCfg_->ipStatic_.gatewayList_.begin(), ifCfg_->ipStatic_.gatewayList_.end(), 4478e745fdaSopenharmony_ci [&data, &TAB](const auto &gateway) { data.append(TAB + TAB + gateway.ToString(TAB)); }); 4488e745fdaSopenharmony_ci 4498e745fdaSopenharmony_ci data.append("\n" + TAB + TAB + "NetMask: "); 4508e745fdaSopenharmony_ci std::for_each(ifCfg_->ipStatic_.netMaskList_.begin(), ifCfg_->ipStatic_.netMaskList_.end(), 4518e745fdaSopenharmony_ci [&data, &TAB](const auto &netMask) { data.append(TAB + TAB + netMask.ToString(TAB)); }); 4528e745fdaSopenharmony_ci 4538e745fdaSopenharmony_ci data.append("\n" + TAB + TAB + "DNSServers: "); 4548e745fdaSopenharmony_ci std::for_each(ifCfg_->ipStatic_.dnsServers_.begin(), ifCfg_->ipStatic_.dnsServers_.end(), 4558e745fdaSopenharmony_ci [&data, &TAB](const auto &server) { data.append(TAB + TAB + server.ToString(TAB)); }); 4568e745fdaSopenharmony_ci 4578e745fdaSopenharmony_ci data.append("\n" + TAB + TAB + "Domain: " + ifCfg_->ipStatic_.domain_ + "\n" + TAB + TAB + "NetCaps: {"); 4588e745fdaSopenharmony_ci std::for_each(netCaps_.begin(), netCaps_.end(), 4598e745fdaSopenharmony_ci [&data, &TAB](const auto &cap) { data.append(std::to_string(cap) + ", "); }); 4608e745fdaSopenharmony_ci data.append("}\n"); 4618e745fdaSopenharmony_ci } 4628e745fdaSopenharmony_ci data.append(TAB + TAB + "BearerType :" + std::to_string(bearerType_) + "\n"); 4638e745fdaSopenharmony_ci info.append(data); 4648e745fdaSopenharmony_ci} 4658e745fdaSopenharmony_ci} // namespace NetManagerStandard 4668e745fdaSopenharmony_ci} // namespace OHOS 467