X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=server.c;h=2b354bdf63d8421782b26e1a9125a54df07a3637;hb=c8dd2dc8f91a322178c43281cbc5c8fc16da5219;hp=6027f5f4aa75fd05f6ce0f730018b2c109b42589;hpb=54247ce93dc6f048c0ffea546f454653ce0e25a8;p=catta diff --git a/server.c b/server.c index 6027f5f..2b354bd 100644 --- a/server.c +++ b/server.c @@ -9,45 +9,37 @@ #include "iface.h" #include "socket.h" -static void post_response(flxServer *s, flxRecord *r, gint iface, const flxAddress *a) { - flxInterface *i; - - g_assert(s); - g_assert(r); - g_assert(iface > 0); - g_assert(a); - - if ((i = flx_interface_monitor_get_interface(s->monitor, iface))) - flx_interface_send_response(i, a->family, r); - -} - -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); + 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) && + if ((e->interface <= 0 || e->interface == i->index) && (e->protocol == AF_UNSPEC || e->protocol == a->family)) { - post_response(s, e->record, iface, a); + 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_key(p))) { @@ -55,29 +47,36 @@ static void handle_query(flxServer *s, flxDnsPacket *p, gint iface, const flxAdd 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_record(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); } } @@ -120,9 +119,8 @@ static void dispatch_packet(flxServer *s, flxDnsPacket *p, struct sockaddr *sa, 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 || @@ -132,23 +130,18 @@ static void dispatch_packet(flxServer *s, flxDnsPacket *p, struct sockaddr *sa, 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"); } } @@ -479,9 +472,9 @@ void flx_server_add_address( 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); @@ -489,14 +482,14 @@ void flx_server_add_address( } 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); @@ -520,7 +513,7 @@ void flx_server_add_text( 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); @@ -528,7 +521,7 @@ void flx_server_send_query(flxServer *s, gint interface, guchar protocol, flxKey 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; @@ -536,6 +529,6 @@ void flx_server_send_query(flxServer *s, gint interface, guchar protocol, flxKey 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); } }