aboutsummaryrefslogtreecommitdiff
path: root/src/nat-auto/nat_auto_api_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nat-auto/nat_auto_api_test.c')
-rw-r--r--src/nat-auto/nat_auto_api_test.c226
1 files changed, 89 insertions, 137 deletions
diff --git a/src/nat-auto/nat_auto_api_test.c b/src/nat-auto/nat_auto_api_test.c
index 1511d91ba..56a2b8d72 100644
--- a/src/nat-auto/nat_auto_api_test.c
+++ b/src/nat-auto/nat_auto_api_test.c
@@ -28,9 +28,10 @@
28#include "gnunet_nat_auto_service.h" 28#include "gnunet_nat_auto_service.h"
29#include "nat-auto.h" 29#include "nat-auto.h"
30 30
31#define LOG(kind,...) GNUNET_log_from (kind, "nat-auto", __VA_ARGS__) 31#define LOG(kind, ...) GNUNET_log_from (kind, "nat-auto", __VA_ARGS__)
32 32
33#define NAT_SERVER_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30) 33#define NAT_SERVER_TIMEOUT \
34 GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)
34 35
35/** 36/**
36 * Entry we keep for each incoming connection. 37 * Entry we keep for each incoming connection.
@@ -88,7 +89,6 @@ struct ClientActivity
88 * Handle to overall NAT test. 89 * Handle to overall NAT test.
89 */ 90 */
90 struct GNUNET_NAT_AUTO_Test *h; 91 struct GNUNET_NAT_AUTO_Test *h;
91
92}; 92};
93 93
94 94
@@ -184,9 +184,7 @@ struct GNUNET_NAT_AUTO_Test
184 * @param addrlen actual lenght of the @a addr 184 * @param addrlen actual lenght of the @a addr
185 */ 185 */
186static void 186static void
187reversal_cb (void *cls, 187reversal_cb (void *cls, const struct sockaddr *addr, socklen_t addrlen)
188 const struct sockaddr *addr,
189 socklen_t addrlen)
190{ 188{
191 struct GNUNET_NAT_AUTO_Test *h = cls; 189 struct GNUNET_NAT_AUTO_Test *h = cls;
192 const struct sockaddr_in *sa; 190 const struct sockaddr_in *sa;
@@ -198,11 +196,10 @@ reversal_cb (void *cls,
198 { 196 {
199 LOG (GNUNET_ERROR_TYPE_DEBUG, 197 LOG (GNUNET_ERROR_TYPE_DEBUG,
200 "Received connection reversal request for wrong port\n"); 198 "Received connection reversal request for wrong port\n");
201 return; /* wrong port */ 199 return; /* wrong port */
202 } 200 }
203 /* report success */ 201 /* report success */
204 h->report (h->report_cls, 202 h->report (h->report_cls, GNUNET_NAT_ERROR_SUCCESS);
205 GNUNET_NAT_ERROR_SUCCESS);
206} 203}
207 204
208 205
@@ -220,22 +217,17 @@ do_udp_read (void *cls)
220 const struct GNUNET_SCHEDULER_TaskContext *tc; 217 const struct GNUNET_SCHEDULER_TaskContext *tc;
221 218
222 tc = GNUNET_SCHEDULER_get_task_context (); 219 tc = GNUNET_SCHEDULER_get_task_context ();
223 tst->ltask = 220 tst->ltask = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
224 GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, 221 tst->lsock,
225 tst->lsock, 222 &do_udp_read,
226 &do_udp_read, 223 tst);
227 tst);
228 if ((NULL != tc->write_ready) && 224 if ((NULL != tc->write_ready) &&
229 (GNUNET_NETWORK_fdset_isset (tc->read_ready, 225 (GNUNET_NETWORK_fdset_isset (tc->read_ready, tst->lsock)) &&
230 tst->lsock)) &&
231 (sizeof (data) == 226 (sizeof (data) ==
232 GNUNET_NETWORK_socket_recv (tst->lsock, 227 GNUNET_NETWORK_socket_recv (tst->lsock, &data, sizeof (data))))
233 &data,
234 sizeof (data))))
235 { 228 {
236 if (data == tst->data) 229 if (data == tst->data)
237 tst->report (tst->report_cls, 230 tst->report (tst->report_cls, GNUNET_NAT_ERROR_SUCCESS);
238 GNUNET_NAT_ERROR_SUCCESS);
239 else 231 else
240 LOG (GNUNET_ERROR_TYPE_DEBUG, 232 LOG (GNUNET_ERROR_TYPE_DEBUG,
241 "Received data mismatches expected value\n"); 233 "Received data mismatches expected value\n");
@@ -263,20 +255,14 @@ do_read (void *cls)
263 tc = GNUNET_SCHEDULER_get_task_context (); 255 tc = GNUNET_SCHEDULER_get_task_context ();
264 na->rtask = NULL; 256 na->rtask = NULL;
265 tst = na->h; 257 tst = na->h;
266 GNUNET_CONTAINER_DLL_remove (tst->na_head, 258 GNUNET_CONTAINER_DLL_remove (tst->na_head, tst->na_tail, na);
267 tst->na_tail,
268 na);
269 if ((NULL != tc->write_ready) && 259 if ((NULL != tc->write_ready) &&
270 (GNUNET_NETWORK_fdset_isset (tc->read_ready, 260 (GNUNET_NETWORK_fdset_isset (tc->read_ready, na->sock)) &&
271 na->sock)) &&
272 (sizeof (data) == 261 (sizeof (data) ==
273 GNUNET_NETWORK_socket_recv (na->sock, 262 GNUNET_NETWORK_socket_recv (na->sock, &data, sizeof (data))))
274 &data,
275 sizeof (data))))
276 { 263 {
277 if (data == tst->data) 264 if (data == tst->data)
278 tst->report (tst->report_cls, 265 tst->report (tst->report_cls, GNUNET_NAT_ERROR_SUCCESS);
279 GNUNET_NAT_ERROR_SUCCESS);
280 else 266 else
281 LOG (GNUNET_ERROR_TYPE_DEBUG, 267 LOG (GNUNET_ERROR_TYPE_DEBUG,
282 "Received data does not match expected value\n"); 268 "Received data does not match expected value\n");
@@ -306,28 +292,22 @@ do_accept (void *cls)
306 tst->lsock, 292 tst->lsock,
307 &do_accept, 293 &do_accept,
308 tst); 294 tst);
309 s = GNUNET_NETWORK_socket_accept (tst->lsock, 295 s = GNUNET_NETWORK_socket_accept (tst->lsock, NULL, NULL);
310 NULL,
311 NULL);
312 if (NULL == s) 296 if (NULL == s)
313 { 297 {
314 GNUNET_log_strerror (GNUNET_ERROR_TYPE_INFO, 298 GNUNET_log_strerror (GNUNET_ERROR_TYPE_INFO, "accept");
315 "accept"); 299 return; /* odd error */
316 return; /* odd error */
317 } 300 }
318 LOG (GNUNET_ERROR_TYPE_DEBUG, 301 LOG (GNUNET_ERROR_TYPE_DEBUG,
319 "Got an inbound connection, waiting for data\n"); 302 "Got an inbound connection, waiting for data\n");
320 wl = GNUNET_new (struct NatActivity); 303 wl = GNUNET_new (struct NatActivity);
321 wl->sock = s; 304 wl->sock = s;
322 wl->h = tst; 305 wl->h = tst;
323 wl->rtask = 306 wl->rtask = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
324 GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, 307 wl->sock,
325 wl->sock, 308 &do_read,
326 &do_read, 309 wl);
327 wl); 310 GNUNET_CONTAINER_DLL_insert (tst->na_head, tst->na_tail, wl);
328 GNUNET_CONTAINER_DLL_insert (tst->na_head,
329 tst->na_tail,
330 wl);
331} 311}
332 312
333 313
@@ -339,15 +319,12 @@ do_accept (void *cls)
339 * @param error error code 319 * @param error error code
340 */ 320 */
341static void 321static void
342mq_error_handler (void *cls, 322mq_error_handler (void *cls, enum GNUNET_MQ_Error error)
343 enum GNUNET_MQ_Error error)
344{ 323{
345 struct ClientActivity *ca = cls; 324 struct ClientActivity *ca = cls;
346 struct GNUNET_NAT_AUTO_Test *tst = ca->h; 325 struct GNUNET_NAT_AUTO_Test *tst = ca->h;
347 326
348 GNUNET_CONTAINER_DLL_remove (tst->ca_head, 327 GNUNET_CONTAINER_DLL_remove (tst->ca_head, tst->ca_tail, ca);
349 tst->ca_tail,
350 ca);
351 GNUNET_MQ_destroy (ca->mq); 328 GNUNET_MQ_destroy (ca->mq);
352 GNUNET_free (ca); 329 GNUNET_free (ca);
353} 330}
@@ -367,7 +344,7 @@ mq_error_handler (void *cls,
367 */ 344 */
368static void 345static void
369addr_cb (void *cls, 346addr_cb (void *cls,
370 void **app_ctx, 347 void **app_ctx,
371 int add_remove, 348 int add_remove,
372 enum GNUNET_NAT_AddressClass ac, 349 enum GNUNET_NAT_AddressClass ac,
373 const struct sockaddr *addr, 350 const struct sockaddr *addr,
@@ -385,15 +362,13 @@ addr_cb (void *cls,
385 if (addrlen != sizeof (struct sockaddr_in)) 362 if (addrlen != sizeof (struct sockaddr_in))
386 { 363 {
387 LOG (GNUNET_ERROR_TYPE_DEBUG, 364 LOG (GNUNET_ERROR_TYPE_DEBUG,
388 "NAT test ignores IPv6 address `%s' returned from NAT library\n", 365 "NAT test ignores IPv6 address `%s' returned from NAT library\n",
389 GNUNET_a2s (addr, 366 GNUNET_a2s (addr, addrlen));
390 addrlen)); 367 return; /* ignore IPv6 here */
391 return; /* ignore IPv6 here */
392 } 368 }
393 LOG (GNUNET_ERROR_TYPE_INFO, 369 LOG (GNUNET_ERROR_TYPE_INFO,
394 "Asking gnunet-nat-server to connect to `%s'\n", 370 "Asking gnunet-nat-server to connect to `%s'\n",
395 GNUNET_a2s (addr, 371 GNUNET_a2s (addr, addrlen));
396 addrlen));
397 372
398 ca = GNUNET_new (struct ClientActivity); 373 ca = GNUNET_new (struct ClientActivity);
399 ca->h = h; 374 ca->h = h;
@@ -406,21 +381,17 @@ addr_cb (void *cls,
406 { 381 {
407 GNUNET_free (ca); 382 GNUNET_free (ca);
408 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 383 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
409 _("Failed to connect to `gnunet-nat-server'\n")); 384 _ ("Failed to connect to `gnunet-nat-server'\n"));
410 return; 385 return;
411 } 386 }
412 GNUNET_CONTAINER_DLL_insert (h->ca_head, 387 GNUNET_CONTAINER_DLL_insert (h->ca_head, h->ca_tail, ca);
413 h->ca_tail,
414 ca);
415 sa = (const struct sockaddr_in *) addr; 388 sa = (const struct sockaddr_in *) addr;
416 env = GNUNET_MQ_msg (msg, 389 env = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_NAT_TEST);
417 GNUNET_MESSAGE_TYPE_NAT_TEST);
418 msg->dst_ipv4 = sa->sin_addr.s_addr; 390 msg->dst_ipv4 = sa->sin_addr.s_addr;
419 msg->dport = sa->sin_port; 391 msg->dport = sa->sin_port;
420 msg->data = h->data; 392 msg->data = h->data;
421 msg->is_tcp = htonl ((uint32_t) (h->proto == IPPROTO_TCP)); 393 msg->is_tcp = htonl ((uint32_t) (h->proto == IPPROTO_TCP));
422 GNUNET_MQ_send (ca->mq, 394 GNUNET_MQ_send (ca->mq, env);
423 env);
424} 395}
425 396
426 397
@@ -437,8 +408,7 @@ do_fail (void *cls)
437 struct GNUNET_NAT_AUTO_Test *nh = cls; 408 struct GNUNET_NAT_AUTO_Test *nh = cls;
438 409
439 nh->ttask = NULL; 410 nh->ttask = NULL;
440 nh->report (nh->report_cls, 411 nh->report (nh->report_cls, nh->status);
441 nh->status);
442} 412}
443 413
444 414
@@ -455,30 +425,25 @@ do_fail (void *cls)
455 */ 425 */
456struct GNUNET_NAT_AUTO_Test * 426struct GNUNET_NAT_AUTO_Test *
457GNUNET_NAT_AUTO_test_start (const struct GNUNET_CONFIGURATION_Handle *cfg, 427GNUNET_NAT_AUTO_test_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
458 uint8_t proto, 428 uint8_t proto,
459 const char *section_name, 429 const char *section_name,
460 GNUNET_NAT_TestCallback report, 430 GNUNET_NAT_TestCallback report,
461 void *report_cls) 431 void *report_cls)
462{ 432{
463 struct GNUNET_NAT_AUTO_Test *nh; 433 struct GNUNET_NAT_AUTO_Test *nh;
464 unsigned long long bnd_port; 434 unsigned long long bnd_port;
465 struct sockaddr_in sa; 435 struct sockaddr_in sa;
466 const struct sockaddr *addrs[] = { 436 const struct sockaddr *addrs[] = {(const struct sockaddr *) &sa};
467 (const struct sockaddr *) &sa 437 const socklen_t addrlens[] = {sizeof (sa)};
468 }; 438
469 const socklen_t addrlens[] = { 439 if ((GNUNET_OK != GNUNET_CONFIGURATION_get_value_number (cfg,
470 sizeof (sa) 440 section_name,
471 }; 441 "PORT",
472 442 &bnd_port)) ||
473 if ( (GNUNET_OK != 443 (bnd_port > 65535))
474 GNUNET_CONFIGURATION_get_value_number (cfg,
475 section_name,
476 "PORT",
477 &bnd_port)) ||
478 (bnd_port > 65535) )
479 { 444 {
480 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 445 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
481 _("Failed to find valid PORT in section `%s'\n"), 446 _ ("Failed to find valid PORT in section `%s'\n"),
482 section_name); 447 section_name);
483 return NULL; 448 return NULL;
484 } 449 }
@@ -499,67 +464,60 @@ GNUNET_NAT_AUTO_test_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
499 nh->status = GNUNET_NAT_ERROR_SUCCESS; 464 nh->status = GNUNET_NAT_ERROR_SUCCESS;
500 if (0 == bnd_port) 465 if (0 == bnd_port)
501 { 466 {
502 nh->nat 467 nh->nat = GNUNET_NAT_register (cfg,
503 = GNUNET_NAT_register (cfg, 468 section_name,
504 section_name, 469 proto,
505 proto, 470 0,
506 0, NULL, NULL, 471 NULL,
507 &addr_cb, 472 NULL,
508 &reversal_cb, 473 &addr_cb,
509 nh); 474 &reversal_cb,
475 nh);
510 } 476 }
511 else 477 else
512 { 478 {
513 nh->lsock 479 nh->lsock =
514 = GNUNET_NETWORK_socket_create (AF_INET, 480 GNUNET_NETWORK_socket_create (AF_INET,
515 (IPPROTO_UDP == proto) 481 (IPPROTO_UDP == proto) ? SOCK_DGRAM
516 ? SOCK_DGRAM 482 : SOCK_STREAM,
517 : SOCK_STREAM, 483 proto);
518 proto); 484 if ((NULL == nh->lsock) ||
519 if ( (NULL == nh->lsock) || 485 (GNUNET_OK != GNUNET_NETWORK_socket_bind (nh->lsock,
520 (GNUNET_OK != 486 (const struct sockaddr *) &sa,
521 GNUNET_NETWORK_socket_bind (nh->lsock, 487 sizeof (sa))))
522 (const struct sockaddr *) &sa,
523 sizeof (sa))))
524 { 488 {
525 LOG (GNUNET_ERROR_TYPE_ERROR, 489 LOG (GNUNET_ERROR_TYPE_ERROR,
526 _("Failed to create socket bound to `%s' for NAT test: %s\n"), 490 _ ("Failed to create socket bound to `%s' for NAT test: %s\n"),
527 GNUNET_a2s ((const struct sockaddr *) &sa, 491 GNUNET_a2s ((const struct sockaddr *) &sa, sizeof (sa)),
528 sizeof (sa)), 492 strerror (errno));
529 STRERROR (errno));
530 if (NULL != nh->lsock) 493 if (NULL != nh->lsock)
531 { 494 {
532 GNUNET_NETWORK_socket_close (nh->lsock); 495 GNUNET_NETWORK_socket_close (nh->lsock);
533 nh->lsock = NULL; 496 nh->lsock = NULL;
534 } 497 }
535 nh->status = GNUNET_NAT_ERROR_INTERNAL_NETWORK_ERROR; 498 nh->status = GNUNET_NAT_ERROR_INTERNAL_NETWORK_ERROR;
536 nh->ttask = GNUNET_SCHEDULER_add_now (&do_fail, 499 nh->ttask = GNUNET_SCHEDULER_add_now (&do_fail, nh);
537 nh);
538 return nh; 500 return nh;
539 } 501 }
540 if (IPPROTO_TCP == proto) 502 if (IPPROTO_TCP == proto)
541 { 503 {
542 GNUNET_break (GNUNET_OK == 504 GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_listen (nh->lsock, 5));
543 GNUNET_NETWORK_socket_listen (nh->lsock, 505 nh->ltask = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
544 5)); 506 nh->lsock,
545 nh->ltask = 507 &do_accept,
546 GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, 508 nh);
547 nh->lsock,
548 &do_accept,
549 nh);
550 } 509 }
551 else 510 else
552 { 511 {
553 nh->ltask = 512 nh->ltask = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
554 GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, 513 nh->lsock,
555 nh->lsock, 514 &do_udp_read,
556 &do_udp_read, 515 nh);
557 nh);
558 } 516 }
559 LOG (GNUNET_ERROR_TYPE_INFO, 517 LOG (GNUNET_ERROR_TYPE_INFO,
560 "NAT test listens on port %llu (%s)\n", 518 "NAT test listens on port %llu (%s)\n",
561 bnd_port, 519 bnd_port,
562 (IPPROTO_TCP == proto) ? "tcp" : "udp"); 520 (IPPROTO_TCP == proto) ? "tcp" : "udp");
563 nh->nat = GNUNET_NAT_register (cfg, 521 nh->nat = GNUNET_NAT_register (cfg,
564 section_name, 522 section_name,
565 proto, 523 proto,
@@ -572,7 +530,7 @@ GNUNET_NAT_AUTO_test_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
572 if (NULL == nh->nat) 530 if (NULL == nh->nat)
573 { 531 {
574 LOG (GNUNET_ERROR_TYPE_INFO, 532 LOG (GNUNET_ERROR_TYPE_INFO,
575 _("NAT test failed to start NAT library\n")); 533 _ ("NAT test failed to start NAT library\n"));
576 if (NULL != nh->ltask) 534 if (NULL != nh->ltask)
577 { 535 {
578 GNUNET_SCHEDULER_cancel (nh->ltask); 536 GNUNET_SCHEDULER_cancel (nh->ltask);
@@ -584,8 +542,7 @@ GNUNET_NAT_AUTO_test_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
584 nh->lsock = NULL; 542 nh->lsock = NULL;
585 } 543 }
586 nh->status = GNUNET_NAT_ERROR_NAT_REGISTER_FAILED; 544 nh->status = GNUNET_NAT_ERROR_NAT_REGISTER_FAILED;
587 nh->ttask = GNUNET_SCHEDULER_add_now (&do_fail, 545 nh->ttask = GNUNET_SCHEDULER_add_now (&do_fail, nh);
588 nh);
589 return nh; 546 return nh;
590 } 547 }
591 } 548 }
@@ -604,21 +561,16 @@ GNUNET_NAT_AUTO_test_stop (struct GNUNET_NAT_AUTO_Test *tst)
604 struct NatActivity *pos; 561 struct NatActivity *pos;
605 struct ClientActivity *cpos; 562 struct ClientActivity *cpos;
606 563
607 LOG (GNUNET_ERROR_TYPE_DEBUG, 564 LOG (GNUNET_ERROR_TYPE_DEBUG, "Stopping NAT test\n");
608 "Stopping NAT test\n");
609 while (NULL != (cpos = tst->ca_head)) 565 while (NULL != (cpos = tst->ca_head))
610 { 566 {
611 GNUNET_CONTAINER_DLL_remove (tst->ca_head, 567 GNUNET_CONTAINER_DLL_remove (tst->ca_head, tst->ca_tail, cpos);
612 tst->ca_tail,
613 cpos);
614 GNUNET_MQ_destroy (cpos->mq); 568 GNUNET_MQ_destroy (cpos->mq);
615 GNUNET_free (cpos); 569 GNUNET_free (cpos);
616 } 570 }
617 while (NULL != (pos = tst->na_head)) 571 while (NULL != (pos = tst->na_head))
618 { 572 {
619 GNUNET_CONTAINER_DLL_remove (tst->na_head, 573 GNUNET_CONTAINER_DLL_remove (tst->na_head, tst->na_tail, pos);
620 tst->na_tail,
621 pos);
622 GNUNET_SCHEDULER_cancel (pos->rtask); 574 GNUNET_SCHEDULER_cancel (pos->rtask);
623 GNUNET_NETWORK_socket_close (pos->sock); 575 GNUNET_NETWORK_socket_close (pos->sock);
624 GNUNET_free (pos); 576 GNUNET_free (pos);