diff options
author | Christian Grothoff <christian@grothoff.org> | 2011-10-22 21:05:05 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2011-10-22 21:05:05 +0000 |
commit | bb3a667f083cc2b5cab9b9c42d466041f15412a7 (patch) | |
tree | c5a9f564dde4eccd365fd26272b996abf1b9bccc /src/core | |
parent | 8215a566377fffdf1737306f6e0664ae1a27bf01 (diff) | |
download | gnunet-bb3a667f083cc2b5cab9b9c42d466041f15412a7.tar.gz gnunet-bb3a667f083cc2b5cab9b9c42d466041f15412a7.zip |
add typemap retransmission code
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/gnunet-service-core_sessions.c | 52 | ||||
-rw-r--r-- | src/core/gnunet-service-core_typemap.c | 12 |
2 files changed, 56 insertions, 8 deletions
diff --git a/src/core/gnunet-service-core_sessions.c b/src/core/gnunet-service-core_sessions.c index 24aa2f9bc..6076604a1 100644 --- a/src/core/gnunet-service-core_sessions.c +++ b/src/core/gnunet-service-core_sessions.c | |||
@@ -33,6 +33,12 @@ | |||
33 | #include "gnunet_constants.h" | 33 | #include "gnunet_constants.h" |
34 | 34 | ||
35 | /** | 35 | /** |
36 | * How often do we transmit our typemap? | ||
37 | */ | ||
38 | #define TYPEMAP_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 5) | ||
39 | |||
40 | |||
41 | /** | ||
36 | * Message ready for encryption. This struct is followed by the | 42 | * Message ready for encryption. This struct is followed by the |
37 | * actual content of the message. | 43 | * actual content of the message. |
38 | */ | 44 | */ |
@@ -121,6 +127,11 @@ struct Session | |||
121 | GNUNET_SCHEDULER_TaskIdentifier cork_task; | 127 | GNUNET_SCHEDULER_TaskIdentifier cork_task; |
122 | 128 | ||
123 | /** | 129 | /** |
130 | * Task to transmit our type map. | ||
131 | */ | ||
132 | GNUNET_SCHEDULER_TaskIdentifier typemap_task; | ||
133 | |||
134 | /** | ||
124 | * Is the neighbour queue empty and thus ready for us | 135 | * Is the neighbour queue empty and thus ready for us |
125 | * to transmit an encrypted message? | 136 | * to transmit an encrypted message? |
126 | */ | 137 | */ |
@@ -181,6 +192,7 @@ GSC_SESSIONS_end (const struct GNUNET_PeerIdentity *pid) | |||
181 | car); | 192 | car); |
182 | GSC_CLIENTS_reject_request (car); | 193 | GSC_CLIENTS_reject_request (car); |
183 | } | 194 | } |
195 | GNUNET_SCHEDULER_cancel (session->typemap_task); | ||
184 | GNUNET_assert (GNUNET_YES == | 196 | GNUNET_assert (GNUNET_YES == |
185 | GNUNET_CONTAINER_multihashmap_remove (sessions, | 197 | GNUNET_CONTAINER_multihashmap_remove (sessions, |
186 | &session->peer.hashPubKey, session)); | 198 | &session->peer.hashPubKey, session)); |
@@ -198,6 +210,36 @@ GSC_SESSIONS_end (const struct GNUNET_PeerIdentity *pid) | |||
198 | 210 | ||
199 | 211 | ||
200 | /** | 212 | /** |
213 | * Transmit our current typemap message to the other peer. | ||
214 | * (Done periodically in case an update got lost). | ||
215 | * | ||
216 | * @param cls the 'struct Session*' | ||
217 | * @param tc unused | ||
218 | */ | ||
219 | static void | ||
220 | transmit_typemap_task (void *cls, | ||
221 | const struct GNUNET_SCHEDULER_TaskContext *tc) | ||
222 | { | ||
223 | struct Session *session = cls; | ||
224 | struct GNUNET_MessageHeader *hdr; | ||
225 | struct GNUNET_TIME_Relative delay; | ||
226 | |||
227 | delay = TYPEMAP_FREQUENCY; | ||
228 | /* randomize a bit to avoid spont. sync */ | ||
229 | delay.rel_value += GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, | ||
230 | 1000); | ||
231 | session->typemap_task = GNUNET_SCHEDULER_add_delayed (delay, | ||
232 | &transmit_typemap_task, | ||
233 | session); | ||
234 | hdr = GSC_TYPEMAP_compute_type_map_message (); | ||
235 | GSC_KX_encrypt_and_transmit (session->kxinfo, | ||
236 | hdr, | ||
237 | ntohs (hdr->size)); | ||
238 | GNUNET_free (hdr); | ||
239 | } | ||
240 | |||
241 | |||
242 | /** | ||
201 | * Create a session, a key exchange was just completed. | 243 | * Create a session, a key exchange was just completed. |
202 | * | 244 | * |
203 | * @param peer peer that is now connected | 245 | * @param peer peer that is now connected |
@@ -207,7 +249,6 @@ void | |||
207 | GSC_SESSIONS_create (const struct GNUNET_PeerIdentity *peer, | 249 | GSC_SESSIONS_create (const struct GNUNET_PeerIdentity *peer, |
208 | struct GSC_KeyExchangeInfo *kx) | 250 | struct GSC_KeyExchangeInfo *kx) |
209 | { | 251 | { |
210 | struct GNUNET_MessageHeader *hdr; | ||
211 | struct Session *session; | 252 | struct Session *session; |
212 | 253 | ||
213 | #if DEBUG_CORE | 254 | #if DEBUG_CORE |
@@ -218,6 +259,8 @@ GSC_SESSIONS_create (const struct GNUNET_PeerIdentity *peer, | |||
218 | session->peer = *peer; | 259 | session->peer = *peer; |
219 | session->kxinfo = kx; | 260 | session->kxinfo = kx; |
220 | session->time_established = GNUNET_TIME_absolute_get (); | 261 | session->time_established = GNUNET_TIME_absolute_get (); |
262 | session->typemap_task = GNUNET_SCHEDULER_add_now (&transmit_typemap_task, | ||
263 | session); | ||
221 | GNUNET_assert (GNUNET_OK == | 264 | GNUNET_assert (GNUNET_OK == |
222 | GNUNET_CONTAINER_multihashmap_put (sessions, | 265 | GNUNET_CONTAINER_multihashmap_put (sessions, |
223 | &peer->hashPubKey, session, | 266 | &peer->hashPubKey, session, |
@@ -226,13 +269,6 @@ GSC_SESSIONS_create (const struct GNUNET_PeerIdentity *peer, | |||
226 | gettext_noop ("# entries in session map"), | 269 | gettext_noop ("# entries in session map"), |
227 | GNUNET_CONTAINER_multihashmap_size (sessions), | 270 | GNUNET_CONTAINER_multihashmap_size (sessions), |
228 | GNUNET_NO); | 271 | GNUNET_NO); |
229 | /* FIXME: we should probably do this periodically (in case | ||
230 | type map message is lost...) */ | ||
231 | hdr = GSC_TYPEMAP_compute_type_map_message (); | ||
232 | GSC_KX_encrypt_and_transmit (kx, | ||
233 | hdr, | ||
234 | ntohs (hdr->size)); | ||
235 | GNUNET_free (hdr); | ||
236 | } | 272 | } |
237 | 273 | ||
238 | 274 | ||
diff --git a/src/core/gnunet-service-core_typemap.c b/src/core/gnunet-service-core_typemap.c index e60f99ed6..e4f75bd00 100644 --- a/src/core/gnunet-service-core_typemap.c +++ b/src/core/gnunet-service-core_typemap.c | |||
@@ -107,6 +107,10 @@ GSC_TYPEMAP_get_from_message (const struct GNUNET_MessageHeader *msg) | |||
107 | switch (ntohs (msg->type)) | 107 | switch (ntohs (msg->type)) |
108 | { | 108 | { |
109 | case GNUNET_MESSAGE_TYPE_CORE_BINARY_TYPE_MAP: | 109 | case GNUNET_MESSAGE_TYPE_CORE_BINARY_TYPE_MAP: |
110 | GNUNET_STATISTICS_update (GSC_stats, | ||
111 | gettext_noop ("# type maps received"), | ||
112 | 1, | ||
113 | GNUNET_NO); | ||
110 | if (size != sizeof (struct GSC_TypeMap)) | 114 | if (size != sizeof (struct GSC_TypeMap)) |
111 | { | 115 | { |
112 | GNUNET_break_op (0); | 116 | GNUNET_break_op (0); |
@@ -116,6 +120,10 @@ GSC_TYPEMAP_get_from_message (const struct GNUNET_MessageHeader *msg) | |||
116 | memcpy (ret, &msg[1], sizeof (struct GSC_TypeMap)); | 120 | memcpy (ret, &msg[1], sizeof (struct GSC_TypeMap)); |
117 | return ret; | 121 | return ret; |
118 | case GNUNET_MESSAGE_TYPE_CORE_COMPRESSED_TYPE_MAP: | 122 | case GNUNET_MESSAGE_TYPE_CORE_COMPRESSED_TYPE_MAP: |
123 | GNUNET_STATISTICS_update (GSC_stats, | ||
124 | gettext_noop ("# type maps received"), | ||
125 | 1, | ||
126 | GNUNET_NO); | ||
119 | ret = GNUNET_malloc (sizeof (struct GSC_TypeMap)); | 127 | ret = GNUNET_malloc (sizeof (struct GSC_TypeMap)); |
120 | dlen = sizeof (struct GSC_TypeMap); | 128 | dlen = sizeof (struct GSC_TypeMap); |
121 | if ( (Z_OK != | 129 | if ( (Z_OK != |
@@ -144,6 +152,10 @@ broadcast_my_type_map () | |||
144 | struct GNUNET_MessageHeader *hdr; | 152 | struct GNUNET_MessageHeader *hdr; |
145 | 153 | ||
146 | hdr = GSC_TYPEMAP_compute_type_map_message (); | 154 | hdr = GSC_TYPEMAP_compute_type_map_message (); |
155 | GNUNET_STATISTICS_update (GSC_stats, | ||
156 | gettext_noop ("# updates to my type map"), | ||
157 | 1, | ||
158 | GNUNET_NO); | ||
147 | GSC_SESSIONS_broadcast (hdr); | 159 | GSC_SESSIONS_broadcast (hdr); |
148 | GNUNET_free (hdr); | 160 | GNUNET_free (hdr); |
149 | } | 161 | } |