- LRN's patch
[oweals/gnunet.git] / src / ats / gnunet-service-ats_addresses.c
index 556214f8041d752da90b074f8db3c09a0fa619b4..fb9bad037049020cc516ffe003e49c3aab27bf06 100644 (file)
 #include "gnunet-service-ats_addresses_mlp.h"
 #endif
 
-#define VERBOSE GNUNET_EXTRA_LOGGING
+#define VERBOSE GNUNET_NO
 
 enum ATS_Mode
 {
-  /**
+  /*
    * Assign each peer an equal amount of bandwidth (bw)
    *
    * bw_per_peer = bw_total / #active addresses
    */
   SIMPLE,
 
-  /**
+  /*
    * Use MLP solver to assign bandwidth
    */
   MLP
@@ -77,17 +77,19 @@ static int ats_mode;
  * @return GNUNET_OK (continue to iterate)
  */
 static int
-update_bw_it (void *cls, const GNUNET_HashCode * key, void *value)
+update_bw_simple_it (void *cls, const GNUNET_HashCode * key, void *value)
 {
   struct ATS_Address *aa = value;
 
-
-  /* Simple method */
   if (GNUNET_YES != aa->active)
     return GNUNET_OK;
   GNUNET_assert (active_addr_count > 0);
+
+
+  /* Simple method */
   aa->assigned_bw_in.value__ = htonl (wan_quota_in / active_addr_count);
   aa->assigned_bw_out.value__ = htonl (wan_quota_out / active_addr_count);
+
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "New bandwidth for peer %s is %u/%u\n",
               GNUNET_i2s (&aa->peer), ntohl (aa->assigned_bw_in.value__),
               ntohl (aa->assigned_bw_out.value__));
@@ -117,7 +119,8 @@ recalculate_assigned_bw ()
                             1, GNUNET_NO);
   GNUNET_STATISTICS_set (GSA_stats, "# active addresses", active_addr_count,
                          GNUNET_NO);
-  GNUNET_CONTAINER_multihashmap_iterate (addresses, &update_bw_it, NULL);
+
+  GNUNET_CONTAINER_multihashmap_iterate (addresses, &update_bw_simple_it, NULL);
 }
 
 /**
@@ -585,12 +588,66 @@ GAS_addresses_in_use (const struct GNUNET_PeerIdentity *peer,
 #endif
 }
 
-void
-GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer)
+
+void request_address_mlp (const struct GNUNET_PeerIdentity *peer)
 {
   struct ATS_Address *aa;
+  aa = NULL;
+
+#if HAVE_GLPK
+  /* Get preferred address from MLP */
+  struct ATS_PreferedAddress * paddr = NULL;
+  paddr = GAS_mlp_get_preferred_address (mlp, addresses, peer);
+  aa = paddr->address;
+  aa->assigned_bw_out = GNUNET_BANDWIDTH_value_init(paddr->bandwidth_out);
+  /* FIXME use bw in value */
+  paddr->bandwidth_in = paddr->bandwidth_out;
+  aa->assigned_bw_in = GNUNET_BANDWIDTH_value_init (paddr->bandwidth_in);
+  GNUNET_free (paddr);
+#endif
 
+  if (aa == NULL)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Cannot suggest address for peer `%s'\n", GNUNET_i2s (peer));
+    return;
+  }
+  if (aa->active == GNUNET_NO)
+  {
+    aa->active = GNUNET_YES;
+    active_addr_count++;
+
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "New bandwidth for peer %s is %u/%u\n",
+                GNUNET_i2s (&aa->peer), ntohl (aa->assigned_bw_in.value__),
+                ntohl (aa->assigned_bw_out.value__));
+    GAS_scheduling_transmit_address_suggestion (&aa->peer, aa->plugin, aa->addr,
+                                                aa->addr_len, aa->session_id,
+                                                aa->ats, aa->ats_count,
+                                                aa->assigned_bw_out,
+                                                aa->assigned_bw_in);
+    GAS_reservations_set_bandwidth (&aa->peer, aa->assigned_bw_in);
+    GAS_performance_notify_clients (&aa->peer, aa->plugin, aa->addr, aa->addr_len,
+                                    aa->ats, aa->ats_count, aa->assigned_bw_out,
+                                    aa->assigned_bw_in);
+  }
+  else
+  {
+    /* just to be sure... */
+    GAS_scheduling_transmit_address_suggestion (peer, aa->plugin, aa->addr,
+                                                aa->addr_len, aa->session_id,
+                                                aa->ats, aa->ats_count,
+                                                aa->assigned_bw_out,
+                                                aa->assigned_bw_in);
+  }
+
+}
+
+void request_address_simple (const struct GNUNET_PeerIdentity *peer)
+{
+  struct ATS_Address *aa;
   aa = NULL;
+
+  /* Get address with: stick to current address, lower distance, lower latency */
   GNUNET_CONTAINER_multihashmap_get_multiple (addresses, &peer->hashPubKey,
                                               &find_address_it, &aa);
   if (aa == NULL)
@@ -599,11 +656,15 @@ GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer)
                 "Cannot suggest address for peer `%s'\n", GNUNET_i2s (peer));
     return;
   }
+
   if (aa->active == GNUNET_NO)
   {
     aa->active = GNUNET_YES;
     active_addr_count++;
-    recalculate_assigned_bw ();
+    if (ats_mode == SIMPLE)
+    {
+      recalculate_assigned_bw ();
+    }
   }
   else
   {
@@ -617,6 +678,20 @@ GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer)
 }
 
 
+void
+GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer)
+{
+  if (ats_mode == SIMPLE)
+  {
+    request_address_simple (peer);
+  }
+  if (ats_mode == MLP)
+  {
+    request_address_mlp(peer);
+  }
+}
+
+
 // FIXME: this function should likely end up in the LP-subsystem and
 // not with 'addresses' in the future...
 void
@@ -661,7 +736,6 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
           mlp = GAS_mlp_init (cfg, stats, MLP_MAX_EXEC_DURATION, MLP_MAX_ITERATIONS);
           break;
 #else
-
           GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "MLP mode was configured, but libglpk is not installed, switching to simple mode");
           ats_mode = SIMPLE;
           break;