[routing-manager] make sure there is a LLA before enabling routing manager (#7042)

This commit is contained in:
kangping
2021-09-30 09:06:02 -07:00
committed by GitHub
parent 3e82174c53
commit 72c2f630c9
2 changed files with 34 additions and 1 deletions
+33 -1
View File
@@ -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<sockaddr_in6 *>(addr->ifa_addr);
if (IN6_IS_ADDR_LINKLOCAL(&ip6Addr->sin6_addr))
{
hasLla = true;
break;
}
}
freeifaddrs(ifAddrs);
return hasLla;
}
void InfraNetif::Init(const char *aIfName)
+1
View File
@@ -143,6 +143,7 @@ private:
void ReceiveNetLinkMessage(void);
void ReceiveIcmp6Message(void);
bool HasLinkLocalAddress(void) const;
};
} // namespace Posix