From 72c2f630c9b1a7344f7dd1d9e90cca41daa56ff6 Mon Sep 17 00:00:00 2001 From: kangping Date: Fri, 1 Oct 2021 00:06:02 +0800 Subject: [PATCH] [routing-manager] make sure there is a LLA before enabling routing manager (#7042) --- src/posix/platform/infra_if.cpp | 34 ++++++++++++++++++++++++++++++++- src/posix/platform/infra_if.hpp | 1 + 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/posix/platform/infra_if.cpp b/src/posix/platform/infra_if.cpp index 7da987a2d..4ca87b617 100644 --- a/src/posix/platform/infra_if.cpp +++ b/src/posix/platform/infra_if.cpp @@ -264,7 +264,39 @@ bool InfraNetif::IsRunning(void) const close(sock); - return (ifReq.ifr_flags & IFF_RUNNING); + return (ifReq.ifr_flags & IFF_RUNNING) && HasLinkLocalAddress(); +} + +bool InfraNetif::HasLinkLocalAddress(void) const +{ + bool hasLla = false; + struct ifaddrs *ifAddrs = nullptr; + + if (getifaddrs(&ifAddrs) < 0) + { + otLogCritPlat("failed to get netif addresses: %s", strerror(errno)); + DieNow(OT_EXIT_ERROR_ERRNO); + } + + for (struct ifaddrs *addr = ifAddrs; addr != nullptr; addr = addr->ifa_next) + { + struct sockaddr_in6 *ip6Addr; + + if (strncmp(addr->ifa_name, mInfraIfName, sizeof(mInfraIfName)) != 0 || addr->ifa_addr->sa_family != AF_INET6) + { + continue; + } + + ip6Addr = reinterpret_cast(addr->ifa_addr); + if (IN6_IS_ADDR_LINKLOCAL(&ip6Addr->sin6_addr)) + { + hasLla = true; + break; + } + } + + freeifaddrs(ifAddrs); + return hasLla; } void InfraNetif::Init(const char *aIfName) diff --git a/src/posix/platform/infra_if.hpp b/src/posix/platform/infra_if.hpp index c44b43038..f638047dc 100644 --- a/src/posix/platform/infra_if.hpp +++ b/src/posix/platform/infra_if.hpp @@ -143,6 +143,7 @@ private: void ReceiveNetLinkMessage(void); void ReceiveIcmp6Message(void); + bool HasLinkLocalAddress(void) const; }; } // namespace Posix