From 98e046ac9634755bb9a6f620d5f4af708871497c Mon Sep 17 00:00:00 2001 From: Philipp Tölke Date: Tue, 19 Oct 2010 21:16:50 +0000 Subject: Send answers from the DHT to the daemon-vpn --- src/vpn/gnunet-daemon-vpn.c | 54 +++++++++++++++++++++++++++++++----------- src/vpn/gnunet-service-dns-p.h | 2 ++ src/vpn/gnunet-service-dns.c | 33 +++++++++++++++++++------- 3 files changed, 67 insertions(+), 22 deletions(-) diff --git a/src/vpn/gnunet-daemon-vpn.c b/src/vpn/gnunet-daemon-vpn.c index 35dc32f1f..5be4f9378 100644 --- a/src/vpn/gnunet-daemon-vpn.c +++ b/src/vpn/gnunet-daemon-vpn.c @@ -61,8 +61,8 @@ struct vpn_cls { struct query_packet_list *head; struct query_packet_list *tail; - struct answer_packet_list *answer_head; - struct answer_packet_list *answer_tail; + struct answer_packet_list *answer_proc_head; + struct answer_packet_list *answer_proc_tail; }; static struct vpn_cls mycls; @@ -151,7 +151,7 @@ static uint16_t calculate_ip_checksum(uint16_t* hdr, short len) { static void helper_write(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tsdkctx) { if (tsdkctx->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) return; - struct answer_packet_list* ans = mycls.answer_head; + struct answer_packet_list* ans = mycls.answer_proc_head; size_t len = ntohs(ans->pkt.hdr.size); GNUNET_assert(ans->pkt.subtype == GNUNET_DNS_ANSWER_TYPE_IP); @@ -191,12 +191,12 @@ static void helper_write(void* cls, const struct GNUNET_SCHEDULER_TaskContext* t memcpy(&pkt->udp_dns.data, ans->pkt.data, data_len); - GNUNET_CONTAINER_DLL_remove (mycls.answer_head, mycls.answer_tail, ans); + GNUNET_CONTAINER_DLL_remove (mycls.answer_proc_head, mycls.answer_proc_tail, ans); GNUNET_free(ans); /* FIXME */ GNUNET_DISK_file_write(mycls.fh_to_helper, pkt, pkt_len); - if (mycls.answer_head != NULL) + if (mycls.answer_proc_head != NULL) GNUNET_SCHEDULER_add_write_file (mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.fh_to_helper, &helper_write, NULL); } @@ -283,10 +283,36 @@ reconnect_to_service_dns (void *cls, /* struct GNUNET_CLIENT_TransmitHandle* th = */ GNUNET_CLIENT_notify_transmit_ready(mycls.dns_connection, ntohs(mycls.head->pkt.hdr.size), GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_YES, &send_query, NULL); } -static void -dns_answer_handler(void* cls, const struct GNUNET_MessageHeader *msg) +static void +process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) { + struct answer_packet* pkt = cls; + + if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_IP) + { + struct answer_packet_list* list = GNUNET_malloc(htons(pkt->hdr.size) + 2*sizeof(struct answer_packet_list*)); + + memcpy(&list->pkt, pkt, htons(pkt->hdr.size)); + + GNUNET_CONTAINER_DLL_insert_after(mycls.answer_proc_head, mycls.answer_proc_tail, mycls.answer_proc_tail, list); + + GNUNET_SCHEDULER_add_write_file (mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.fh_to_helper, &helper_write, NULL); + + return; + } + + if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_SERVICE) + { + /*FIXME: + * -find new IP-address for this service + * -create a DNS-Answer + */ + } +} + +static void +dns_answer_handler(void* cls, const struct GNUNET_MessageHeader *msg) { - if (msg == NULL) + if (msg == NULL) { GNUNET_CLIENT_disconnect(mycls.dns_connection, GNUNET_NO); mycls.dns_connection = NULL; @@ -306,12 +332,12 @@ dns_answer_handler(void* cls, const struct GNUNET_MessageHeader *msg) &reconnect_to_service_dns, NULL); return; - } - struct answer_packet_list* pkt = GNUNET_malloc(ntohs(msg->size) + 2*sizeof(struct answer_packet_list*)); - - memcpy(&pkt->pkt, msg, ntohs(msg->size)); - GNUNET_CONTAINER_DLL_insert_after(mycls.answer_head, mycls.answer_tail, mycls.answer_tail, pkt); - GNUNET_SCHEDULER_add_write_file (mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.fh_to_helper, &helper_write, NULL); + } + void *pkt = GNUNET_malloc(ntohs(msg->size)); + + memcpy(pkt, msg, ntohs(msg->size)); + + GNUNET_SCHEDULER_add_now(mycls.sched, process_answer, pkt); GNUNET_CLIENT_receive(mycls.dns_connection, &dns_answer_handler, NULL, GNUNET_TIME_UNIT_FOREVER_REL); } diff --git a/src/vpn/gnunet-service-dns-p.h b/src/vpn/gnunet-service-dns-p.h index 351696451..1e25daa90 100644 --- a/src/vpn/gnunet-service-dns-p.h +++ b/src/vpn/gnunet-service-dns-p.h @@ -39,6 +39,8 @@ struct answer_packet { unsigned to:32 GNUNET_PACKED; unsigned dst_port:16 GNUNET_PACKED; + unsigned short id GNUNET_PACKED; + unsigned char data[1]; }; diff --git a/src/vpn/gnunet-service-dns.c b/src/vpn/gnunet-service-dns.c index 750f81cef..7b1ebab69 100644 --- a/src/vpn/gnunet-service-dns.c +++ b/src/vpn/gnunet-service-dns.c @@ -58,7 +58,7 @@ struct dns_query_id_state { unsigned remote_ip:32; unsigned local_port:16; }; -static struct dns_query_id_state query_states[65536]; /* This is < 1MiB */ +static struct dns_query_id_state query_states[65536]; /* This is < 1.5MiB */ void hijack(unsigned short port) { char port_s[6]; @@ -78,6 +78,11 @@ void unhijack(unsigned short port) { size_t send_answer(void* cls, size_t size, void* buf); +struct receive_dht_cls { + unsigned short id; + struct GNUNET_DHT_GetHandle* handle; +}; + void receive_dht(void *cls, struct GNUNET_TIME_Absolute exp, const GNUNET_HashCode *key, @@ -87,7 +92,8 @@ void receive_dht(void *cls, size_t size, const void *data) { - unsigned short id = *((unsigned short*)cls); + unsigned short id = ((struct receive_dht_cls*)cls)->id; + struct GNUNET_DHT_GetHandle* handle = ((struct receive_dht_cls*)cls)->handle; GNUNET_free(cls); GNUNET_assert(type == GNUNET_BLOCK_TYPE_DNS); @@ -109,11 +115,19 @@ void receive_dht(void *cls, answer->pkt.to = query_states[id].local_ip; answer->pkt.dst_port = query_states[id].local_port; + answer->pkt.id = id; + memcpy(answer->pkt.data, data, size); GNUNET_CONTAINER_DLL_insert_after(mycls.head, mycls.tail, mycls.tail, answer); - /* struct GNUNET_CONNECTION_TransmitHandle* th = */ GNUNET_SERVER_notify_transmit_ready(query_states[id].client, len, GNUNET_TIME_UNIT_FOREVER_REL, &send_answer, query_states[id].client); + GNUNET_SERVER_notify_transmit_ready(query_states[id].client, + len, + GNUNET_TIME_UNIT_FOREVER_REL, + &send_answer, + query_states[id].client); + + GNUNET_DHT_get_stop(handle); } /** @@ -134,14 +148,16 @@ void receive_query(void *cls, struct GNUNET_SERVER_Client *client, const struct if (pdns->queries[0]->namelen > 9 && 0 == strncmp(pdns->queries[0]->name+(pdns->queries[0]->namelen - 9), ".gnunet.", 9)) { - unsigned short* id = GNUNET_malloc(sizeof(unsigned short)); - *id = dns->s.id; - GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Query for .gnunet!\n"); GNUNET_HashCode key; GNUNET_CRYPTO_hash(pdns->queries[0]->name, pdns->queries[0]->namelen, &key); + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Getting with key %08x, len is %d\n", *((unsigned int*)&key), pdns->queries[0]->namelen); - GNUNET_DHT_get_start(mycls.dht, + + struct receive_dht_cls* cls = GNUNET_malloc(sizeof(struct receive_dht_cls)); + cls->id = dns->s.id; + + cls->handle = GNUNET_DHT_get_start(mycls.dht, GNUNET_TIME_UNIT_MINUTES, GNUNET_BLOCK_TYPE_DNS, &key, @@ -151,7 +167,8 @@ void receive_query(void *cls, struct GNUNET_SERVER_Client *client, const struct NULL, 0, receive_dht, - id); + cls); + goto out; } -- cgit v1.2.3