add address test
[oweals/gnunet.git] / src / ats / gnunet-service-ats_addresses.c
index a7a1dbe6993eca82cc50e6733755c2cdac6fe03a..9388a66b4caca10779ab4841a0310c28daad527b 100644 (file)
@@ -412,7 +412,7 @@ struct GAS_Addresses_Handle
  */
 static unsigned int
 disassemble_ats_information (struct ATS_Address *dest,
-                                                                                                                const struct GNUNET_ATS_Information *update,
+                             const struct GNUNET_ATS_Information *update,
                              uint32_t update_count,
                              struct GNUNET_ATS_Information **delta_dest,
                              uint32_t *delta_count)
@@ -438,71 +438,71 @@ disassemble_ats_information (struct ATS_Address *dest,
 
   if (NULL == dest->atsi)
   {
-               /* Create performance information */
-               dest->atsi = GNUNET_malloc (update_count * sizeof (struct GNUNET_ATS_Information));
-               dest->atsi_count = update_count;
-               memcpy (dest->atsi, update, update_count * sizeof (struct GNUNET_ATS_Information));
-               (*delta_dest) = GNUNET_malloc (update_count * sizeof (struct GNUNET_ATS_Information));
-               for (c1 = 0; c1 < update_count; c1 ++)
-               {
-                       (*delta_dest)[c1].type = update[c1].type;
-                       (*delta_dest)[c1].value = htonl(GNUNET_ATS_VALUE_UNDEFINED);
-               }
-               (*delta_count) = update_count;
-               return GNUNET_YES;
+    /* Create performance information */
+    dest->atsi = GNUNET_malloc (update_count * sizeof (struct GNUNET_ATS_Information));
+    dest->atsi_count = update_count;
+    memcpy (dest->atsi, update, update_count * sizeof (struct GNUNET_ATS_Information));
+    (*delta_dest) = GNUNET_malloc (update_count * sizeof (struct GNUNET_ATS_Information));
+    for (c1 = 0; c1 < update_count; c1 ++)
+    {
+      (*delta_dest)[c1].type = update[c1].type;
+      (*delta_dest)[c1].value = htonl(GNUNET_ATS_VALUE_UNDEFINED);
+    }
+    (*delta_count) = update_count;
+    return GNUNET_YES;
   }
 
   for (c1 = 0; c1 < update_count; c1++)
   {
-       /* Update existing performance information */
-       found = GNUNET_NO;
-       for (c2 = 0; c2 < dest->atsi_count; c2++)
-       {
-                       if (update[c1].type == dest->atsi[c2].type)
-                       {
-                               if (update[c1].value != dest->atsi[c2].value)
-                               {
-                                               /* Save previous value in delta */
-                                               delta_atsi[delta_atsi_count] = dest->atsi[c2];
-                                               delta_atsi_count ++;
-                                               /* Set new value */
-                                               dest->atsi[c2].value = update[c1].value;
-                                               change = GNUNET_YES;
-                               }
-                               found = GNUNET_YES;
-                               break;
-                       }
-       }
-               if (GNUNET_NO == found)
-               {
-                               add_atsi[add_atsi_count] = update[c1];
-                               add_atsi_count ++;
-                               delta_atsi[delta_atsi_count].type = update[c1].type;
-                               delta_atsi[delta_atsi_count].value = htonl (GNUNET_ATS_VALUE_UNDEFINED);
-                               delta_atsi_count ++;
-               }
+    /* Update existing performance information */
+    found = GNUNET_NO;
+    for (c2 = 0; c2 < dest->atsi_count; c2++)
+    {
+      if (update[c1].type == dest->atsi[c2].type)
+      {
+        if (update[c1].value != dest->atsi[c2].value)
+        {
+          /* Save previous value in delta */
+          delta_atsi[delta_atsi_count] = dest->atsi[c2];
+          delta_atsi_count ++;
+          /* Set new value */
+          dest->atsi[c2].value = update[c1].value;
+          change = GNUNET_YES;
+        }
+        found = GNUNET_YES;
+        break;
+      }
+    }
+    if (GNUNET_NO == found)
+    {
+      add_atsi[add_atsi_count] = update[c1];
+      add_atsi_count ++;
+      delta_atsi[delta_atsi_count].type = update[c1].type;
+      delta_atsi[delta_atsi_count].value = htonl (GNUNET_ATS_VALUE_UNDEFINED);
+      delta_atsi_count ++;
+    }
   }
 
   if (add_atsi_count > 0)
   {
-               /* Extend ats performance information */
-
-               tmp_atsi = GNUNET_malloc ((dest->atsi_count + add_atsi_count) *
-                                                                                                                       (sizeof (struct GNUNET_ATS_Information)));
-               memcpy (tmp_atsi, dest->atsi, dest->atsi_count * sizeof (struct GNUNET_ATS_Information));
-               memcpy (&tmp_atsi[dest->atsi_count], add_atsi, add_atsi_count * sizeof (struct GNUNET_ATS_Information));
-               GNUNET_free (dest->atsi);
-               dest->atsi = tmp_atsi;
-               dest->atsi_count = dest->atsi_count + add_atsi_count;
-                       change = GNUNET_YES;
+    /* Extend ats performance information */
+
+    tmp_atsi = GNUNET_malloc ((dest->atsi_count + add_atsi_count) *
+                              (sizeof (struct GNUNET_ATS_Information)));
+    memcpy (tmp_atsi, dest->atsi, dest->atsi_count * sizeof (struct GNUNET_ATS_Information));
+    memcpy (&tmp_atsi[dest->atsi_count], add_atsi, add_atsi_count * sizeof (struct GNUNET_ATS_Information));
+    GNUNET_free (dest->atsi);
+    dest->atsi = tmp_atsi;
+    dest->atsi_count = dest->atsi_count + add_atsi_count;
+    change = GNUNET_YES;
   }
 
   if (delta_atsi_count > 0)
   {
-               /* Copy delta */
-               (*delta_dest) = GNUNET_malloc (delta_atsi_count * sizeof (struct GNUNET_ATS_Information));
-               memcpy ((*delta_dest), delta_atsi, delta_atsi_count * sizeof (struct GNUNET_ATS_Information));
-               (*delta_count) = delta_atsi_count;
+    /* Copy delta */
+    (*delta_dest) = GNUNET_malloc (delta_atsi_count * sizeof (struct GNUNET_ATS_Information));
+    memcpy ((*delta_dest), delta_atsi, delta_atsi_count * sizeof (struct GNUNET_ATS_Information));
+    (*delta_count) = delta_atsi_count;
   }
 
   return change;
@@ -804,8 +804,8 @@ GAS_addresses_add (struct GAS_Addresses_Handle *handle,
                       &peer->hashPubKey, new_address,
                       GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
 
-    GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Adding new address %p for peer `%s' session id %u, %s\n",
-               new_address, GNUNET_i2s (peer), session_id, GNUNET_ATS_print_network_type(addr_net));
+    GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Adding new address %p for peer `%s', length %u, session id %u, %s\n",
+               new_address, GNUNET_i2s (peer), plugin_addr_len, session_id, GNUNET_ATS_print_network_type(addr_net));
 
     /* Tell solver about new address */
     handle->s_add (handle->solver, new_address, addr_net);
@@ -853,37 +853,35 @@ GAS_addresses_add (struct GAS_Addresses_Handle *handle,
   atsi_delta_count = 0;
   if (GNUNET_YES == disassemble_ats_information (existing_address, atsi, atsi_count, &atsi_delta, &atsi_delta_count))
   {
-       /* Notify performance clients about properties */
-               GAS_performance_notify_all_clients (&existing_address->peer,
-                               existing_address->plugin,
-                               existing_address->addr, existing_address->addr_len,
-                               existing_address->session_id,
-                               existing_address->atsi, existing_address->atsi_count,
-                               existing_address->assigned_bw_out,
-                               existing_address->assigned_bw_in);
-
-               for (c1 = 0; c1 < atsi_delta_count; c1++)
-               {
-                       if ((GNUNET_ATS_NETWORK_TYPE == ntohl (atsi_delta[c1].type)) &&
-                                       (addr_net != ntohl (atsi_delta[c1].value)))
-                       {
-                               /* Network type changed */
-                               GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Address for peer `%s' %p changed from network %s to %s\n",
-                  GNUNET_i2s (peer),
-                  existing_address,
-                  GNUNET_ATS_print_network_type (addr_net),
-                  GNUNET_ATS_print_network_type (ntohl (atsi_delta[c1].value)));
-                       handle->s_address_update_network (handle->solver, existing_address,
-                                       ntohl (atsi_delta[c1].value),
-                                       get_performance_info (existing_address, GNUNET_ATS_NETWORK_TYPE));
-                       addr_net = get_performance_info (existing_address, GNUNET_ATS_NETWORK_TYPE);
-                       }
-               }
-
-               /* Notify solver about update with atsi information and session */
-         handle->s_bulk_start (handle->solver);
-         GAS_normalization_normalize_property (handle->addresses, existing_address, atsi, atsi_count);
-         handle->s_bulk_stop (handle->solver);
+    /* Notify performance clients about properties */
+    GAS_performance_notify_all_clients (&existing_address->peer,
+                existing_address->plugin,
+                existing_address->addr, existing_address->addr_len,
+                existing_address->session_id,
+                existing_address->atsi, existing_address->atsi_count,
+                existing_address->assigned_bw_out,
+                existing_address->assigned_bw_in);
+
+    for (c1 = 0; c1 < atsi_delta_count; c1++)
+    {
+      if ((GNUNET_ATS_NETWORK_TYPE == ntohl (atsi_delta[c1].type)) &&
+              (addr_net != ntohl (atsi_delta[c1].value)))
+      {
+          /* Network type changed */
+          GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Address for peer `%s' %p changed from network %s to %s\n",
+                  GNUNET_i2s (peer), existing_address,
+                  GNUNET_ATS_print_network_type (addr_net),
+                  GNUNET_ATS_print_network_type (ntohl (atsi_delta[c1].value)));
+          handle->s_address_update_network (handle->solver, existing_address,
+                  ntohl (atsi_delta[c1].value),
+                  get_performance_info (existing_address, GNUNET_ATS_NETWORK_TYPE));
+          addr_net = get_performance_info (existing_address, GNUNET_ATS_NETWORK_TYPE);
+      }
+    }
+    /* Notify solver about update with atsi information and session */
+    handle->s_bulk_start (handle->solver);
+    GAS_normalization_normalize_property (handle->addresses, existing_address, atsi, atsi_count);
+    handle->s_bulk_stop (handle->solver);
   }
   GNUNET_free_non_null (atsi_delta);
 
@@ -897,9 +895,10 @@ GAS_addresses_add (struct GAS_Addresses_Handle *handle,
                previous_session, session_id);
 
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-           "Updated existing address for peer `%s' %p with new session %u in network %s\n",
+           "Updated existing address for peer `%s' %p length %u with new session %u in network %s\n",
            GNUNET_i2s (peer),
            existing_address,
+           existing_address->addr_len,
            session_id,
            GNUNET_ATS_print_network_type(addr_net));
 }
