gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r17908 - gnunet/src/vpn
Date: Wed, 2 Nov 2011 11:13:59 +0100

Author: toelke
Date: 2011-11-02 11:13:59 +0100 (Wed, 02 Nov 2011)
New Revision: 17908

Modified:
   gnunet/src/vpn/gnunet-daemon-vpn-helper.c
   gnunet/src/vpn/gnunet-daemon-vpn.c
   gnunet/src/vpn/gnunet-service-dns-p.h
   gnunet/src/vpn/gnunet-service-dns.c
Log:
handle client connections

fix #1855

Modified: gnunet/src/vpn/gnunet-daemon-vpn-helper.c
===================================================================
--- gnunet/src/vpn/gnunet-daemon-vpn-helper.c   2011-11-02 10:11:09 UTC (rev 
17907)
+++ gnunet/src/vpn/gnunet-daemon-vpn-helper.c   2011-11-02 10:13:59 UTC (rev 
17908)
@@ -344,7 +344,7 @@
           size_t len = sizeof (struct query_packet) + ntohs 
(pkt6_udp->udp_hdr.len) - 9;
 
           struct query_packet_list *query =
-            GNUNET_malloc (len + 2 * sizeof (struct query_packet_list *));
+            GNUNET_malloc (len + sizeof(struct answer_packet_list) - 
sizeof(struct answer_packet));
           query->pkt.hdr.type = htons 
(GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_QUERY_DNS);
           query->pkt.hdr.size = htons (len);
           memcpy(query->pkt.orig_to, &pkt6->ip6_hdr.dadr, 16);
@@ -538,7 +538,7 @@
       size_t len = sizeof (struct query_packet) + ntohs (udp->udp_hdr.len) - 9;
 
       struct query_packet_list *query =
-          GNUNET_malloc (len + 2 * sizeof (struct query_packet_list *));
+          GNUNET_malloc (len + sizeof(struct answer_packet_list) - 
sizeof(struct answer_packet));
       query->pkt.hdr.type = htons 
(GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_QUERY_DNS);
       query->pkt.hdr.size = htons (len);
       memcpy(query->pkt.orig_to, &pkt->ip_hdr.dadr, 4);

Modified: gnunet/src/vpn/gnunet-daemon-vpn.c
===================================================================
--- gnunet/src/vpn/gnunet-daemon-vpn.c  2011-11-02 10:11:09 UTC (rev 17907)
+++ gnunet/src/vpn/gnunet-daemon-vpn.c  2011-11-02 10:13:59 UTC (rev 17908)
@@ -574,7 +574,7 @@
 
     list =
         GNUNET_malloc (htons (pkt->hdr.size) +
-                       2 * sizeof (struct answer_packet_list *));
+                       sizeof(struct answer_packet_list) - sizeof(struct 
answer_packet));
 
     memcpy (&list->pkt, pkt, htons (pkt->hdr.size));
 
@@ -622,8 +622,8 @@
     char *name = (char *) (map_entry + 1);
 
     list =
-        GNUNET_malloc (2 * sizeof (struct answer_packet_list *) + offset + 2 +
-                       ntohs (namelen));
+      GNUNET_malloc (sizeof(struct answer_packet_list) - sizeof(struct 
answer_packet) + offset + 2 +
+                     ntohs (namelen));
 
     struct answer_packet *rpkt = &list->pkt;
 
@@ -641,7 +641,7 @@
   {
     list =
         GNUNET_malloc (htons (pkt->hdr.size) +
-                       2 * sizeof (struct answer_packet_list *));
+                       sizeof(struct answer_packet_list) - sizeof(struct 
answer_packet));
     memcpy (&list->pkt, pkt, htons (pkt->hdr.size));
   }
   else if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_REMOTE_AAAA)
@@ -701,7 +701,7 @@
 
     list =
         GNUNET_malloc (htons (pkt->hdr.size) +
-                       2 * sizeof (struct answer_packet_list *));
+                       sizeof(struct answer_packet_list) - sizeof(struct 
answer_packet));
 
     memcpy (&list->pkt, pkt, htons (pkt->hdr.size));
   }
