aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2011-10-22 21:05:05 +0000
committerChristian Grothoff <christian@grothoff.org>2011-10-22 21:05:05 +0000
commitbb3a667f083cc2b5cab9b9c42d466041f15412a7 (patch)
treec5a9f564dde4eccd365fd26272b996abf1b9bccc /src/core
parent8215a566377fffdf1737306f6e0664ae1a27bf01 (diff)
downloadgnunet-bb3a667f083cc2b5cab9b9c42d466041f15412a7.tar.gz
gnunet-bb3a667f083cc2b5cab9b9c42d466041f15412a7.zip
add typemap retransmission code
Diffstat (limited to 'src/core')
-rw-r--r--src/core/gnunet-service-core_sessions.c52
-rw-r--r--src/core/gnunet-service-core_typemap.c12
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 */
219static void
220transmit_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
207GSC_SESSIONS_create (const struct GNUNET_PeerIdentity *peer, 249GSC_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}