diff options
author | Philipp Tölke <toelke@in.tum.de> | 2011-04-29 13:13:47 +0000 |
---|---|---|
committer | Philipp Tölke <toelke@in.tum.de> | 2011-04-29 13:13:47 +0000 |
commit | 7ab0702a79cf5afd934cb6a17f946830d9786847 (patch) | |
tree | 5e2ca112a979e26b8210686dafad70e7622905c5 /src/vpn | |
parent | 4204cfacd357f6a1531486b85370bf2095fb38da (diff) | |
download | gnunet-7ab0702a79cf5afd934cb6a17f946830d9786847.tar.gz gnunet-7ab0702a79cf5afd934cb6a17f946830d9786847.zip |
remove IP-Mappings after some time
Diffstat (limited to 'src/vpn')
-rw-r--r-- | src/vpn/gnunet-daemon-vpn.c | 50 | ||||
-rw-r--r-- | src/vpn/gnunet-daemon-vpn.h | 3 |
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 @@ | |||
42 | const struct GNUNET_CONFIGURATION_Handle *cfg; | 42 | const struct GNUNET_CONFIGURATION_Handle *cfg; |
43 | struct GNUNET_MESH_Handle *mesh_handle; | 43 | struct GNUNET_MESH_Handle *mesh_handle; |
44 | struct GNUNET_CONTAINER_MultiHashMap* hashmap; | 44 | struct GNUNET_CONTAINER_MultiHashMap* hashmap; |
45 | static struct GNUNET_CONTAINER_Heap *heap; | ||
46 | |||
47 | /** | ||
48 | * If there are at least this many address-mappings, old ones will be removed | ||
49 | */ | ||
50 | static 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 | ||
110 | static void | ||
111 | collect_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 | |||
104 | void | 127 | void |
105 | send_icmp_response(void* cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { | 128 | send_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 | */ |