aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Tölke <toelke@in.tum.de>2010-10-19 21:16:50 +0000
committerPhilipp Tölke <toelke@in.tum.de>2010-10-19 21:16:50 +0000
commit98e046ac9634755bb9a6f620d5f4af708871497c (patch)
tree0b14a5e7fcf29b518c17cf56c78e9b2257c09a24
parent677fdd9cd9464cd443722a197ede640fc4be2c95 (diff)
downloadgnunet-98e046ac9634755bb9a6f620d5f4af708871497c.tar.gz
gnunet-98e046ac9634755bb9a6f620d5f4af708871497c.zip
Send answers from the DHT to the daemon-vpn
-rw-r--r--src/vpn/gnunet-daemon-vpn.c54
-rw-r--r--src/vpn/gnunet-service-dns-p.h2
-rw-r--r--src/vpn/gnunet-service-dns.c33
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
68static struct vpn_cls mycls; 68static struct vpn_cls mycls;
@@ -151,7 +151,7 @@ static uint16_t calculate_ip_checksum(uint16_t* hdr, short len) {
151static void helper_write(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tsdkctx) { 151static 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
286static void 286static void
287dns_answer_handler(void* cls, const struct GNUNET_MessageHeader *msg) 287process_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
312static void
313dns_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};
61static struct dns_query_id_state query_states[65536]; /* This is < 1MiB */ 61static struct dns_query_id_state query_states[65536]; /* This is < 1.5MiB */
62 62
63void hijack(unsigned short port) { 63void 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
79size_t send_answer(void* cls, size_t size, void* buf); 79size_t send_answer(void* cls, size_t size, void* buf);
80 80
81struct receive_dht_cls {
82 unsigned short id;
83 struct GNUNET_DHT_GetHandle* handle;
84};
85
81void receive_dht(void *cls, 86void 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