aboutsummaryrefslogtreecommitdiff
path: root/src/transport/transport_api_monitoring.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/transport/transport_api_monitoring.c')
-rw-r--r--src/transport/transport_api_monitoring.c128
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 */
149int
150GNUNET_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 */
189const char *
190GNUNET_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 */
152static void 240static void
153peer_address_response_processor (void *cls, 241peer_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,
162static void 250static void
163send_request (struct GNUNET_TRANSPORT_PeerMonitoringContext *pal_ctx) 251send_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 */
225static void 313static void
226peer_address_response_processor (void *cls, 314peer_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}