diff options
author | Philipp Tölke <toelke@in.tum.de> | 2010-11-17 08:55:35 +0000 |
---|---|---|
committer | Philipp Tölke <toelke@in.tum.de> | 2010-11-17 08:55:35 +0000 |
commit | c38f2bd388d3b7db9720118745862ac1c45a2ffe (patch) | |
tree | 92c859fcac09fe120894cd34f1d44a188807c610 /src | |
parent | 923eaac23b3e718df6bd9520e786c597033f351d (diff) | |
download | gnunet-c38f2bd388d3b7db9720118745862ac1c45a2ffe.tar.gz gnunet-c38f2bd388d3b7db9720118745862ac1c45a2ffe.zip |
Store mappings into the hashmap
Diffstat (limited to 'src')
-rw-r--r-- | src/vpn/gnunet-daemon-vpn.c | 34 |
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 | */ |
115 | static struct answer_packet_list *answer_proc_tail; | 115 | static struct answer_packet_list *answer_proc_tail; |
116 | 116 | ||
117 | /** | ||
118 | * The hashmap containing the mappings from ipv6-addresses to gnunet-descriptors | ||
119 | */ | ||
120 | static struct GNUNET_CONTAINER_MultiHashMap* hashmap; | ||
121 | |||
117 | static void helper_read(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tsdkctx); | 122 | static void helper_read(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tsdkctx); |
118 | static void dns_answer_handler(void* cls, const struct GNUNET_MessageHeader *msg); | 123 | static 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 | */ | ||
350 | static int | 358 | static int |
351 | address_mapping_exists(unsigned char addr[]) { | 359 | address_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 | ||
355 | static void | 367 | static 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); |