-add tests
[oweals/gnunet.git] / src / ats / gnunet-service-ats_plugins.c
index ad39ab441fcdd93bc888fe5a157bc541aa0ae3ce..f70c4cd9b84e1bb028921bbb098acaae46e9b02d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  This file is part of GNUnet.
- Copyright (C) 2011-2014 Christian Grothoff (and other contributing authors)
+ Copyright (C) 2011-2014 GNUnet e.V.
 
  GNUnet is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published
@@ -14,8 +14,8 @@
 
  You should have received a copy of the GNU General Public License
  along with GNUnet; see the file COPYING.  If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
  */
 
 /**
@@ -30,6 +30,7 @@
 #include "gnunet-service-ats_performance.h"
 #include "gnunet-service-ats_preferences.h"
 #include "gnunet-service-ats_plugins.h"
+#include "gnunet-service-ats_reservations.h"
 #include "gnunet-service-ats_scheduling.h"
 #include "gnunet-service-ats_normalization.h"
 
@@ -58,9 +59,9 @@ static char *plugin;
  * @param pref_rel the new relative preference value
  */
 void
-GAS_normalized_preference_changed (const struct GNUNET_PeerIdentity *peer,
-                                  enum GNUNET_ATS_PreferenceKind kind,
-                                  double pref_rel)
+GAS_plugin_notify_preference_changed (const struct GNUNET_PeerIdentity *peer,
+                                      enum GNUNET_ATS_PreferenceKind kind,
+                                      double pref_rel)
 {
   sf->s_pref (sf->cls,
               peer,
@@ -70,27 +71,15 @@ GAS_normalized_preference_changed (const struct GNUNET_PeerIdentity *peer,
 
 
 /**
- * The relative value for a property changed
+ * The relative value for a property changed.
  *
- * @param address the peer
- * @param type the ATS type
- * @param prop_rel the new relative preference value
+ * @param address the peer for which a property changed
  */
 void
-GAS_normalized_property_changed (struct ATS_Address *address,
-                                uint32_t type,
-                                double prop_rel)
+GAS_plugin_notify_property_changed (struct ATS_Address *address)
 {
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-             "Normalized property %s for peer `%s' changed to %.3f \n",
-             GNUNET_ATS_print_property_type (type),
-             GNUNET_i2s (&address->peer),
-             prop_rel);
   sf->s_address_update_property (sf->cls,
-                                 address,
-                                 type,
-                                 0,
-                                 prop_rel);
+                                 address);
 }
 
 
@@ -143,8 +132,7 @@ solver_info_cb (void *cls,
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Solver notifies `%s' with result `%s'\n",
                 "GAS_OP_SOLVE_STOP",
-                (GAS_STAT_SUCCESS == status) ? "SUCCESS" : "FAIL",
-                add_info);
+                (GAS_STAT_SUCCESS == status) ? "SUCCESS" : "FAIL");
     return;
   case GAS_OP_SOLVE_SETUP_START:
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -195,6 +183,7 @@ solver_info_cb (void *cls,
                (GAS_STAT_SUCCESS == status) ? "SUCCESS" : "FAIL");
     return;
   default:
+    GNUNET_break (0);
     break;
   }
 }
@@ -210,28 +199,31 @@ static void
 bandwidth_changed_cb (void *cls,
                      struct ATS_Address *address)
 {
-  uint32_t diff_out;
-  uint32_t diff_in;
+  long long diff_out;
+  long long diff_in;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Bandwidth assignment changed for peer %s \n",
-              GNUNET_i2s (&address->peer));
-
+              "Bandwidth assignment changed for peer %s to %u/%u\n",
+              GNUNET_i2s (&address->peer),
+              (unsigned int) address->assigned_bw_in,
+              (unsigned int) address->assigned_bw_out);
+  GAS_reservations_set_bandwidth (&address->peer,
+                                  GNUNET_BANDWIDTH_value_init (address->assigned_bw_in));
   /* Notify performance clients about changes to address */
   GAS_performance_notify_all_clients (&address->peer,
                                      address->plugin,
                                      address->addr,
                                      address->addr_len,
                                      address->active,
-                                     address->atsi,
-                                     address->atsi_count,
+                                     &address->properties,
+                                      address->local_address_info,
                                      GNUNET_BANDWIDTH_value_init (address->assigned_bw_out),
                                      GNUNET_BANDWIDTH_value_init (address->assigned_bw_in));
 
   if ( (0 == address->assigned_bw_in) &&
        (0 == address->assigned_bw_out) )
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                "Telling transport to disconnect peer `%s'\n",
                 GNUNET_i2s (&address->peer));
 
@@ -244,18 +236,23 @@ bandwidth_changed_cb (void *cls,
   }
 
   /* Do bandwidth stability check */
-  diff_out = abs (address->assigned_bw_out - address->last_notified_bw_out);
-  diff_in = abs (address->assigned_bw_in - address->last_notified_bw_in);
-
-  if ( (diff_out < htonl(GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT.value__)) &&
-       (diff_in < htonl(GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT.value__)) )
+  diff_out = llabs ((long long) address->assigned_bw_out -
+                    (long long) address->last_notified_bw_out);
+  diff_in = llabs ((long long) address->assigned_bw_in -
+                   (long long) address->last_notified_bw_in);
+  if ( (diff_out < htonl (GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT.value__)) &&
+       (diff_in < htonl (GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT.value__)) )
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Bandwidth change too small, not notifying client\n");
     return;
+  }
 
