aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwachs <wachs@140774ce-b5e7-0310-ab8b-a85725594a96>2012-12-04 16:04:24 +0000
committerwachs <wachs@140774ce-b5e7-0310-ab8b-a85725594a96>2012-12-04 16:04:24 +0000
commit36539b13632be43bb7b7b4a14ad98bb65bc4b807 (patch)
treed10d53386ed6918d8bc1027c14ea61a361aed3a4
parent64bab8f30fdc449e172a34882ce93495e4985970 (diff)
changes
git-svn-id: https://gnunet.org/svn/gnunet@25243 140774ce-b5e7-0310-ab8b-a85725594a96
-rw-r--r--src/ats/gnunet-service-ats_addresses.c73
-rw-r--r--src/ats/gnunet-service-ats_addresses.h15
-rw-r--r--src/ats/gnunet-service-ats_addresses_mlp.c5
-rw-r--r--src/ats/gnunet-service-ats_scheduling.c2
4 files changed, 82 insertions, 13 deletions
diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c
index 49d6d0b593..d0225635bb 100644
--- a/src/ats/gnunet-service-ats_addresses.c
+++ b/src/ats/gnunet-service-ats_addresses.c
@@ -65,6 +65,17 @@ enum ATS_Mode
/**
* Handle for ATS address component
*/
+struct GAS_Addresses_Suggestion_Requests
+{
+ struct GAS_Addresses_Suggestion_Requests *next;
+ struct GAS_Addresses_Suggestion_Requests *prev;
+
+ struct GNUNET_PeerIdentity id;
+};
+
+/**
+ * Handle for ATS address component
+ */
struct GAS_Addresses_Handle
{
/**
@@ -102,6 +113,16 @@ struct GAS_Addresses_Handle
*/
void *solver;
+ /**
+ * Address suggestion requests DLL head
+ */
+ struct GAS_Addresses_Suggestion_Requests *r_head;
+
+ /**
+ * Address suggestion requests DLL tail
+ */
+ struct GAS_Addresses_Suggestion_Requests *r_tail;
+
/* Solver functions */
/**
@@ -957,11 +978,54 @@ request_address_simple (const struct GNUNET_PeerIdentity *peer)
}
+/**
+ * Cancel address suggestions for a peer
+ *
+ * @param peer the respective peer
+ */
+void
+GAS_addresses_request_address_cancel (const struct GNUNET_PeerIdentity *peer)
+{
+ struct GAS_Addresses_Suggestion_Requests *cur = handle->r_head;
+ while (NULL != cur)
+ {
+ if (0 == memcmp (peer, &cur->id, sizeof (cur->id)))
+ break; /* found */
+ cur = cur->next;
+ }
+
+ if (NULL == cur)
+ {
+ GNUNET_break (0);
+ return;
+ }
+ GNUNET_CONTAINER_DLL_remove (handle->r_head, handle->r_tail, cur);
+ GNUNET_free (cur);
+}
+
+
+/**
+ * Add an address suggestions for a peer
+ *
+ * @param peer the respective peer
+ */
void
GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer)
{
+ struct GAS_Addresses_Suggestion_Requests *cur = handle->r_head;
+
if (GNUNET_NO == handle->running)
return;
+ while (NULL != cur)
+ {
+ if (0 == memcmp (peer, &cur->id, sizeof (cur->id)))
+ return; /* already suggesting */
+ cur = cur->next;
+ }
+
+ cur = GNUNET_malloc (sizeof (struct GAS_Addresses_Suggestion_Requests));
+ cur->id = (*peer);
+ GNUNET_CONTAINER_DLL_insert (handle->r_head, handle->r_tail, cur);
if (handle->ats_mode == MODE_SIMPLISTIC)
{
@@ -1181,12 +1245,19 @@ GAS_addresses_destroy_all ()
void
GAS_addresses_done (struct GAS_Addresses_Handle *handle)
{
- GNUNET_assert (NULL != handle);
+ struct GAS_Addresses_Suggestion_Requests *cur;
+ GNUNET_assert (NULL != handle);
GAS_addresses_destroy_all ();
handle->running = GNUNET_NO;
GNUNET_CONTAINER_multihashmap_destroy (handle->addresses);
handle->addresses = NULL;
+ while (NULL != (cur = handle->r_head))
+ {
+ GNUNET_CONTAINER_DLL_remove (handle->r_head, handle->r_tail, cur);
+ GNUNET_free (cur);
+ }
+
GNUNET_free (handle);
/* Stop configured solution method */
diff --git a/src/ats/gnunet-service-ats_addresses.h b/src/ats/gnunet-service-ats_addresses.h
index 983c747896..67defbecf0 100644
--- a/src/ats/gnunet-service-ats_addresses.h
+++ b/src/ats/gnunet-service-ats_addresses.h
@@ -172,16 +172,17 @@ void
GAS_addresses_destroy_all (void);
-// FIXME: this function should likely end up in the LP-subsystem and
-// not with 'addresses' in the future...
-// Note: this call should trigger an address suggestion
-// (GAS_scheduling_transmit_address_suggestion)
+/**
+ * Cancel address suggestions for a peer
+ *
+ * @param peer the respective peer
+ */
void
-GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer);
+GAS_addresses_request_address_cancel (const struct GNUNET_PeerIdentity *peer);
+void
+GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer);
-// FIXME: this function should likely end up in the LP-subsystem and
-// not with 'addresses' in the future...
void
GAS_addresses_change_preference (const struct GNUNET_PeerIdentity *peer,
enum GNUNET_ATS_PreferenceKind kind,
diff --git a/src/ats/gnunet-service-ats_addresses_mlp.c b/src/ats/gnunet-service-ats_addresses_mlp.c
index 51630c5097..c4fe21dfb4 100644
--- a/src/ats/gnunet-service-ats_addresses_mlp.c
+++ b/src/ats/gnunet-service-ats_addresses_mlp.c
@@ -1125,16 +1125,13 @@ GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
mlp->BIG_M = (double) BIG_M_VALUE;
- /* Get maximum number of iterations */
-
-
/* Get timeout for iterations */
if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_time(cfg, "ats", "MAX_DURATION", &max_duration))
{
max_duration = MLP_MAX_EXEC_DURATION;
}
-
+ /* Get maximum number of iterations */
if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_size(cfg, "ats", "MAX_ITERATIONS", &max_iterations))
{
max_iterations = MLP_MAX_ITERATIONS;
diff --git a/src/ats/gnunet-service-ats_scheduling.c b/src/ats/gnunet-service-ats_scheduling.c
index a4c04275f0..ec7be9164b 100644
--- a/src/ats/gnunet-service-ats_scheduling.c
+++ b/src/ats/gnunet-service-ats_scheduling.c
@@ -193,7 +193,7 @@ GAS_handle_request_address_cancel (void *cls,
"REQUEST_ADDRESS_CANCEL");
GNUNET_break (0 == ntohl (msg->reserved));
- /* TODO */
+ GAS_addresses_request_address_cancel (&msg->peer);
GNUNET_SERVER_receive_done (client, GNUNET_OK);
}