Sfoglia il codice sorgente

cache getifaddrs - mac

travis laduke 2 anni fa
parent
commit
4192f6a6d9
2 ha cambiato i file con 16 aggiunte e 1 eliminazioni
  1. 13 1
      osdep/MacEthernetTap.cpp
  2. 3 0
      osdep/MacEthernetTap.hpp

+ 13 - 1
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<InetAddress> 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<InetAddress> r;
+
 	if (!getifaddrs(&ifa)) {
 		struct ifaddrs *p = ifa;
 		while (p) {
@@ -368,6 +377,9 @@ std::vector<InetAddress> MacEthernetTap::ips() const
 	}
 	std::sort(r.begin(),r.end());
 	r.erase(std::unique(r.begin(),r.end()),r.end());
+
+	_ifaddrs = r;
+
 	return r;
 }
 

+ 3 - 0
osdep/MacEthernetTap.hpp

@@ -77,6 +77,9 @@ private:
 	int _agentStdin,_agentStdout,_agentStderr,_agentStdin2,_agentStdout2,_agentStderr2;
 	long _agentPid;
 	volatile bool _enabled;
+	mutable std::vector<InetAddress> _ifaddrs;
+	mutable uint64_t _lastIfAddrsUpdate;
+
 };
 
 } // namespace ZeroTier