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