diff --git a/osdep/WindowsEthernetTap.cpp b/osdep/WindowsEthernetTap.cpp index db65bbf41..7a9d4b309 100644 --- a/osdep/WindowsEthernetTap.cpp +++ b/osdep/WindowsEthernetTap.cpp @@ -467,7 +467,8 @@ WindowsEthernetTap::WindowsEthernetTap( _pathToHelpers(hp), _run(true), _initialized(false), - _enabled(true) + _enabled(true), + _lastIfAddrsUpdate(0) { char subkeyName[1024]; char subkeyClass[1024]; @@ -749,6 +750,14 @@ std::vector WindowsEthernetTap::ips() const if (!_initialized) return addrs; + uint64_t now = OSUtils::now(); + + if ((now - _lastIfAddrsUpdate) <= GETIFADDRS_CACHE_TIME) { + return _ifaddrs; + } + + _lastIfAddrsUpdate = now; + try { MIB_UNICASTIPADDRESS_TABLE *ipt = (MIB_UNICASTIPADDRESS_TABLE *)0; if (GetUnicastIpAddressTable(AF_UNSPEC,&ipt) == NO_ERROR) { @@ -777,6 +786,8 @@ std::vector WindowsEthernetTap::ips() const std::sort(addrs.begin(),addrs.end()); addrs.erase(std::unique(addrs.begin(),addrs.end()),addrs.end()); + _ifaddrs = addrs; + return addrs; } diff --git a/osdep/WindowsEthernetTap.hpp b/osdep/WindowsEthernetTap.hpp index a08042d44..a79dac0ec 100644 --- a/osdep/WindowsEthernetTap.hpp +++ b/osdep/WindowsEthernetTap.hpp @@ -152,6 +152,9 @@ private: volatile bool _run; volatile bool _initialized; volatile bool _enabled; + + mutable std::vector _ifaddrs; + mutable uint64_t _lastIfAddrsUpdate; }; } // namespace ZeroTier