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) | |
download | gnunet-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.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 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 | */ | ||
100 | struct 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 | |||
953 | GNUNET_ATS_scheduling_done (struct GNUNET_ATS_SchedulingHandle *sh) | 972 | GNUNET_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 | */ |
1018 | void | 1047 | struct GNUNET_ATS_SuggestHandle * |
1019 | GNUNET_ATS_suggest_address (struct GNUNET_ATS_SchedulingHandle *sh, | 1048 | GNUNET_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)); |