diff options
author | Philipp Tölke <toelke@in.tum.de> | 2011-11-02 10:13:59 +0000 |
---|---|---|
committer | Philipp Tölke <toelke@in.tum.de> | 2011-11-02 10:13:59 +0000 |
commit | 205e3bf8b151fcce80e8682fa5dc722356b11689 (patch) | |
tree | 5ddec1a75547a5c46f018d22bc2400bad7afe0cd /src/vpn | |
parent | 41cf51c0ed0dfc2f0a932575bd69651a12ae56b6 (diff) | |
download | gnunet-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.c | 4 | ||||
-rw-r--r-- | src/vpn/gnunet-daemon-vpn.c | 12 | ||||
-rw-r--r-- | src/vpn/gnunet-service-dns-p.h | 4 | ||||
-rw-r--r-- | src/vpn/gnunet-service-dns.c | 54 |
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 | ||
105 | struct answer_packet_list | 105 | struct 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 | ||
128 | static void | ||
129 | client_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 | } |