gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r17671 - gnunet/src/core


From: gnunet
Subject: [GNUnet-SVN] r17671 - gnunet/src/core
Date: Sat, 22 Oct 2011 23:05:05 +0200

Author: grothoff
Date: 2011-10-22 23:05:05 +0200 (Sat, 22 Oct 2011)
New Revision: 17671

Modified:
   gnunet/src/core/gnunet-service-core_sessions.c
   gnunet/src/core/gnunet-service-core_typemap.c
Log:
add typemap retransmission code

Modified: gnunet/src/core/gnunet-service-core_sessions.c
===================================================================
--- gnunet/src/core/gnunet-service-core_sessions.c      2011-10-22 20:56:05 UTC 
(rev 17670)
+++ gnunet/src/core/gnunet-service-core_sessions.c      2011-10-22 21:05:05 UTC 
(rev 17671)
@@ -33,6 +33,12 @@
 #include "gnunet_constants.h"
 
 /**
+ * How often do we transmit our typemap?
+ */
+#define TYPEMAP_FREQUENCY GNUNET_TIME_relative_multiply 
(GNUNET_TIME_UNIT_MINUTES, 5)
+
+
+/**
  * Message ready for encryption.  This struct is followed by the
  * actual content of the message.
  */
@@ -121,6 +127,11 @@
   GNUNET_SCHEDULER_TaskIdentifier cork_task;
 
   /**
+   * Task to transmit our type map.
+   */
+  GNUNET_SCHEDULER_TaskIdentifier typemap_task;
+
+  /**
    * Is the neighbour queue empty and thus ready for us
    * to transmit an encrypted message?  
    */
@@ -181,6 +192,7 @@
                                 car);
     GSC_CLIENTS_reject_request (car);
   }
+  GNUNET_SCHEDULER_cancel (session->typemap_task);
   GNUNET_assert (GNUNET_YES ==
                  GNUNET_CONTAINER_multihashmap_remove (sessions,
                                                        
&session->peer.hashPubKey, session));
@@ -198,6 +210,36 @@
 
 
 /**
+ * Transmit our current typemap message to the other peer.
+ * (Done periodically in case an update got lost).
+ *
+ * @param cls the 'struct Session*'
+ * @param tc unused
+ */ 
+static void
+transmit_typemap_task (void *cls,
+                      const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  struct Session *session = cls;
+  struct GNUNET_MessageHeader *hdr;
+  struct GNUNET_TIME_Relative delay;
+
+  delay = TYPEMAP_FREQUENCY;
+  /* randomize a bit to avoid spont. sync */
+  delay.rel_value += GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
+                                              1000);
+  session->typemap_task = GNUNET_SCHEDULER_add_delayed (delay,
+                                                       &transmit_typemap_task,
+                                                       session);
+  hdr = GSC_TYPEMAP_compute_type_map_message ();
+  GSC_KX_encrypt_and_transmit (session->kxinfo, 
+                              hdr,
+                              ntohs (hdr->size));
+  GNUNET_free (hdr);
+}
+
+
+/**
  * Create a session, a key exchange was just completed.
  *
  * @param peer peer that is now connected
@@ -207,7 +249,6 @@
 GSC_SESSIONS_create (const struct GNUNET_PeerIdentity *peer,
                     struct GSC_KeyExchangeInfo *kx)
 {
-  struct GNUNET_MessageHeader *hdr;
   struct Session *session;
 
 #if DEBUG_CORE
@@ -218,6 +259,8 @@
   session->peer = *peer;
   session->kxinfo = kx;
   session->time_established = GNUNET_TIME_absolute_get ();
+  session->typemap_task = GNUNET_SCHEDULER_add_now (&transmit_typemap_task,
+                                                   session);
   GNUNET_assert (GNUNET_OK ==
                  GNUNET_CONTAINER_multihashmap_put (sessions,
                                                     &peer->hashPubKey, session,
@@ -226,13 +269,6 @@
                            gettext_noop ("# entries in session map"),
                            GNUNET_CONTAINER_multihashmap_size (sessions), 
                            GNUNET_NO);
-  /* FIXME: we should probably do this periodically (in case
-     type map message is lost...) */
-  hdr = GSC_TYPEMAP_compute_type_map_message ();
-  GSC_KX_encrypt_and_transmit (kx, 
-                              hdr,
-                              ntohs (hdr->size));
-  GNUNET_free (hdr);
 }
 
 

Modified: gnunet/src/core/gnunet-service-core_typemap.c
===================================================================
--- gnunet/src/core/gnunet-service-core_typemap.c       2011-10-22 20:56:05 UTC 
(rev 17670)
+++ gnunet/src/core/gnunet-service-core_typemap.c       2011-10-22 21:05:05 UTC 
(rev 17671)
@@ -107,6 +107,10 @@
   switch (ntohs (msg->type))
   {
   case GNUNET_MESSAGE_TYPE_CORE_BINARY_TYPE_MAP:
+    GNUNET_STATISTICS_update (GSC_stats, 
+                             gettext_noop ("# type maps received"),
+                             1,
+                             GNUNET_NO);
     if (size != sizeof (struct GSC_TypeMap))
     {
       GNUNET_break_op (0);
@@ -116,6 +120,10 @@
     memcpy (ret, &msg[1], sizeof (struct GSC_TypeMap));
     return ret;
   case GNUNET_MESSAGE_TYPE_CORE_COMPRESSED_TYPE_MAP:
+    GNUNET_STATISTICS_update (GSC_stats, 
+                             gettext_noop ("# type maps received"),
+                             1,
+                             GNUNET_NO);
     ret = GNUNET_malloc (sizeof (struct GSC_TypeMap));
     dlen = sizeof (struct GSC_TypeMap);
     if ( (Z_OK !=
@@ -144,6 +152,10 @@
   struct GNUNET_MessageHeader *hdr;
 
   hdr = GSC_TYPEMAP_compute_type_map_message ();
+  GNUNET_STATISTICS_update (GSC_stats, 
+                           gettext_noop ("# updates to my type map"),
+                           1,
+                           GNUNET_NO);
   GSC_SESSIONS_broadcast (hdr);
   GNUNET_free (hdr);
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]