aboutsummaryrefslogtreecommitdiff
path: root/src/ats
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2012-02-20 22:02:28 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2012-02-20 22:02:28 +0000
commitc4745ca5df31efd2917ebd134ac82a0d1e1281f6 (patch)
treee2a059dbfc575dcfd994b50f4ec2a0895433176d /src/ats
parent2f40f09726422b092245154cbe30a1cf4389b9fa (diff)
downloadgnunet-c4745ca5df31efd2917ebd134ac82a0d1e1281f6.tar.gz
gnunet-c4745ca5df31efd2917ebd134ac82a0d1e1281f6.zip
- latest changes
Diffstat (limited to 'src/ats')
-rw-r--r--src/ats/gnunet-service-ats_addresses.c91
-rw-r--r--src/ats/gnunet-service-ats_addresses_mlp.c8
2 files changed, 73 insertions, 26 deletions
diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c
index 843394a0f..8900abcb6 100644
--- a/src/ats/gnunet-service-ats_addresses.c
+++ b/src/ats/gnunet-service-ats_addresses.c
@@ -588,34 +588,68 @@ GAS_addresses_in_use (const struct GNUNET_PeerIdentity *peer,
588#endif 588#endif
589} 589}
590 590
591void 591
592GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer) 592void request_address_mlp (const struct GNUNET_PeerIdentity *peer)
593{ 593{
594 struct ATS_Address *aa; 594 struct ATS_Address *aa;
595
596 aa = NULL; 595 aa = NULL;
597 596
598 if (ats_mode == SIMPLE) 597#if HAVE_GLPK
598 /* Get preferred address from MLP */
599 struct ATS_PreferedAddress * paddr = NULL;
600 paddr = GAS_mlp_get_preferred_address (mlp, addresses, peer);
601 aa = paddr->address;
602 aa->assigned_bw_out = GNUNET_BANDWIDTH_value_init(paddr->bandwidth_out);
603 /* FIXME use bw in value */
604 paddr->bandwidth_in = paddr->bandwidth_out;
605 aa->assigned_bw_in = GNUNET_BANDWIDTH_value_init (paddr->bandwidth_in);
606 GNUNET_free (paddr);
607#endif
608
609 if (aa == NULL)
599 { 610 {
600 /* Get address with: stick to current address, lower distance, lower latency */ 611 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
601 GNUNET_CONTAINER_multihashmap_get_multiple (addresses, &peer->hashPubKey, 612 "Cannot suggest address for peer `%s'\n", GNUNET_i2s (peer));
602 &find_address_it, &aa); 613 return;
603 } 614 }
604 if (ats_mode == MLP) 615 if (aa->active == GNUNET_NO)
605 { 616 {
606#if HAVE_GLPK 617 aa->active = GNUNET_YES;
607#endif 618 active_addr_count++;
608 /* Get preferred address from MLP */ 619
609 struct ATS_PreferedAddress * paddr = NULL; 620 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "New bandwidth for peer %s is %u/%u\n",
610 paddr = GAS_mlp_get_preferred_address (mlp, addresses, peer); 621 GNUNET_i2s (&aa->peer), ntohl (aa->assigned_bw_in.value__),
611 aa = paddr->address; 622 ntohl (aa->assigned_bw_out.value__));
612 aa->assigned_bw_out = GNUNET_BANDWIDTH_value_init(paddr->bandwidth_out); 623 GAS_scheduling_transmit_address_suggestion (&aa->peer, aa->plugin, aa->addr,
613 /* FIXME use bw in value */ 624 aa->addr_len, aa->session_id,
614 paddr->bandwidth_in = paddr->bandwidth_out; 625 aa->ats, aa->ats_count,
615 aa->assigned_bw_in = GNUNET_BANDWIDTH_value_init (paddr->bandwidth_in); 626 aa->assigned_bw_out,
616 GNUNET_free (paddr); 627 aa->assigned_bw_in);
628 GAS_reservations_set_bandwidth (&aa->peer, aa->assigned_bw_in);
629 GAS_performance_notify_clients (&aa->peer, aa->plugin, aa->addr, aa->addr_len,
630 aa->ats, aa->ats_count, aa->assigned_bw_out,
631 aa->assigned_bw_in);
632 }
633 else
634 {
635 /* just to be sure... */
636 GAS_scheduling_transmit_address_suggestion (peer, aa->plugin, aa->addr,
637 aa->addr_len, aa->session_id,
638 aa->ats, aa->ats_count,
639 aa->assigned_bw_out,
640 aa->assigned_bw_in);
617 } 641 }
618 642
643}
644
645void request_address_simple (const struct GNUNET_PeerIdentity *peer)
646{
647 struct ATS_Address *aa;
648 aa = NULL;
649
650 /* Get address with: stick to current address, lower distance, lower latency */
651 GNUNET_CONTAINER_multihashmap_get_multiple (addresses, &peer->hashPubKey,
652 &find_address_it, &aa);
619 if (aa == NULL) 653 if (aa == NULL)
620 { 654 {
621 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 655 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -631,10 +665,6 @@ GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer)
631 { 665 {
632 recalculate_assigned_bw (); 666 recalculate_assigned_bw ();
633 } 667 }
634 if (ats_mode == SIMPLE)
635 {
636 recalculate_assigned_bw ();
637 }
638 } 668 }
639 else 669 else
640 { 670 {
@@ -648,6 +678,20 @@ GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer)
648} 678}
649 679
650 680
681void
682GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer)
683{
684 if (ats_mode == SIMPLE)
685 {
686 request_address_simple (peer);
687 }
688 if (ats_mode == MLP)
689 {
690 request_address_mlp(peer);
691 }
692}
693
694
651// FIXME: this function should likely end up in the LP-subsystem and 695// FIXME: this function should likely end up in the LP-subsystem and
652// not with 'addresses' in the future... 696// not with 'addresses' in the future...
653void 697void
@@ -692,7 +736,6 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
692 mlp = GAS_mlp_init (cfg, stats, MLP_MAX_EXEC_DURATION, MLP_MAX_ITERATIONS); 736 mlp = GAS_mlp_init (cfg, stats, MLP_MAX_EXEC_DURATION, MLP_MAX_ITERATIONS);
693 break; 737 break;
694#else 738#else
695
696 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "MLP mode was configured, but libglpk is not installed, switching to simple mode"); 739 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "MLP mode was configured, but libglpk is not installed, switching to simple mode");
697 ats_mode = SIMPLE; 740 ats_mode = SIMPLE;
698 break; 741 break;
diff --git a/src/ats/gnunet-service-ats_addresses_mlp.c b/src/ats/gnunet-service-ats_addresses_mlp.c
index 1e10370d9..17e3f2f2a 100644
--- a/src/ats/gnunet-service-ats_addresses_mlp.c
+++ b/src/ats/gnunet-service-ats_addresses_mlp.c
@@ -1092,7 +1092,6 @@ GAS_mlp_solve_problem (struct GAS_MLP_Handle *mlp)
1092 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\tAddress %s %f\n", 1092 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\tAddress %s %f\n",
1093 (n == 1.0) ? "[x]" : "[ ]", b); 1093 (n == 1.0) ? "[x]" : "[ ]", b);
1094 } 1094 }
1095
1096 } 1095 }
1097 1096
1098 if (mlp->mlp_task != GNUNET_SCHEDULER_NO_TASK) 1097 if (mlp->mlp_task != GNUNET_SCHEDULER_NO_TASK)
@@ -1556,6 +1555,8 @@ mlp_get_preferred_address_it (void *cls, const GNUNET_HashCode * key, void *valu
1556 struct ATS_PreferedAddress *aa = (struct ATS_PreferedAddress *) cls; 1555 struct ATS_PreferedAddress *aa = (struct ATS_PreferedAddress *) cls;
1557 struct ATS_Address *addr = value; 1556 struct ATS_Address *addr = value;
1558 struct MLP_information *mlpi = addr->mlp_information; 1557 struct MLP_information *mlpi = addr->mlp_information;
1558 if (mlpi == NULL)
1559 return GNUNET_YES;
1559 if (mlpi->n == GNUNET_YES) 1560 if (mlpi->n == GNUNET_YES)
1560 { 1561 {
1561 aa->address = addr; 1562 aa->address = addr;
@@ -1583,8 +1584,11 @@ GAS_mlp_get_preferred_address (struct GAS_MLP_Handle *mlp,
1583 const struct GNUNET_PeerIdentity *peer) 1584 const struct GNUNET_PeerIdentity *peer)
1584{ 1585{
1585 struct ATS_PreferedAddress * aa = GNUNET_malloc (sizeof (struct ATS_PreferedAddress)); 1586 struct ATS_PreferedAddress * aa = GNUNET_malloc (sizeof (struct ATS_PreferedAddress));
1587 aa->address = NULL;
1588 aa->bandwidth_in = 0;
1589 aa->bandwidth_out = 0;
1586 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Getting preferred address for `%s'\n", GNUNET_i2s (peer)); 1590 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Getting preferred address for `%s'\n", GNUNET_i2s (peer));
1587 GNUNET_CONTAINER_multihashmap_get_multiple(addresses, &peer->hashPubKey, mlp_get_preferred_address_it, aa); 1591 GNUNET_CONTAINER_multihashmap_get_multiple (addresses, &peer->hashPubKey, mlp_get_preferred_address_it, aa);
1588 return aa; 1592 return aa;
1589} 1593}
1590 1594