@@ -941,7 +940,7 @@ GAS_addresses_update (struct GAS_Addresses_Handle *handle,
 
   /* Get existing address */
   aa = find_exact_address (handle, peer, plugin_name,
-                                                                                                plugin_addr, plugin_addr_len, session_id);
+        plugin_addr, plugin_addr_len, session_id);
   if (aa == NULL)
   {
     /* GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Tried to update unknown address for peer `%s' `%s' session id %u\n", */
@@ -975,30 +974,30 @@ GAS_addresses_update (struct GAS_Addresses_Handle *handle,
   atsi_delta_count = 0;
   if (GNUNET_YES == disassemble_ats_information (aa, atsi, atsi_count, &atsi_delta, &atsi_delta_count))
   {
-       /* ATS properties changed */
-       for (c1 = 0; c1 < atsi_delta_count; c1++)
-       {
-               if (GNUNET_ATS_NETWORK_TYPE == ntohl (atsi_delta[c1].type))
-               {
-                       /* Network type changed */
-                       handle->s_address_update_network (handle->solver, aa,
-                                       ntohl (atsi_delta[c1].value),
-                                       get_performance_info (aa, GNUNET_ATS_NETWORK_TYPE));
-               }
-       }
-
-               /* Notify performance clients about updated address */
-               GAS_performance_notify_all_clients (&aa->peer,
-                               aa->plugin,
-                               aa->addr, aa->addr_len,
-                               aa->session_id,
-                               aa->atsi, aa->atsi_count,
-                               aa->assigned_bw_out,
-                               aa->assigned_bw_in);
-
-               handle->s_bulk_start (handle->solver);
-               GAS_normalization_normalize_property (handle->addresses, aa, atsi, atsi_count);
-               handle->s_bulk_stop (handle->solver);
+    /* ATS properties changed */
+    for (c1 = 0; c1 < atsi_delta_count; c1++)
+    {
+        if (GNUNET_ATS_NETWORK_TYPE == ntohl (atsi_delta[c1].type))
+        {
+            /* Network type changed */
+            handle->s_address_update_network (handle->solver, aa,
+                      ntohl (atsi_delta[c1].value),
+                      get_performance_info (aa, GNUNET_ATS_NETWORK_TYPE));
+        }
+    }
+
+    /* Notify performance clients about updated address */
+    GAS_performance_notify_all_clients (&aa->peer,
+                    aa->plugin,
+                    aa->addr, aa->addr_len,
+                    aa->session_id,
+                    aa->atsi, aa->atsi_count,
+                    aa->assigned_bw_out,
+                    aa->assigned_bw_in);
+
+    handle->s_bulk_start (handle->solver);
+    GAS_normalization_normalize_property (handle->addresses, aa, atsi, atsi_count);
+    handle->s_bulk_stop (handle->solver);
   }
   GNUNET_free_non_null (atsi_delta);
 }
@@ -1105,6 +1104,7 @@ destroy_by_session_id (void *cls, const struct GNUNET_HashCode * key, void *valu
         /* Notify solver to delete session */
         handle->s_del (handle->solver, aa, GNUNET_YES);
         aa->session_id = 0;
+        aa->active = GNUNET_NO;
         return GNUNET_OK;
     }
   }
