aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPhilipp Tölke <toelke@in.tum.de>2011-04-29 13:13:47 +0000
committerPhilipp Tölke <toelke@in.tum.de>2011-04-29 13:13:47 +0000
commit7ab0702a79cf5afd934cb6a17f946830d9786847 (patch)
tree5e2ca112a979e26b8210686dafad70e7622905c5 /src
parent4204cfacd357f6a1531486b85370bf2095fb38da (diff)
downloadgnunet-7ab0702a79cf5afd934cb6a17f946830d9786847.tar.gz
gnunet-7ab0702a79cf5afd934cb6a17f946830d9786847.zip
remove IP-Mappings after some time
Diffstat (limited to 'src')
-rw-r--r--src/vpn/gnunet-daemon-vpn.c50
-rw-r--r--src/vpn/gnunet-daemon-vpn.h3
2 files changed, 47 insertions, 6 deletions
diff --git a/src/vpn/gnunet-daemon-vpn.c b/src/vpn/gnunet-daemon-vpn.c
index 77fd547ec..726a013c0 100644
--- a/src/vpn/gnunet-daemon-vpn.c
+++ b/src/vpn/gnunet-daemon-vpn.c
@@ -42,6 +42,12 @@
42const struct GNUNET_CONFIGURATION_Handle *cfg; 42const struct GNUNET_CONFIGURATION_Handle *cfg;
43struct GNUNET_MESH_Handle *mesh_handle; 43struct GNUNET_MESH_Handle *mesh_handle;
44struct GNUNET_CONTAINER_MultiHashMap* hashmap; 44struct GNUNET_CONTAINER_MultiHashMap* hashmap;
45static struct GNUNET_CONTAINER_Heap *heap;
46
47/**
48 * If there are at least this many address-mappings, old ones will be removed
49 */
50static long long unsigned int max_mappings = 200;
45 51
46/** 52/**
47 * Final status code. 53 * Final status code.
@@ -101,6 +107,23 @@ address_mapping_exists(unsigned char addr[]) {
101 } 107 }
102} 108}
103 109
110static void
111collect_mappings(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) {
112 if ( (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) != 0)
113 return;
114
115 struct map_entry* me = GNUNET_CONTAINER_heap_remove_root(heap);
116
117 /* This is free()ed memory! */
118 me->heap_node = NULL;
119
120 /* FIXME! GNUNET_MESH_close_tunnel(state->tunnel); */
121
122 GNUNET_CONTAINER_multihashmap_remove(hashmap, &me->hash, me);
123
124 GNUNET_free(me);
125}
126
104void 127void
105send_icmp_response(void* cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { 128send_icmp_response(void* cls, const struct GNUNET_SCHEDULER_TaskContext *tc) {
106 struct ip6_icmp* request = cls; 129 struct ip6_icmp* request = cls;
@@ -259,11 +282,19 @@ process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) {
259 282
260 memset(value->additional_ports, 0, 8192); 283 memset(value->additional_ports, 0, 8192);
261 284
262 /* FIXME save this to heap, too */ 285 memcpy(&value->hash, &key, sizeof(GNUNET_HashCode));
286
263 if (GNUNET_NO == 287 if (GNUNET_NO ==
264 GNUNET_CONTAINER_multihashmap_contains (hashmap, &key)) 288 GNUNET_CONTAINER_multihashmap_contains (hashmap, &key))
265 GNUNET_CONTAINER_multihashmap_put (hashmap, &key, value, 289 {
266 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY); 290 GNUNET_CONTAINER_multihashmap_put (hashmap, &key, value,
291 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY);
292
293 value->heap_node = GNUNET_CONTAINER_heap_insert (heap, value,
294 GNUNET_TIME_absolute_get ().abs_value);
295 if (GNUNET_CONTAINER_heap_get_size(heap) > max_mappings)
296 GNUNET_SCHEDULER_add_now(collect_mappings, NULL);
297 }
267 else 298 else
268 GNUNET_free(value); 299 GNUNET_free(value);
269 300
@@ -295,8 +326,10 @@ process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) {
295 k[i] += 16*(c2 - 87); 326 k[i] += 16*(c2 - 87);
296 } 327 }
297 328
298 /* FIXME: update costs in heap */
299 struct map_entry* map_entry = GNUNET_CONTAINER_multihashmap_get(hashmap, &key); 329 struct map_entry* map_entry = GNUNET_CONTAINER_multihashmap_get(hashmap, &key);
330 GNUNET_CONTAINER_heap_update_cost (heap, map_entry->heap_node,
331 GNUNET_TIME_absolute_get ().abs_value);
332
300 uint16_t offset = ntohs(pkt->addroffset); 333 uint16_t offset = ntohs(pkt->addroffset);
301 334
302 if (map_entry == NULL) 335 if (map_entry == NULL)
@@ -457,8 +490,9 @@ receive_udp_back (void *cls, struct GNUNET_MESH_Tunnel* tunnel,
457 GNUNET_HashCode* key = address_mapping_exists(pkt6->ip6_hdr.sadr); 490 GNUNET_HashCode* key = address_mapping_exists(pkt6->ip6_hdr.sadr);
458 GNUNET_assert (key != NULL); 491 GNUNET_assert (key != NULL);
459 492
460 /* FIXME: update costs in heap */
461 struct map_entry *me = GNUNET_CONTAINER_multihashmap_get(hashmap, key); 493 struct map_entry *me = GNUNET_CONTAINER_multihashmap_get(hashmap, key);
494 GNUNET_CONTAINER_heap_update_cost (heap, me->heap_node,
495 GNUNET_TIME_absolute_get ().abs_value);
462 496
463 GNUNET_free(key); 497 GNUNET_free(key);
464 498
@@ -531,8 +565,9 @@ receive_tcp_back (void *cls, struct GNUNET_MESH_Tunnel* tunnel,
531 GNUNET_HashCode* key = address_mapping_exists(pkt6->ip6_hdr.sadr); 565 GNUNET_HashCode* key = address_mapping_exists(pkt6->ip6_hdr.sadr);
532 GNUNET_assert (key != NULL); 566 GNUNET_assert (key != NULL);
533 567
534 /* FIXME: update costs in heap */
535 struct map_entry *me = GNUNET_CONTAINER_multihashmap_get(hashmap, key); 568 struct map_entry *me = GNUNET_CONTAINER_multihashmap_get(hashmap, key);
569 GNUNET_CONTAINER_heap_update_cost (heap, me->heap_node,
570 GNUNET_TIME_absolute_get ().abs_value);
536 571
537 GNUNET_free(key); 572 GNUNET_free(key);
538 573
@@ -588,6 +623,9 @@ run (void *cls,
588 cfg = cfg_; 623 cfg = cfg_;
589 restart_hijack = 0; 624 restart_hijack = 0;
590 hashmap = GNUNET_CONTAINER_multihashmap_create(65536); 625 hashmap = GNUNET_CONTAINER_multihashmap_create(65536);
626 heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN);
627 GNUNET_CONFIGURATION_get_value_number (cfg, "vpn", "MAX_MAPPINGg",
628 &max_mappings);
591 udp_connections = GNUNET_CONTAINER_multihashmap_create(65536); 629 udp_connections = GNUNET_CONTAINER_multihashmap_create(65536);
592 GNUNET_SCHEDULER_TaskIdentifier conn_task = GNUNET_SCHEDULER_add_now (connect_to_service_dns, NULL); 630 GNUNET_SCHEDULER_TaskIdentifier conn_task = GNUNET_SCHEDULER_add_now (connect_to_service_dns, NULL);
593 GNUNET_SCHEDULER_add_after (conn_task, start_helper_and_schedule, NULL); 631 GNUNET_SCHEDULER_add_after (conn_task, start_helper_and_schedule, NULL);
diff --git a/src/vpn/gnunet-daemon-vpn.h b/src/vpn/gnunet-daemon-vpn.h
index c640123b7..11d3fa43b 100644
--- a/src/vpn/gnunet-daemon-vpn.h
+++ b/src/vpn/gnunet-daemon-vpn.h
@@ -73,6 +73,9 @@ struct map_entry {
73 struct GNUNET_MESH_Tunnel *tunnel; 73 struct GNUNET_MESH_Tunnel *tunnel;
74 uint16_t namelen; 74 uint16_t namelen;
75 char additional_ports[8192]; 75 char additional_ports[8192];
76
77 struct GNUNET_CONTAINER_HeapNode* heap_node;
78 GNUNET_HashCode hash;
76 /** 79 /**
77 * After this struct the name is located in DNS-Format! 80 * After this struct the name is located in DNS-Format!
78 */ 81 */