-fix time assertion introduce in last patch
[oweals/gnunet.git] / src / transport / gnunet-service-transport_validation.c
index e184125882675d7688c2cebe1ea2b8a317276742..86172fab3aca26bbdb229a99183ab0a423d8ae0f 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2010-2013 Christian Grothoff (and other contributing authors)
+     (C) 2010-2014 Christian Grothoff (and other contributing authors)
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -24,6 +24,7 @@
  * @author Christian Grothoff
  */
 #include "platform.h"
+#include "gnunet-service-transport_clients.h"
 #include "gnunet-service-transport_validation.h"
 #include "gnunet-service-transport_plugins.h"
 #include "gnunet-service-transport_hello.h"
@@ -324,7 +325,6 @@ static struct GNUNET_CONTAINER_MultiPeerMap *validation_map;
  */
 static struct GNUNET_PEERINFO_NotifyContext *pnc;
 
-
 /**
  * Minimum delay between to validations
  */
@@ -345,8 +345,6 @@ static unsigned int validations_fast_start_threshold;
  */
 static struct GNUNET_TIME_Absolute validation_next;
 
-static GST_ValidationChangedCallback validation_entry_changed_cb;
-static void *validation_entry_changed_cb_cls;
 
 /**
  * Context for the validation entry match function.
@@ -369,14 +367,16 @@ struct ValidationEntryMatchContext
 /**
  * Iterate over validation entries until a matching one is found.
  *
- * @param cls the 'struct ValidationEntryMatchContext'
+ * @param cls the `struct ValidationEntryMatchContext *`
  * @param key peer identity (unused)
- * @param value a 'struct ValidationEntry' to match
- * @return GNUNET_YES if the entry does not match,
- *         GNUNET_NO if the entry does match
+ * @param value a `struct ValidationEntry *` to match
+ * @return #GNUNET_YES if the entry does not match,
+ *         #GNUNET_NO if the entry does match
  */
 static int
-validation_entry_match (void *cls, const struct GNUNET_PeerIdentity * key, void *value)
+validation_entry_match (void *cls,
+                        const struct GNUNET_PeerIdentity *key,
+                        void *value)
 {
   struct ValidationEntryMatchContext *vemc = cls;
   struct ValidationEntry *ve = value;
@@ -389,22 +389,25 @@ validation_entry_match (void *cls, const struct GNUNET_PeerIdentity * key, void
   return GNUNET_YES;
 }
 
+
+/**
+ * A validation entry changed.  Update the state and notify
+ * monitors.
+ *
+ * @param ve validation entry that changed
+ * @param state new state
+ */
 static void
-validation_entry_changed (struct ValidationEntry *ve, enum GNUNET_TRANSPORT_ValidationState state)
+validation_entry_changed (struct ValidationEntry *ve,
+                          enum GNUNET_TRANSPORT_ValidationState state)
 {
-  char *t_sent = GNUNET_strdup(GNUNET_STRINGS_absolute_time_to_string(ve->send_time));
-  char *t_valid = GNUNET_strdup(GNUNET_STRINGS_absolute_time_to_string(ve->valid_until));
-  char *t_next = GNUNET_strdup(GNUNET_STRINGS_absolute_time_to_string(ve->next_validation));
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Validation entry changed for peer `%s' address `%s':\n\tSent:  %s\n\tValid: %s\n\tNext:  %s\n",
-      GNUNET_i2s(&ve->pid), GST_plugins_a2s(ve->address),
-      t_sent, t_valid, t_next);
   ve->state = state;
-
-  GNUNET_free (t_sent);
-  GNUNET_free (t_valid);
-  GNUNET_free (t_next);
-  validation_entry_changed_cb (validation_entry_changed_cb_cls, &ve->pid,
-      ve->address, ve->send_time, ve->valid_until, ve->next_validation, state);
+  GST_clients_broadcast_validation_notification (&ve->pid,
+                                                 ve->address,
+                                                 ve->send_time,
+                                                 ve->valid_until,
+                                                 ve->next_validation,
+                                                 state);
 }
 
 
