gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r13054 - gnunet/src/vpn


From: gnunet
Subject: [GNUnet-SVN] r13054 - gnunet/src/vpn
Date: Tue, 21 Sep 2010 17:14:40 +0200

Author: toelke
Date: 2010-09-21 17:14:40 +0200 (Tue, 21 Sep 2010)
New Revision: 13054

Modified:
   gnunet/src/vpn/gnunet-service-dns.c
Log:
save a bit of state

Modified: gnunet/src/vpn/gnunet-service-dns.c
===================================================================
--- gnunet/src/vpn/gnunet-service-dns.c 2010-09-21 13:49:10 UTC (rev 13053)
+++ gnunet/src/vpn/gnunet-service-dns.c 2010-09-21 15:14:40 UTC (rev 13054)
@@ -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 @@
 
        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,10 +75,12 @@
        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,8 +97,12 @@
        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 @@
     {&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;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]