diff options
author | Philipp Tölke <toelke@in.tum.de> | 2011-04-10 21:36:24 +0000 |
---|---|---|
committer | Philipp Tölke <toelke@in.tum.de> | 2011-04-10 21:36:24 +0000 |
commit | 0ed04623d2fff96b2093052330c8c92f1367ee7a (patch) | |
tree | 953dcb17648103917bbec9ec996970e3c52e60e5 /src/vpn | |
parent | 9898b0cbe6b15c3b1ae1264011f7d5375ab5247c (diff) | |
download | gnunet-0ed04623d2fff96b2093052330c8c92f1367ee7a.tar.gz gnunet-0ed04623d2fff96b2093052330c8c92f1367ee7a.zip |
save state in heap
Diffstat (limited to 'src/vpn')
-rw-r--r-- | src/vpn/gnunet-daemon-exit.c | 110 |
1 files changed, 92 insertions, 18 deletions
diff --git a/src/vpn/gnunet-daemon-exit.c b/src/vpn/gnunet-daemon-exit.c index e154f4c6a..be9d0d053 100644 --- a/src/vpn/gnunet-daemon-exit.c +++ b/src/vpn/gnunet-daemon-exit.c | |||
@@ -65,7 +65,19 @@ static struct GNUNET_MESH_Handle *mesh_handle; | |||
65 | * source-port and destination-port to a struct redirect_state | 65 | * source-port and destination-port to a struct redirect_state |
66 | */ | 66 | */ |
67 | static struct GNUNET_CONTAINER_MultiHashMap *udp_connections; | 67 | static struct GNUNET_CONTAINER_MultiHashMap *udp_connections; |
68 | static struct GNUNET_CONTAINER_Heap *udp_connections_heap; | ||
68 | static struct GNUNET_CONTAINER_MultiHashMap *tcp_connections; | 69 | static struct GNUNET_CONTAINER_MultiHashMap *tcp_connections; |
70 | static struct GNUNET_CONTAINER_Heap *tcp_connections_heap; | ||
71 | |||
72 | /** | ||
73 | * If there are at least this many udp-Connections, old ones will be removed | ||
74 | */ | ||
75 | static long long unsigned int max_udp_connections = 200; | ||
76 | |||
77 | /** | ||
78 | * If there are at least this many tcp-Connections, old ones will be removed | ||
79 | */ | ||
80 | static long long unsigned int max_tcp_connections = 200; | ||
69 | 81 | ||
70 | /** | 82 | /** |
71 | * This struct is saved into the services-hashmap | 83 | * This struct is saved into the services-hashmap |
@@ -114,6 +126,10 @@ struct redirect_state | |||
114 | GNUNET_HashCode desc; | 126 | GNUNET_HashCode desc; |
115 | struct redirect_service *serv; | 127 | struct redirect_service *serv; |
116 | 128 | ||
129 | struct GNUNET_CONTAINER_HeapNode* heap_node; | ||
130 | struct GNUNET_CONTAINER_MultiHashMap *hashmap; | ||
131 | GNUNET_HashCode hash; | ||
132 | |||
117 | /** | 133 | /** |
118 | * The source-address and -port of this connection | 134 | * The source-address and -port of this connection |
119 | */ | 135 | */ |
@@ -158,6 +174,26 @@ cleanup(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tskctx) { | |||
158 | } | 174 | } |
159 | } | 175 | } |
160 | 176 | ||
177 | static void | ||
178 | collect_connections(void* cls, const struct GNUNET_SCHEDULER_TaskContext* t) { | ||
179 | if (GNUNET_SCHEDULER_REASON_SHUTDOWN == t->reason) | ||
180 | return; | ||
181 | |||
182 | |||
183 | struct GNUNET_CONTAINER_Heap *heap = cls; | ||
184 | |||
185 | struct redirect_state* state = GNUNET_CONTAINER_heap_remove_root(heap); | ||
186 | |||
187 | /* This is free()ed memory! */ | ||
188 | state->heap_node = NULL; | ||
189 | |||
190 | /* FIXME! GNUNET_MESH_close_tunnel(state->tunnel); */ | ||
191 | |||
192 | GNUNET_CONTAINER_multihashmap_remove(state->hashmap, &state->hash, state); | ||
193 | |||
194 | GNUNET_free(state); | ||
195 | } | ||
196 | |||
161 | /** | 197 | /** |
162 | * cls is the pointer to a GNUNET_MessageHeader that is | 198 | * cls is the pointer to a GNUNET_MessageHeader that is |
163 | * followed by the service-descriptor and the udp-packet that should be sent; | 199 | * followed by the service-descriptor and the udp-packet that should be sent; |
@@ -200,10 +236,14 @@ udp_from_helper (struct udp_pkt *udp, unsigned char *dadr, size_t addrlen, | |||
200 | /* FIXME better hashing */ | 236 | /* FIXME better hashing */ |
201 | GNUNET_HashCode hash; | 237 | GNUNET_HashCode hash; |
202 | GNUNET_CRYPTO_hash (&u_i, sizeof (struct redirect_info), &hash); | 238 | GNUNET_CRYPTO_hash (&u_i, sizeof (struct redirect_info), &hash); |
203 | /* FIXME: update costs in heap */ | 239 | |
204 | struct redirect_state *state = | 240 | struct redirect_state *state = |
205 | GNUNET_CONTAINER_multihashmap_get (udp_connections, &hash); | 241 | GNUNET_CONTAINER_multihashmap_get (udp_connections, &hash); |
206 | 242 | ||
243 | /* Mark this connection as freshly used */ | ||
244 | GNUNET_CONTAINER_heap_update_cost (udp_connections_heap, state->heap_node, | ||
245 | GNUNET_TIME_absolute_get ().abs_value); | ||
246 | |||
207 | tunnel = state->tunnel; | 247 | tunnel = state->tunnel; |
208 | 248 | ||
209 | /* check if spt == serv.remote if yes: set spt = serv.myport ("nat") */ | 249 | /* check if spt == serv.remote if yes: set spt = serv.myport ("nat") */ |
@@ -228,6 +268,7 @@ udp_from_helper (struct udp_pkt *udp, unsigned char *dadr, size_t addrlen, | |||
228 | GNUNET_CONTAINER_multihashmap_put (udp_services, | 268 | GNUNET_CONTAINER_multihashmap_put (udp_services, |
229 | &hash, serv, | 269 | &hash, serv, |
230 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); | 270 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); |
271 | |||
231 | state->serv = serv; | 272 | state->serv = serv; |
232 | } | 273 | } |
233 | /* send udp-packet back */ | 274 | /* send udp-packet back */ |
@@ -279,10 +320,13 @@ tcp_from_helper (struct tcp_pkt *tcp, unsigned char *dadr, size_t addrlen, | |||
279 | /* get tunnel and service-descriptor from this */ | 320 | /* get tunnel and service-descriptor from this */ |
280 | GNUNET_HashCode hash; | 321 | GNUNET_HashCode hash; |
281 | GNUNET_CRYPTO_hash (&u_i, sizeof (struct redirect_info), &hash); | 322 | GNUNET_CRYPTO_hash (&u_i, sizeof (struct redirect_info), &hash); |
282 | /* FIXME: update costs in heap */ | ||
283 | struct redirect_state *state = | 323 | struct redirect_state *state = |
284 | GNUNET_CONTAINER_multihashmap_get (tcp_connections, &hash); | 324 | GNUNET_CONTAINER_multihashmap_get (tcp_connections, &hash); |
285 | 325 | ||
326 | /* Mark this connection as freshly used */ | ||
327 | GNUNET_CONTAINER_heap_update_cost (tcp_connections_heap, state->heap_node, | ||
328 | GNUNET_TIME_absolute_get ().abs_value); | ||
329 | |||
286 | tunnel = state->tunnel; | 330 | tunnel = state->tunnel; |
287 | 331 | ||
288 | /* check if spt == serv.remote if yes: set spt = serv.myport ("nat") */ | 332 | /* check if spt == serv.remote if yes: set spt = serv.myport ("nat") */ |
@@ -295,7 +339,7 @@ tcp_from_helper (struct tcp_pkt *tcp, unsigned char *dadr, size_t addrlen, | |||
295 | // This is an illegal packet. | 339 | // This is an illegal packet. |
296 | GNUNET_assert (0); | 340 | GNUNET_assert (0); |
297 | } | 341 | } |
298 | /* send udp-packet back */ | 342 | /* send tcp-packet back */ |
299 | len = | 343 | len = |
300 | sizeof (struct GNUNET_MessageHeader) + sizeof (GNUNET_HashCode) + pktlen; | 344 | sizeof (struct GNUNET_MessageHeader) + sizeof (GNUNET_HashCode) + pktlen; |
301 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "len: %d\n", pktlen); | 345 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "len: %d\n", pktlen); |
@@ -806,6 +850,7 @@ receive_tcp_service (void *cls, | |||
806 | memset (state, 0, sizeof (struct redirect_state)); | 850 | memset (state, 0, sizeof (struct redirect_state)); |
807 | state->tunnel = tunnel; | 851 | state->tunnel = tunnel; |
808 | state->serv = serv; | 852 | state->serv = serv; |
853 | state->hashmap = tcp_connections; | ||
809 | memcpy (&state->desc, desc, sizeof (GNUNET_HashCode)); | 854 | memcpy (&state->desc, desc, sizeof (GNUNET_HashCode)); |
810 | 855 | ||
811 | len = sizeof (struct GNUNET_MessageHeader) + sizeof (struct pkt_tun) + | 856 | len = sizeof (struct GNUNET_MessageHeader) + sizeof (struct pkt_tun) + |
@@ -833,13 +878,22 @@ receive_tcp_service (void *cls, | |||
833 | } | 878 | } |
834 | 879 | ||
835 | /* FIXME better hashing */ | 880 | /* FIXME better hashing */ |
836 | GNUNET_CRYPTO_hash (&state->redirect_info, sizeof (struct redirect_info), &hash); | 881 | GNUNET_CRYPTO_hash (&state->redirect_info, sizeof (struct redirect_info), |
882 | &state->hash); | ||
837 | 883 | ||
838 | /* FIXME save this to heap, too */ | ||
839 | if (GNUNET_NO == | 884 | if (GNUNET_NO == |
840 | GNUNET_CONTAINER_multihashmap_contains (tcp_connections, &hash)) | 885 | GNUNET_CONTAINER_multihashmap_contains (tcp_connections, &state->hash)) |
841 | GNUNET_CONTAINER_multihashmap_put (tcp_connections, &hash, state, | 886 | { |
842 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY); | 887 | GNUNET_CONTAINER_multihashmap_put (tcp_connections, &state->hash, state, |
888 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY); | ||
889 | |||
890 | state->heap_node = | ||
891 | GNUNET_CONTAINER_heap_insert (tcp_connections_heap, state, | ||
892 | GNUNET_TIME_absolute_get ().abs_value); | ||
893 | |||
894 | if (GNUNET_CONTAINER_heap_get_size(tcp_connections_heap) > max_tcp_connections) | ||
895 | GNUNET_SCHEDULER_add_now(collect_connections, tcp_connections_heap); | ||
896 | } | ||
843 | else | 897 | else |
844 | GNUNET_free (state); | 898 | GNUNET_free (state); |
845 | 899 | ||
@@ -894,10 +948,12 @@ receive_udp_service (void *cls, | |||
894 | * This will be saved in the hashmap, so that the receiving procedure knows | 948 | * This will be saved in the hashmap, so that the receiving procedure knows |
895 | * through which tunnel this connection has to be routed. | 949 | * through which tunnel this connection has to be routed. |
896 | */ | 950 | */ |
897 | struct redirect_state *state = GNUNET_malloc (sizeof (struct redirect_state)); | 951 | struct redirect_state *state = |
952 | GNUNET_malloc (sizeof (struct redirect_state)); | ||
898 | memset (state, 0, sizeof (struct redirect_state)); | 953 | memset (state, 0, sizeof (struct redirect_state)); |
899 | state->tunnel = tunnel; | 954 | state->tunnel = tunnel; |
900 | state->serv = serv; | 955 | state->serv = serv; |
956 | state->hashmap = udp_connections; | ||
901 | memcpy (&state->desc, desc, sizeof (GNUNET_HashCode)); | 957 | memcpy (&state->desc, desc, sizeof (GNUNET_HashCode)); |
902 | 958 | ||
903 | len = sizeof (struct GNUNET_MessageHeader) + sizeof (struct pkt_tun) + | 959 | len = sizeof (struct GNUNET_MessageHeader) + sizeof (struct pkt_tun) + |
@@ -925,13 +981,22 @@ receive_udp_service (void *cls, | |||
925 | } | 981 | } |
926 | 982 | ||
927 | /* FIXME better hashing */ | 983 | /* FIXME better hashing */ |
928 | GNUNET_CRYPTO_hash (&state->redirect_info, sizeof (struct redirect_info), &hash); | 984 | GNUNET_CRYPTO_hash (&state->redirect_info, sizeof (struct redirect_info), |
985 | &state->hash); | ||
929 | 986 | ||
930 | /* FIXME save this to heap, too */ | ||
931 | if (GNUNET_NO == | 987 | if (GNUNET_NO == |
932 | GNUNET_CONTAINER_multihashmap_contains (udp_connections, &hash)) | 988 | GNUNET_CONTAINER_multihashmap_contains (udp_connections, &state->hash)) |
933 | GNUNET_CONTAINER_multihashmap_put (udp_connections, &hash, state, | 989 | { |
934 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY); | 990 | GNUNET_CONTAINER_multihashmap_put (udp_connections, &state->hash, state, |
991 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY); | ||
992 | |||
993 | state->heap_node = | ||
994 | GNUNET_CONTAINER_heap_insert (udp_connections_heap, state, | ||
995 | GNUNET_TIME_absolute_get ().abs_value); | ||
996 | |||
997 | if (GNUNET_CONTAINER_heap_get_size(udp_connections_heap) > max_udp_connections) | ||
998 | GNUNET_SCHEDULER_add_now(collect_connections, udp_connections_heap); | ||
999 | } | ||
935 | else | 1000 | else |
936 | GNUNET_free (state); | 1001 | GNUNET_free (state); |
937 | 1002 | ||
@@ -960,10 +1025,19 @@ run (void *cls, | |||
960 | mesh_handle = GNUNET_MESH_connect (cfg_, NULL, NULL, handlers, NULL); | 1025 | mesh_handle = GNUNET_MESH_connect (cfg_, NULL, NULL, handlers, NULL); |
961 | 1026 | ||
962 | cfg = cfg_; | 1027 | cfg = cfg_; |
963 | udp_connections = GNUNET_CONTAINER_multihashmap_create(65536); | 1028 | udp_connections = GNUNET_CONTAINER_multihashmap_create (65536); |
964 | tcp_connections = GNUNET_CONTAINER_multihashmap_create(65536); | 1029 | udp_connections_heap = |
965 | udp_services = GNUNET_CONTAINER_multihashmap_create(65536); | 1030 | GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN); |
966 | tcp_services = GNUNET_CONTAINER_multihashmap_create(65536); | 1031 | tcp_connections = GNUNET_CONTAINER_multihashmap_create (65536); |
1032 | tcp_connections_heap = | ||
1033 | GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN); | ||
1034 | udp_services = GNUNET_CONTAINER_multihashmap_create (65536); | ||
1035 | tcp_services = GNUNET_CONTAINER_multihashmap_create (65536); | ||
1036 | |||
1037 | GNUNET_CONFIGURATION_get_value_number (cfg, "exit", "MAX_UDP_CONNECTIONS", | ||
1038 | &max_udp_connections); | ||
1039 | GNUNET_CONFIGURATION_get_value_number (cfg, "exit", "MAX_TCP_CONNECTIONS", | ||
1040 | &max_tcp_connections); | ||
967 | 1041 | ||
968 | char *services; | 1042 | char *services; |
969 | GNUNET_CONFIGURATION_get_value_filename (cfg, "dns", "SERVICES", &services); | 1043 | GNUNET_CONFIGURATION_get_value_filename (cfg, "dns", "SERVICES", &services); |