summaryrefslogtreecommitdiffstats
path: root/avahi-core/server.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2005-05-10 23:15:51 +0000
committerLennart Poettering <lennart@poettering.net>2005-05-10 23:15:51 +0000
commit8d8c0255f0f0242a067b577747740bab1b1021ea (patch)
tree7a79b9ffb29fc03b9ade734815ebf348de0020d2 /avahi-core/server.c
parent602a2b6481587b7da2594db39151ec9380f276df (diff)
check MUSTs of RFC:
* always set AA bit on response * handle conflict in known answer suppresion git-svn-id: file:///home/lennart/svn/public/avahi/trunk@67 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
Diffstat (limited to 'avahi-core/server.c')
-rw-r--r--avahi-core/server.c128
1 files changed, 70 insertions, 58 deletions
diff --git a/avahi-core/server.c b/avahi-core/server.c
index 3f37e1f..e9289da 100644
--- a/avahi-core/server.c
+++ b/avahi-core/server.c
@@ -265,64 +265,6 @@ static void incoming_probe(AvahiServer *s, AvahiRecord *record, AvahiInterface *
g_free(t);
}
-static void handle_query(AvahiServer *s, AvahiDnsPacket *p, AvahiInterface *i, const AvahiAddress *a, guint16 port, gboolean legacy_unicast) {
- guint n;
-
- g_assert(s);
- g_assert(p);
- g_assert(i);
- g_assert(a);
-
- g_assert(!s->unicast_packet);
-
- /* Handle the questions */
- for (n = avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_QDCOUNT); n > 0; n --) {
- AvahiKey *key;
- gboolean unicast_response = FALSE;
-
- if (!(key = avahi_dns_packet_consume_key(p, &unicast_response))) {
- g_warning("Packet too short (1)");
- return;
- }
-
- handle_query_key(s, p, key, i, a, port, legacy_unicast, unicast_response);
- avahi_key_unref(key);
- }
-
- /* Known Answer Suppression */
- for (n = avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_ANCOUNT); n > 0; n --) {
- AvahiRecord *record;
- gboolean unique = FALSE;
-
- if (!(record = avahi_dns_packet_consume_record(p, &unique))) {
- g_warning("Packet too short (2)");
- return;
- }
-
- avahi_packet_scheduler_incoming_known_answer(i->scheduler, record, a);
- avahi_record_unref(record);
- }
-
- /* Probe record */
- for (n = avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_NSCOUNT); n > 0; n --) {
- AvahiRecord *record;
- gboolean unique = FALSE;
-
- if (!(record = avahi_dns_packet_consume_record(p, &unique))) {
- g_warning("Packet too short (3)");
- return;
- }
-
- if (record->key->type != AVAHI_DNS_TYPE_ANY)
- incoming_probe(s, record, i);
-
- avahi_record_unref(record);
- }
-
- if (s->unicast_packet)
- send_unicast_response_packet(s, i, a, port);
-}
-
static gboolean handle_conflict(AvahiServer *s, AvahiInterface *i, AvahiRecord *record, gboolean unique, const AvahiAddress *a) {
gboolean valid = TRUE;
AvahiEntry *e, *n;
@@ -390,6 +332,76 @@ static gboolean handle_conflict(AvahiServer *s, AvahiInterface *i, AvahiRecord *
return valid;
}
+static void incoming_known_answer(AvahiServer *s, AvahiInterface *i, AvahiRecord *r, gboolean legacy_unicast, gboolean unique, const AvahiAddress *a) {
+ g_assert(s);
+ g_assert(i);
+ g_assert(r);
+
+ if (legacy_unicast)
+ return;
+
+ if (handle_conflict(s, i, r, unique, a))
+ avahi_packet_scheduler_incoming_known_answer(i->scheduler, r, a);
+}
+
+static void handle_query(AvahiServer *s, AvahiDnsPacket *p, AvahiInterface *i, const AvahiAddress *a, guint16 port, gboolean legacy_unicast) {
+ guint n;
+
+ g_assert(s);
+ g_assert(p);
+ g_assert(i);
+ g_assert(a);
+
+ g_assert(!s->unicast_packet);
+
+ /* Handle the questions */
+ for (n = avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_QDCOUNT); n > 0; n --) {
+ AvahiKey *key;
+ gboolean unicast_response = FALSE;
+
+ if (!(key = avahi_dns_packet_consume_key(p, &unicast_response))) {
+ g_warning("Packet too short (1)");
+ return;
+ }
+
+ handle_query_key(s, p, key, i, a, port, legacy_unicast, unicast_response);
+ avahi_key_unref(key);
+ }
+
+ /* Known Answer Suppression */
+ for (n = avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_ANCOUNT); n > 0; n --) {
+ AvahiRecord *record;
+ gboolean unique = FALSE;
+
+ if (!(record = avahi_dns_packet_consume_record(p, &unique))) {
+ g_warning("Packet too short (2)");
+ return;
+ }
+
+ incoming_known_answer(s, i, record, legacy_unicast, unique, a);
+ avahi_record_unref(record);
+ }
+
+ /* Probe record */
+ for (n = avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_NSCOUNT); n > 0; n --) {
+ AvahiRecord *record;
+ gboolean unique = FALSE;
+
+ if (!(record = avahi_dns_packet_consume_record(p, &unique))) {
+ g_warning("Packet too short (3)");
+ return;
+ }
+
+ if (record->key->type != AVAHI_DNS_TYPE_ANY)
+ incoming_probe(s, record, i);
+
+ avahi_record_unref(record);
+ }
+
+ if (s->unicast_packet)
+ send_unicast_response_packet(s, i, a, port);
+}
+
static void handle_response(AvahiServer *s, AvahiDnsPacket *p, AvahiInterface *i, const AvahiAddress *a) {
guint n;