Send answers from the DHT to the daemon-vpn
authorPhilipp Tölke <toelke@in.tum.de>
Tue, 19 Oct 2010 21:16:50 +0000 (21:16 +0000)
committerPhilipp Tölke <toelke@in.tum.de>
Tue, 19 Oct 2010 21:16:50 +0000 (21:16 +0000)
src/vpn/gnunet-daemon-vpn.c
src/vpn/gnunet-service-dns-p.h
src/vpn/gnunet-service-dns.c

index 35dc32f1f62e02889ce75e4e7561c9919393815a..5be4f93781a138f3dfefc1f12ff21ec682f8c70c 100644 (file)
@@ -61,8 +61,8 @@ struct vpn_cls {
        struct query_packet_list *head;
        struct query_packet_list *tail;
 
-       struct answer_packet_list *answer_head;
-       struct answer_packet_list *answer_tail;
+       struct answer_packet_list *answer_proc_head;
+       struct answer_packet_list *answer_proc_tail;
 };
 
 static struct vpn_cls mycls;
@@ -151,7 +151,7 @@ static uint16_t calculate_ip_checksum(uint16_t* hdr, short len) {
 static void helper_write(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tsdkctx) {
        if (tsdkctx->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)
                return;
-       struct answer_packet_list* ans = mycls.answer_head;
+       struct answer_packet_list* ans = mycls.answer_proc_head;
        size_t len = ntohs(ans->pkt.hdr.size);
 
        GNUNET_assert(ans->pkt.subtype == GNUNET_DNS_ANSWER_TYPE_IP);
@@ -191,12 +191,12 @@ static void helper_write(void* cls, const struct GNUNET_SCHEDULER_TaskContext* t
 
        memcpy(&pkt->udp_dns.data, ans->pkt.data, data_len);
        
-       GNUNET_CONTAINER_DLL_remove (mycls.answer_head, mycls.answer_tail, ans);
+       GNUNET_CONTAINER_DLL_remove (mycls.answer_proc_head, mycls.answer_proc_tail, ans);
        GNUNET_free(ans);
 
        /* FIXME */ GNUNET_DISK_file_write(mycls.fh_to_helper, pkt, pkt_len);
 
-       if (mycls.answer_head != NULL)
+       if (mycls.answer_proc_head != NULL)
                GNUNET_SCHEDULER_add_write_file (mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.fh_to_helper, &helper_write, NULL);
 }
 
@@ -283,10 +283,36 @@ reconnect_to_service_dns (void *cls,
     /* struct GNUNET_CLIENT_TransmitHandle* th = */ GNUNET_CLIENT_notify_transmit_ready(mycls.dns_connection, ntohs(mycls.head->pkt.hdr.size), GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_YES, &send_query, NULL);
 }
 
-static void 
-dns_answer_handler(void* cls, const struct GNUNET_MessageHeader *msg) 
+static void
+process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) {
+    struct answer_packet* pkt = cls;
+
+    if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_IP)
+      {
+       struct answer_packet_list* list = GNUNET_malloc(htons(pkt->hdr.size) + 2*sizeof(struct answer_packet_list*));
+
+       memcpy(&list->pkt, pkt, htons(pkt->hdr.size));
+
+       GNUNET_CONTAINER_DLL_insert_after(mycls.answer_proc_head, mycls.answer_proc_tail, mycls.answer_proc_tail, list);
+
+       GNUNET_SCHEDULER_add_write_file (mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.fh_to_helper, &helper_write, NULL);
+
+       return;
+      }
+
+    if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_SERVICE)
+      {
+       /*FIXME:
+        * -find new IP-address for this service
+        * -create a DNS-Answer
+        */
+      }
+}
+
+static void
+dns_answer_handler(void* cls, const struct GNUNET_MessageHeader *msg)
 {
-  if (msg == NULL) 
+  if (msg == NULL)
     {
       GNUNET_CLIENT_disconnect(mycls.dns_connection, GNUNET_NO);
       mycls.dns_connection = NULL;
@@ -306,12 +332,12 @@ dns_answer_handler(void* cls, const struct GNUNET_MessageHeader *msg)
                                &reconnect_to_service_dns,
                                NULL);
       return;
-    }  
-  struct answer_packet_list* pkt = GNUNET_malloc(ntohs(msg->size) + 2*sizeof(struct answer_packet_list*));
-  
-  memcpy(&pkt->pkt, msg, ntohs(msg->size));
-  GNUNET_CONTAINER_DLL_insert_after(mycls.answer_head, mycls.answer_tail, mycls.answer_tail, pkt);  
-  GNUNET_SCHEDULER_add_write_file (mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.fh_to_helper, &helper_write, NULL);
+    }
+  void *pkt = GNUNET_malloc(ntohs(msg->size));
+
+  memcpy(pkt, msg, ntohs(msg->size));
+
+  GNUNET_SCHEDULER_add_now(mycls.sched, process_answer, pkt);
   GNUNET_CLIENT_receive(mycls.dns_connection, &dns_answer_handler, NULL, GNUNET_TIME_UNIT_FOREVER_REL);
 }
 
