#include "iface.h"
#include "socket.h"
-static void post_response(flxServer *s, flxRecord *r, gint iface, const flxAddress *a) {
-}
-
-static void handle_query_key(flxServer *s, flxKey *k, gint iface, const flxAddress *a) {
+static void handle_query_key(flxServer *s, flxKey *k, flxInterface *i, const flxAddress *a) {
flxEntry *e;
+ gchar *txt;
g_assert(s);
g_assert(k);
+ g_assert(i);
g_assert(a);
- for (e = g_hash_table_lookup(s->rrset_by_name, k); e; e = e->next_by_name) {
+ g_message("Handling query: %s", txt = flx_key_to_string(k));
+ g_free(txt);
+
+ for (e = g_hash_table_lookup(s->rrset_by_name, k); e; e = e->by_name_next) {
- if ((e->interface <= 0 || e->interface == iface) &&
- (e->protocol == AF_UNSPEC || e->protocol == a->family))
- post_response(s, e->record, iface, a);
+ if ((e->interface <= 0 || e->interface == i->index) &&
+ (e->protocol == AF_UNSPEC || e->protocol == a->family)) {
+
+ flx_interface_post_response(i, a->family, e->record);
+ }
}
}
-static void handle_query(flxServer *s, flxDnsPacket *p, gint iface, const flxAddress *a) {
+static void handle_query(flxServer *s, flxDnsPacket *p, flxInterface *i, const flxAddress *a) {
guint n;
g_assert(s);
g_assert(p);
+ g_assert(i);
g_assert(a);
for (n = flx_dns_packet_get_field(p, DNS_FIELD_QDCOUNT); n > 0; n --) {
-
flxKey *key;
- if (!(key = flx_dns_packet_consume_query(p))) {
+ if (!(key = flx_dns_packet_consume_key(p))) {
g_warning("Packet too short");
return;
}
- handle_query_key(s, key, iface, a);
+ handle_query_key(s, key, i, a);
flx_key_unref(key);
}
}
-static void add_response_to_cache(flxCache *c, flxDnsPacket *p, const flxAddress *a) {
+static void handle_response(flxServer *s, flxDnsPacket *p, flxInterface *i, const flxAddress *a) {
guint n;
- g_assert(c);
+ g_assert(s);
g_assert(p);
+ g_assert(i);
g_assert(a);
- for (n = flx_dns_packet_get_field(p, DNS_FIELD_ANCOUNT); n > 0; n--) {
-
- flxRecord *rr;
+
+ for (n = flx_dns_packet_get_field(p, DNS_FIELD_ANCOUNT) +
+ flx_dns_packet_get_field(p, DNS_FIELD_ARCOUNT); n > 0; n--) {
+ flxRecord *record;
gboolean cache_flush = FALSE;
+ gchar *txt;
- if (!(rr = flx_dns_packet_consume_rr(p, &cache_flush))) {
+ if (!(record = flx_dns_packet_consume_record(p, &cache_flush))) {
g_warning("Packet too short");
return;
}
- flx_cache_update(c, rr, cache_flush, a);
- flx_record_unref(rr);
+ g_message("Handling response: %s", txt = flx_record_to_string(record));
+ g_free(txt);
+
+ flx_cache_update(a->family == AF_INET ? i->ipv4_cache : i->ipv6_cache, record, cache_flush, a);
+ flx_packet_scheduler_drop_response(a->family == AF_INET ? i->ipv4_scheduler : i->ipv6_scheduler, record);
+ flx_record_unref(record);
}
}
g_assert(sa);
g_assert(iface > 0);
+ g_message("new packet recieved.");
+
if (!(i = flx_interface_monitor_get_interface(s->monitor, iface))) {
g_warning("Recieved packet from invalid interface.");
return;
return;
}
-
flx_address_from_sockaddr(sa, &a);
-
+
if (flx_dns_packet_is_query(p)) {
if (flx_dns_packet_get_field(p, DNS_FIELD_QDCOUNT) == 0 ||
- flx_dns_packet_get_field(p, DNS_FIELD_ARCOUNT) != 0
+ flx_dns_packet_get_field(p, DNS_FIELD_ARCOUNT) != 0 ||
flx_dns_packet_get_field(p, DNS_FIELD_NSCOUNT) != 0) {
g_warning("Invalid query packet.");
return;
}
- handle_query(s, p, iface, &a);
+ handle_query(s, p, i, &a);
g_message("Handled query");
} else {
- flxCache *c;
-
if (flx_dns_packet_get_field(p, DNS_FIELD_QDCOUNT) != 0 ||
flx_dns_packet_get_field(p, DNS_FIELD_ANCOUNT) == 0 ||
- flx_dns_packet_get_field(p, DNS_FIELD_NSCOUNT) != 0 ||
- flx_dns_packet_get_field(p, DNS_FIELD_ARCOUNT) != 0) {
+ flx_dns_packet_get_field(p, DNS_FIELD_NSCOUNT) != 0) {
g_warning("Invalid response packet.");
return;
}
- c = a.family == AF_INET ? i->ipv4_cache : i->ipv6_cache;
- add_response_to_cache(c, p, &a);
-
- g_message("Handled responnse");
+ handle_response(s, p, i, &a);
+ g_message("Handled response");
}
}
if (a->family == AF_INET) {
gchar *r;
- flx_server_add_full(s, id, interface, protocol, unique, n, FLX_DNS_CLASS_IN, FLX_DNS_TYPE_A, &a->ipv4, sizeof(a->ipv4), FLX_DEFAULT_TTL);
+ flx_server_add_full(s, id, interface, protocol, unique, n, FLX_DNS_CLASS_IN, FLX_DNS_TYPE_A, &a->data.ipv4, sizeof(a->data.ipv4), FLX_DEFAULT_TTL);
- r = flx_reverse_lookup_name_ipv4(&a->ipv4);
+ r = flx_reverse_lookup_name_ipv4(&a->data.ipv4);
g_assert(r);
flx_server_add_full(s, id, interface, protocol, unique, r, FLX_DNS_CLASS_IN, FLX_DNS_TYPE_PTR, n, strlen(n)+1, FLX_DEFAULT_TTL);
g_free(r);
} else {
gchar *r;
- flx_server_add_full(s, id, interface, protocol, unique, n, FLX_DNS_CLASS_IN, FLX_DNS_TYPE_AAAA, &a->ipv6, sizeof(a->ipv6), FLX_DEFAULT_TTL);
+ flx_server_add_full(s, id, interface, protocol, unique, n, FLX_DNS_CLASS_IN, FLX_DNS_TYPE_AAAA, &a->data.ipv6, sizeof(a->data.ipv6), FLX_DEFAULT_TTL);
- r = flx_reverse_lookup_name_ipv6_arpa(&a->ipv6);
+ r = flx_reverse_lookup_name_ipv6_arpa(&a->data.ipv6);
g_assert(r);
flx_server_add_full(s, id, interface, protocol, unique, r, FLX_DNS_CLASS_IN, FLX_DNS_TYPE_PTR, n, strlen(n)+1, FLX_DEFAULT_TTL);
g_free(r);
- r = flx_reverse_lookup_name_ipv6_int(&a->ipv6);
+ r = flx_reverse_lookup_name_ipv6_int(&a->data.ipv6);
g_assert(r);
flx_server_add_full(s, id, interface, protocol, unique, r, FLX_DNS_CLASS_IN, FLX_DNS_TYPE_PTR, n, strlen(n)+1, FLX_DEFAULT_TTL);
g_free(r);
flx_server_add_full(s, id, interface, protocol, unique, name, FLX_DNS_CLASS_IN, FLX_DNS_TYPE_TXT, text, strlen(text), FLX_DEFAULT_TTL);
}
-void flx_server_send_query(flxServer *s, gint interface, guchar protocol, flxKey *k) {
+void flx_server_post_query(flxServer *s, gint interface, guchar protocol, flxKey *k) {
g_assert(s);
g_assert(k);
flxInterface *i;
for (i = flx_interface_monitor_get_first(s->monitor); i; i = i->interface_next)
- flx_interface_send_query(i, protocol, k);
+ flx_interface_post_query(i, protocol, k);
} else {
flxInterface *i;
if (!(i = flx_interface_monitor_get_interface(s->monitor, interface)))
return;
- flx_interface_send_query(i, protocol, k);
+ flx_interface_post_query(i, protocol, k);
}
}