-fix config, shutdown issue
[oweals/gnunet.git] / src / ats / gnunet-service-ats_plugins.c
index 900183c1b74841c0e4f1cfdf523cea202067d785..b44934999d7c875892e19ef66765b7c962680e4a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  This file is part of GNUnet.
- (C) 2011-2014 Christian Grothoff (and other contributing authors)
Copyright (C) 2011-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
@@ -58,9 +58,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,
@@ -77,15 +77,10 @@ GAS_normalized_preference_changed (const struct GNUNET_PeerIdentity *peer,
  * @param prop_rel the new relative preference value
  */
 void
-GAS_normalized_property_changed (struct ATS_Address *address,
-                                uint32_t type,
-                                double prop_rel)
+GAS_plugin_notify_property_changed (struct ATS_Address *address,
+                                    enum GNUNET_ATS_Property type,
+                                    double prop_rel)
 {
-  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,
@@ -268,6 +263,108 @@ bandwidth_changed_cb (void *cls,
 }
 
 
+/**
+ * Convert quota from text to numeric value.
+ *
+ * @param quota_str the value found in the configuration
+ * @param direction direction of the quota
+ * @param network network the quota applies to
+ * @return numeric quota value to use
+ */
+static unsigned long long
+parse_quota (const char *quota_str,
+             const char *direction,
+             enum GNUNET_ATS_Network_Type network)
+{
+  int res;
+  unsigned long long ret;
+
+  res = GNUNET_NO;
+  if (0 == strcmp (quota_str, GNUNET_ATS_MaxBandwidthString))
+  {
+    ret = GNUNET_ATS_MaxBandwidth;
+    res = GNUNET_YES;
+  }
+  if ((GNUNET_NO == res) &&
+      (GNUNET_OK ==
+       GNUNET_STRINGS_fancy_size_to_bytes (quota_str,
+                                           &ret)))
+    res = GNUNET_YES;
+  if ((GNUNET_NO == res) &&
+      (1 ==
+       sscanf (quota_str,
+               "%llu",
+               &ret)))
+    res = GNUNET_YES;
+  if (GNUNET_NO == res)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                _("Could not load %s quota for network `%s':  `%s', assigning default bandwidth %llu\n"),
+                direction,
+                GNUNET_ATS_print_network_type (network),
+                quota_str,
+                GNUNET_ATS_DefaultBandwidth);
+    ret = GNUNET_ATS_DefaultBandwidth;
+  }
+  else
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+                _("%s quota configured for network `%s' is %llu\n"),
+                direction,
+                GNUNET_ATS_print_network_type (network),
+                ret);
+  }
+  return ret;
+}
+
+
+/**
+ * Load quota value from the configuration @a cfg for the
+ * given network @a type and @a direction.
+ *
+ * @param cfg configuration to parse
+ * @param type network type to parse for
+ * @param direction traffic direction to parse for
+ * @return quota to apply
+ */
+static unsigned long long
+load_quota (const struct GNUNET_CONFIGURATION_Handle *cfg,
+            enum GNUNET_ATS_Network_Type type,
+            const char *direction)
+{
+  char *entry;
+  char *quota_str;
+  unsigned long long ret;
+
+  GNUNET_asprintf (&entry,
+                   "%s_QUOTA_%s",
+                   GNUNET_ATS_print_network_type (type),
+                   direction);
+  if (GNUNET_OK ==
+      GNUNET_CONFIGURATION_get_value_string (cfg,
+                                             "ats",
+                                             entry,
+                                             &quota_str))
+  {
+    ret = parse_quota (quota_str,
+                       direction,
+                       type);
+    GNUNET_free (quota_str);
+  }
+  else
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                _("No %s-quota configured for network `%s', assigning default bandwidth %llu\n"),
+                direction,
+                GNUNET_ATS_print_network_type (type),
+                GNUNET_ATS_DefaultBandwidth);
+    ret = GNUNET_ATS_DefaultBandwidth;
+  }
+  GNUNET_free (entry);
+  return ret;
+}
+
+
 /**
  * Load quotas for networks from configuration
  *
@@ -283,136 +380,23 @@ load_quotas (const struct GNUNET_CONFIGURATION_Handle *cfg,
              unsigned long long *in_dest,
              int dest_length)
 {
-  char *entry_in = NULL;
-  char *entry_out = NULL;
-  char *quota_out_str;
-  char *quota_in_str;
-  int c;
-  int res;
+  unsigned int c;
 
   for (c = 0; (c < GNUNET_ATS_NetworkTypeCount) && (c < dest_length); c++)
   {
-    in_dest[c] = 0;
-    out_dest[c] = 0;
-    GNUNET_asprintf (&entry_out,
-                     "%s_QUOTA_OUT",
-                     GNUNET_ATS_print_network_type (c));
-    GNUNET_asprintf (&entry_in,
-                     "%s_QUOTA_IN",
-                     GNUNET_ATS_print_network_type (c));
-
-    /* quota out */
-    if (GNUNET_OK ==
-        GNUNET_CONFIGURATION_get_value_string (cfg,
-                                               "ats",
-                                               entry_out,
-                                               &quota_out_str))
-    {
-      res = GNUNET_NO;
-      if (0 == strcmp (quota_out_str, GNUNET_ATS_MaxBandwidthString))
-      {
-        out_dest[c] = GNUNET_ATS_MaxBandwidth;
-        res = GNUNET_YES;
-      }
-      if ((GNUNET_NO == res)
-          && (GNUNET_OK
-              == GNUNET_STRINGS_fancy_size_to_bytes (quota_out_str,
-                  &out_dest[c])))
-        res = GNUNET_YES;
-      if ((GNUNET_NO == res)
-          && (GNUNET_OK
-              == GNUNET_CONFIGURATION_get_value_number (cfg, "ats", entry_out,
-                  &out_dest[c])))
-        res = GNUNET_YES;
-
-      if (GNUNET_NO == res)
-      {
-        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                    _("Could not load quota for network `%s':  `%s', assigning default bandwidth %llu\n"),
-                    GNUNET_ATS_print_network_type (c),
-                    quota_out_str,
-                    GNUNET_ATS_DefaultBandwidth);
-        out_dest[c] = GNUNET_ATS_DefaultBandwidth;
-      }
-      else
-      {
-        GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-                    _("Outbound quota configure for network `%s' is %llu\n"),
-                    GNUNET_ATS_print_network_type (c),
-                    out_dest[c]);
-      }
-      GNUNET_free (quota_out_str);
-    }
-    else
-    {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                  _("No outbound quota configured for network `%s', assigning default bandwidth %llu\n"),
-                  GNUNET_ATS_print_network_type (c),
-                  GNUNET_ATS_DefaultBandwidth);
-      out_dest[c] = GNUNET_ATS_DefaultBandwidth;
-    }
-
-    /* quota in */
-    if (GNUNET_OK ==
-        GNUNET_CONFIGURATION_get_value_string (cfg,
-                                               "ats",
-                                               entry_in,
-                                               &quota_in_str))
-    {
-      res = GNUNET_NO;
-      if (0 == strcmp (quota_in_str, GNUNET_ATS_MaxBandwidthString))
-      {
-        in_dest[c] = GNUNET_ATS_MaxBandwidth;
-        res = GNUNET_YES;
-      }
-      if ((GNUNET_NO == res) &&
-          (GNUNET_OK ==
-           GNUNET_STRINGS_fancy_size_to_bytes (quota_in_str,
-                                               &in_dest[c])))
-        res = GNUNET_YES;
-      if ((GNUNET_NO == res) &&
-          (GNUNET_OK ==
-           GNUNET_CONFIGURATION_get_value_number (cfg,
-                                                  "ats",
-                                                  entry_in,
-                                                  &in_dest[c])))
-        res = GNUNET_YES;
-
-      if (GNUNET_NO == res)
-      {
-        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                    _("Could not load quota for network `%s':  `%s', assigning default bandwidth %llu\n"),
-                    GNUNET_ATS_print_network_type (c),
-                    quota_in_str,
-                    GNUNET_ATS_DefaultBandwidth);
-        in_dest[c] = GNUNET_ATS_DefaultBandwidth;
-      }
-      else
-      {
-        GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-                    _("Inbound quota configured for network `%s' is %llu\n"),
-                    GNUNET_ATS_print_network_type (c),
-                    in_dest[c]);
-      }
-      GNUNET_free (quota_in_str);
-    }
-    else
-    {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                  _("No outbound quota configure for network `%s', assigning default bandwidth %llu\n"),
-                  GNUNET_ATS_print_network_type (c),
-                  GNUNET_ATS_DefaultBandwidth);
-      in_dest[c] = GNUNET_ATS_DefaultBandwidth;
-    }
+    in_dest[c] = load_quota (cfg,
+                             c,
+                             "out");
+    out_dest[c] = load_quota (cfg,
+                              c,
+                              "in");
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Loaded quota for network `%s' (in/out): %llu %llu\n",
                 GNUNET_ATS_print_network_type (c),
                 in_dest[c],
                 out_dest[c]);
-    GNUNET_free(entry_out);
-    GNUNET_free(entry_in);
   }
-  return GNUNET_ATS_NetworkTypeCount;
+  return c;
 }
 
 
@@ -424,12 +408,9 @@ 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)
 {
-  unsigned long long quotas_in[GNUNET_ATS_NetworkTypeCount];
-  unsigned long long quotas_out[GNUNET_ATS_NetworkTypeCount];
   char *mode_str;
-  unsigned int c;
 
   /* Figure out configured solution method */
   if (GNUNET_SYSERR ==
@@ -442,25 +423,18 @@ GAS_plugins_init (const struct GNUNET_CONFIGURATION_Handle *cfg)
                 "No resource assignment method configured, using proportional approach\n");
     mode_str = GNUNET_strdup ("proportional");
   }
-  load_quotas (cfg,
-               quotas_out,
-               quotas_in,
-               GNUNET_ATS_NetworkTypeCount);
   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.cfg = cfg;
   env.stats = GSA_stats;
   env.addresses = GSA_addresses;
   env.network_count = GNUNET_ATS_NetworkTypeCount;
-  for (c = 0; c < GNUNET_ATS_NetworkTypeCount; c++)
-  {
-    env.out_quota[c] = quotas_out[c];
-    env.in_quota[c] = quotas_in[c];
-  }
-
+  load_quotas (cfg,
+               env.out_quota,
+               env.in_quota,
+               GNUNET_ATS_NetworkTypeCount);
   GNUNET_asprintf (&plugin,
                    "libgnunet_plugin_ats_%s",
                    mode_str);
@@ -483,7 +457,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);
@@ -512,7 +486,7 @@ GAS_plugin_new_address (struct ATS_Address *new_address,
              new_address,
              addr_net);
   sf->s_bulk_start (sf->cls);
-  GAS_normalization_normalize_property (new_address,
+  GAS_normalization_update_property (new_address,
                                        atsi,
                                        atsi_count);
   sf->s_bulk_stop (sf->cls);
@@ -545,11 +519,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_SERVER_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,