diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2013-01-14 11:11:15 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2013-01-14 11:11:15 +0000 |
commit | bd914712dbe5fa19e74dd58ed676830767ea393f (patch) | |
tree | 04db0040097eb62a2032080f5b9a07e52329f650 /src/ats/ats_api_scheduling.c | |
parent | 3674620bee74d359170f3f3ee072f8fb14dcebb0 (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.c | 53 |
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)); |