diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2012-01-18 14:42:15 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2012-01-18 14:42:15 +0000 |
commit | 76393615c3bd7443bb41a1f1054b798b8c4a1117 (patch) | |
tree | 80093d63204a5173e5948cd857d29a3bc41c12c7 /src/ats | |
parent | b43e11992b7f039e3c1fd90deec470a8996b0651 (diff) | |
download | gnunet-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.c | 4 | ||||
-rw-r--r-- | src/ats/gnunet-service-ats_addresses.h | 4 | ||||
-rw-r--r-- | src/ats/gnunet-service-ats_addresses_mlp.c | 79 | ||||
-rw-r--r-- | src/ats/gnunet-service-ats_addresses_mlp.h | 14 | ||||
-rw-r--r-- | src/ats/test_ats_mlp.c | 14 |
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 | ||
35 | struct ATS_Address | 35 | struct 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 | ||
43 | struct 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 | ||