aboutsummaryrefslogtreecommitdiff
path: root/src/vpn
diff options
context:
space:
mode:
authorPhilipp Tölke <toelke@in.tum.de>2011-11-02 10:13:59 +0000
committerPhilipp Tölke <toelke@in.tum.de>2011-11-02 10:13:59 +0000
commit205e3bf8b151fcce80e8682fa5dc722356b11689 (patch)
tree5ddec1a75547a5c46f018d22bc2400bad7afe0cd /src/vpn
parent41cf51c0ed0dfc2f0a932575bd69651a12ae56b6 (diff)
downloadgnunet-205e3bf8b151fcce80e8682fa5dc722356b11689.tar.gz
gnunet-205e3bf8b151fcce80e8682fa5dc722356b11689.zip
handle client connections
fix #1855
Diffstat (limited to 'src/vpn')
-rw-r--r--src/vpn/gnunet-daemon-vpn-helper.c4
-rw-r--r--src/vpn/gnunet-daemon-vpn.c12
-rw-r--r--src/vpn/gnunet-service-dns-p.h4
-rw-r--r--src/vpn/gnunet-service-dns.c54
4 files changed, 51 insertions, 23 deletions
diff --git a/src/vpn/gnunet-daemon-vpn-helper.c b/src/vpn/gnunet-daemon-vpn-helper.c
index 81a52e222..124b53bf1 100644
--- a/src/vpn/gnunet-daemon-vpn-helper.c
+++ b/src/vpn/gnunet-daemon-vpn-helper.c
@@ -344,7 +344,7 @@ message_token (void *cls __attribute__ ((unused)), void *client
344 size_t len = sizeof (struct query_packet) + ntohs (pkt6_udp->udp_hdr.len) - 9; 344 size_t len = sizeof (struct query_packet) + ntohs (pkt6_udp->udp_hdr.len) - 9;
345 345
346 struct query_packet_list *query = 346 struct query_packet_list *query =
347 GNUNET_malloc (len + 2 * sizeof (struct query_packet_list *)); 347 GNUNET_malloc (len + sizeof(struct answer_packet_list) - sizeof(struct answer_packet));
348 query->pkt.hdr.type = htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_QUERY_DNS); 348 query->pkt.hdr.type = htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_QUERY_DNS);
349 query->pkt.hdr.size = htons (len); 349 query->pkt.hdr.size = htons (len);
350 memcpy(query->pkt.orig_to, &pkt6->ip6_hdr.dadr, 16); 350 memcpy(query->pkt.orig_to, &pkt6->ip6_hdr.dadr, 16);
@@ -538,7 +538,7 @@ message_token (void *cls __attribute__ ((unused)), void *client
538 size_t len = sizeof (struct query_packet) + ntohs (udp->udp_hdr.len) - 9; 538 size_t len = sizeof (struct query_packet) + ntohs (udp->udp_hdr.len) - 9;
539 539
540 struct query_packet_list *query = 540 struct query_packet_list *query =
541 GNUNET_malloc (len + 2 * sizeof (struct query_packet_list *)); 541 GNUNET_malloc (len + sizeof(struct answer_packet_list) - sizeof(struct answer_packet));
542 query->pkt.hdr.type = htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_QUERY_DNS); 542 query->pkt.hdr.type = htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_QUERY_DNS);
543 query->pkt.hdr.size = htons (len); 543 query->pkt.hdr.size = htons (len);
544 memcpy(query->pkt.orig_to, &pkt->ip_hdr.dadr, 4); 544 memcpy(query->pkt.orig_to, &pkt->ip_hdr.dadr, 4);
diff --git a/src/vpn/gnunet-daemon-vpn.c b/src/vpn/gnunet-daemon-vpn.c
index d87edfbc4..1191dffe1 100644
--- a/src/vpn/gnunet-daemon-vpn.c
+++ b/src/vpn/gnunet-daemon-vpn.c
@@ -574,7 +574,7 @@ process_answer (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
574 574
575 list = 575 list =
576 GNUNET_malloc (htons (pkt->hdr.size) + 576 GNUNET_malloc (htons (pkt->hdr.size) +
577 2 * sizeof (struct answer_packet_list *)); 577 sizeof(struct answer_packet_list) - sizeof(struct answer_packet));
578 578
579 memcpy (&list->pkt, pkt, htons (pkt->hdr.size)); 579 memcpy (&list->pkt, pkt, htons (pkt->hdr.size));
580 580
@@ -622,8 +622,8 @@ process_answer (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
622 char *name = (char *) (map_entry + 1); 622 char *name = (char *) (map_entry + 1);
623 623
624 list = 624 list =
625 GNUNET_malloc (2 * sizeof (struct answer_packet_list *) + offset + 2 + 625 GNUNET_malloc (sizeof(struct answer_packet_list) - sizeof(struct answer_packet) + offset + 2 +
626 ntohs (namelen)); 626 ntohs (namelen));
627 627
628 struct answer_packet *rpkt = &list->pkt; 628 struct answer_packet *rpkt = &list->pkt;
629 629
@@ -641,7 +641,7 @@ process_answer (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
641 { 641 {
642 list = 642 list =
643 GNUNET_malloc (htons (pkt->hdr.size) + 643 GNUNET_malloc (htons (pkt->hdr.size) +
644 2 * sizeof (struct answer_packet_list *)); 644 sizeof(struct answer_packet_list) - sizeof(struct answer_packet));
645 memcpy (&list->pkt, pkt, htons (pkt->hdr.size)); 645 memcpy (&list->pkt, pkt, htons (pkt->hdr.size));
646 } 646 }
647 else if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_REMOTE_AAAA) 647 else if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_REMOTE_AAAA)
@@ -701,7 +701,7 @@ process_answer (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
701 701
702 list = 702 list =
703 GNUNET_malloc (htons (pkt->hdr.size) + 703 GNUNET_malloc (htons (pkt->hdr.size) +
704 2 * sizeof (struct answer_packet_list *)); 704 sizeof(struct answer_packet_list) - sizeof(struct answer_packet));
705 705
706 memcpy (&list->pkt, pkt, htons (pkt->hdr.size)); 706 memcpy (&list->pkt, pkt, htons (pkt->hdr.size));
707 } 707 }
@@ -763,7 +763,7 @@ process_answer (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
763 763
764 list = 764 list =
765 GNUNET_malloc (htons (pkt->hdr.size) + 765 GNUNET_malloc (htons (pkt->hdr.size) +
766 2 * sizeof (struct answer_packet_list *)); 766 sizeof(struct answer_packet_list) - sizeof(struct answer_packet));
767 767
768 memcpy (&list->pkt, pkt, htons (pkt->hdr.size)); 768 memcpy (&list->pkt, pkt, htons (pkt->hdr.size));
769 } 769 }
diff --git a/src/vpn/gnunet-service-dns-p.h b/src/vpn/gnunet-service-dns-p.h
index 020700385..13b410e2f 100644
--- a/src/vpn/gnunet-service-dns-p.h
+++ b/src/vpn/gnunet-service-dns-p.h
@@ -102,10 +102,10 @@ struct answer_packet
102 unsigned char data[1]; 102 unsigned char data[1];
103}; 103};
104 104
105struct answer_packet_list 105struct answer_packet_list {
106{
107 struct answer_packet_list *next GNUNET_PACKED; 106 struct answer_packet_list *next GNUNET_PACKED;
108 struct answer_packet_list *prev GNUNET_PACKED; 107 struct answer_packet_list *prev GNUNET_PACKED;
108 struct GNUNET_SERVER_Client *client;
109 struct answer_packet pkt; 109 struct answer_packet pkt;
110}; 110};
111 111
diff --git a/src/vpn/gnunet-service-dns.c b/src/vpn/gnunet-service-dns.c
index 806c4745a..6f9d0f1ad 100644
--- a/src/vpn/gnunet-service-dns.c
+++ b/src/vpn/gnunet-service-dns.c
@@ -125,6 +125,27 @@ struct tunnel_state
125 struct GNUNET_MESH_TransmitHandle *th; 125 struct GNUNET_MESH_TransmitHandle *th;
126}; 126};
127 127
128static void
129client_disconnect(void* cls, struct GNUNET_SERVER_Client *client)
130{
131 if (NULL == head) return;
132
133 struct answer_packet_list *element = head;
134 while (element != NULL)
135 {
136 if (element->client == client)
137 {
138 GNUNET_SERVER_client_drop(client);
139 GNUNET_CONTAINER_DLL_remove(head, tail, element);
140 struct answer_packet_list* t = element;
141 element = element->next;
142 GNUNET_free(t);
143 }
144 else
145 element = element->next;
146 }
147}
148
128/** 149/**
129 * Hijack all outgoing DNS-Traffic but for traffic leaving "our" port. 150 * Hijack all outgoing DNS-Traffic but for traffic leaving "our" port.
130 */ 151 */
@@ -238,14 +259,14 @@ send_answer (void *cls, size_t size, void *buf)
238 259
239 GNUNET_CONTAINER_DLL_remove (head, tail, query); 260 GNUNET_CONTAINER_DLL_remove (head, tail, query);
240 261
241 GNUNET_free (query);
242
243 /* When more data is to be sent, reschedule */ 262 /* When more data is to be sent, reschedule */
244 if (head != NULL) 263 if (head != NULL)
245 server_notify = GNUNET_SERVER_notify_transmit_ready (cls, ntohs (head->pkt.hdr.size), 264 server_notify = GNUNET_SERVER_notify_transmit_ready (head->client, ntohs (head->pkt.hdr.size),
246 GNUNET_TIME_UNIT_FOREVER_REL, 265 GNUNET_TIME_UNIT_FOREVER_REL,
247 &send_answer, cls); 266 &send_answer, NULL);
248 267
268 GNUNET_SERVER_client_drop(query->client);
269 GNUNET_free (query);
249 return len; 270 return len;
250} 271}
251 272
@@ -496,7 +517,7 @@ receive_mesh_answer (void *cls
496 + sizeof (struct dns_record_line) - 1 + 16; /* To hold the IPv6-Address */ 517 + sizeof (struct dns_record_line) - 1 + 16; /* To hold the IPv6-Address */
497 518
498 struct answer_packet_list *answer = 519 struct answer_packet_list *answer =
499 GNUNET_malloc (len + 2 * sizeof (struct answer_packet_list *)); 520 GNUNET_malloc (len + sizeof(struct answer_packet_list) - sizeof(struct answer_packet));
500 521
501 answer->pkt.hdr.type = htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS); 522 answer->pkt.hdr.type = htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS);
502 answer->pkt.hdr.size = htons (len); 523 answer->pkt.hdr.size = htons (len);
@@ -599,12 +620,13 @@ receive_mesh_answer (void *cls
599 (unsigned long) (&answer->pkt))); 620 (unsigned long) (&answer->pkt)));
600 621
601 GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer); 622 GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer);
623 answer->client = query_states[dns->s.id].client;
602 624
603 if (server_notify == NULL) 625 if (server_notify == NULL)
604 server_notify = GNUNET_SERVER_notify_transmit_ready (query_states[dns->s.id].client, len, 626 server_notify = GNUNET_SERVER_notify_transmit_ready (query_states[dns->s.id].client, len,
605 GNUNET_TIME_UNIT_FOREVER_REL, 627 GNUNET_TIME_UNIT_FOREVER_REL,
606 &send_answer, 628 &send_answer,
607 query_states[dns->s.id].client); 629 NULL);
608 630
609 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 631 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
610 "Sent answer of length %d on to client, addroffset = %d\n", len, 632 "Sent answer of length %d on to client, addroffset = %d\n", len,
@@ -639,7 +661,7 @@ send_rev_query (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
639 2 /* We do not know the lenght of the answer yet */ ; 661 2 /* We do not know the lenght of the answer yet */ ;
640 662
641 struct answer_packet_list *answer = 663 struct answer_packet_list *answer =
642 GNUNET_malloc (len + 2 * sizeof (struct answer_packet_list *)); 664 GNUNET_malloc (len + sizeof(struct answer_packet_list) - sizeof(struct answer_packet));
643 665
644 answer->pkt.hdr.type = htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS); 666 answer->pkt.hdr.type = htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS);
645 answer->pkt.hdr.size = htons (len); 667 answer->pkt.hdr.size = htons (len);
@@ -692,11 +714,12 @@ send_rev_query (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
692 (unsigned long) (&answer->pkt))); 714 (unsigned long) (&answer->pkt)));
693 715
694 GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer); 716 GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer);
717 answer->client = query_states[id].client;
695 718
696 if (server_notify == NULL) 719 if (server_notify == NULL)
697 server_notify = GNUNET_SERVER_notify_transmit_ready (query_states[id].client, len, 720 server_notify = GNUNET_SERVER_notify_transmit_ready (query_states[id].client, len,
698 GNUNET_TIME_UNIT_FOREVER_REL, 721 GNUNET_TIME_UNIT_FOREVER_REL,
699 &send_answer, query_states[id].client); 722 &send_answer, NULL);
700} 723}
701 724
702/** 725/**
@@ -739,11 +762,13 @@ receive_dht (void *cls, struct GNUNET_TIME_Absolute exp
739 + sizeof (struct dns_record_line) - 1 + 16; /* To hold the IPv6-Address */ 762 + sizeof (struct dns_record_line) - 1 + 16; /* To hold the IPv6-Address */
740 763
741 struct answer_packet_list *answer = 764 struct answer_packet_list *answer =
742 GNUNET_malloc (len + 2 * sizeof (struct answer_packet_list *)); 765 GNUNET_malloc (len +
766 sizeof(struct answer_packet_list) - sizeof(struct answer_packet));
743 767
744 answer->pkt.hdr.type = htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS); 768 answer->pkt.hdr.type = htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS);
745 answer->pkt.hdr.size = htons (len); 769 answer->pkt.hdr.size = htons (len);
746 answer->pkt.subtype = GNUNET_DNS_ANSWER_TYPE_SERVICE; 770 answer->pkt.subtype = GNUNET_DNS_ANSWER_TYPE_SERVICE;
771 answer->client = query_states[id].client;
747 772
748 GNUNET_CRYPTO_hash (&rec->peer, 773 GNUNET_CRYPTO_hash (&rec->peer,
749 sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), 774 sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
@@ -808,9 +833,9 @@ receive_dht (void *cls, struct GNUNET_TIME_Absolute exp
808 GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer); 833 GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer);
809 834
810 if (server_notify == NULL) 835 if (server_notify == NULL)
811 server_notify = GNUNET_SERVER_notify_transmit_ready (query_states[id].client, len, 836 server_notify = GNUNET_SERVER_notify_transmit_ready (answer->client, len,
812 GNUNET_TIME_UNIT_FOREVER_REL, 837 GNUNET_TIME_UNIT_FOREVER_REL,
813 &send_answer, query_states[id].client); 838 &send_answer, NULL);
814} 839}
815 840
816/** 841/**
@@ -841,6 +866,7 @@ receive_query (void *cls
841 866
842 query_states[dns->s.id].valid = GNUNET_YES; 867 query_states[dns->s.id].valid = GNUNET_YES;
843 query_states[dns->s.id].client = client; 868 query_states[dns->s.id].client = client;
869 GNUNET_SERVER_client_keep(client);
844 memcpy(query_states[dns->s.id].local_ip, pkt->orig_from, pkt->addrlen); 870 memcpy(query_states[dns->s.id].local_ip, pkt->orig_from, pkt->addrlen);
845 query_states[dns->s.id].addrlen = pkt->addrlen; 871 query_states[dns->s.id].addrlen = pkt->addrlen;
846 query_states[dns->s.id].local_port = pkt->src_port; 872 query_states[dns->s.id].local_port = pkt->src_port;
@@ -1329,7 +1355,7 @@ handle_response(struct dns_pkt* dns, struct sockaddr *addr, socklen_t addrlen, i
1329 1355
1330 size_t len = sizeof (struct answer_packet) + r - 1; /* 1 for the unsigned char data[1]; */ 1356 size_t len = sizeof (struct answer_packet) + r - 1; /* 1 for the unsigned char data[1]; */
1331 struct answer_packet_list *answer = 1357 struct answer_packet_list *answer =
1332 GNUNET_malloc (len + 2 * sizeof (struct answer_packet_list *)); 1358 GNUNET_malloc (len + sizeof(struct answer_packet_list) - (sizeof(struct answer_packet)));
1333 answer->pkt.hdr.type = 1359 answer->pkt.hdr.type =
1334 htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS); 1360 htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS);
1335 answer->pkt.hdr.size = htons (len); 1361 answer->pkt.hdr.size = htons (len);
@@ -1355,6 +1381,7 @@ handle_response(struct dns_pkt* dns, struct sockaddr *addr, socklen_t addrlen, i
1355 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "sending answer with addrlen = %d\n", addrlen); 1381 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "sending answer with addrlen = %d\n", addrlen);
1356 answer->pkt.dst_port = query_states[dns->s.id].local_port; 1382 answer->pkt.dst_port = query_states[dns->s.id].local_port;
1357 memcpy (answer->pkt.data, dns, r); 1383 memcpy (answer->pkt.data, dns, r);
1384 answer->client = query_states[dns->s.id].client;
1358 1385
1359 GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer); 1386 GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer);
1360 1387
@@ -1362,7 +1389,7 @@ handle_response(struct dns_pkt* dns, struct sockaddr *addr, socklen_t addrlen, i
1362 server_notify = GNUNET_SERVER_notify_transmit_ready (query_states[dns->s.id].client, 1389 server_notify = GNUNET_SERVER_notify_transmit_ready (query_states[dns->s.id].client,
1363 len, GNUNET_TIME_UNIT_FOREVER_REL, 1390 len, GNUNET_TIME_UNIT_FOREVER_REL,
1364 &send_answer, 1391 &send_answer,
1365 query_states[dns->s.id].client); 1392 NULL);
1366 } 1393 }
1367 } 1394 }
1368 GNUNET_free(addr); 1395 GNUNET_free(addr);
@@ -1662,6 +1689,7 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
1662 dht = GNUNET_DHT_connect (cfg, 1024); 1689 dht = GNUNET_DHT_connect (cfg, 1024);
1663 GNUNET_SCHEDULER_add_now (publish_names, NULL); 1690 GNUNET_SCHEDULER_add_now (publish_names, NULL);
1664 GNUNET_SERVER_add_handlers (server, handlers); 1691 GNUNET_SERVER_add_handlers (server, handlers);
1692 GNUNET_SERVER_disconnect_notify(server, &client_disconnect, NULL);
1665 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &cleanup_task, 1693 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &cleanup_task,
1666 cls); 1694 cls);
1667} 1695}