]> git.meshlink.io Git - catta/blobdiff - server.c
add known answer suppresion server part
[catta] / server.c
index 6b3c2dd61c3c899714bba2c154004d59b4b3eea0..04c7d10821bc8a0c4712f68b716715f5eef879cc 100644 (file)
--- a/server.c
+++ b/server.c
@@ -24,9 +24,22 @@ static void handle_query_key(flxServer *s, flxKey *k, flxInterface *i, const flx
 
     flx_packet_scheduler_incoming_query(i->scheduler, k);
 
-    for (e = g_hash_table_lookup(s->rrset_by_key, k); e; e = e->by_key_next)
-        if (flx_interface_match(i, e->interface, e->protocol))
-            flx_interface_post_response(i, e->record, FALSE);
+    if (k->type == FLX_DNS_TYPE_ANY) {
+
+        /* Handle ANY query */
+        
+        for (e = s->entries; e; e = e->entry_next)
+            if (flx_key_pattern_match(k, e->record->key))
+                if (flx_interface_match(i, e->interface, e->protocol))
+                    flx_interface_post_response(i, a, e->record, FALSE);
+    } else {
+
+        /* Handle all other queries */
+        
+        for (e = g_hash_table_lookup(s->rrset_by_key, k); e; e = e->by_key_next)
+            if (flx_interface_match(i, e->interface, e->protocol))
+                flx_interface_post_response(i, a, e->record, FALSE);
+    }
 }
 
 static void handle_query(flxServer *s, flxDnsPacket *p, flxInterface *i, const flxAddress *a) {
@@ -48,6 +61,20 @@ static void handle_query(flxServer *s, flxDnsPacket *p, flxInterface *i, const f
         handle_query_key(s, key, i, a);
         flx_key_unref(key);
     }
+
+    /* Known Answer Suppresion */
+    for (n = flx_dns_packet_get_field(p, DNS_FIELD_ANCOUNT); n > 0; n --) {
+        flxRecord *record;
+        gboolean unique = FALSE;
+
+        if (!(record = flx_dns_packet_consume_record(p, &unique))) {
+            g_warning("Packet too short (2)");
+            return;
+        }
+
+        flx_packet_scheduler_incoming_known_answer(i->scheduler, record, a);
+        flx_record_unref(record);
+    }
 }
 
 static void handle_response(flxServer *s, flxDnsPacket *p, flxInterface *i, const flxAddress *a) {
@@ -69,13 +96,15 @@ static void handle_response(flxServer *s, flxDnsPacket *p, flxInterface *i, cons
             return;
         }
 
-        g_message("Handling response: %s", txt = flx_record_to_string(record));
-        g_free(txt);
-
-        flx_cache_update(i->cache, record, cache_flush, a);
-
-        flx_packet_scheduler_incoming_response(i->scheduler, record);
-        flx_record_unref(record);
+        if (record->key->type != FLX_DNS_TYPE_ANY) {
+            g_message("Handling response: %s", txt = flx_record_to_string(record));
+            g_free(txt);
+            
+            flx_cache_update(i->cache, record, cache_flush, a);
+            
+            flx_packet_scheduler_incoming_response(i->scheduler, record);
+            flx_record_unref(record);
+        }
     }
 }
 
@@ -348,6 +377,8 @@ void flx_server_add(
     g_assert(s);
     g_assert(r);
 
+    g_assert(r->key->type != FLX_DNS_TYPE_ANY);
+
     e = g_new(flxServerEntry, 1);
     e->record = flx_record_ref(r);
     e->id = id;
@@ -566,7 +597,7 @@ static void post_response_callback(flxInterfaceMonitor *m, flxInterface *i, gpoi
     g_assert(i);
     g_assert(r);
 
-    flx_interface_post_response(i, r, FALSE);
+    flx_interface_post_response(i, NULL, r, FALSE);
 }
 
 void flx_server_post_response(flxServer *s, gint interface, guchar protocol, flxRecord *record) {