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)
downloadgnunet-bd914712dbe5fa19e74dd58ed676830767ea393f.tar.gz
gnunet-bd914712dbe5fa19e74dd58ed676830767ea393f.zip
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 eeda4fd71..dce267ee7 100644
--- a/src/ats/ats_api_scheduling.c
+++ b/src/ats/ats_api_scheduling.c
@@ -94,6 +94,15 @@ struct ATS_Network
94 socklen_t length; 94 socklen_t length;
95}; 95};
96 96
97/**
98 * Handle for address suggestions
99 */
100struct GNUNET_ATS_SuggestHandle
101{
102 struct GNUNET_ATS_SuggestHandle *prev;
103 struct GNUNET_ATS_SuggestHandle *next;
104 struct GNUNET_PeerIdentity id;
105};
97 106
98 107
99/** 108/**
@@ -118,6 +127,16 @@ struct GNUNET_ATS_SchedulingHandle
118 void *suggest_cb_cls; 127 void *suggest_cb_cls;
119 128
120 /** 129 /**
130 * DLL for suggestions head
131 */
132 struct GNUNET_ATS_SuggestHandle *sug_head;
133
134 /**
135 * DLL for suggestions tail
136 */
137 struct GNUNET_ATS_SuggestHandle *sug_tail;
138
139 /**
121 * Connection to ATS service. 140 * Connection to ATS service.
122 */ 141 */
123 struct GNUNET_CLIENT_Connection *client; 142 struct GNUNET_CLIENT_Connection *client;
@@ -953,7 +972,8 @@ void
953GNUNET_ATS_scheduling_done (struct GNUNET_ATS_SchedulingHandle *sh) 972GNUNET_ATS_scheduling_done (struct GNUNET_ATS_SchedulingHandle *sh)
954{ 973{
955 struct PendingMessage *p; 974 struct PendingMessage *p;
956 975 struct GNUNET_ATS_SuggestHandle *cur;
976 struct GNUNET_ATS_SuggestHandle *next;
957 while (NULL != (p = sh->pending_head)) 977 while (NULL != (p = sh->pending_head))
958 { 978 {
959 GNUNET_CONTAINER_DLL_remove (sh->pending_head, sh->pending_tail, p); 979 GNUNET_CONTAINER_DLL_remove (sh->pending_head, sh->pending_tail, p);
@@ -970,6 +990,14 @@ GNUNET_ATS_scheduling_done (struct GNUNET_ATS_SchedulingHandle *sh)
970 sh->task = GNUNET_SCHEDULER_NO_TASK; 990 sh->task = GNUNET_SCHEDULER_NO_TASK;
971 } 991 }
972 992
993 next = sh->sug_head;
994 while (NULL != (cur = next))
995 {
996 next = cur->next;
997 GNUNET_CONTAINER_DLL_remove (sh->sug_head, sh->sug_tail, cur);
998 GNUNET_free (cur);
999 }
1000
973 delete_networks (sh); 1001 delete_networks (sh);
974 if (sh->interface_task != GNUNET_SCHEDULER_NO_TASK) 1002 if (sh->interface_task != GNUNET_SCHEDULER_NO_TASK)
975 { 1003 {
@@ -1014,13 +1042,15 @@ GNUNET_ATS_reset_backoff (struct GNUNET_ATS_SchedulingHandle *sh,
1014 * 1042 *
1015 * @param sh handle 1043 * @param sh handle
1016 * @param peer identity of the peer we need an address for 1044 * @param peer identity of the peer we need an address for
1045 * @return suggest handle
1017 */ 1046 */
1018void 1047struct GNUNET_ATS_SuggestHandle *
1019GNUNET_ATS_suggest_address (struct GNUNET_ATS_SchedulingHandle *sh, 1048GNUNET_ATS_suggest_address (struct GNUNET_ATS_SchedulingHandle *sh,
1020 const struct GNUNET_PeerIdentity *peer) 1049 const struct GNUNET_PeerIdentity *peer)
1021{ 1050{
1022 struct PendingMessage *p; 1051 struct PendingMessage *p;
1023 struct RequestAddressMessage *m; 1052 struct RequestAddressMessage *m;
1053 struct GNUNET_ATS_SuggestHandle *s;
1024 1054
1025 // FIXME: ATS needs to remember this in case of 1055 // FIXME: ATS needs to remember this in case of
1026 // a disconnect! 1056 // a disconnect!
@@ -1035,6 +1065,10 @@ GNUNET_ATS_suggest_address (struct GNUNET_ATS_SchedulingHandle *sh,
1035 m->peer = *peer; 1065 m->peer = *peer;
1036 GNUNET_CONTAINER_DLL_insert_tail (sh->pending_head, sh->pending_tail, p); 1066 GNUNET_CONTAINER_DLL_insert_tail (sh->pending_head, sh->pending_tail, p);
1037 do_transmit (sh); 1067 do_transmit (sh);
1068 s = GNUNET_malloc (sizeof (struct GNUNET_ATS_SuggestHandle));
1069 s->id = (*peer);
1070 GNUNET_CONTAINER_DLL_insert_tail (sh->sug_head, sh->sug_tail, s);
1071 return s;
1038} 1072}
1039 1073
1040 1074
@@ -1050,6 +1084,21 @@ GNUNET_ATS_suggest_address_cancel (struct GNUNET_ATS_SchedulingHandle *sh,
1050{ 1084{
1051 struct PendingMessage *p; 1085 struct PendingMessage *p;
1052 struct RequestAddressMessage *m; 1086 struct RequestAddressMessage *m;
1087 struct GNUNET_ATS_SuggestHandle *s;
1088
1089 for (s = sh->sug_head; NULL != s; s = s->next)
1090 if (0 == memcmp(peer, &s->id, sizeof (s->id)))
1091 break;
1092 if (NULL == s)
1093 {
1094 GNUNET_break (0);
1095 return;
1096 }
1097 else
1098 {
1099 GNUNET_CONTAINER_DLL_remove (sh->sug_head, sh->sug_tail, s);
1100 GNUNET_free (s);
1101 }
1053 1102
1054 p = GNUNET_malloc (sizeof (struct PendingMessage) + 1103 p = GNUNET_malloc (sizeof (struct PendingMessage) +
1055 sizeof (struct RequestAddressMessage)); 1104 sizeof (struct RequestAddressMessage));