@@ -413,11 +416,13 @@ validation_entry_changed (struct ValidationEntry *ve, enum GNUNET_TRANSPORT_Vali
  *
  * @param cls (unused)
  * @param key peer identity (unused)
- * @param value a 'struct ValidationEntry' to clean up
- * @return GNUNET_YES (continue to iterate)
+ * @param value a `struct ValidationEntry *` to clean up
+ * @return #GNUNET_YES (continue to iterate)
  */
 static int
-cleanup_validation_entry (void *cls, const struct GNUNET_PeerIdentity * key, void *value)
+cleanup_validation_entry (void *cls,
+                          const struct GNUNET_PeerIdentity *key,
+                          void *value)
 {
   struct ValidationEntry *ve = value;
 
@@ -579,8 +584,8 @@ transmit_ping_if_allowed (void *cls,
       ret = -1;
     else
     {
-      GNUNET_assert (papi->send != NULL);
-      GNUNET_assert (papi->get_session != NULL);
+      GNUNET_assert (NULL != papi->send);
+      GNUNET_assert (NULL != papi->get_session);
       struct Session * session = papi->get_session(papi->cls, ve->address);
 
       if (session != NULL)
@@ -589,12 +594,13 @@ transmit_ping_if_allowed (void *cls,
                           message_buf, tsize,
                           PING_PRIORITY, ACCEPTABLE_PING_DELAY,
                           NULL, NULL);
-        network = papi->get_network (ve->address, session);
+        network = papi->get_network (papi->cls, session);
         if (GNUNET_ATS_NET_UNSPECIFIED == network)
         {
-          GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
-              "Could not obtain a valid network for `%s' `%s'\n",
-              GNUNET_i2s (pid), GST_plugins_a2s (ve->address));
+          GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                      "Could not obtain a valid network for `%s' `%s'\n",
+                      GNUNET_i2s (pid),
+                      GST_plugins_a2s (ve->address));
           GNUNET_break(0);
         }
         GST_neighbours_notify_data_sent (pid, ve->address, session, tsize);
@@ -602,8 +608,10 @@ transmit_ping_if_allowed (void *cls,
       else
       {
         /* Could not get a valid session */
-        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Could not get a valid session for `%s' `%s'\n",
-                    GNUNET_i2s (pid), GST_plugins_a2s (ve->address));
+        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                    "Could not get a valid session for `%s' `%s'\n",
+                    GNUNET_i2s (pid),
+                    GST_plugins_a2s (ve->address));
         ret = -1;
       }
     }
@@ -618,10 +626,10 @@ transmit_ping_if_allowed (void *cls,
 
     ve->network = network;
     ve->expecting_pong = GNUNET_YES;
-    validations_running ++;
-         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                     "Validation started, %u validation processes running\n",
-                     validations_running);
+    validations_running++;
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Validation started, %u validation processes running\n",
+                validations_running);
     /*  Notify about PING sent */
     validation_entry_changed (ve, GNUNET_TRANSPORT_VS_UPDATE);
   }
