- latest changes
authorMatthias Wachs <wachs@net.in.tum.de>
Mon, 20 Feb 2012 21:42:26 +0000 (21:42 +0000)
committerMatthias Wachs <wachs@net.in.tum.de>
Mon, 20 Feb 2012 21:42:26 +0000 (21:42 +0000)
src/ats/gnunet-service-ats_addresses.c
src/ats/gnunet-service-ats_addresses_mlp.c
src/ats/gnunet-service-ats_addresses_mlp.h
src/ats/test_ats_mlp.c

index 12eaef113c9c4d83995a3b639f9fbb6ce2199165..843394a0f3b747bbcce1d5c8ae96668e2d2c1e73 100644 (file)
@@ -600,23 +600,41 @@ GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer)
     /* 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)
-    {
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                  "Cannot suggest address for peer `%s'\n", GNUNET_i2s (peer));
-      return;
-    }
   }
   if (ats_mode == MLP)
   {
+#if HAVE_GLPK
+#endif
     /* 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);
+  }
+
+  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++;
-    recalculate_assigned_bw ();
+    if (ats_mode == SIMPLE)
+    {
+      recalculate_assigned_bw ();
+    }
+    if (ats_mode == SIMPLE)
+    {
+      recalculate_assigned_bw ();
+    }
   }
   else
   {
index b84e671f2614a249399a073a37a1561b13ecddb2..1e10370d9511b4f12429e2621cae39a2124fc41b 100644 (file)
@@ -1553,12 +1553,17 @@ static int
 mlp_get_preferred_address_it (void *cls, const GNUNET_HashCode * key, void *value)
 {
 
-  struct ATS_Address **aa = (struct ATS_Address **)cls;
+  struct ATS_PreferedAddress *aa = (struct ATS_PreferedAddress *) cls;
   struct ATS_Address *addr = value;
   struct MLP_information *mlpi = addr->mlp_information;
   if (mlpi->n == GNUNET_YES)
   {
-    *aa = addr;
+    aa->address = addr;
+    if (mlpi->b > (double) UINT32_MAX)
+      aa->bandwidth_out = UINT32_MAX;
+    else
+      aa->bandwidth_out = (uint32_t) mlpi->b;
+    aa->bandwidth_in = 0;
     return GNUNET_NO;
   }
   return GNUNET_YES;
@@ -1572,14 +1577,14 @@ mlp_get_preferred_address_it (void *cls, const GNUNET_HashCode * key, void *valu
  * @param peer the peer
  * @return suggested address
  */
-struct ATS_Address *
+struct ATS_PreferedAddress *
 GAS_mlp_get_preferred_address (struct GAS_MLP_Handle *mlp,
                                struct GNUNET_CONTAINER_MultiHashMap * addresses,
                                const struct GNUNET_PeerIdentity *peer)
 {
-  struct ATS_Address * aa = NULL;
+  struct ATS_PreferedAddress * aa = GNUNET_malloc (sizeof (struct ATS_PreferedAddress));
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Getting preferred address for `%s'\n", GNUNET_i2s (peer));
-  GNUNET_CONTAINER_multihashmap_get_multiple(addresses, &peer->hashPubKey, mlp_get_preferred_address_it, &aa);
+  GNUNET_CONTAINER_multihashmap_get_multiple(addresses, &peer->hashPubKey, mlp_get_preferred_address_it, aa);
   return aa;
 }
 
index 9e7ca053318fccc1631ead2e02ca5f0ab39eb698..1efcbf0e5390409b866b24ac85825b24c0de5cdc 100644 (file)
@@ -61,6 +61,13 @@ struct ATS_Peer
   struct ATS_Address *tail;
 };
 
+struct ATS_PreferedAddress
+{
+  uint32_t bandwidth_out;
+  uint32_t bandwidth_in;
+  struct ATS_Address *address;
+};
+
 /**
  * MLP Handle
  */
@@ -366,7 +373,7 @@ GAS_mlp_address_change_preference (struct GAS_MLP_Handle *mlp,
  * @param peer the peer
  * @return suggested address
  */
-struct ATS_Address *
+struct ATS_PreferedAddress *
 GAS_mlp_get_preferred_address (struct GAS_MLP_Handle *mlp,
                                struct GNUNET_CONTAINER_MultiHashMap * addresses,
                                const struct GNUNET_PeerIdentity *peer);
index 8af368c8e034619d15efc126d28ab63297066701..ab8327dd9f3ac58290f2dfce5a73929233017e4b 100644 (file)
@@ -74,7 +74,7 @@ check (void *cls, char *const *args, const char *cfgfile,
   return;
 #endif
   struct ATS_Address addr[10];
-  struct ATS_Address *res[10];
+  struct ATS_PreferedAddress *res[10];
 
   stats = GNUNET_STATISTICS_create("ats", cfg);
 
@@ -97,8 +97,7 @@ check (void *cls, char *const *args, const char *cfgfile,
   set_ats (&a1_ats[1], GNUNET_ATS_QUALITY_NET_DELAY, 2);
   set_ats (&a1_ats[2], GNUNET_ATS_ARRAY_TERMINATOR, 0);
   create_address (&addr[0], "dummy", 3, &a1_ats[0]);
-  addr[0].atsp_network_type = GNUNET_ATS_NET_LOOPBACK;
-
+  addr[0].atsp_network_type = GNUNET_ATS_NET_WAN;
 
   /* Creating peer 1  address 2 */
   addr[1].peer.hashPubKey = p[0].hashPubKey;
@@ -116,7 +115,7 @@ check (void *cls, char *const *args, const char *cfgfile,
   set_ats (&a3_ats[1], GNUNET_ATS_QUALITY_NET_DISTANCE, 1);
   set_ats (&a3_ats[2], GNUNET_ATS_ARRAY_TERMINATOR, 0);
   create_address (&addr[2], "dummy3", 3, &a3_ats[0]);
-  addr[2].atsp_network_type = GNUNET_ATS_NET_WAN;
+  addr[2].atsp_network_type = GNUNET_ATS_NET_LAN;
 
   GNUNET_CONTAINER_multihashmap_put(addresses, &addr[0].peer.hashPubKey, &addr[0], GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
 
@@ -144,9 +143,9 @@ check (void *cls, char *const *args, const char *cfgfile,
   GNUNET_assert (GNUNET_OK == GAS_mlp_solve_problem(mlp));
 
   res[0] = GAS_mlp_get_preferred_address(mlp, addresses, &p[0]);
-  GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Preferred address `%s' \n",res[0]->plugin);
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Preferred address `%s' outbound bandwidth: %u Bps\n",res[0]->address->plugin, res[0]->bandwidth_out);
   res[1] = GAS_mlp_get_preferred_address(mlp, addresses, &p[1]);
-  GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Preferred address `%s' \n",res[1]->plugin);
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Preferred address `%s' outbound bandwidth: %u Bps\n",res[1]->address->plugin, res[1]->bandwidth_out);
 
   /* Delete an address */
   GNUNET_CONTAINER_multihashmap_remove (addresses, &addr[0].peer.hashPubKey, &addr[0]);