diff options
author | Lennart Poettering <lennart@poettering.net> | 2005-11-13 16:36:33 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2005-11-13 16:36:33 +0000 |
commit | da75d1898a45c106a994cd87f8da5b6bcb2b6450 (patch) | |
tree | 2c0016b9908d4f3816e3c5ee609a12292423293a /avahi-core/server.c | |
parent | c9d4620346b561e7eac4c04c070351710f195acc (diff) |
* Make "NameAcquired" warning line disappear in avahi-client
Scheduler tweaks:
* Add some more comments
* Remove scheduled queries from the query queue if the querier which issued
them dies. This reduces traffic immensly when many short lived queries are
made, e.g. during host name lookups.
* Don't free a querier object immediately when it is no longer referenced.
Instead keep it and try to recycle it in case someone else wants to do the
same query later on. Free it at the latest moment possible: just before the
next query is scheduled to be made. This reduces traffic immensly when many
short lived queries are made.
With these two changes we can minimize the traffic to zero or near zero for
many simple lookups.
* When responding records with the FLUSH_CACHE bit set, reply immediately only
when all response record have this bit set. Prior to this change we replied
imediately as soon as one record hat this bit set. This change should make us
pass *all* Bonjour mDNS conformance tests without any exceptions.
git-svn-id: file:///home/lennart/svn/public/avahi/trunk@954 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
Diffstat (limited to 'avahi-core/server.c')
-rw-r--r-- | avahi-core/server.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/avahi-core/server.c b/avahi-core/server.c index eb04ec1..5790bee 100644 --- a/avahi-core/server.c +++ b/avahi-core/server.c @@ -404,15 +404,25 @@ void avahi_server_generate_response(AvahiServer *s, AvahiInterface *i, AvahiDnsP int tc = p && !!(avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_FLAGS) & AVAHI_DNS_FLAG_TC); while ((r = avahi_record_list_next(s->record_list, &flush_cache, &unicast_response, &auxiliary))) { - - if (!avahi_interface_post_response(i, r, flush_cache, a, immediately || (flush_cache && !tc && !auxiliary)) && unicast_response) { - append_aux_records_to_list(s, i, r, unicast_response); - + int im = immediately; + + /* Only send the response immediately if it contains a + * unique entry AND it is not in reply to a truncated + * packet AND it is not an auxiliary record AND all other + * responses for this record are unique too. */ + + if (flush_cache && !tc && !auxiliary && avahi_record_list_all_flush_cache(s->record_list)) + im = 1; + + if (!avahi_interface_post_response(i, r, flush_cache, a, im) && unicast_response) { + /* Due to some reasons the record has not been scheduled. * The client requested an unicast response in that * case. Therefore we prepare such a response */ + append_aux_records_to_list(s, i, r, unicast_response); + for (;;) { if (!reply) { @@ -517,7 +527,7 @@ static void reflect_query(AvahiServer *s, AvahiInterface *i, AvahiKey *k) { for (j = s->monitor->interfaces; j; j = j->interface_next) if (j != i && (s->config.reflect_ipv || j->protocol == i->protocol)) { /* Post the query to other networks */ - avahi_interface_post_query(j, k, 1); + avahi_interface_post_query(j, k, 1, NULL); /* Reply from caches of other network. This is needed to * "work around" known answer suppression. */ |