gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r12951 - gnunet/src/vpn
Date: Thu, 9 Sep 2010 15:06:29 +0200

Author: toelke
Date: 2010-09-09 15:06:29 +0200 (Thu, 09 Sep 2010)
New Revision: 12951

Modified:
   gnunet/src/vpn/gnunet-daemon-vpn.c
   gnunet/src/vpn/gnunet-service-dns-p.h
Log:
Use the DLL as queue

Modified: gnunet/src/vpn/gnunet-daemon-vpn.c
===================================================================
--- gnunet/src/vpn/gnunet-daemon-vpn.c  2010-09-09 13:06:27 UTC (rev 12950)
+++ gnunet/src/vpn/gnunet-daemon-vpn.c  2010-09-09 13:06:29 UTC (rev 12951)
@@ -55,7 +55,8 @@
 
        pid_t helper_pid;
 
-       struct GNUNET_CONTAINER_SList *query_queue;
+       struct query_packet_list *head;
+       struct query_packet_list *tail;
 };
 
 static struct vpn_cls mycls;
@@ -118,29 +119,21 @@
 
 size_t send_query(void* cls, size_t size, void* buf)
 {
-       struct GNUNET_CONTAINER_SList_Iterator *start = 
GNUNET_CONTAINER_slist_begin (mycls.query_queue);
+       struct query_packet_list* query = mycls.head;
+       size_t len = ntohs(query->pkt.hdr.size);
 
-       GNUNET_assert(GNUNET_CONTAINER_slist_count(mycls.query_queue) > 0);
-
-       GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "There are %d queries pending.\n", 
GNUNET_CONTAINER_slist_count(mycls.query_queue));
-
-       size_t len;
-       struct query_packet* pkt = (struct 
query_packet*)GNUNET_CONTAINER_slist_get(start, &len);
-
-       GNUNET_assert(ntohs(pkt->hdr.size) == len);
        GNUNET_assert(len <= size);
 
-       memcpy(buf, pkt, len);
+       memcpy(buf, &query->pkt.hdr, len);
+
        GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Sent %d bytes.\n", len);
 
-       GNUNET_CONTAINER_slist_erase(start);
-       GNUNET_CONTAINER_slist_iter_destroy(start);
+       GNUNET_CONTAINER_DLL_remove (mycls.head, mycls.tail, query);
 
-       if (GNUNET_CONTAINER_slist_count(mycls.query_queue) > 0) {
-               start = GNUNET_CONTAINER_slist_begin (mycls.query_queue);
-               GNUNET_assert(GNUNET_CONTAINER_slist_end(start) != GNUNET_YES);
-               pkt = (struct query_packet*)GNUNET_CONTAINER_slist_get(start, 
&len);
-               GNUNET_CLIENT_notify_transmit_ready(mycls.dns_connection, len, 
GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_YES, &send_query, NULL);
+       GNUNET_free(query);
+
+       if (mycls.head != NULL) {
+               GNUNET_CLIENT_notify_transmit_ready(mycls.dns_connection, 
ntohs(mycls.head->pkt.hdr.size), GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_YES, 
&send_query, NULL);
        }
 
        return len;
@@ -175,15 +168,15 @@
                struct ip_udp *udp = (struct ip_udp*) message;
                if (pkt->ip_hdr.proto == 0x11 && udp->ip_hdr.dadr == 0x020a0a0a 
&& ntohs(udp->udp_hdr.dpt) == 53 ) {
                        size_t len = sizeof(struct query_packet) + 
ntohs(udp->udp_hdr.len) - 9; /* 9 = 8 for the udp-header + 1 for the unsigned 
char data[1]; */
-                       struct query_packet* query = GNUNET_malloc(len);
-                       query->hdr.type = 
htons(GNUNET_MESSAGE_TYPE_LOCAL_QUERY_DNS);
-                       query->hdr.size = htons(len);
-                       query->orig_to = pkt->ip_hdr.dadr;
-                       query->orig_from = pkt->ip_hdr.sadr;
-                       query->src_port = udp->udp_hdr.spt;
-                       memcpy(query->data, udp->data, ntohs(udp->udp_hdr.len) 
- 8);
+                       struct query_packet_list* query = GNUNET_malloc(len + 
2*sizeof(struct query_packet_list*));
+                       query->pkt.hdr.type = 
htons(GNUNET_MESSAGE_TYPE_LOCAL_QUERY_DNS);
+                       query->pkt.hdr.size = htons(len);
+                       query->pkt.orig_to = pkt->ip_hdr.dadr;
+                       query->pkt.orig_from = pkt->ip_hdr.sadr;
+                       query->pkt.src_port = udp->udp_hdr.spt;
+                       memcpy(query->pkt.data, udp->data, 
ntohs(udp->udp_hdr.len) - 8);
 
-                       GNUNET_CONTAINER_slist_add_end (mycls.query_queue, 
GNUNET_CONTAINER_SLIST_DISPOSITION_DYNAMIC, query, len);
+                       GNUNET_CONTAINER_DLL_insert_after(mycls.head, 
mycls.tail, mycls.tail, query);
 
                        struct GNUNET_CLIENT_TransmitHandle* th = 
GNUNET_CLIENT_notify_transmit_ready(mycls.dns_connection, len, 
GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_YES, &send_query, NULL);
                        if (th != NULL)
@@ -214,9 +207,6 @@
   mycls.sched = sched;
   mycls.mst = GNUNET_SERVER_mst_create(&message_token, NULL);
 
-  mycls.query_queue = GNUNET_CONTAINER_slist_create();
-  GNUNET_assert(GNUNET_CONTAINER_slist_count(mycls.query_queue) == 0);
-
   mycls.dns_connection = GNUNET_CLIENT_connect (sched, "gnunet-service-dns", 
cfg);
   GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Connection: %x\n", 
mycls.dns_connection);
 

Modified: gnunet/src/vpn/gnunet-service-dns-p.h
===================================================================
--- gnunet/src/vpn/gnunet-service-dns-p.h       2010-09-09 13:06:27 UTC (rev 
12950)
+++ gnunet/src/vpn/gnunet-service-dns-p.h       2010-09-09 13:06:29 UTC (rev 
12951)
@@ -11,7 +11,12 @@
        unsigned src_port:16 GNUNET_PACKED;
 
        unsigned char data[1]; /* The DNS-Packet */
-       
 };
 
+struct query_packet_list {
+       struct query_packet_list* next GNUNET_PACKED;
+       struct query_packet_list* prev GNUNET_PACKED;
+       struct query_packet pkt;
+};
+
 #endif




reply via email to

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