@@ -763,7 +763,7 @@
 
     list =
         GNUNET_malloc (htons (pkt->hdr.size) +
-                       2 * sizeof (struct answer_packet_list *));
+                       sizeof(struct answer_packet_list) - sizeof(struct 
answer_packet));
 
     memcpy (&list->pkt, pkt, htons (pkt->hdr.size));
   }

Modified: gnunet/src/vpn/gnunet-service-dns-p.h
===================================================================
--- gnunet/src/vpn/gnunet-service-dns-p.h       2011-11-02 10:11:09 UTC (rev 
17907)
+++ gnunet/src/vpn/gnunet-service-dns-p.h       2011-11-02 10:13:59 UTC (rev 
17908)
@@ -102,10 +102,10 @@
   unsigned char data[1];
 };
 
-struct answer_packet_list
-{
+struct answer_packet_list {
   struct answer_packet_list *next GNUNET_PACKED;
   struct answer_packet_list *prev GNUNET_PACKED;
+  struct GNUNET_SERVER_Client *client;
   struct answer_packet pkt;
 };
 

Modified: gnunet/src/vpn/gnunet-service-dns.c
===================================================================
--- gnunet/src/vpn/gnunet-service-dns.c 2011-11-02 10:11:09 UTC (rev 17907)
+++ gnunet/src/vpn/gnunet-service-dns.c 2011-11-02 10:13:59 UTC (rev 17908)
@@ -125,6 +125,27 @@
   struct GNUNET_MESH_TransmitHandle *th;
 };
 
+static void
+client_disconnect(void* cls, struct GNUNET_SERVER_Client *client)
+{
+  if (NULL == head) return;
+
+  struct answer_packet_list *element = head;
+  while (element != NULL)
+    {
+      if (element->client == client)
+        {
+          GNUNET_SERVER_client_drop(client);
+          GNUNET_CONTAINER_DLL_remove(head, tail, element);
+          struct answer_packet_list* t = element;
+          element = element->next;
+          GNUNET_free(t);
+        }
+      else
+        element = element->next;
+    }
+}
+
 /**
  * Hijack all outgoing DNS-Traffic but for traffic leaving "our" port.
  */
@@ -238,14 +259,14 @@
 
   GNUNET_CONTAINER_DLL_remove (head, tail, query);
 
-  GNUNET_free (query);
-
   /* When more data is to be sent, reschedule */
   if (head != NULL)
-    server_notify = GNUNET_SERVER_notify_transmit_ready (cls, ntohs 
(head->pkt.hdr.size),
+    server_notify = GNUNET_SERVER_notify_transmit_ready (head->client, ntohs 
(head->pkt.hdr.size),
                                                          
GNUNET_TIME_UNIT_FOREVER_REL,
-                                                         &send_answer, cls);
+                                                         &send_answer, NULL);
 
+  GNUNET_SERVER_client_drop(query->client);
+  GNUNET_free (query);
   return len;
 }
 
@@ -496,7 +517,7 @@
       + sizeof (struct dns_record_line) - 1 + 16;       /* To hold the 
IPv6-Address */
 
   struct answer_packet_list *answer =
-      GNUNET_malloc (len + 2 * sizeof (struct answer_packet_list *));
+      GNUNET_malloc (len + sizeof(struct answer_packet_list) - sizeof(struct 
answer_packet));
 
   answer->pkt.hdr.type = htons 
(GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS);
   answer->pkt.hdr.size = htons (len);
@@ -599,12 +620,13 @@
                                (unsigned long) (&answer->pkt)));
 
   GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer);
+  answer->client = query_states[dns->s.id].client;
 
   if (server_notify == NULL)
     server_notify = GNUNET_SERVER_notify_transmit_ready 
(query_states[dns->s.id].client, len,
                                                          
GNUNET_TIME_UNIT_FOREVER_REL,
                                                          &send_answer,
-                                                         
query_states[dns->s.id].client);
+                                                         NULL);
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Sent answer of length %d on to client, addroffset = %d\n", len,
@@ -639,7 +661,7 @@
       2 /* We do not know the lenght of the answer yet */ ;
 
   struct answer_packet_list *answer =
