1/* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include "ethernet_lan_management.h" 17#include "netmgr_ext_log_wrapper.h" 18#include "net_conn_client.h" 19#include "netsys_controller.h" 20#include "netmanager_base_common_utils.h" 21#include "route.h" 22#include "net_manager_constants.h" 23 24namespace OHOS { 25namespace NetManagerStandard { 26namespace { 27constexpr const int32_t LOCAL_NET_ID = 99; 28} // namespace 29 30EthernetLanManagement::EthernetLanManagement() 31{ 32} 33 34void EthernetLanManagement::GetOldLinkInfo(sptr<DevInterfaceState> &devState) 35{ 36 if (devState == nullptr) { 37 NETMGR_EXT_LOG_D("EthernetLanManagement:GetOldLinkInfo fail due to devState is nullptr"); 38 return; 39 } 40 if (devState->GetLinkInfo() == nullptr) { 41 NETMGR_EXT_LOG_W("EthernetLanManagement:GetOldLinkInfo fail due to linkInfo is NULL"); 42 netLinkInfo_.Initialize(); 43 return; 44 } 45 netLinkInfo_ = *(devState->GetLinkInfo()); 46} 47 48int32_t EthernetLanManagement::UpdateLanLinkInfo(sptr<DevInterfaceState> &devState) 49{ 50 if (devState == nullptr) { 51 NETMGR_EXT_LOG_D("EthernetLanManagement:UpdateLanLinkInfo fail due to devState is nullptr"); 52 return NETMANAGER_ERR_INTERNAL; 53 } 54 if (!devState->GetLinkUp()) { 55 NETMGR_EXT_LOG_D("EthernetLanManagement:UpdateLanLinkInfo fail due to not link up"); 56 return ETHERNET_ERR_DEVICE_NOT_LINK; 57 } 58 if (devState->GetLinkInfo() == nullptr) { 59 NETMGR_EXT_LOG_E("EthernetLanManagement:UpdateLanLinkInfo fail due to newNetLinkInfo is NULL"); 60 return NETMANAGER_ERR_INTERNAL; 61 } 62 NetLinkInfo newNetLinkInfo = *(devState->GetLinkInfo()); 63 int32_t ret = NETMANAGER_SUCCESS; 64 ret += DelIp(newNetLinkInfo); 65 ret += SetIp(newNetLinkInfo); 66 ret += DelRoute(newNetLinkInfo); 67 ret += SetRoute(newNetLinkInfo); 68 return ret; 69} 70 71int32_t EthernetLanManagement::ReleaseLanNetLink(sptr<DevInterfaceState> &devState) 72{ 73 NETMGR_EXT_LOG_D("EthernetLanManagement:ReleaseLanNetLink..."); 74 if (devState == nullptr) { 75 NETMGR_EXT_LOG_D("EthernetLanManagement:ReleaseLanNetLink fail due to devState is nullptr"); 76 return NETMANAGER_ERR_INTERNAL; 77 } 78 if (devState->GetLinkInfo() == nullptr) { 79 NETMGR_EXT_LOG_E("EthernetLanManagement:ReleaseLanNetLink fail due to newNetLinkInfo is NULL"); 80 return NETMANAGER_ERR_INTERNAL; 81 } 82 NetLinkInfo newNetLinkInfo = *(devState->GetLinkInfo()); 83 int32_t ret = NETMANAGER_SUCCESS; 84 for (const auto &inetAddr : newNetLinkInfo.netAddrList_) { 85 auto family = CommonUtils::GetAddrFamily(inetAddr.address_); 86 auto prefixLen = inetAddr.prefixlen_ ? static_cast<int32_t>(inetAddr.prefixlen_) 87 : ((family == AF_INET6) ? CommonUtils::Ipv6PrefixLen(inetAddr.netMask_) 88 : CommonUtils::Ipv4PrefixLen(inetAddr.netMask_)); 89 ret += NetConnClient::GetInstance().DelInterfaceAddress(newNetLinkInfo.ifaceName_, 90 inetAddr.address_, prefixLen); 91 if (ret != NETMANAGER_SUCCESS) { 92 NETMGR_EXT_LOG_E("del lan interface[%{public}s] address[%{private}s] failed", 93 newNetLinkInfo.ifaceName_.c_str(), inetAddr.address_.c_str()); 94 } 95 } 96 for (const auto &route : newNetLinkInfo.routeList_) { 97 std::string destAddress = route.destination_.address_ + "/" + std::to_string(route.destination_.prefixlen_); 98 ret += NetConnClient::GetInstance().RemoveNetworkRoute(LOCAL_NET_ID, route.iface_, destAddress, 99 route.gateway_.address_); 100 if (ret != NETMANAGER_SUCCESS) { 101 NETMGR_EXT_LOG_E("del lan[%{public}s] route failed, destAddress[%{private}s], nexthop[%{private}s]", 102 route.iface_.c_str(), destAddress.c_str(), route.gateway_.address_.c_str()); 103 } 104 } 105 return ret; 106} 107 108int32_t EthernetLanManagement::SetIp(const NetLinkInfo &newNetLinkInfo) 109{ 110 NETMGR_EXT_LOG_D("EthernetLanManagement:SetIp..."); 111 for (const auto &inetAddr : newNetLinkInfo.netAddrList_) { 112 if (netLinkInfo_.HasNetAddr(inetAddr)) { 113 NETMGR_EXT_LOG_W("Same ip address:[%{public}s], there is no need to add it again", 114 CommonUtils::ToAnonymousIp(inetAddr.address_).c_str()); 115 continue; 116 } 117 auto family = CommonUtils::GetAddrFamily(inetAddr.address_); 118 auto prefixLen = inetAddr.prefixlen_ ? static_cast<int32_t>(inetAddr.prefixlen_) 119 : ((family == AF_INET6) ? CommonUtils::Ipv6PrefixLen(inetAddr.netMask_) 120 : CommonUtils::Ipv4PrefixLen(inetAddr.netMask_)); 121 auto ret = NetConnClient::GetInstance().AddInterfaceAddress(newNetLinkInfo.ifaceName_, 122 inetAddr.address_, prefixLen); 123 if (ret != NETMANAGER_SUCCESS) { 124 NETMGR_EXT_LOG_E("set lan interface address failed"); 125 return ret; 126 } 127 } 128 return NETMANAGER_SUCCESS; 129} 130 131int32_t EthernetLanManagement::DelIp(const NetLinkInfo &newNetLinkInfo) 132{ 133 NETMGR_EXT_LOG_D("EthernetLanManagement:DelIp..."); 134 for (const auto &inetAddr : netLinkInfo_.netAddrList_) { 135 if (newNetLinkInfo.HasNetAddr(inetAddr)) { 136 NETMGR_EXT_LOG_W("Same ip address:[%{public}s], there is not need to be deleted", 137 CommonUtils::ToAnonymousIp(inetAddr.address_).c_str()); 138 continue; 139 } 140 auto family = CommonUtils::GetAddrFamily(inetAddr.address_); 141 auto prefixLen = inetAddr.prefixlen_ ? static_cast<int32_t>(inetAddr.prefixlen_) 142 : ((family == AF_INET6) ? CommonUtils::Ipv6PrefixLen(inetAddr.netMask_) 143 : CommonUtils::Ipv4PrefixLen(inetAddr.netMask_)); 144 auto ret = NetConnClient::GetInstance().DelInterfaceAddress(netLinkInfo_.ifaceName_, 145 inetAddr.address_, prefixLen); 146 if (ret != NETMANAGER_SUCCESS) { 147 NETMGR_EXT_LOG_E("del lan interface address failed"); 148 return ret; 149 } 150 } 151 return NETMANAGER_SUCCESS; 152} 153 154int32_t EthernetLanManagement::SetRoute(const NetLinkInfo &newNetLinkInfo) 155{ 156 for (const auto &route : newNetLinkInfo.routeList_) { 157 if (netLinkInfo_.HasRoute(route)) { 158 NETMGR_EXT_LOG_W("Same route:[%{public}s] ifo, there is no need to add it again", 159 CommonUtils::ToAnonymousIp(route.destination_.address_).c_str()); 160 continue; 161 } 162 std::string destAddress = route.destination_.address_ + "/" + std::to_string(route.destination_.prefixlen_); 163 auto ret = NetConnClient::GetInstance().AddNetworkRoute(LOCAL_NET_ID, route.iface_, destAddress, 164 route.gateway_.address_); 165 if (ret != NETMANAGER_SUCCESS) { 166 NETMGR_EXT_LOG_E("Set lan route failed"); 167 return ret; 168 } 169 } 170 return NETMANAGER_SUCCESS; 171} 172 173int32_t EthernetLanManagement::DelRoute(const NetLinkInfo &newNetLinkInfo) 174{ 175 for (const auto &route : netLinkInfo_.routeList_) { 176 if (newNetLinkInfo.HasRoute(route)) { 177 NETMGR_EXT_LOG_W("Same route:[%{public}s] ifo, there is not need to be deleted", 178 CommonUtils::ToAnonymousIp(route.destination_.address_).c_str()); 179 continue; 180 } 181 std::string destAddress = route.destination_.address_ + "/" + std::to_string(route.destination_.prefixlen_); 182 auto ret = NetConnClient::GetInstance().RemoveNetworkRoute(LOCAL_NET_ID, route.iface_, destAddress, 183 route.gateway_.address_); 184 if (ret != NETMANAGER_SUCCESS) { 185 NETMGR_EXT_LOG_E("del lan route failed"); 186 return ret; 187 } 188 } 189 return NETMANAGER_SUCCESS; 190} 191 192} // namespace NetManagerStandard 193} // namespace OHOS 194 195