@@ -866,7 +874,7 @@ process_peerinfo_hello (void *cls, const struct GNUNET_PeerIdentity *peer,
  * @param max_fds maximum number of fds to use
  */
 void
-GST_validation_start (GST_ValidationChangedCallback cb, void *cb_cls, unsigned int max_fds)
+GST_validation_start (unsigned int max_fds)
 {
   /**
    * Initialization for validation throttling
@@ -884,9 +892,8 @@ GST_validation_start (GST_ValidationChangedCallback cb, void *cb_cls, unsigned i
   validation_delay.rel_value_us = (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.rel_value_us) / (max_fds / 2);
   validations_fast_start_threshold = (max_fds / 2);
   validations_running = 0;
-  validation_entry_changed_cb = cb;
-  validation_entry_changed_cb_cls = cb_cls;
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Validation uses a fast start threshold of %u connections and a delay between of %s\n ",
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Validation uses a fast start threshold of %u connections and a delay between of %s\n ",
               validations_fast_start_threshold,
               GNUNET_STRINGS_relative_time_to_string (validation_delay,
                                                       GNUNET_YES));
@@ -939,27 +946,30 @@ multicast_pong (void *cls,
 {
   struct TransportPongMessage *pong = cls;
   struct GNUNET_TRANSPORT_PluginFunctions *papi;
+  struct Session *session;
 
   papi = GST_plugins_find (address->transport_name);
-  if (papi == NULL)
+  if (NULL == papi)
     return;
 
-  GNUNET_assert (papi->send != NULL);
-  GNUNET_assert (papi->get_session != NULL);
-
-  struct Session * session = papi->get_session(papi->cls, address);
-  if (session == NULL)
+  GNUNET_assert (NULL != papi->send);
+  GNUNET_assert (NULL != papi->get_session);
+  session = papi->get_session(papi->cls, address);
+  if (NULL == session)
   {
      GNUNET_break (0);
      return;
   }
-
   papi->send (papi->cls, session,
-              (const char *) pong, ntohs (pong->header.size),
-              PONG_PRIORITY, ACCEPTABLE_PING_DELAY,
+              (const char *) pong,
+              ntohs (pong->header.size),
+              PONG_PRIORITY,
+              ACCEPTABLE_PING_DELAY,
               NULL, NULL);
   GST_neighbours_notify_data_sent (&address->peer,
-      address, session, pong->header.size);
+                                   address,
+                                   session,
+                                   pong->header.size);
 
 }
 
@@ -1056,7 +1066,7 @@ GST_validation_handle_ping (const struct GNUNET_PeerIdentity *sender,
     if (NULL == (papi = GST_plugins_find (plugin_name)))
     {
       /* we don't have the plugin for this address */
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+      GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                   _("Plugin `%s' not available, cannot confirm having this address\n"),
                   plugin_name);
       GNUNET_free (plugin_name);
@@ -1069,7 +1079,7 @@ GST_validation_handle_ping (const struct GNUNET_PeerIdentity *sender,
                                 gettext_noop
                                 ("# failed address checks during validation"), 1,
                                 GNUNET_NO);
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+      GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                   _("Address `%s' is not one of my addresses, not confirming PING\n"),
                   GST_plugins_a2s (&address));
       return GNUNET_SYSERR;
@@ -1080,7 +1090,7 @@ GST_validation_handle_ping (const struct GNUNET_PeerIdentity *sender,
                                 gettext_noop
                                 ("# successful address checks during validation"), 1,
                                 GNUNET_NO);
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+      GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                   "Address `%s' is one of my addresses, confirming PING\n",
                   GST_plugins_a2s (&address));
     }
@@ -1089,7 +1099,7 @@ GST_validation_handle_ping (const struct GNUNET_PeerIdentity *sender,
     {
       if (GNUNET_NO == buggy)
       {
-        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+        GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                     _("Not confirming PING from peer `%s' with address `%s' since I cannot confirm having this address.\n"),
                     GNUNET_i2s (sender),
                     GST_plugins_a2s (&address));
@@ -1193,7 +1203,7 @@ GST_validation_handle_ping (const struct GNUNET_PeerIdentity *sender,
                                          pong->header.size);
     }
   }
