aboutsummaryrefslogtreecommitdiff
path: root/src/vpn
diff options
context:
space:
mode:
authorPhilipp Tölke <toelke@in.tum.de>2011-04-10 21:36:24 +0000
committerPhilipp Tölke <toelke@in.tum.de>2011-04-10 21:36:24 +0000
commit0ed04623d2fff96b2093052330c8c92f1367ee7a (patch)
tree953dcb17648103917bbec9ec996970e3c52e60e5 /src/vpn
parent9898b0cbe6b15c3b1ae1264011f7d5375ab5247c (diff)
downloadgnunet-0ed04623d2fff96b2093052330c8c92f1367ee7a.tar.gz
gnunet-0ed04623d2fff96b2093052330c8c92f1367ee7a.zip
save state in heap
Diffstat (limited to 'src/vpn')
-rw-r--r--src/vpn/gnunet-daemon-exit.c110
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 */
67static struct GNUNET_CONTAINER_MultiHashMap *udp_connections; 67static struct GNUNET_CONTAINER_MultiHashMap *udp_connections;
68static struct GNUNET_CONTAINER_Heap *udp_connections_heap;
68static struct GNUNET_CONTAINER_MultiHashMap *tcp_connections; 69static struct GNUNET_CONTAINER_MultiHashMap *tcp_connections;
70static 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 */
75static 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 */
80static 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
177static void
178collect_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);