aboutsummaryrefslogtreecommitdiff
path: root/src/ats
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2012-01-18 14:42:15 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2012-01-18 14:42:15 +0000
commit76393615c3bd7443bb41a1f1054b798b8c4a1117 (patch)
tree80093d63204a5173e5948cd857d29a3bc41c12c7 /src/ats
parentb43e11992b7f039e3c1fd90deec470a8996b0651 (diff)
downloadgnunet-76393615c3bd7443bb41a1f1054b798b8c4a1117.tar.gz
gnunet-76393615c3bd7443bb41a1f1054b798b8c4a1117.zip
- functionality for "for all peers" constraints
Diffstat (limited to 'src/ats')
-rw-r--r--src/ats/gnunet-service-ats_addresses.c4
-rw-r--r--src/ats/gnunet-service-ats_addresses.h4
-rw-r--r--src/ats/gnunet-service-ats_addresses_mlp.c79
-rw-r--r--src/ats/gnunet-service-ats_addresses_mlp.h14
-rw-r--r--src/ats/test_ats_mlp.c14
5 files changed, 104 insertions, 11 deletions
diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c
index 06eee9fb3..ae78858e6 100644
--- a/src/ats/gnunet-service-ats_addresses.c
+++ b/src/ats/gnunet-service-ats_addresses.c
@@ -154,7 +154,9 @@ create_address (const struct GNUNET_PeerIdentity *peer,
154 memcpy (&aa[1], plugin_addr, plugin_addr_len); 154 memcpy (&aa[1], plugin_addr, plugin_addr_len);
155 aa->plugin = GNUNET_strdup (plugin_name); 155 aa->plugin = GNUNET_strdup (plugin_name);
156 aa->session_id = session_id; 156 aa->session_id = session_id;
157 157 aa->mlp_information = NULL;
158 aa->next = NULL;
159 aa->prev = NULL;
158 return aa; 160 return aa;
159} 161}
160 162
diff --git a/src/ats/gnunet-service-ats_addresses.h b/src/ats/gnunet-service-ats_addresses.h
index a5230b4f3..33ff5869d 100644
--- a/src/ats/gnunet-service-ats_addresses.h
+++ b/src/ats/gnunet-service-ats_addresses.h
@@ -34,6 +34,10 @@
34 34
35struct ATS_Address 35struct ATS_Address
36{ 36{
37 struct ATS_Address *next;
38
39 struct ATS_Address *prev;
40
37 struct GNUNET_PeerIdentity peer; 41 struct GNUNET_PeerIdentity peer;
38 42
39 size_t addr_len; 43 size_t addr_len;
diff --git a/src/ats/gnunet-service-ats_addresses_mlp.c b/src/ats/gnunet-service-ats_addresses_mlp.c
index c3a7cfb5c..3899e126a 100644
--- a/src/ats/gnunet-service-ats_addresses_mlp.c
+++ b/src/ats/gnunet-service-ats_addresses_mlp.c
@@ -34,7 +34,7 @@
34#endif 34#endif
35#include "float.h" 35#include "float.h"
36 36
37#define DEBUG_ATS GNUNET_YES 37#define DEBUG_ATS GNUNET_NO
38 38
39/* A very big value */ 39/* A very big value */
40#define M DBL_MAX 40#define M DBL_MAX
@@ -325,12 +325,14 @@ mlp_add_constraints_all_addresses (struct GAS_MLP_Handle *mlp, struct GNUNET_CON
325 double *ar= GNUNET_malloc (pi * sizeof (double)); 325 double *ar= GNUNET_malloc (pi * sizeof (double));
326 mlp->ar = ar; 326 mlp->ar = ar;
327 327
328 /* Adding constraint rows */ 328 /* Adding constraint rows
329 /* Feasibility constraints */ 329 * This constraints are kind of "for all addresses"
330 330 * Feasibility constraints:
331 /* c 1) bandwidth capping */ 331 *
332 /* c 3) minimum bandwidth */ 332 * c 1) bandwidth capping
333 /* c 4) minimum number of connections */ 333 * c 3) minimum bandwidth
334 * c 4) minimum number of connections
335 */
334 mlp->r_c4 = glp_add_rows (mlp->prob, 1); 336 mlp->r_c4 = glp_add_rows (mlp->prob, 1);
335 glp_set_row_bnds (mlp->prob, mlp->r_c4, GLP_LO, mlp->n_min, 0.0); 337 glp_set_row_bnds (mlp->prob, mlp->r_c4, GLP_LO, mlp->n_min, 0.0);
336 338
@@ -811,6 +813,37 @@ GAS_mlp_address_update (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_Mult
811 address->mlp_information = mlpi; 813 address->mlp_information = mlpi;
812 mlp->addr_in_problem ++; 814 mlp->addr_in_problem ++;
813 815
816 /* Check for and add peer */
817 struct ATS_Peer *peer = mlp->peer_head;
818 while (peer != NULL)
819 {
820 if (0 == memcmp (&address->peer, &peer->id, sizeof (struct GNUNET_PeerIdentity)))
821 break;
822 peer = peer->next;
823 }
824 if (peer == NULL)
825 {
826#if DEBUG_ATS
827 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Adding new peer `%s'\n", GNUNET_i2s (&address->peer));
828#endif
829 peer = GNUNET_malloc (sizeof (struct ATS_Peer));
830 peer->head = NULL;
831 peer->tail = NULL;
832 memcpy (&peer->id, &address->peer, sizeof (struct GNUNET_PeerIdentity));
833 GNUNET_assert(address->prev == NULL);
834 GNUNET_assert(address->next == NULL);
835 GNUNET_CONTAINER_DLL_insert (peer->head, peer->tail, address);
836 GNUNET_CONTAINER_DLL_insert (mlp->peer_head, mlp->peer_tail, peer);
837 }
838 else
839 {
840#if DEBUG_ATS
841 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Adding address to peer `%s'\n", GNUNET_i2s (&address->peer));
842#endif
843 GNUNET_CONTAINER_DLL_insert (peer->head, peer->tail, address);
844 }
845
846
814 /* Add bandwidth column */ 847 /* Add bandwidth column */
815 col = glp_add_cols (mlp->prob, 2); 848 col = glp_add_cols (mlp->prob, 2);
816 mlpi->c_b = col; 849 mlpi->c_b = col;
@@ -836,8 +869,12 @@ GAS_mlp_address_update (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_Mult
836 glp_set_col_kind (mlp->prob, mlpi->c_n, GLP_IV); 869 glp_set_col_kind (mlp->prob, mlpi->c_n, GLP_IV);
837 /* Objective function coefficient == 0 */ 870 /* Objective function coefficient == 0 */
838 glp_set_obj_coef (mlp->prob, mlpi->c_n, 0); 871 glp_set_obj_coef (mlp->prob, mlpi->c_n, 0);
839 872 }
840 /* Add */ 873 else
874 {
875#if DEBUG_ATS
876 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Updating existing address to peer `%s'\n", GNUNET_i2s (&address->peer));
877#endif
841 } 878 }
842 879
843 /* Recalculate */ 880 /* Recalculate */
@@ -869,6 +906,30 @@ GAS_mlp_address_delete (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_Mult
869 mlp->addr_in_problem --; 906 mlp->addr_in_problem --;
870 } 907 }
871 908
909 /* Remove from peer list */
910 struct ATS_Peer *head = mlp->peer_head;
911 while (head != NULL)
912 {
913 if (0 == memcmp (&address->peer, &head->id, sizeof (struct GNUNET_PeerIdentity)))
914 break;
915 head = head->next;
916 }
917 GNUNET_assert (head != NULL);
918#if DEBUG_ATS
919 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Deleting address for `%s'\n", GNUNET_i2s (&address->peer));
920#endif
921 GNUNET_CONTAINER_DLL_remove (head->head, head->tail, address);
922
923 if ((head->head == NULL) && (head->tail == NULL))
924 {
925 /* No address for peer left, remove peer */
926#if DEBUG_ATS
927 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Deleting peer `%s'\n", GNUNET_i2s (&address->peer));
928#endif
929 GNUNET_CONTAINER_DLL_remove (mlp->peer_head, mlp->peer_tail, head);
930 GNUNET_free (head);
931 }
932
872 /* Update problem */ 933 /* Update problem */
873 934
874 /* Recalculate */ 935 /* Recalculate */
diff --git a/src/ats/gnunet-service-ats_addresses_mlp.h b/src/ats/gnunet-service-ats_addresses_mlp.h
index 3878b0f5f..2383f24ef 100644
--- a/src/ats/gnunet-service-ats_addresses_mlp.h
+++ b/src/ats/gnunet-service-ats_addresses_mlp.h
@@ -40,6 +40,17 @@
40#define MLP_MAX_EXEC_DURATION GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 3) 40#define MLP_MAX_EXEC_DURATION GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 3)
41#define MLP_MAX_ITERATIONS INT_MAX 41#define MLP_MAX_ITERATIONS INT_MAX
42 42
43struct ATS_Peer
44{
45 struct ATS_Peer *next;
46 struct ATS_Peer *prev;
47
48 struct GNUNET_PeerIdentity id;
49
50 struct ATS_Address *head;
51 struct ATS_Address *tail;
52};
53
43/** 54/**
44 * MLP Handle 55 * MLP Handle
45 */ 56 */
@@ -135,6 +146,9 @@ struct GAS_MLP_Handle
135 146
136 /* Information about the problem */ 147 /* Information about the problem */
137 148
149 struct ATS_Peer *peer_head;
150 struct ATS_Peer *peer_tail;
151
138 /* current problem matrix */ 152 /* current problem matrix */
139 /* row index array */ 153 /* row index array */
140 int *ia; 154 int *ia;
diff --git a/src/ats/test_ats_mlp.c b/src/ats/test_ats_mlp.c
index 48916d2d9..94009ee4e 100644
--- a/src/ats/test_ats_mlp.c
+++ b/src/ats/test_ats_mlp.c
@@ -60,14 +60,26 @@ check (void *cls, char *const *args, const char *cfgfile,
60 addresses = GNUNET_CONTAINER_multihashmap_create (10); 60 addresses = GNUNET_CONTAINER_multihashmap_create (10);
61 61
62 GNUNET_CRYPTO_hash_create_random(GNUNET_CRYPTO_QUALITY_WEAK, &addr.peer.hashPubKey); 62 GNUNET_CRYPTO_hash_create_random(GNUNET_CRYPTO_QUALITY_WEAK, &addr.peer.hashPubKey);
63 addr.mlp_information = NULL;
64 addr.next = NULL;
65 addr.prev = NULL;
63 addr.plugin = strdup ("dummy"); 66 addr.plugin = strdup ("dummy");
64 GNUNET_CONTAINER_multihashmap_put(addresses, &addr.peer.hashPubKey, &addr, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); 67 GNUNET_CONTAINER_multihashmap_put(addresses, &addr.peer.hashPubKey, &addr, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
65 68
66 mlp = GAS_mlp_init (cfg, NULL, MLP_MAX_EXEC_DURATION, MLP_MAX_ITERATIONS); 69 mlp = GAS_mlp_init (cfg, NULL, MLP_MAX_EXEC_DURATION, MLP_MAX_ITERATIONS);
67 70
68 GAS_mlp_address_update(mlp, addresses, &addr); 71 /* Add a new address */
72 GAS_mlp_address_update (mlp, addresses, &addr);
69 73
70 GNUNET_assert (mlp != NULL); 74 GNUNET_assert (mlp != NULL);
75 GNUNET_assert (mlp->addr_in_problem == 1);
76
77 /* Update an new address */
78 GAS_mlp_address_update (mlp, addresses, &addr);
79 GNUNET_assert (mlp->addr_in_problem == 1);
80
81 /* Delete an address */
82 GAS_mlp_address_delete (mlp, addresses, &addr);
71 83
72 GAS_mlp_done (mlp); 84 GAS_mlp_done (mlp);
73 85