@@ -1202,7 +1202,7 @@ GAS_addresses_in_use (struct GAS_Addresses_Handle *handle,
   if (NULL == ea)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Trying to set unknown address `%s', %s %u %s \n",
+                "Trying to set unknown address `%s' `%s' `%u' to %s \n",
                 GNUNET_i2s (peer),
                 plugin_name, session_id,
                 (GNUNET_NO == in_use) ? "NO" : "YES");
@@ -1263,6 +1263,23 @@ GAS_addresses_request_address_cancel (struct GAS_Addresses_Handle *handle,
   GNUNET_free (cur);
 }
 
+/*
+static int
+addrinfo_it (void *cls, const struct GNUNET_HashCode *key, void *value)
+{
+       static int count = 0;
+       struct GNUNET_PeerIdentity *id = cls;
+       struct ATS_Address *aa = value;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "[%u] Peer `%s' %s length %u session %u active %s\n",
+              count, GNUNET_i2s (id), aa->plugin, aa->addr_len, aa->session_id,
+              (GNUNET_YES == aa->active) ? "active" : "inactive");
+
+  count ++;
+       return GNUNET_OK;
+}
+*/
 
 /**
  * Request address suggestions for a peer
@@ -1277,7 +1294,7 @@ GAS_addresses_request_address (struct GAS_Addresses_Handle *handle,
   struct GAS_Addresses_Suggestion_Requests *cur = handle->r_head;
   struct ATS_Address *aa;
 
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               "Received `%s' for peer `%s'\n",
               "REQUEST ADDRESS",
               GNUNET_i2s (peer));
@@ -1297,6 +1314,13 @@ GAS_addresses_request_address (struct GAS_Addresses_Handle *handle,
       GNUNET_CONTAINER_DLL_insert (handle->r_head, handle->r_tail, cur);
   }
 
+  /*
+   * Debuging information about addresses
+   *
+   * GNUNET_CONTAINER_multihashmap_get_multiple(handle->addresses,
+   *  &peer->hashPubKey, &addrinfo_it, (void *) peer);
+   */
+
   /* Get prefered address from solver */
   aa = (struct ATS_Address *) handle->s_get (handle->solver, peer);
   if (NULL == aa)
