diff --git a/services/netmanagernative/include/netsys/netlink_socket_diag.h b/services/netmanagernative/include/netsys/netlink_socket_diag.h index 39962d751c06900976146502c34d5a4080d2db3e..fa103e7b75b15fc1137313b7eb160eb38ae57a62 100644 --- a/services/netmanagernative/include/netsys/netlink_socket_diag.h +++ b/services/netmanagernative/include/netsys/netlink_socket_diag.h @@ -34,11 +34,10 @@ public: /** * Destroy all 'active' TCP sockets that no longer exist. * - * @param ipAddr Network interface name * @param ipAddr Network IP address * @param excludeLoopback “true” to exclude loopback. */ - void DestroyLiveSockets(const std::string &iface, const std::string &ipAddr, bool excludeLoopback); + void DestroyLiveSockets(const char *ipAddr, bool excludeLoopback); private: static bool InLookBack(uint32_t a); @@ -48,12 +47,10 @@ private: int32_t ExecuteDestroySocket(uint8_t proto, const inet_diag_msg *msg); int32_t GetErrorFromKernel(int32_t fd); bool IsLoopbackSocket(const inet_diag_msg *msg); - bool IsMatchNetwork(const inet_diag_msg *msg, const std::string &iface, const std::string &ipAddr); - int32_t ProcessSockDiagDumpResponse(uint8_t proto, const std::string &iface, const std::string &ipAddr, - bool excludeLoopback); + bool IsMatchNetwork(const inet_diag_msg *msg, const std::string &ipAddr); + int32_t ProcessSockDiagDumpResponse(uint8_t proto, const std::string &ipAddr, bool excludeLoopback); int32_t SendSockDiagDumpRequest(uint8_t proto, uint8_t family, uint32_t states); - void SockDiagDumpCallback(uint8_t proto, const inet_diag_msg *msg, const std::string &iface, - const std::string &ipAddr, bool excludeLoopback); + void SockDiagDumpCallback(uint8_t proto, const inet_diag_msg *msg, const std::string &ipAddr, bool excludeLoopback); private: struct SockDiagRequest { diff --git a/services/netmanagernative/src/manager/interface_manager.cpp b/services/netmanagernative/src/manager/interface_manager.cpp index c3c4703ec81203b0264213101d6c207ecf05f797..36b5948da865ad72957a8e5334605ac37b4b904d 100644 --- a/services/netmanagernative/src/manager/interface_manager.cpp +++ b/services/netmanagernative/src/manager/interface_manager.cpp @@ -201,7 +201,7 @@ int InterfaceManager::AddAddress(const char *interfaceName, const char *addr, in int InterfaceManager::DelAddress(const char *interfaceName, const char *addr, int prefixLen) { NetLinkSocketDiag socketDiag; - socketDiag.DestroyLiveSockets(interfaceName, addr, true); + socketDiag.DestroyLiveSockets(addr, true); return ModifyAddress(RTM_DELADDR, interfaceName, addr, prefixLen); } diff --git a/services/netmanagernative/src/netsys/netlink_socket_diag.cpp b/services/netmanagernative/src/netsys/netlink_socket_diag.cpp index 4753cde5066aaf87649b9ab562fce49239deb509..4c6238d5dc8e8c3984cc45105ede738ccc211bcb 100644 --- a/services/netmanagernative/src/netsys/netlink_socket_diag.cpp +++ b/services/netmanagernative/src/netsys/netlink_socket_diag.cpp @@ -144,7 +144,7 @@ bool NetLinkSocketDiag::IsLoopbackSocket(const inet_diag_msg *msg) return false; } -bool NetLinkSocketDiag::IsMatchNetwork(const inet_diag_msg *msg, const std::string &iface, const std::string &ipAddr) +bool NetLinkSocketDiag::IsMatchNetwork(const inet_diag_msg *msg, const std::string &ipAddr) { if (msg->idiag_family == AF_INET) { if (CommonUtils::GetAddrFamily(ipAddr) != AF_INET) { @@ -173,8 +173,7 @@ bool NetLinkSocketDiag::IsMatchNetwork(const inet_diag_msg *msg, const std::stri return false; } -int32_t NetLinkSocketDiag::ProcessSockDiagDumpResponse(uint8_t proto, const std::string &iface, - const std::string &ipAddr, bool excludeLoopback) +int32_t NetLinkSocketDiag::ProcessSockDiagDumpResponse(uint8_t proto, const std::string &ipAddr, bool excludeLoopback) { char buf[KERNEL_BUFFER_SIZE] = {0}; ssize_t readBytes = read(dumpSock_, buf, sizeof(buf)); @@ -194,7 +193,7 @@ int32_t NetLinkSocketDiag::ProcessSockDiagDumpResponse(uint8_t proto, const std: return NETMANAGER_SUCCESS; } else { const auto *msg = reinterpret_cast(NLMSG_DATA(nlh)); - SockDiagDumpCallback(proto, msg, iface, ipAddr, excludeLoopback); + SockDiagDumpCallback(proto, msg, ipAddr, excludeLoopback); } } readBytes = read(dumpSock_, buf, sizeof(buf)); @@ -224,8 +223,8 @@ int32_t NetLinkSocketDiag::SendSockDiagDumpRequest(uint8_t proto, uint8_t family return GetErrorFromKernel(dumpSock_); } -void NetLinkSocketDiag::SockDiagDumpCallback(uint8_t proto, const inet_diag_msg *msg, const std::string &iface, - const std::string &ipAddr, bool excludeLoopback) +void NetLinkSocketDiag::SockDiagDumpCallback(uint8_t proto, const inet_diag_msg *msg, const std::string &ipAddr, + bool excludeLoopback) { if (msg == nullptr) { NETNATIVE_LOGE("msg is nullptr"); @@ -237,7 +236,7 @@ void NetLinkSocketDiag::SockDiagDumpCallback(uint8_t proto, const inet_diag_msg return; } - if (!IsMatchNetwork(msg, iface, ipAddr)) { + if (!IsMatchNetwork(msg, ipAddr)) { NETNATIVE_LOGE("Socket is not associated with the network"); return; } @@ -245,11 +244,16 @@ void NetLinkSocketDiag::SockDiagDumpCallback(uint8_t proto, const inet_diag_msg ExecuteDestroySocket(proto, msg); } -void NetLinkSocketDiag::DestroyLiveSockets(const std::string &iface, const std::string &ipAddr, bool excludeLoopback) +void NetLinkSocketDiag::DestroyLiveSockets(const char *ipAddr, bool excludeLoopback) { NETNATIVE_LOG_D("DestroySocketsLackingNetwork in"); + if (ipAddr == nullptr) { + NETNATIVE_LOGE("Ip address is nullptr."); + return; + } + if (!CreateNetlinkSocket()) { - NETNATIVE_LOGE("Error closing sockets for netId change"); + NETNATIVE_LOGE("Create netlink diag socket failed."); return; } @@ -262,7 +266,7 @@ void NetLinkSocketDiag::DestroyLiveSockets(const std::string &iface, const std:: NETNATIVE_LOGE("Failed to dump %{public}s sockets", family == AF_INET ? "IPv4" : "IPv6"); break; } - ret = ProcessSockDiagDumpResponse(proto, iface, ipAddr, excludeLoopback); + ret = ProcessSockDiagDumpResponse(proto, ipAddr, excludeLoopback); if (ret != NETMANAGER_SUCCESS) { NETNATIVE_LOGE("Failed to destroy %{public}s sockets", family == AF_INET ? "IPv4" : "IPv6"); break;