-      GNUNET_malloc (len + 2 * sizeof (struct answer_packet_list *));
+      GNUNET_malloc (len + sizeof(struct answer_packet_list) - sizeof(struct 
answer_packet));
 
   answer->pkt.hdr.type = htons 
(GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS);
   answer->pkt.hdr.size = htons (len);
@@ -692,11 +714,12 @@
                                (unsigned long) (&answer->pkt)));
 
   GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer);
+  answer->client = query_states[id].client;
 
   if (server_notify == NULL)
     server_notify = GNUNET_SERVER_notify_transmit_ready 
(query_states[id].client, len,
                                                          
GNUNET_TIME_UNIT_FOREVER_REL,
-                                                         &send_answer, 
query_states[id].client);
+                                                         &send_answer, NULL);
 }
 
 /**
@@ -739,11 +762,13 @@
       + sizeof (struct dns_record_line) - 1 + 16;       /* To hold the 
IPv6-Address */
 
   struct answer_packet_list *answer =
-      GNUNET_malloc (len + 2 * sizeof (struct answer_packet_list *));
+      GNUNET_malloc (len +
+                     sizeof(struct answer_packet_list) - sizeof(struct 
answer_packet));
 
   answer->pkt.hdr.type = htons 
(GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS);
   answer->pkt.hdr.size = htons (len);
   answer->pkt.subtype = GNUNET_DNS_ANSWER_TYPE_SERVICE;
+  answer->client = query_states[id].client;
 
   GNUNET_CRYPTO_hash (&rec->peer,
                       sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
@@ -808,9 +833,9 @@
   GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer);
 
   if (server_notify == NULL)
-    server_notify = GNUNET_SERVER_notify_transmit_ready 
(query_states[id].client, len,
+    server_notify = GNUNET_SERVER_notify_transmit_ready (answer->client, len,
                                                          
GNUNET_TIME_UNIT_FOREVER_REL,
-                                                         &send_answer, 
query_states[id].client);
+                                                         &send_answer, NULL);
 }
 
 /**
@@ -841,6 +866,7 @@
 
   query_states[dns->s.id].valid = GNUNET_YES;
   query_states[dns->s.id].client = client;
+  GNUNET_SERVER_client_keep(client);
   memcpy(query_states[dns->s.id].local_ip, pkt->orig_from, pkt->addrlen);
   query_states[dns->s.id].addrlen = pkt->addrlen;
   query_states[dns->s.id].local_port = pkt->src_port;
@@ -1329,7 +1355,7 @@
 
           size_t len = sizeof (struct answer_packet) + r - 1;     /* 1 for the 
unsigned char data[1]; */
           struct answer_packet_list *answer =
-            GNUNET_malloc (len + 2 * sizeof (struct answer_packet_list *));
+            GNUNET_malloc (len + sizeof(struct answer_packet_list) - 
(sizeof(struct answer_packet)));
           answer->pkt.hdr.type =
             htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS);
           answer->pkt.hdr.size = htons (len);
@@ -1355,6 +1381,7 @@
           GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "sending answer with addrlen = 
%d\n", addrlen);
           answer->pkt.dst_port = query_states[dns->s.id].local_port;
           memcpy (answer->pkt.data, dns, r);
+          answer->client = query_states[dns->s.id].client;
 
           GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer);
 
@@ -1362,7 +1389,7 @@
             server_notify = GNUNET_SERVER_notify_transmit_ready 
(query_states[dns->s.id].client,
                                                                  len, 
GNUNET_TIME_UNIT_FOREVER_REL,
                                                                  &send_answer,
-                                                                 
query_states[dns->s.id].client);
+                                                                 NULL);
         }
     }
   GNUNET_free(addr);
@@ -1662,6 +1689,7 @@
   dht = GNUNET_DHT_connect (cfg, 1024);
   GNUNET_SCHEDULER_add_now (publish_names, NULL);
   GNUNET_SERVER_add_handlers (server, handlers);
+  GNUNET_SERVER_disconnect_notify(server, &client_disconnect, NULL);
   GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &cleanup_task,
                                 cls);
 }




reply via email to

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