gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r13306 - gnunet/src/vpn
Date: Tue, 19 Oct 2010 23:16:50 +0200

Author: toelke
Date: 2010-10-19 23:16:50 +0200 (Tue, 19 Oct 2010)
New Revision: 13306

Modified:
   gnunet/src/vpn/gnunet-daemon-vpn.c
   gnunet/src/vpn/gnunet-service-dns-p.h
   gnunet/src/vpn/gnunet-service-dns.c
Log:
Send answers from the DHT to the daemon-vpn

Modified: gnunet/src/vpn/gnunet-daemon-vpn.c
===================================================================
--- gnunet/src/vpn/gnunet-daemon-vpn.c  2010-10-19 21:16:48 UTC (rev 13305)
+++ gnunet/src/vpn/gnunet-daemon-vpn.c  2010-10-19 21:16:50 UTC (rev 13306)
@@ -61,8 +61,8 @@
        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 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 @@
 
        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 @@
     /* 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 @@
                                &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);
 }
 

Modified: gnunet/src/vpn/gnunet-service-dns-p.h
===================================================================
--- gnunet/src/vpn/gnunet-service-dns-p.h       2010-10-19 21:16:48 UTC (rev 
13305)
+++ gnunet/src/vpn/gnunet-service-dns-p.h       2010-10-19 21:16:50 UTC (rev 
13306)
@@ -39,6 +39,8 @@
     unsigned to:32 GNUNET_PACKED;
     unsigned dst_port:16 GNUNET_PACKED;
 
+    unsigned short id GNUNET_PACKED;
+
     unsigned char data[1];
 };
 

Modified: gnunet/src/vpn/gnunet-service-dns.c
===================================================================
--- gnunet/src/vpn/gnunet-service-dns.c 2010-10-19 21:16:48 UTC (rev 13305)
+++ gnunet/src/vpn/gnunet-service-dns.c 2010-10-19 21:16:50 UTC (rev 13306)
@@ -58,7 +58,7 @@
        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 @@
 
 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 @@
                 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 @@
   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 @@
        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 @@
                                 NULL,
                                 0,
                                 receive_dht,
-                                id);
+                                cls);
+
            goto out;
        }
 




reply via email to

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