@@ -1306,7 +1330,7 @@ GAS_addresses_request_address (struct GAS_Addresses_Handle *handle,
     return;
   }
 
-  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Suggesting address %p for peer `%s'\n", aa, GNUNET_i2s (peer));
 
   GAS_scheduling_transmit_address_suggestion (peer,
@@ -1384,12 +1408,13 @@ GAS_addresses_handle_backoff_reset (struct GAS_Addresses_Handle *handle,
  */
 static void
 normalized_preference_changed_cb (void *cls,
-                                                                 const struct GNUNET_PeerIdentity *peer,
-                                                                 enum GNUNET_ATS_PreferenceKind kind,
-                                                                 double pref_rel)
+                                  const struct GNUNET_PeerIdentity *peer,
+                                  enum GNUNET_ATS_PreferenceKind kind,
+                                  double pref_rel)
 {
-       GNUNET_assert (NULL != cls);
-       struct GAS_Addresses_Handle *handle = cls;
+  GNUNET_assert (NULL != cls);
+  struct GAS_Addresses_Handle *handle = cls;
+
   /* Tell solver about update */
   handle->s_pref (handle->solver, peer, kind, pref_rel);
 }
@@ -1405,24 +1430,20 @@ normalized_preference_changed_cb (void *cls,
  */
 static void
 normalized_property_changed_cb (void *cls,
-                                                                                                                 struct ATS_Address *address,
-                                                                                                                 uint32_t type,
-                                                                                                                 double prop_rel)
+                                struct ATS_Address *address,
+                                uint32_t type,
+                                double prop_rel)
 {
-       struct GAS_Addresses_Handle *ah = (struct GAS_Addresses_Handle *) cls;
-       GNUNET_assert (NULL != ah);
-
-       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);
-
-       ah->s_address_update_property (ah->solver,
-                                                                                                                               address,
-                                                                                                                               type,
-                                                                                                                               0,
-                                                                                                                               prop_rel);
+  struct GAS_Addresses_Handle *ah = (struct GAS_Addresses_Handle *) cls;
+  GNUNET_assert (NULL != ah);
+
+  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);
+
+  ah->s_address_update_property (ah->solver, address, type, 0, prop_rel);
 }
 
 
@@ -1470,10 +1491,10 @@ GAS_addresses_change_preference (struct GAS_Addresses_Handle *handle,
                                  enum GNUNET_ATS_PreferenceKind kind,
                                  float score_abs)
 {
-       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Received `%s' for peer `%s' for client %p\n",
-              "CHANGE PREFERENCE",
-              GNUNET_i2s (peer), client);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+        "Received `%s' for peer `%s' for client %p\n",
+        "CHANGE PREFERENCE",
+        GNUNET_i2s (peer), client);
 
   if (GNUNET_NO == handle->running)
     return;