-  GNUNET_log(GNUNET_ERROR_TYPE_INFO,
-             "Sending bandwidth update for peer `%s': %u/%u\n",
-             GNUNET_i2s (&address->peer),
-             address->assigned_bw_out,
-             address->assigned_bw_out);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Sending bandwidth update for peer `%s': %u/%u\n",
+              GNUNET_i2s (&address->peer),
+              address->assigned_bw_out,
+              address->assigned_bw_out);
 
   /* *Notify scheduling clients about suggestion */
   GAS_scheduling_transmit_address_suggestion (&address->peer,
@@ -308,7 +305,7 @@ parse_quota (const char *quota_str,
                 direction,
                 GNUNET_ATS_print_network_type (network),
                 quota_str,
-                GNUNET_ATS_DefaultBandwidth);
+                (unsigned long long) GNUNET_ATS_DefaultBandwidth);
     ret = GNUNET_ATS_DefaultBandwidth;
   }
   else
@@ -362,7 +359,7 @@ load_quota (const struct GNUNET_CONFIGURATION_Handle *cfg,
                 _("No %s-quota configured for network `%s', assigning default bandwidth %llu\n"),
                 direction,
                 GNUNET_ATS_print_network_type (type),
-                GNUNET_ATS_DefaultBandwidth);
+                (unsigned long long) GNUNET_ATS_DefaultBandwidth);
     ret = GNUNET_ATS_DefaultBandwidth;
   }
   GNUNET_free (entry);
@@ -413,7 +410,7 @@ load_quotas (const struct GNUNET_CONFIGURATION_Handle *cfg,
  *         solver plugin)
  */
 int
-GAS_plugins_init (const struct GNUNET_CONFIGURATION_Handle *cfg)
+GAS_plugin_init (const struct GNUNET_CONFIGURATION_Handle *cfg)
 {
   char *mode_str;
 
@@ -431,8 +428,8 @@ GAS_plugins_init (const struct GNUNET_CONFIGURATION_Handle *cfg)
   env.cls = NULL;
   env.info_cb = &solver_info_cb;
   env.bandwidth_changed_cb = &bandwidth_changed_cb;
-  env.get_preferences = &GAS_normalization_get_preferences_by_peer;
-  env.get_property = &GAS_normalization_get_properties;
+  env.get_preferences = &GAS_preference_get_by_peer;
+  env.get_connectivity = &GAS_connectivity_has_peer;
   env.cfg = cfg;
   env.stats = GSA_stats;
   env.addresses = GSA_addresses;
@@ -463,7 +460,7 @@ GAS_plugins_init (const struct GNUNET_CONFIGURATION_Handle *cfg)
  * Shutdown address subsystem.
  */
 void
-GAS_plugins_done ()
+GAS_plugin_done ()
 {
   GNUNET_PLUGIN_unload (plugin,
                         sf);
@@ -478,24 +475,13 @@ GAS_plugins_done ()
  * for talking to the respective peer.
  *
  * @param new_address the new address
- * @param addr_net network scope the address is in
- * @param atsi performance data for the address
- * @param atsi_count size of the @a atsi array
  */
 void
-GAS_plugin_new_address (struct ATS_Address *new_address,
-                       enum GNUNET_ATS_Network_Type addr_net,
-                       const struct GNUNET_ATS_Information *atsi,
-                       uint32_t atsi_count)
+GAS_plugin_new_address (struct ATS_Address *new_address)
 {
   sf->s_add (sf->cls,
              new_address,
-             addr_net);
-  sf->s_bulk_start (sf->cls);
-  GAS_normalization_normalize_property (new_address,
-                                       atsi,
-                                       atsi_count);
-  sf->s_bulk_stop (sf->cls);
+             new_address->properties.scope); /* FIXME: remove 3rd arg here! */
 }
 
 
@@ -509,8 +495,7 @@ void
 GAS_plugin_delete_address (struct ATS_Address *address)
 {
   sf->s_del (sf->cls,
-             address,
-             GNUNET_NO);
+             address);
 }
 
 
@@ -525,11 +510,11 @@ GAS_plugin_delete_address (struct ATS_Address *address)
  * @param score_abs degree of the appreciation
  */
 void
-GAS_plugin_preference_feedback (struct GNUNET_SERVER_Client *application,
-                               const struct GNUNET_PeerIdentity *peer,
-                               const struct GNUNET_TIME_Relative scope,
-                               enum GNUNET_ATS_PreferenceKind kind,
-                               float score_abs)
+GAS_plugin_notify_feedback (struct GNUNET_SERVICE_Client *application,
+                            const struct GNUNET_PeerIdentity *peer,
+                            const struct GNUNET_TIME_Relative scope,
+                            enum GNUNET_ATS_PreferenceKind kind,
+                            float score_abs)
 {
   sf->s_feedback (sf->cls,
                   application,
@@ -557,7 +542,7 @@ GAS_plugin_solver_lock ()
 void
 GAS_plugin_solver_unlock ()
 {
-  sf->s_bulk_start (sf->cls);
+  sf->s_bulk_stop (sf->cls);
 }
 
 
@@ -570,24 +555,8 @@ GAS_plugin_solver_unlock ()
 void
 GAS_plugin_request_connect_start (const struct GNUNET_PeerIdentity *pid)
 {
-  const struct ATS_Address *aa;
-
-  aa = sf->s_get (sf->cls, pid);
-  if (NULL == aa)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-               "Cannot suggest address for peer `%s'\n",
-               GNUNET_i2s (pid));
-    return;
-  }
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-            "Suggesting address %p for peer `%s'\n",
-            aa,
-            GNUNET_i2s (pid));
-  GAS_scheduling_transmit_address_suggestion (pid,
-                                              aa->session_id,
-                                              GNUNET_BANDWIDTH_value_init (aa->assigned_bw_out),
-                                              GNUNET_BANDWIDTH_value_init (aa->assigned_bw_in));
+  sf->s_get (sf->cls,
+             pid);
 }