-  if (ret != -1)
+  if (-1 != ret)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Transmitted PONG to `%s' via reliable mechanism\n",
@@ -1241,7 +1251,7 @@ struct ValidateAddressContext
  * Iterator callback to go over all addresses and try to validate them
  * (unless blocked or already validated).
  *
- * @param cls pointer to a `struct ValidateAddressContext`
+ * @param cls pointer to a `struct ValidateAddressContext *`
  * @param address the address
  * @param expiration expiration time
  * @return #GNUNET_OK (keep the address)
@@ -1275,19 +1285,21 @@ validate_address_iterator (void *cls,
 /**
  * Add the validated peer address to the HELLO.
  *
- * @param cls the 'struct ValidationEntry' with the validated address
- * @param max space in buf
+ * @param cls the `struct ValidationEntry *` with the validated address
+ * @param max space in @a buf
  * @param buf where to add the address
- * @return number of bytes written, 0 to signal the
+ * @return number of bytes written, #GNUNET_SYSERR to signal the
  *         end of the iteration.
  */
-static size_t
-add_valid_peer_address (void *cls, size_t max, void *buf)
+static ssize_t
+add_valid_peer_address (void *cls,
+                        size_t max,
+                        void *buf)
 {
   struct ValidationEntry *ve = cls;
 
   if (GNUNET_YES == ve->copied)
-    return 0;                   /* terminate */
+    return GNUNET_SYSERR; /* Done */
   ve->copied = GNUNET_YES;
   return GNUNET_HELLO_add_address (ve->address, ve->valid_until, buf, max);
 }
@@ -1373,7 +1385,7 @@ GST_validation_handle_pong (const struct GNUNET_PeerIdentity *sender,
 
   sig_res = GNUNET_SYSERR;
   do_verify = GNUNET_YES;
-  if (0 != GNUNET_TIME_absolute_get_remaining(ve->pong_sig_valid_until).rel_value_us)
+  if (0 != GNUNET_TIME_absolute_get_remaining (ve->pong_sig_valid_until).rel_value_us)
   {
     /* We have a cached and valid signature for this peer,
      * try to compare instead of verify */
@@ -1414,7 +1426,9 @@ GST_validation_handle_pong (const struct GNUNET_PeerIdentity *sender,
 
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               "Validation process successful for peer `%s' with plugin `%s' address `%s'\n",
-              GNUNET_i2s (sender), tname, GST_plugins_a2s (ve->address));
+              GNUNET_i2s (sender),
+              tname,
+              GST_plugins_a2s (ve->address));
   /* validity achieved, remember it! */
   ve->expecting_pong = GNUNET_NO;
   ve->valid_until = GNUNET_TIME_relative_to_absolute (HELLO_ADDRESS_EXPIRATION);
@@ -1534,7 +1548,9 @@ struct IteratorContext
  * @return #GNUNET_OK (continue to iterate)
  */
 static int
-iterate_addresses (void *cls, const struct GNUNET_PeerIdentity *key, void *value)
+iterate_addresses (void *cls,
+                   const struct GNUNET_PeerIdentity *key,
+                   void *value)
 {
   struct IteratorContext *ic = cls;
   struct ValidationEntry *ve = value;
@@ -1551,7 +1567,7 @@ iterate_addresses (void *cls, const struct GNUNET_PeerIdentity *key, void *value
  *
  * @param target peer information is requested for
  * @param cb function to call; will not be called after this function returns
- * @param cb_cls closure for 'cb'
+ * @param cb_cls closure for @a cb
  */
 void
 GST_validation_get_addresses (const struct GNUNET_PeerIdentity *target,
@@ -1660,11 +1676,12 @@ struct ValidationIteratorContext
   GST_ValidationChangedCallback cb;
 
   /**
-   * Closure for 'cb'.
+   * Closure for @e cb.
    */
   void *cb_cls;
 };
 
+
 static int
 validation_entries_iterate (void *cls,
                            const struct GNUNET_PeerIdentity *key,
@@ -1688,7 +1705,8 @@ validation_entries_iterate (void *cls,
  * @param cb_cls closure for cb
  */
 void
-GST_validation_iterate (GST_ValidationChangedCallback cb, void *cb_cls)
+GST_validation_iterate (GST_ValidationChangedCallback cb,
+                        void *cb_cls)
 {
   struct ValidationIteratorContext ic;
 
@@ -1696,7 +1714,9 @@ GST_validation_iterate (GST_ValidationChangedCallback cb, void *cb_cls)
     return; /* can happen during shutdown */
   ic.cb = cb;
   ic.cb_cls = cb_cls;
-  GNUNET_CONTAINER_multipeermap_iterate (validation_map, &validation_entries_iterate, &ic);
+  GNUNET_CONTAINER_multipeermap_iterate (validation_map,
+                                         &validation_entries_iterate,
+                                         &ic);
 }
 
 /* end of file gnunet-service-transport_validation.c */