@@ -1507,16 +1528,16 @@ GAS_addresses_change_preference (struct GAS_Addresses_Handle *handle,
  */
 void
 GAS_addresses_preference_feedback (struct GAS_Addresses_Handle *handle,
-                                                                                                                                               void *application,
-                                                                                                                                               const struct GNUNET_PeerIdentity *peer,
-                                                                                                                                               const struct GNUNET_TIME_Relative scope,
-                                                                                                                                               enum GNUNET_ATS_PreferenceKind kind,
-                                                                                                                                               float score_abs)
+                                  void *application,
+                                  const struct GNUNET_PeerIdentity *peer,
+                                  const struct GNUNET_TIME_Relative scope,
+                                  enum GNUNET_ATS_PreferenceKind kind,
+                                  float score_abs)
 {
-       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Received `%s' for peer `%s' for client %p\n",
-              "PREFERENCE FEEDBACK",
-              GNUNET_i2s (peer), application);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+        "Received `%s' for peer `%s' for client %p\n",
+        "PREFERENCE FEEDBACK",
+        GNUNET_i2s (peer), application);
 
   if (GNUNET_NO == handle->running)
     return;
@@ -1524,11 +1545,11 @@ GAS_addresses_preference_feedback (struct GAS_Addresses_Handle *handle,
   if (GNUNET_NO == GNUNET_CONTAINER_multihashmap_contains (handle->addresses,
                                                           &peer->hashPubKey))
   {
-      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-                  "Received `%s' for unknown peer `%s' from client %p\n",
-                  "PREFERENCE FEEDBACK",
-                  GNUNET_i2s (peer), application);
-      return;
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Received `%s' for unknown peer `%s' from client %p\n",
+                "PREFERENCE FEEDBACK",
+                GNUNET_i2s (peer), application);
+    return;
   }
 
   handle->s_feedback (handle->solver, application, peer, scope, kind, score_abs);
