mirror of
https://github.com/espressif/openthread.git
synced 2026-08-26 04:09:52 +00:00
[routing-manager] make sure there is a LLA before enabling routing manager (#7042)
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -143,6 +143,7 @@ private:
|
||||
|
||||
void ReceiveNetLinkMessage(void);
|
||||
void ReceiveIcmp6Message(void);
|
||||
bool HasLinkLocalAddress(void) const;
|
||||
};
|
||||
|
||||
} // namespace Posix
|
||||
|
||||
Reference in New Issue
Block a user