diff options
author | Philipp Tölke <toelke@in.tum.de> | 2010-10-19 21:16:50 +0000 |
---|---|---|
committer | Philipp Tölke <toelke@in.tum.de> | 2010-10-19 21:16:50 +0000 |
commit | 98e046ac9634755bb9a6f620d5f4af708871497c (patch) | |
tree | 0b14a5e7fcf29b518c17cf56c78e9b2257c09a24 | |
parent | 677fdd9cd9464cd443722a197ede640fc4be2c95 (diff) | |
download | gnunet-98e046ac9634755bb9a6f620d5f4af708871497c.tar.gz gnunet-98e046ac9634755bb9a6f620d5f4af708871497c.zip |
Send answers from the DHT to the daemon-vpn
-rw-r--r-- | src/vpn/gnunet-daemon-vpn.c | 54 | ||||
-rw-r--r-- | src/vpn/gnunet-service-dns-p.h | 2 | ||||
-rw-r--r-- | 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 { | |||
61 | struct query_packet_list *head; | 61 | struct query_packet_list *head; |
62 | struct query_packet_list *tail; | 62 | struct query_packet_list *tail; |
63 | 63 | ||
64 | struct answer_packet_list *answer_head; | 64 | struct answer_packet_list *answer_proc_head; |
65 | struct answer_packet_list *answer_tail; | 65 | struct answer_packet_list *answer_proc_tail; |
66 | }; | 66 | }; |
67 | 67 | ||
68 | static struct vpn_cls mycls; | 68 | static struct vpn_cls mycls; |
@@ -151,7 +151,7 @@ static uint16_t calculate_ip_checksum(uint16_t* hdr, short len) { | |||
151 | static void helper_write(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tsdkctx) { | 151 | static void helper_write(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tsdkctx) { |
152 | if (tsdkctx->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) | 152 | if (tsdkctx->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) |
153 | return; | 153 | return; |
154 | struct answer_packet_list* ans = mycls.answer_head; | 154 | struct answer_packet_list* ans = mycls.answer_proc_head; |
155 | size_t len = ntohs(ans->pkt.hdr.size); | 155 | size_t len = ntohs(ans->pkt.hdr.size); |
156 | 156 | ||
157 | GNUNET_assert(ans->pkt.subtype == GNUNET_DNS_ANSWER_TYPE_IP); | 157 | 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 | |||
191 | 191 | ||
192 | memcpy(&pkt->udp_dns.data, ans->pkt.data, data_len); | 192 | memcpy(&pkt->udp_dns.data, ans->pkt.data, data_len); |
193 | 193 | ||
194 | GNUNET_CONTAINER_DLL_remove (mycls.answer_head, mycls.answer_tail, ans); | 194 | GNUNET_CONTAINER_DLL_remove (mycls.answer_proc_head, mycls.answer_proc_tail, ans); |
195 | GNUNET_free(ans); | 195 | GNUNET_free(ans); |
196 | 196 | ||
197 | /* FIXME */ GNUNET_DISK_file_write(mycls.fh_to_helper, pkt, pkt_len); | 197 | /* FIXME */ GNUNET_DISK_file_write(mycls.fh_to_helper, pkt, pkt_len); |
198 | 198 | ||
199 | if (mycls.answer_head != NULL) | 199 | if (mycls.answer_proc_head != NULL) |
200 | GNUNET_SCHEDULER_add_write_file (mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.fh_to_helper, &helper_write, NULL); | 200 | GNUNET_SCHEDULER_add_write_file (mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.fh_to_helper, &helper_write, NULL); |
201 | } | 201 | } |
202 | 202 | ||
@@ -283,10 +283,36 @@ reconnect_to_service_dns (void *cls, | |||
283 | /* 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); | 283 | /* 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); |
284 | } | 284 | } |
285 | 285 | ||
286 | static void | 286 | static void |
287 | dns_answer_handler(void* cls, const struct GNUNET_MessageHeader *msg) | 287 | process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) { |
288 | struct answer_packet* pkt = cls; | ||
289 | |||
290 | if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_IP) | ||
291 | { | ||
292 | struct answer_packet_list* list = GNUNET_malloc(htons(pkt->hdr.size) + 2*sizeof(struct answer_packet_list*)); | ||
293 | |||
294 | memcpy(&list->pkt, pkt, htons(pkt->hdr.size)); | ||
295 | |||
296 | GNUNET_CONTAINER_DLL_insert_after(mycls.answer_proc_head, mycls.answer_proc_tail, mycls.answer_proc_tail, list); | ||
297 | |||
298 | GNUNET_SCHEDULER_add_write_file (mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.fh_to_helper, &helper_write, NULL); | ||
299 | |||
300 | return; | ||
301 | } | ||
302 | |||
303 | if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_SERVICE) | ||
304 | { | ||
305 | /*FIXME: | ||
306 | * -find new IP-address for this service | ||
307 | * -create a DNS-Answer | ||
308 | */ | ||
309 | } | ||
310 | } | ||
311 | |||
312 | static void | ||
313 | dns_answer_handler(void* cls, const struct GNUNET_MessageHeader *msg) | ||
288 | { | 314 | { |
289 | if (msg == NULL) | 315 | if (msg == NULL) |
290 | { | 316 | { |
291 | GNUNET_CLIENT_disconnect(mycls.dns_connection, GNUNET_NO); | 317 | GNUNET_CLIENT_disconnect(mycls.dns_connection, GNUNET_NO); |
292 | mycls.dns_connection = NULL; | 318 | mycls.dns_connection = NULL; |
@@ -306,12 +332,12 @@ dns_answer_handler(void* cls, const struct GNUNET_MessageHeader *msg) | |||
306 | &reconnect_to_service_dns, | 332 | &reconnect_to_service_dns, |
307 | NULL); | 333 | NULL); |
308 | return; | 334 | return; |
309 | } | 335 | } |
310 | struct answer_packet_list* pkt = GNUNET_malloc(ntohs(msg->size) + 2*sizeof(struct answer_packet_list*)); | 336 | void *pkt = GNUNET_malloc(ntohs(msg->size)); |
311 | 337 | ||
312 | memcpy(&pkt->pkt, msg, ntohs(msg->size)); | 338 | memcpy(pkt, msg, ntohs(msg->size)); |
313 | GNUNET_CONTAINER_DLL_insert_after(mycls.answer_head, mycls.answer_tail, mycls.answer_tail, pkt); | 339 | |
314 | GNUNET_SCHEDULER_add_write_file (mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.fh_to_helper, &helper_write, NULL); | 340 | GNUNET_SCHEDULER_add_now(mycls.sched, process_answer, pkt); |
315 | GNUNET_CLIENT_receive(mycls.dns_connection, &dns_answer_handler, NULL, GNUNET_TIME_UNIT_FOREVER_REL); | 341 | GNUNET_CLIENT_receive(mycls.dns_connection, &dns_answer_handler, NULL, GNUNET_TIME_UNIT_FOREVER_REL); |
316 | } | 342 | } |
317 | 343 | ||
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 { | |||
39 | unsigned to:32 GNUNET_PACKED; | 39 | unsigned to:32 GNUNET_PACKED; |
40 | unsigned dst_port:16 GNUNET_PACKED; | 40 | unsigned dst_port:16 GNUNET_PACKED; |
41 | 41 | ||
42 | unsigned short id GNUNET_PACKED; | ||
43 | |||
42 | unsigned char data[1]; | 44 | unsigned char data[1]; |
43 | }; | 45 | }; |
44 | 46 | ||
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 { | |||
58 | unsigned remote_ip:32; | 58 | unsigned remote_ip:32; |
59 | unsigned local_port:16; | 59 | unsigned local_port:16; |
60 | }; | 60 | }; |
61 | static struct dns_query_id_state query_states[65536]; /* This is < 1MiB */ | 61 | static struct dns_query_id_state query_states[65536]; /* This is < 1.5MiB */ |
62 | 62 | ||
63 | void hijack(unsigned short port) { | 63 | void hijack(unsigned short port) { |
64 | char port_s[6]; | 64 | char port_s[6]; |
@@ -78,6 +78,11 @@ void unhijack(unsigned short port) { | |||
78 | 78 | ||
79 | size_t send_answer(void* cls, size_t size, void* buf); | 79 | size_t send_answer(void* cls, size_t size, void* buf); |
80 | 80 | ||
81 | struct receive_dht_cls { | ||
82 | unsigned short id; | ||
83 | struct GNUNET_DHT_GetHandle* handle; | ||
84 | }; | ||
85 | |||
81 | void receive_dht(void *cls, | 86 | void receive_dht(void *cls, |
82 | struct GNUNET_TIME_Absolute exp, | 87 | struct GNUNET_TIME_Absolute exp, |
83 | const GNUNET_HashCode *key, | 88 | const GNUNET_HashCode *key, |
@@ -87,7 +92,8 @@ void receive_dht(void *cls, | |||
87 | size_t size, | 92 | size_t size, |
88 | const void *data) | 93 | const void *data) |
89 | { | 94 | { |
90 | unsigned short id = *((unsigned short*)cls); | 95 | unsigned short id = ((struct receive_dht_cls*)cls)->id; |
96 | struct GNUNET_DHT_GetHandle* handle = ((struct receive_dht_cls*)cls)->handle; | ||
91 | GNUNET_free(cls); | 97 | GNUNET_free(cls); |
92 | 98 | ||
93 | GNUNET_assert(type == GNUNET_BLOCK_TYPE_DNS); | 99 | GNUNET_assert(type == GNUNET_BLOCK_TYPE_DNS); |
@@ -109,11 +115,19 @@ void receive_dht(void *cls, | |||
109 | answer->pkt.to = query_states[id].local_ip; | 115 | answer->pkt.to = query_states[id].local_ip; |
110 | answer->pkt.dst_port = query_states[id].local_port; | 116 | answer->pkt.dst_port = query_states[id].local_port; |
111 | 117 | ||
118 | answer->pkt.id = id; | ||
119 | |||
112 | memcpy(answer->pkt.data, data, size); | 120 | memcpy(answer->pkt.data, data, size); |
113 | 121 | ||
114 | GNUNET_CONTAINER_DLL_insert_after(mycls.head, mycls.tail, mycls.tail, answer); | 122 | GNUNET_CONTAINER_DLL_insert_after(mycls.head, mycls.tail, mycls.tail, answer); |
115 | 123 | ||
116 | /* 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); | 124 | GNUNET_SERVER_notify_transmit_ready(query_states[id].client, |
125 | len, | ||
126 | GNUNET_TIME_UNIT_FOREVER_REL, | ||
127 | &send_answer, | ||
128 | query_states[id].client); | ||
129 | |||
130 | GNUNET_DHT_get_stop(handle); | ||
117 | } | 131 | } |
118 | 132 | ||
119 | /** | 133 | /** |
@@ -134,14 +148,16 @@ void receive_query(void *cls, struct GNUNET_SERVER_Client *client, const struct | |||
134 | if (pdns->queries[0]->namelen > 9 && | 148 | if (pdns->queries[0]->namelen > 9 && |
135 | 0 == strncmp(pdns->queries[0]->name+(pdns->queries[0]->namelen - 9), ".gnunet.", 9)) { | 149 | 0 == strncmp(pdns->queries[0]->name+(pdns->queries[0]->namelen - 9), ".gnunet.", 9)) { |
136 | 150 | ||
137 | unsigned short* id = GNUNET_malloc(sizeof(unsigned short)); | ||
138 | *id = dns->s.id; | ||
139 | |||
140 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Query for .gnunet!\n"); | 151 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Query for .gnunet!\n"); |
141 | GNUNET_HashCode key; | 152 | GNUNET_HashCode key; |
142 | GNUNET_CRYPTO_hash(pdns->queries[0]->name, pdns->queries[0]->namelen, &key); | 153 | GNUNET_CRYPTO_hash(pdns->queries[0]->name, pdns->queries[0]->namelen, &key); |
154 | |||
143 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Getting with key %08x, len is %d\n", *((unsigned int*)&key), pdns->queries[0]->namelen); | 155 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Getting with key %08x, len is %d\n", *((unsigned int*)&key), pdns->queries[0]->namelen); |
144 | GNUNET_DHT_get_start(mycls.dht, | 156 | |
157 | struct receive_dht_cls* cls = GNUNET_malloc(sizeof(struct receive_dht_cls)); | ||
158 | cls->id = dns->s.id; | ||
159 | |||
160 | cls->handle = GNUNET_DHT_get_start(mycls.dht, | ||
145 | GNUNET_TIME_UNIT_MINUTES, | 161 | GNUNET_TIME_UNIT_MINUTES, |
146 | GNUNET_BLOCK_TYPE_DNS, | 162 | GNUNET_BLOCK_TYPE_DNS, |
147 | &key, | 163 | &key, |
@@ -151,7 +167,8 @@ void receive_query(void *cls, struct GNUNET_SERVER_Client *client, const struct | |||
151 | NULL, | 167 | NULL, |
152 | 0, | 168 | 0, |
153 | receive_dht, | 169 | receive_dht, |
154 | id); | 170 | cls); |
171 | |||
155 | goto out; | 172 | goto out; |
156 | } | 173 | } |
157 | 174 | ||