From 2d7387bcf63ccf0db74ea96295ec23f4780683e7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Philipp=20T=C3=B6lke?= Date: Tue, 21 Sep 2010 15:14:40 +0000 Subject: [PATCH] save a bit of state --- src/vpn/gnunet-service-dns.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/vpn/gnunet-service-dns.c b/src/vpn/gnunet-service-dns.c index b05bfd17f..351df68a6 100644 --- a/src/vpn/gnunet-service-dns.c +++ b/src/vpn/gnunet-service-dns.c @@ -32,7 +32,6 @@ #include "gnunet-vpn-packet.h" #include "gnunet-vpn-pretty-print.h" - struct dns_cls { struct GNUNET_SCHEDULER_Handle *sched; @@ -40,9 +39,16 @@ struct dns_cls { unsigned short dnsoutport; }; - static struct dns_cls mycls; +struct dns_query_id_state { + unsigned valid:1; + struct GNUNET_SERVER_Client* client; + unsigned local_ip:32; + unsigned local_port:16; +}; +static struct dns_query_id_state query_states[65536]; /* This is < 1MiB */ + void hijack(unsigned short port) { char port_s[6]; @@ -69,9 +75,11 @@ void receive_query(void *cls, struct GNUNET_SERVER_Client *client, const struct memset(&dest, 0, sizeof dest); dest.sin_port = htons(53); dest.sin_addr.s_addr = pkt->orig_to; - /* TODO: - * State merken, damit die Antwort korrekt zurückgeschickt werden kann - */ + + query_states[dns->id].valid = 1; + query_states[dns->id].client = client; + query_states[dns->id].local_ip = pkt->orig_from; + query_states[dns->id].local_port = pkt->src_port; int r = GNUNET_NETWORK_socket_sendto(mycls.dnsout, dns, ntohs(pkt->hdr.size) - sizeof(struct query_packet) + 1, (struct sockaddr*) &dest, sizeof dest); GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "send %d bytes to socket\n", r); @@ -89,7 +97,11 @@ static void read_response (void *cls, const struct GNUNET_SCHEDULER_TaskContext int r; r = GNUNET_NETWORK_socket_recv(mycls.dnsout, buf, 65536); - pkt_printf_dns(dns); + if (query_states[dns->id].valid == 1) { + query_states[dns->id].valid = 0; + + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Would send answer to Client %x, to IP %x:%d\n", query_states[dns->id].client, ntohl(query_states[dns->id].local_ip), ntohs(query_states[dns->id].local_port)); + } GNUNET_SCHEDULER_add_read_net(mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.dnsout, &read_response, NULL); } @@ -125,6 +137,14 @@ run (void *cls, {&receive_query, NULL, GNUNET_MESSAGE_TYPE_LOCAL_QUERY_DNS, 0}, {NULL, NULL, 0, 0} }; + + { + int i; + for (i = 0; i < 65536; i++) { + query_states[i].valid = 0; + } + } + struct sockaddr_in addr; mycls.sched = sched; -- 2.25.1