diff options
Diffstat (limited to 'src/transport/transport_api_monitoring.c')
-rw-r--r-- | src/transport/transport_api_monitoring.c | 128 |
1 files changed, 108 insertions, 20 deletions
diff --git a/src/transport/transport_api_monitoring.c b/src/transport/transport_api_monitoring.c index d7bc56e09..bfbe1d0a1 100644 --- a/src/transport/transport_api_monitoring.c +++ b/src/transport/transport_api_monitoring.c | |||
@@ -140,6 +140,94 @@ struct GNUNET_TRANSPORT_ValidationMonitoringContext | |||
140 | int one_shot; | 140 | int one_shot; |
141 | }; | 141 | }; |
142 | 142 | ||
143 | /** | ||
144 | * Check if a state is defined as connected | ||
145 | * | ||
146 | * @param state the state value | ||
147 | * @return GNUNET_YES or GNUNET_NO | ||
148 | */ | ||
149 | int | ||
150 | GNUNET_TRANSPORT_is_connected (enum GNUNET_TRANSPORT_PeerState state) | ||
151 | { | ||
152 | switch (state) | ||
153 | { | ||
154 | case S_NOT_CONNECTED: | ||
155 | case S_INIT_ATS: | ||
156 | case S_INIT_BLACKLIST: | ||
157 | case S_CONNECT_SENT: | ||
158 | case S_CONNECT_RECV_BLACKLIST_INBOUND: | ||
159 | case S_CONNECT_RECV_ATS: | ||
160 | case S_CONNECT_RECV_BLACKLIST: | ||
161 | case S_CONNECT_RECV_ACK: | ||
162 | return GNUNET_NO; | ||
163 | case S_CONNECTED: | ||
164 | case S_RECONNECT_ATS: | ||
165 | case S_RECONNECT_BLACKLIST: | ||
166 | case S_RECONNECT_SENT: | ||
167 | case S_CONNECTED_SWITCHING_BLACKLIST: | ||
168 | case S_CONNECTED_SWITCHING_CONNECT_SENT: | ||
169 | return GNUNET_YES; | ||
170 | case S_DISCONNECT: | ||
171 | case S_DISCONNECT_FINISHED: | ||
172 | return GNUNET_NO; | ||
173 | default: | ||
174 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
175 | "Unhandled state `%s' \n", | ||
176 | GNUNET_TRANSPORT_p2s (state)); | ||
177 | GNUNET_break (0); | ||
178 | break; | ||
179 | } | ||
180 | return GNUNET_SYSERR; | ||
181 | } | ||
182 | |||
183 | /** | ||
184 | * Convert state to human-readable string. | ||
185 | * | ||
186 | * @param state the state value | ||
187 | * @return corresponding string | ||
188 | */ | ||
189 | const char * | ||
190 | GNUNET_TRANSPORT_p2s (enum GNUNET_TRANSPORT_PeerState state) | ||
191 | { | ||
192 | switch (state) | ||
193 | { | ||
194 | case S_NOT_CONNECTED: | ||
195 | return "S_NOT_CONNECTED"; | ||
196 | case S_INIT_ATS: | ||
197 | return "S_INIT_ATS"; | ||
198 | case S_INIT_BLACKLIST: | ||
199 | return "S_INIT_BLACKLIST"; | ||
200 | case S_CONNECT_SENT: | ||
201 | return "S_CONNECT_SENT"; | ||
202 | case S_CONNECT_RECV_BLACKLIST_INBOUND: | ||
203 | return "S_CONNECT_RECV_BLACKLIST_INBOUND"; | ||
204 | case S_CONNECT_RECV_ATS: | ||
205 | return "S_CONNECT_RECV_ATS"; | ||
206 | case S_CONNECT_RECV_BLACKLIST: | ||
207 | return "S_CONNECT_RECV_BLACKLIST"; | ||
208 | case S_CONNECT_RECV_ACK: | ||
209 | return "S_CONNECT_RECV_ACK"; | ||
210 | case S_CONNECTED: | ||
211 | return "S_CONNECTED"; | ||
212 | case S_RECONNECT_ATS: | ||
213 | return "S_RECONNECT_ATS"; | ||
214 | case S_RECONNECT_BLACKLIST: | ||
215 | return "S_RECONNECT_BLACKLIST"; | ||
216 | case S_RECONNECT_SENT: | ||
217 | return "S_RECONNECT_SENT"; | ||
218 | case S_CONNECTED_SWITCHING_BLACKLIST: | ||
219 | return "S_CONNECTED_SWITCHING_BLACKLIST"; | ||
220 | case S_CONNECTED_SWITCHING_CONNECT_SENT: | ||
221 | return "S_CONNECTED_SWITCHING_CONNECT_SENT"; | ||
222 | case S_DISCONNECT: | ||
223 | return "S_DISCONNECT"; | ||
224 | case S_DISCONNECT_FINISHED: | ||
225 | return "S_DISCONNECT_FINISHED"; | ||
226 | default: | ||
227 | GNUNET_break (0); | ||
228 | return "UNDEFINED"; | ||
229 | } | ||
230 | } | ||
143 | 231 | ||
144 | 232 | ||
145 | /** | 233 | /** |
@@ -150,7 +238,7 @@ struct GNUNET_TRANSPORT_ValidationMonitoringContext | |||
150 | * message with the human-readable address | 238 | * message with the human-readable address |
151 | */ | 239 | */ |
152 | static void | 240 | static void |
153 | peer_address_response_processor (void *cls, | 241 | peer_response_processor (void *cls, |
154 | const struct GNUNET_MessageHeader *msg); | 242 | const struct GNUNET_MessageHeader *msg); |
155 | 243 | ||
156 | 244 | ||
@@ -162,10 +250,10 @@ peer_address_response_processor (void *cls, | |||
162 | static void | 250 | static void |
163 | send_request (struct GNUNET_TRANSPORT_PeerMonitoringContext *pal_ctx) | 251 | send_request (struct GNUNET_TRANSPORT_PeerMonitoringContext *pal_ctx) |
164 | { | 252 | { |
165 | struct PeerIterateMessage msg; | 253 | struct PeerMonitorMessage msg; |
166 | 254 | ||
167 | msg.header.size = htons (sizeof (struct PeerIterateMessage)); | 255 | msg.header.size = htons (sizeof (struct PeerMonitorMessage)); |
168 | msg.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_ITERATE); | 256 | msg.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PEER_REQUEST); |
169 | msg.one_shot = htonl (pal_ctx->one_shot); | 257 | msg.one_shot = htonl (pal_ctx->one_shot); |
170 | msg.timeout = GNUNET_TIME_absolute_hton (pal_ctx->timeout); | 258 | msg.timeout = GNUNET_TIME_absolute_hton (pal_ctx->timeout); |
171 | msg.peer = pal_ctx->peer; | 259 | msg.peer = pal_ctx->peer; |
@@ -174,7 +262,7 @@ send_request (struct GNUNET_TRANSPORT_PeerMonitoringContext *pal_ctx) | |||
174 | &msg.header, | 262 | &msg.header, |
175 | GNUNET_TIME_absolute_get_remaining (pal_ctx->timeout), | 263 | GNUNET_TIME_absolute_get_remaining (pal_ctx->timeout), |
176 | GNUNET_YES, | 264 | GNUNET_YES, |
177 | &peer_address_response_processor, | 265 | &peer_response_processor, |
178 | pal_ctx)); | 266 | pal_ctx)); |
179 | } | 267 | } |
180 | 268 | ||
@@ -218,16 +306,16 @@ reconnect (struct GNUNET_TRANSPORT_PeerMonitoringContext *pal_ctx) | |||
218 | /** | 306 | /** |
219 | * Function called with responses from the service. | 307 | * Function called with responses from the service. |
220 | * | 308 | * |
221 | * @param cls our 'struct GNUNET_TRANSPORT_PeerAddressLookupContext*' | 309 | * @param cls our 'struct GNUNET_TRANSPORT_PeerMonitoringContext*' |
222 | * @param msg NULL on timeout or error, otherwise presumably a | 310 | * @param msg NULL on timeout or error, otherwise presumably a |
223 | * message with the human-readable address | 311 | * message with the human-readable address |
224 | */ | 312 | */ |
225 | static void | 313 | static void |
226 | peer_address_response_processor (void *cls, | 314 | peer_response_processor (void *cls, |
227 | const struct GNUNET_MessageHeader *msg) | 315 | const struct GNUNET_MessageHeader *msg) |
228 | { | 316 | { |
229 | struct GNUNET_TRANSPORT_PeerMonitoringContext *pal_ctx = cls; | 317 | struct GNUNET_TRANSPORT_PeerMonitoringContext *pal_ctx = cls; |
230 | struct PeerIterateResponseMessage *air_msg; | 318 | struct PeerIterateResponseMessage *pir_msg; |
231 | struct GNUNET_HELLO_Address *address; | 319 | struct GNUNET_HELLO_Address *address; |
232 | const char *addr; | 320 | const char *addr; |
233 | const char *transport_name; | 321 | const char *transport_name; |
@@ -251,7 +339,7 @@ peer_address_response_processor (void *cls, | |||
251 | } | 339 | } |
252 | size = ntohs (msg->size); | 340 | size = ntohs (msg->size); |
253 | GNUNET_break (ntohs (msg->type) == | 341 | GNUNET_break (ntohs (msg->type) == |
254 | GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_ITERATE_RESPONSE); | 342 | GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PEER_RESPONSE); |
255 | if (size == sizeof (struct GNUNET_MessageHeader)) | 343 | if (size == sizeof (struct GNUNET_MessageHeader)) |
256 | { | 344 | { |
257 | /* done! */ | 345 | /* done! */ |
@@ -270,7 +358,7 @@ peer_address_response_processor (void *cls, | |||
270 | 358 | ||
271 | if ((size < sizeof (struct PeerIterateResponseMessage)) || | 359 | if ((size < sizeof (struct PeerIterateResponseMessage)) || |
272 | (ntohs (msg->type) != | 360 | (ntohs (msg->type) != |
273 | GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_ITERATE_RESPONSE)) | 361 | GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PEER_RESPONSE)) |
274 | { | 362 | { |
275 | GNUNET_break (0); | 363 | GNUNET_break (0); |
276 | if (pal_ctx->one_shot) | 364 | if (pal_ctx->one_shot) |
@@ -286,9 +374,9 @@ peer_address_response_processor (void *cls, | |||
286 | return; | 374 | return; |
287 | } | 375 | } |
288 | 376 | ||
289 | air_msg = (struct PeerIterateResponseMessage *) msg; | 377 | pir_msg = (struct PeerIterateResponseMessage *) msg; |
290 | tlen = ntohl (air_msg->pluginlen); | 378 | tlen = ntohl (pir_msg->pluginlen); |
291 | alen = ntohl (air_msg->addrlen); | 379 | alen = ntohl (pir_msg->addrlen); |
292 | 380 | ||
293 | if (size != sizeof (struct PeerIterateResponseMessage) + tlen + alen) | 381 | if (size != sizeof (struct PeerIterateResponseMessage) + tlen + alen) |
294 | { | 382 | { |
@@ -308,12 +396,12 @@ peer_address_response_processor (void *cls, | |||
308 | 396 | ||
309 | if (alen == 0 && tlen == 0) | 397 | if (alen == 0 && tlen == 0) |
310 | { | 398 | { |
311 | pal_ctx->cb (pal_ctx->cb_cls, &air_msg->peer, NULL, | 399 | pal_ctx->cb (pal_ctx->cb_cls, &pir_msg->peer, NULL, |
312 | S_NOT_CONNECTED, GNUNET_TIME_UNIT_ZERO_ABS); | 400 | S_NOT_CONNECTED, GNUNET_TIME_UNIT_ZERO_ABS); |
313 | } | 401 | } |
314 | else | 402 | else |
315 | { | 403 | { |
316 | addr = (const char *) &air_msg[1]; | 404 | addr = (const char *) &pir_msg[1]; |
317 | transport_name = &addr[alen]; | 405 | transport_name = &addr[alen]; |
318 | 406 | ||
319 | if (transport_name[tlen - 1] != '\0') | 407 | if (transport_name[tlen - 1] != '\0') |
@@ -333,16 +421,16 @@ peer_address_response_processor (void *cls, | |||
333 | } | 421 | } |
334 | 422 | ||
335 | /* notify client */ | 423 | /* notify client */ |
336 | address = GNUNET_HELLO_address_allocate (&air_msg->peer, | 424 | address = GNUNET_HELLO_address_allocate (&pir_msg->peer, |
337 | transport_name, addr, alen); | 425 | transport_name, addr, alen); |
338 | pal_ctx->cb (pal_ctx->cb_cls, &air_msg->peer, address, | 426 | pal_ctx->cb (pal_ctx->cb_cls, &pir_msg->peer, address, |
339 | ntohl(air_msg->state), | 427 | ntohl(pir_msg->state), |
340 | GNUNET_TIME_absolute_ntoh (air_msg->state_timeout)); | 428 | GNUNET_TIME_absolute_ntoh (pir_msg->state_timeout)); |
341 | GNUNET_HELLO_address_free (address); | 429 | GNUNET_HELLO_address_free (address); |
342 | } | 430 | } |
343 | 431 | ||
344 | /* expect more replies */ | 432 | /* expect more replies */ |
345 | GNUNET_CLIENT_receive (pal_ctx->client, &peer_address_response_processor, | 433 | GNUNET_CLIENT_receive (pal_ctx->client, &peer_response_processor, |
346 | pal_ctx, | 434 | pal_ctx, |
347 | GNUNET_TIME_absolute_get_remaining (pal_ctx->timeout)); | 435 | GNUNET_TIME_absolute_get_remaining (pal_ctx->timeout)); |
348 | } | 436 | } |