aboutsummaryrefslogtreecommitdiff
path: root/src/vpn
diff options
context:
space:
mode:
authorPhilipp Tölke <toelke@in.tum.de>2011-04-29 13:13:54 +0000
committerPhilipp Tölke <toelke@in.tum.de>2011-04-29 13:13:54 +0000
commitaab9f46b0488e0dd80c728b6d642fa4de853e63f (patch)
treed6e8be8159cc56917870838b1b27d7b4c8a3c464 /src/vpn
parent67bb0b2d4c066476d4719b7151bebb3b81c84190 (diff)
downloadgnunet-aab9f46b0488e0dd80c728b6d642fa4de853e63f.tar.gz
gnunet-aab9f46b0488e0dd80c728b6d642fa4de853e63f.zip
handle the reception of dns-answers in daemon-vpn
Diffstat (limited to 'src/vpn')
-rw-r--r--src/vpn/gnunet-daemon-vpn.c77
-rw-r--r--src/vpn/gnunet-daemon-vpn.h4
2 files changed, 80 insertions, 1 deletions
diff --git a/src/vpn/gnunet-daemon-vpn.c b/src/vpn/gnunet-daemon-vpn.c
index 726a013c0..6829b3cd9 100644
--- a/src/vpn/gnunet-daemon-vpn.c
+++ b/src/vpn/gnunet-daemon-vpn.c
@@ -237,6 +237,34 @@ new_ip6addr(unsigned char* buf, const GNUNET_HashCode *peer, const GNUNET_HashCo
237/*}}}*/ 237/*}}}*/
238 238
239/** 239/**
240 * Create a new Address from an answer-packet
241 */
242void
243new_ip6addr_remote (unsigned char *buf, unsigned char *addr, char addrlen)
244{ /* {{{ */
245 char *ipv6addr;
246 unsigned long long ipv6prefix;
247 GNUNET_assert (GNUNET_OK ==
248 GNUNET_CONFIGURATION_get_value_string (cfg, "vpn",
249 "IPV6ADDR",
250 &ipv6addr));
251 GNUNET_assert (GNUNET_OK ==
252 GNUNET_CONFIGURATION_get_value_number (cfg, "vpn",
253 "IPV6PREFIX",
254 &ipv6prefix));
255 GNUNET_assert (ipv6prefix < 127);
256 ipv6prefix = (ipv6prefix + 7) / 8;
257
258 inet_pton (AF_INET6, ipv6addr, buf);
259 GNUNET_free (ipv6addr);
260
261 int local_length = 16 - ipv6prefix;
262
263 memcpy (buf + ipv6prefix, addr, max (addrlen, local_length));
264}
265/*}}}*/
266
267/**
240 * This gets scheduled with cls pointing to an answer_packet and does everything 268 * This gets scheduled with cls pointing to an answer_packet and does everything
241 * needed in order to send it to the helper. 269 * needed in order to send it to the helper.
242 * 270 *
@@ -360,7 +388,54 @@ process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) {
360 list = GNUNET_malloc(htons(pkt->hdr.size) + 2*sizeof(struct answer_packet_list*)); 388 list = GNUNET_malloc(htons(pkt->hdr.size) + 2*sizeof(struct answer_packet_list*));
361 memcpy(&list->pkt, pkt, htons(pkt->hdr.size)); 389 memcpy(&list->pkt, pkt, htons(pkt->hdr.size));
362 } 390 }
363 /* TODO GNUNET_DNS_ANSWER_TYPE_REMOTE */ 391 else if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_REMOTE)
392 {
393 pkt->subtype = GNUNET_DNS_ANSWER_TYPE_IP;
394
395 GNUNET_HashCode key;
396 memset(&key, 0, sizeof(GNUNET_HashCode));
397
398 unsigned char* c = ((unsigned char*)pkt)+ntohs(pkt->addroffset);
399 new_ip6addr_remote(c, &pkt->addr, pkt->addrsize);
400 unsigned char* k = (unsigned char*)&key;
401 /*
402 * Copy the newly generated ip-address to the key backwards (as only the first part is used in the hash-table)
403 */
404 unsigned int i;
405 for (i = 0; i < 16; i++)
406 k[15-i] = c[i];
407
408 uint16_t namelen = strlen((char*)pkt->data+12)+1;
409
410 struct map_entry* value = GNUNET_malloc(sizeof(struct map_entry) + namelen);
411 char* name = (char*)(value +1);
412
413 value->namelen = namelen;
414 memcpy(name, pkt->data+12, namelen);
415
416 value->addrlen = pkt->addrsize;
417 memcpy(&value->addr, &pkt->addr, pkt->addrsize);
418 memset(value->additional_ports, 0, 8192);
419
420 memcpy(&value->hash, &key, sizeof(GNUNET_HashCode));
421
422 if (GNUNET_NO ==
423 GNUNET_CONTAINER_multihashmap_contains (hashmap, &key))
424 {
425 GNUNET_CONTAINER_multihashmap_put (hashmap, &key, value,
426 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY);
427 value->heap_node = GNUNET_CONTAINER_heap_insert (heap, value,
428 GNUNET_TIME_absolute_get ().abs_value);
429 if (GNUNET_CONTAINER_heap_get_size(heap) > max_mappings)
430 GNUNET_SCHEDULER_add_now(collect_mappings, NULL);
431 }
432 else
433 GNUNET_free(value);
434
435 list = GNUNET_malloc(htons(pkt->hdr.size) + 2*sizeof(struct answer_packet_list*));
436
437 memcpy(&list->pkt, pkt, htons(pkt->hdr.size));
438 }
364 else 439 else
365 { 440 {
366 GNUNET_break(0); 441 GNUNET_break(0);
diff --git a/src/vpn/gnunet-daemon-vpn.h b/src/vpn/gnunet-daemon-vpn.h
index 11d3fa43b..3ddd6eef6 100644
--- a/src/vpn/gnunet-daemon-vpn.h
+++ b/src/vpn/gnunet-daemon-vpn.h
@@ -70,6 +70,10 @@ extern struct GNUNET_CONTAINER_MultiHashMap* hashmap;
70 70
71struct map_entry { 71struct map_entry {
72 struct GNUNET_vpn_service_descriptor desc; 72 struct GNUNET_vpn_service_descriptor desc;
73
74 char addrlen;
75 char addr[16];
76
73 struct GNUNET_MESH_Tunnel *tunnel; 77 struct GNUNET_MESH_Tunnel *tunnel;
74 uint16_t namelen; 78 uint16_t namelen;
75 char additional_ports[8192]; 79 char additional_ports[8192];