aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPhilipp Tölke <toelke@in.tum.de>2010-11-17 08:55:35 +0000
committerPhilipp Tölke <toelke@in.tum.de>2010-11-17 08:55:35 +0000
commitc38f2bd388d3b7db9720118745862ac1c45a2ffe (patch)
tree92c859fcac09fe120894cd34f1d44a188807c610 /src
parent923eaac23b3e718df6bd9520e786c597033f351d (diff)
downloadgnunet-c38f2bd388d3b7db9720118745862ac1c45a2ffe.tar.gz
gnunet-c38f2bd388d3b7db9720118745862ac1c45a2ffe.zip
Store mappings into the hashmap
Diffstat (limited to 'src')
-rw-r--r--src/vpn/gnunet-daemon-vpn.c34
1 files changed, 31 insertions, 3 deletions
diff --git a/src/vpn/gnunet-daemon-vpn.c b/src/vpn/gnunet-daemon-vpn.c
index 3ec02ee3c..51c9d1e87 100644
--- a/src/vpn/gnunet-daemon-vpn.c
+++ b/src/vpn/gnunet-daemon-vpn.c
@@ -114,6 +114,11 @@ static struct answer_packet_list *answer_proc_head;
114 */ 114 */
115static struct answer_packet_list *answer_proc_tail; 115static struct answer_packet_list *answer_proc_tail;
116 116
117/**
118 * The hashmap containing the mappings from ipv6-addresses to gnunet-descriptors
119 */
120static struct GNUNET_CONTAINER_MultiHashMap* hashmap;
121
117static void helper_read(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tsdkctx); 122static void helper_read(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tsdkctx);
118static void dns_answer_handler(void* cls, const struct GNUNET_MessageHeader *msg); 123static void dns_answer_handler(void* cls, const struct GNUNET_MessageHeader *msg);
119 124
@@ -347,9 +352,16 @@ helper_write(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tsdkctx) {
347 NULL); 352 NULL);
348} 353}
349 354
355/**
356 * @return GNUNET_YES if a mapping exists
357 */
350static int 358static int
351address_mapping_exists(unsigned char addr[]) { 359address_mapping_exists(unsigned char addr[]) {
352 return 1; 360 GNUNET_HashCode* key = alloca(sizeof(GNUNET_HashCode));
361 memset(key, 0, sizeof(GNUNET_HashCode));
362 memcpy(key, addr, 16);
363
364 return GNUNET_CONTAINER_multihashmap_contains(hashmap, key);
353} 365}
354 366
355static void 367static void
@@ -424,7 +436,7 @@ message_token(void *cls,
424 /* ICMPv6 */ 436 /* ICMPv6 */
425 pkt6_icmp = (struct ip6_icmp*)pkt6; 437 pkt6_icmp = (struct ip6_icmp*)pkt6;
426 /* If this packet is an icmp-echo-request and a mapping exists, answer */ 438 /* If this packet is an icmp-echo-request and a mapping exists, answer */
427 if (pkt6_icmp->icmp_hdr.type == 0x80 && address_mapping_exists(pkt6->ip6_hdr.sadr)) 439 if (pkt6_icmp->icmp_hdr.type == 0x80 && address_mapping_exists(pkt6->ip6_hdr.dadr))
428 { 440 {
429 pkt6_icmp = GNUNET_malloc(ntohs(pkt6->shdr.size)); 441 pkt6_icmp = GNUNET_malloc(ntohs(pkt6->shdr.size));
430 memcpy(pkt6_icmp, pkt6, ntohs(pkt6->shdr.size)); 442 memcpy(pkt6_icmp, pkt6, ntohs(pkt6->shdr.size));
@@ -528,7 +540,22 @@ process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) {
528 { 540 {
529 pkt->subtype = GNUNET_DNS_ANSWER_TYPE_IP; 541 pkt->subtype = GNUNET_DNS_ANSWER_TYPE_IP;
530 542
531 new_ip6addr(((char*)pkt)+ntohs(pkt->addroffset), pkt); 543 GNUNET_HashCode key;
544 memset(&key, 0, sizeof(GNUNET_HashCode));
545 new_ip6addr((char*)&key, pkt);
546
547 struct GNUNET_vpn_service_descriptor* value = GNUNET_malloc(sizeof(struct GNUNET_vpn_service_descriptor));
548 memcpy(value, &pkt->service_descr, sizeof(struct GNUNET_vpn_service_descriptor));
549
550 if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put(hashmap,
551 &key,
552 value,
553 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY))
554 {
555 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Could not store to hashmap\n");
556 }
557
558 memcpy(((char*)pkt)+ntohs(pkt->addroffset), &key, 16);
532 559
533 /*FIXME: 560 /*FIXME:
534 * -save DNS_Record into hashmap, pointed to by ip 561 * -save DNS_Record into hashmap, pointed to by ip
@@ -634,6 +661,7 @@ run (void *cls,
634 mst = GNUNET_SERVER_mst_create(&message_token, NULL); 661 mst = GNUNET_SERVER_mst_create(&message_token, NULL);
635 cfg = cfg_; 662 cfg = cfg_;
636 restart_hijack = 0; 663 restart_hijack = 0;
664 hashmap = GNUNET_CONTAINER_multihashmap_create(65536);
637 GNUNET_SCHEDULER_add_now (connect_to_service_dns, NULL); 665 GNUNET_SCHEDULER_add_now (connect_to_service_dns, NULL);
638 GNUNET_SCHEDULER_add_now (start_helper_and_schedule, NULL); 666 GNUNET_SCHEDULER_add_now (start_helper_and_schedule, NULL);
639 GNUNET_SCHEDULER_add_delayed(GNUNET_TIME_UNIT_FOREVER_REL, &cleanup, cls); 667 GNUNET_SCHEDULER_add_delayed(GNUNET_TIME_UNIT_FOREVER_REL, &cleanup, cls);