From 4192f6a6d92cd63ffb13c73b50be5f7d0fe4a3d9 Mon Sep 17 00:00:00 2001 From: travis laduke Date: Tue, 16 May 2023 16:16:12 -0700 Subject: [PATCH] cache getifaddrs - mac --- osdep/MacEthernetTap.cpp | 14 +++++++++++++- osdep/MacEthernetTap.hpp | 3 +++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/osdep/MacEthernetTap.cpp b/osdep/MacEthernetTap.cpp index 55822fd5a..392f222b8 100644 --- a/osdep/MacEthernetTap.cpp +++ b/osdep/MacEthernetTap.cpp @@ -90,7 +90,8 @@ MacEthernetTap::MacEthernetTap( _agentStdout2(-1), _agentStderr2(-1), _agentPid(-1), - _enabled(true) + _enabled(true), + _lastIfAddrsUpdate(0) { char ethaddr[64],mtustr[16],devnostr[16],devstr[16],metricstr[16]; OSUtils::ztsnprintf(ethaddr,sizeof(ethaddr),"%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",(int)mac[0],(int)mac[1],(int)mac[2],(int)mac[3],(int)mac[4],(int)mac[5]); @@ -341,8 +342,16 @@ bool MacEthernetTap::removeIp(const InetAddress &ip) std::vector MacEthernetTap::ips() const { + uint64_t now = OSUtils::now(); + + if ((now - _lastIfAddrsUpdate) <= GETIFADDRS_CACHE_TIME) { + return _ifaddrs; + } + _lastIfAddrsUpdate = now; + struct ifaddrs *ifa = (struct ifaddrs *)0; std::vector r; + if (!getifaddrs(&ifa)) { struct ifaddrs *p = ifa; while (p) { @@ -368,6 +377,9 @@ std::vector MacEthernetTap::ips() const } std::sort(r.begin(),r.end()); r.erase(std::unique(r.begin(),r.end()),r.end()); + + _ifaddrs = r; + return r; } diff --git a/osdep/MacEthernetTap.hpp b/osdep/MacEthernetTap.hpp index 4b02999b9..8ba378022 100644 --- a/osdep/MacEthernetTap.hpp +++ b/osdep/MacEthernetTap.hpp @@ -77,6 +77,9 @@ private: int _agentStdin,_agentStdout,_agentStderr,_agentStdin2,_agentStdout2,_agentStderr2; long _agentPid; volatile bool _enabled; + mutable std::vector _ifaddrs; + mutable uint64_t _lastIfAddrsUpdate; + }; } // namespace ZeroTier