aboutsummaryrefslogtreecommitdiff
path: root/src/ats/ats_api_scheduling.c
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2013-01-14 11:11:15 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2013-01-14 11:11:15 +0000
commitbd914712dbe5fa19e74dd58ed676830767ea393f (patch)
tree04db0040097eb62a2032080f5b9a07e52329f650 /src/ats/ats_api_scheduling.c
parent3674620bee74d359170f3f3ee072f8fb14dcebb0 (diff)
adding suggest handle to allow transport to check if we have pending address request
Diffstat (limited to 'src/ats/ats_api_scheduling.c')
-rw-r--r--src/ats/ats_api_scheduling.c53
1 files changed, 51 insertions, 2 deletions
diff --git a/src/ats/ats_api_scheduling.c b/src/ats/ats_api_scheduling.c
index eeda4fd710..dce267ee7c 100644
--- a/src/ats/ats_api_scheduling.c
+++ b/src/ats/ats_api_scheduling.c
@@ -94,6 +94,15 @@ struct ATS_Network
socklen_t length;
};
+/**
+ * Handle for address suggestions
+ */
+struct GNUNET_ATS_SuggestHandle
+{
+ struct GNUNET_ATS_SuggestHandle *prev;
+ struct GNUNET_ATS_SuggestHandle *next;
+ struct GNUNET_PeerIdentity id;
+};
/**
@@ -118,6 +127,16 @@ struct GNUNET_ATS_SchedulingHandle
void *suggest_cb_cls;
/**
+ * DLL for suggestions head
+ */
+ struct GNUNET_ATS_SuggestHandle *sug_head;
+
+ /**
+ * DLL for suggestions tail
+ */
+ struct GNUNET_ATS_SuggestHandle *sug_tail;
+
+ /**
* Connection to ATS service.
*/
struct GNUNET_CLIENT_Connection *client;
@@ -953,7 +972,8 @@ void
GNUNET_ATS_scheduling_done (struct GNUNET_ATS_SchedulingHandle *sh)
{
struct PendingMessage *p;
-
+ struct GNUNET_ATS_SuggestHandle *cur;
+ struct GNUNET_ATS_SuggestHandle *next;
while (NULL != (p = sh->pending_head))
{
GNUNET_CONTAINER_DLL_remove (sh->pending_head, sh->pending_tail, p);
@@ -970,6 +990,14 @@ GNUNET_ATS_scheduling_done (struct GNUNET_ATS_SchedulingHandle *sh)
sh->task = GNUNET_SCHEDULER_NO_TASK;
}
+ next = sh->sug_head;
+ while (NULL != (cur = next))
+ {
+ next = cur->next;
+ GNUNET_CONTAINER_DLL_remove (sh->sug_head, sh->sug_tail, cur);
+ GNUNET_free (cur);
+ }
+
delete_networks (sh);
if (sh->interface_task != GNUNET_SCHEDULER_NO_TASK)
{
@@ -1014,13 +1042,15 @@ GNUNET_ATS_reset_backoff (struct GNUNET_ATS_SchedulingHandle *sh,
*
* @param sh handle
* @param peer identity of the peer we need an address for
+ * @return suggest handle
*/
-void
+struct GNUNET_ATS_SuggestHandle *
GNUNET_ATS_suggest_address (struct GNUNET_ATS_SchedulingHandle *sh,
const struct GNUNET_PeerIdentity *peer)
{
struct PendingMessage *p;
struct RequestAddressMessage *m;
+ struct GNUNET_ATS_SuggestHandle *s;
// FIXME: ATS needs to remember this in case of
// a disconnect!
@@ -1035,6 +1065,10 @@ GNUNET_ATS_suggest_address (struct GNUNET_ATS_SchedulingHandle *sh,
m->peer = *peer;
GNUNET_CONTAINER_DLL_insert_tail (sh->pending_head, sh->pending_tail, p);
do_transmit (sh);
+ s = GNUNET_malloc (sizeof (struct GNUNET_ATS_SuggestHandle));
+ s->id = (*peer);
+ GNUNET_CONTAINER_DLL_insert_tail (sh->sug_head, sh->sug_tail, s);
+ return s;
}
@@ -1050,6 +1084,21 @@ GNUNET_ATS_suggest_address_cancel (struct GNUNET_ATS_SchedulingHandle *sh,
{
struct PendingMessage *p;
struct RequestAddressMessage *m;
+ struct GNUNET_ATS_SuggestHandle *s;
+
+ for (s = sh->sug_head; NULL != s; s = s->next)
+ if (0 == memcmp(peer, &s->id, sizeof (s->id)))
+ break;
+ if (NULL == s)
+ {
+ GNUNET_break (0);
+ return;
+ }
+ else
+ {
+ GNUNET_CONTAINER_DLL_remove (sh->sug_head, sh->sug_tail, s);
+ GNUNET_free (s);
+ }
p = GNUNET_malloc (sizeof (struct PendingMessage) +
sizeof (struct RequestAddressMessage));