From 9a048b843719ad831c17b030ac522bc1e57122f8 Mon Sep 17 00:00:00 2001 From: Sjoerd Simons Date: Mon, 28 Jan 2008 12:49:53 +0000 Subject: Make the poof algorithm only positive if 4 unanswered queries each at least one second apart are observed. This reduces the likelyhood of false positives a lot. git-svn-id: file:///home/lennart/svn/public/avahi/trunk@1746 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe --- avahi-core/cache.c | 21 ++++++++++++++++----- avahi-core/cache.h | 2 ++ avahi-core/server.c | 3 ++- 3 files changed, 20 insertions(+), 6 deletions(-) (limited to 'avahi-core') diff --git a/avahi-core/cache.c b/avahi-core/cache.c index 4ba88b5..9d97b6c 100644 --- a/avahi-core/cache.c +++ b/avahi-core/cache.c @@ -444,12 +444,15 @@ void avahi_cache_flush(AvahiCache *c) { static void* start_poof_callback(AvahiCache *c, AvahiKey *pattern, AvahiCacheEntry *e, void *userdata) { AvahiAddress *a = userdata; + struct timeval now; assert(c); assert(pattern); assert(e); assert(a); - + + gettimeofday(&now, NULL); + switch (e->state) { case AVAHI_CACHE_VALID: @@ -458,15 +461,23 @@ static void* start_poof_callback(AvahiCache *c, AvahiKey *pattern, AvahiCacheEnt e->state = AVAHI_CACHE_POOF; e->poof_address = *a; - + e->poof_timestamp = now; + e->poof_num = 0; + break; case AVAHI_CACHE_POOF: + if (avahi_timeval_diff(&now, &e->poof_timestamp) < 1000000) + break; - /* This is the second time we got no response, so let's + e->poof_timestamp = now; + e->poof_address = *a; + e->poof_num ++; + + /* This is the 4th time we got no response, so let's * fucking remove this entry. */ - - expire_in_one_second(c, e, AVAHI_CACHE_POOF_FINAL); + if (e->poof_num > 3) + expire_in_one_second(c, e, AVAHI_CACHE_POOF_FINAL); break; default: diff --git a/avahi-core/cache.h b/avahi-core/cache.h index edf9fa5..fd74005 100644 --- a/avahi-core/cache.h +++ b/avahi-core/cache.h @@ -48,8 +48,10 @@ struct AvahiCacheEntry { AvahiCache *cache; AvahiRecord *record; struct timeval timestamp; + struct timeval poof_timestamp; struct timeval expiry; int cache_flush; + int poof_num; AvahiAddress origin; diff --git a/avahi-core/server.c b/avahi-core/server.c index ebd0bff..453db09 100644 --- a/avahi-core/server.c +++ b/avahi-core/server.c @@ -585,7 +585,8 @@ static void handle_query_packet(AvahiServer *s, AvahiDnsPacket *p, AvahiInterfac if (!legacy_unicast && !from_local_iface) { reflect_query(s, i, key); - avahi_cache_start_poof(i->cache, key, a); + if (!unicast_response) + avahi_cache_start_poof(i->cache, key, a); } if (avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_ANCOUNT) == 0 && -- cgit