diff --git a/osdep/BSDEthernetTap.cpp b/osdep/BSDEthernetTap.cpp index efba03147..b2e1a8760 100644 --- a/osdep/BSDEthernetTap.cpp +++ b/osdep/BSDEthernetTap.cpp @@ -74,7 +74,8 @@ BSDEthernetTap::BSDEthernetTap( _mtu(mtu), _metric(metric), _fd(0), - _enabled(true) + _enabled(true), + _lastIfAddrsUpdate(0) { static Mutex globalTapCreateLock; char devpath[64],ethaddr[64],mtustr[32],metstr[32],tmpdevname[32]; @@ -287,6 +288,13 @@ bool BSDEthernetTap::removeIp(const InetAddress &ip) std::vector BSDEthernetTap::ips() const { + uint64_t now = OSUtils::now(); + + if ((now - _lastIfAddrsUpdate) <= GETIFADDRS_CACHE_TIME) { + return _ifaddrs; + } + _lastIfAddrsUpdate = now; + struct ifaddrs *ifa = (struct ifaddrs *)0; if (getifaddrs(&ifa)) return std::vector(); @@ -320,6 +328,8 @@ std::vector BSDEthernetTap::ips() const std::sort(r.begin(),r.end()); std::unique(r.begin(),r.end()); + _ifaddrs = r; + return r; } diff --git a/osdep/BSDEthernetTap.hpp b/osdep/BSDEthernetTap.hpp index c66fb6f79..fc4e4908e 100644 --- a/osdep/BSDEthernetTap.hpp +++ b/osdep/BSDEthernetTap.hpp @@ -71,6 +71,8 @@ private: int _fd; int _shutdownSignalPipe[2]; volatile bool _enabled; + mutable std::vector _ifaddrs; + mutable uint64_t _lastIfAddrsUpdate; }; } // namespace ZeroTier