[Top][All Lists]
[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);
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r17908 - gnunet/src/vpn,
gnunet <=