|
@@ -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;
|
|
|
}
|
|
|
|