@@ -1545,7 +1566,10 @@ GAS_addresses_preference_feedback (struct GAS_Addresses_Handle *handle,
  * @return number of networks loaded
  */
 static unsigned int
-load_quotas (const struct GNUNET_CONFIGURATION_Handle *cfg, unsigned long long *out_dest, unsigned long long *in_dest, int dest_length)
+load_quotas (const struct GNUNET_CONFIGURATION_Handle *cfg,
+            unsigned long long *out_dest,
+            unsigned long long *in_dest,
+            int dest_length)
 {
   char *network_str[GNUNET_ATS_NetworkTypeCount] = GNUNET_ATS_NetworkTypeString;
   char * entry_in = NULL;
@@ -1652,7 +1676,8 @@ bandwidth_changed_cb (void *cls, struct ATS_Address *address)
   GNUNET_assert (handle != NULL);
   GNUNET_assert (address != NULL);
 
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Bandwidth assignment changed for peer %s \n", GNUNET_i2s(&address->peer));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Bandwidth assignment changed for peer %s \n",
+               GNUNET_i2s(&address->peer));
 
   /* Notify performance clients about changes to address */
   GAS_performance_notify_all_clients (&address->peer,
@@ -1671,13 +1696,26 @@ bandwidth_changed_cb (void *cls, struct ATS_Address *address)
   }
   if (NULL == cur)
   {
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+      GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                   "Nobody is interested in peer `%s' :(\n",GNUNET_i2s (&address->peer));
       return;
   }
 
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Sending bandwidth update for peer `%s'\n",GNUNET_i2s (&address->peer));
+  if ((0 == ntohl (address->assigned_bw_in.value__)) &&
+               (0 == ntohl (address->assigned_bw_out.value__)))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+                "Telling transport to disconnect peer `%s'\n",
+                GNUNET_i2s (&address->peer));
+  }
+  else
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+                "Sending bandwidth update for peer `%s': %llu %llu\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,
@@ -1759,7 +1797,6 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
     case MODE_MLP:
       /* Init the MLP solver with default values */
 #if HAVE_LIBGLPK
-      ah->ats_mode = MODE_MLP;
       ah->s_init = &GAS_mlp_init;
       ah->s_add = &GAS_mlp_address_add;
       ah->s_address_update_property = &GAS_mlp_address_property_changed;
@@ -1781,7 +1818,6 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
       break;
     case MODE_PROPORTIONAL:
       /* Init the proportional solver with default values */
-      ah->ats_mode = MODE_PROPORTIONAL;
       ah->s_init = &GAS_proportional_init;
       ah->s_add = &GAS_proportional_address_add;
       ah->s_address_update_property = &GAS_proportional_address_property_changed;
@@ -1896,8 +1932,10 @@ GAS_addresses_destroy_all (struct GAS_Addresses_Handle *handle)
 
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               "Destroying all addresses\n");
+  handle->s_bulk_start (handle->solver);
   if (handle->addresses != NULL)
     GNUNET_CONTAINER_multihashmap_iterate (handle->addresses, &destroy_all_address_it, handle);
+  handle->s_bulk_start (handle->solver);
 }