index 3516964517b837986e0d5fef06ceeb5a8dc43405..1e25daa906991af7f8c5293d49691e5ce6bd0f86 100644 (file)
@@ -39,6 +39,8 @@ struct answer_packet {
     unsigned to:32 GNUNET_PACKED;
     unsigned dst_port:16 GNUNET_PACKED;
 
+    unsigned short id GNUNET_PACKED;
+
     unsigned char data[1];
 };
 
index 750f81cefcc53a0d5df7eaf95a35adbf95be262d..7b1ebab698e6467a8f141128cd706bdf69fb5f53 100644 (file)
@@ -58,7 +58,7 @@ struct dns_query_id_state {
        unsigned remote_ip:32;
        unsigned local_port:16;
 };
-static struct dns_query_id_state query_states[65536]; /* This is < 1MiB */
+static struct dns_query_id_state query_states[65536]; /* This is < 1.5MiB */
 
 void hijack(unsigned short port) {
        char port_s[6];
@@ -78,6 +78,11 @@ void unhijack(unsigned short port) {
 
 size_t send_answer(void* cls, size_t size, void* buf);
 
+struct receive_dht_cls {
+  unsigned short id;
+  struct GNUNET_DHT_GetHandle* handle;
+};
+
 void receive_dht(void *cls,
                 struct GNUNET_TIME_Absolute exp,
                 const GNUNET_HashCode *key,
@@ -87,7 +92,8 @@ void receive_dht(void *cls,
                 size_t size,
                 const void *data)
 {
-  unsigned short id = *((unsigned short*)cls);
+  unsigned short id = ((struct receive_dht_cls*)cls)->id;
+  struct GNUNET_DHT_GetHandle* handle = ((struct receive_dht_cls*)cls)->handle;
   GNUNET_free(cls);
 
   GNUNET_assert(type == GNUNET_BLOCK_TYPE_DNS);
@@ -109,11 +115,19 @@ void receive_dht(void *cls,
   answer->pkt.to = query_states[id].local_ip;
   answer->pkt.dst_port = query_states[id].local_port;
 
+  answer->pkt.id = id;
+
   memcpy(answer->pkt.data, data, size);
 
   GNUNET_CONTAINER_DLL_insert_after(mycls.head, mycls.tail, mycls.tail, answer);
 
-  /* struct GNUNET_CONNECTION_TransmitHandle* th = */ GNUNET_SERVER_notify_transmit_ready(query_states[id].client, len, GNUNET_TIME_UNIT_FOREVER_REL, &send_answer, query_states[id].client);
+  GNUNET_SERVER_notify_transmit_ready(query_states[id].client,
+                                     len,
+                                     GNUNET_TIME_UNIT_FOREVER_REL,
+                                     &send_answer,
+                                     query_states[id].client);
+
+  GNUNET_DHT_get_stop(handle);
 }
 
 /**
@@ -134,14 +148,16 @@ void receive_query(void *cls, struct GNUNET_SERVER_Client *client, const struct
        if (pdns->queries[0]->namelen > 9 &&
            0 == strncmp(pdns->queries[0]->name+(pdns->queries[0]->namelen - 9), ".gnunet.", 9)) {
 
-           unsigned short* id = GNUNET_malloc(sizeof(unsigned short));
-           *id = dns->s.id;
-
            GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Query for .gnunet!\n");
            GNUNET_HashCode key;
            GNUNET_CRYPTO_hash(pdns->queries[0]->name, pdns->queries[0]->namelen, &key);
+
            GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Getting with key %08x, len is %d\n", *((unsigned int*)&key), pdns->queries[0]->namelen);
-           GNUNET_DHT_get_start(mycls.dht,
+
+           struct receive_dht_cls* cls = GNUNET_malloc(sizeof(struct receive_dht_cls));
+           cls->id = dns->s.id;
+
+           cls->handle = GNUNET_DHT_get_start(mycls.dht,
                                 GNUNET_TIME_UNIT_MINUTES,
                                 GNUNET_BLOCK_TYPE_DNS,
                                 &key,
@@ -151,7 +167,8 @@ void receive_query(void *cls, struct GNUNET_SERVER_Client *client, const struct
                                 NULL,
                                 0,
                                 receive_dht,
-                                id);
+                                cls);
+
            goto out;
        }