summaryrefslogtreecommitdiff
path: root/src/nat-auto/gnunet-nat-auto_legacy.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nat-auto/gnunet-nat-auto_legacy.c')
-rw-r--r--src/nat-auto/gnunet-nat-auto_legacy.c208
1 files changed, 80 insertions, 128 deletions
diff --git a/src/nat-auto/gnunet-nat-auto_legacy.c b/src/nat-auto/gnunet-nat-auto_legacy.c
index 4a24223fd..93b544343 100644
--- a/src/nat-auto/gnunet-nat-auto_legacy.c
+++ b/src/nat-auto/gnunet-nat-auto_legacy.c
@@ -28,9 +28,10 @@
28#include "gnunet_nat_lib.h" 28#include "gnunet_nat_lib.h"
29#include "nat.h" 29#include "nat.h"
30 30
31#define LOG(kind,...) GNUNET_log_from (kind, "nat", __VA_ARGS__) 31#define LOG(kind, ...) GNUNET_log_from (kind, "nat", __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_Test *h; 91 struct GNUNET_NAT_Test *h;
91
92}; 92};
93 93
94 94
@@ -184,9 +184,7 @@ struct GNUNET_NAT_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_Test *h = cls; 189 struct GNUNET_NAT_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_Test *tst = ca->h; 325 struct GNUNET_NAT_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}
@@ -379,15 +356,13 @@ addr_cb (void *cls,
379 if (addrlen != sizeof (struct sockaddr_in)) 356 if (addrlen != sizeof (struct sockaddr_in))
380 { 357 {
381 LOG (GNUNET_ERROR_TYPE_DEBUG, 358 LOG (GNUNET_ERROR_TYPE_DEBUG,
382 "NAT test ignores IPv6 address `%s' returned from NAT library\n", 359 "NAT test ignores IPv6 address `%s' returned from NAT library\n",
383 GNUNET_a2s (addr, 360 GNUNET_a2s (addr, addrlen));
384 addrlen)); 361 return; /* ignore IPv6 here */
385 return; /* ignore IPv6 here */
386 } 362 }
387 LOG (GNUNET_ERROR_TYPE_INFO, 363 LOG (GNUNET_ERROR_TYPE_INFO,
388 "Asking gnunet-nat-server to connect to `%s'\n", 364 "Asking gnunet-nat-server to connect to `%s'\n",
389 GNUNET_a2s (addr, 365 GNUNET_a2s (addr, addrlen));
390 addrlen));
391 366
392 ca = GNUNET_new (struct ClientActivity); 367 ca = GNUNET_new (struct ClientActivity);
393 ca->h = h; 368 ca->h = h;
@@ -400,21 +375,17 @@ addr_cb (void *cls,
400 { 375 {
401 GNUNET_free (ca); 376 GNUNET_free (ca);
402 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 377 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
403 _("Failed to connect to `gnunet-nat-server'\n")); 378 _ ("Failed to connect to `gnunet-nat-server'\n"));
404 return; 379 return;
405 } 380 }
406 GNUNET_CONTAINER_DLL_insert (h->ca_head, 381 GNUNET_CONTAINER_DLL_insert (h->ca_head, h->ca_tail, ca);
407 h->ca_tail,
408 ca);
409 sa = (const struct sockaddr_in *) addr; 382 sa = (const struct sockaddr_in *) addr;
410 env = GNUNET_MQ_msg (msg, 383 env = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_NAT_TEST);
411 GNUNET_MESSAGE_TYPE_NAT_TEST);
412 msg->dst_ipv4 = sa->sin_addr.s_addr; 384 msg->dst_ipv4 = sa->sin_addr.s_addr;
413 msg->dport = sa->sin_port; 385 msg->dport = sa->sin_port;
414 msg->data = h->data; 386 msg->data = h->data;
415 msg->is_tcp = htonl ((uint32_t) h->is_tcp); 387 msg->is_tcp = htonl ((uint32_t) h->is_tcp);
416 GNUNET_MQ_send (ca->mq, 388 GNUNET_MQ_send (ca->mq, env);
417 env);
418} 389}
419 390
420 391
@@ -434,8 +405,8 @@ do_timeout (void *cls)
434 nh->ttask = NULL; 405 nh->ttask = NULL;
435 nh->report (nh->report_cls, 406 nh->report (nh->report_cls,
436 (GNUNET_NAT_ERROR_SUCCESS == nh->status) 407 (GNUNET_NAT_ERROR_SUCCESS == nh->status)
437 ? GNUNET_NAT_ERROR_TIMEOUT 408 ? GNUNET_NAT_ERROR_TIMEOUT
438 : nh->status); 409 : nh->status);
439} 410}
440 411
441 412
@@ -465,12 +436,8 @@ GNUNET_NAT_test_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
465{ 436{
466 struct GNUNET_NAT_Test *nh; 437 struct GNUNET_NAT_Test *nh;
467 struct sockaddr_in sa; 438 struct sockaddr_in sa;
468 const struct sockaddr *addrs[] = { 439 const struct sockaddr *addrs[] = {(const struct sockaddr *) &sa};
469 (const struct sockaddr *) &sa 440 const socklen_t addrlens[] = {sizeof (sa)};
470 };
471 const socklen_t addrlens[] = {
472 sizeof (sa)
473 };
474 441
475 memset (&sa, 0, sizeof (sa)); 442 memset (&sa, 0, sizeof (sa));
476 sa.sin_family = AF_INET; 443 sa.sin_family = AF_INET;
@@ -489,69 +456,62 @@ GNUNET_NAT_test_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
489 nh->status = GNUNET_NAT_ERROR_SUCCESS; 456 nh->status = GNUNET_NAT_ERROR_SUCCESS;
490 if (0 == bnd_port) 457 if (0 == bnd_port)
491 { 458 {
492 nh->nat 459 nh->nat = GNUNET_NAT_register (cfg,
493 = GNUNET_NAT_register (cfg, 460 is_tcp,
494 is_tcp, 461 0,
495 0, 462 0,
496 0, 463 NULL,
497 NULL, 464 NULL,
498 NULL, 465 &addr_cb,
499 &addr_cb, 466 &reversal_cb,
500 &reversal_cb, 467 nh,
501 nh, 468 NULL);
502 NULL);
503 } 469 }
504 else 470 else
505 { 471 {
506 nh->lsock = 472 nh->lsock =
507 GNUNET_NETWORK_socket_create (AF_INET, 473 GNUNET_NETWORK_socket_create (AF_INET,
508 (is_tcp == 474 (is_tcp == GNUNET_YES) ? SOCK_STREAM
509 GNUNET_YES) ? SOCK_STREAM : SOCK_DGRAM, 475 : SOCK_DGRAM,
510 0); 476 0);
511 if ((nh->lsock == NULL) || 477 if ((nh->lsock == NULL) ||
512 (GNUNET_OK != 478 (GNUNET_OK != GNUNET_NETWORK_socket_bind (nh->lsock,
513 GNUNET_NETWORK_socket_bind (nh->lsock, 479 (const struct sockaddr *) &sa,
514 (const struct sockaddr *) &sa, 480 sizeof (sa))))
515 sizeof (sa))))
516 { 481 {
517 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 482 GNUNET_log (
518 _("Failed to create listen socket bound to `%s' for NAT test: %s\n"), 483 GNUNET_ERROR_TYPE_ERROR,
519 GNUNET_a2s ((const struct sockaddr *) &sa, 484 _ ("Failed to create listen socket bound to `%s' for NAT test: %s\n"),
520 sizeof (sa)), 485 GNUNET_a2s ((const struct sockaddr *) &sa, sizeof (sa)),
521 STRERROR (errno)); 486 strerror (errno));
522 if (NULL != nh->lsock) 487 if (NULL != nh->lsock)
523 { 488 {
524 GNUNET_NETWORK_socket_close (nh->lsock); 489 GNUNET_NETWORK_socket_close (nh->lsock);
525 nh->lsock = NULL; 490 nh->lsock = NULL;
526 } 491 }
527 nh->status = GNUNET_NAT_ERROR_INTERNAL_NETWORK_ERROR; 492 nh->status = GNUNET_NAT_ERROR_INTERNAL_NETWORK_ERROR;
528 nh->ttask = GNUNET_SCHEDULER_add_now (&do_timeout, 493 nh->ttask = GNUNET_SCHEDULER_add_now (&do_timeout, nh);
529 nh);
530 return nh; 494 return nh;
531 } 495 }
532 if (GNUNET_YES == is_tcp) 496 if (GNUNET_YES == is_tcp)
533 { 497 {
534 GNUNET_break (GNUNET_OK == 498 GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_listen (nh->lsock, 5));
535 GNUNET_NETWORK_socket_listen (nh->lsock, 499 nh->ltask = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
536 5)); 500 nh->lsock,
537 nh->ltask = 501 &do_accept,
538 GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, 502 nh);
539 nh->lsock,
540 &do_accept,
541 nh);
542 } 503 }
543 else 504 else
544 { 505 {
545 nh->ltask = 506 nh->ltask = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
546 GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, 507 nh->lsock,
547 nh->lsock, 508 &do_udp_read,
548 &do_udp_read, 509 nh);
549 nh);
550 } 510 }
551 LOG (GNUNET_ERROR_TYPE_INFO, 511 LOG (GNUNET_ERROR_TYPE_INFO,
552 "NAT test listens on port %u (%s)\n", 512 "NAT test listens on port %u (%s)\n",
553 bnd_port, 513 bnd_port,
554 (GNUNET_YES == is_tcp) ? "tcp" : "udp"); 514 (GNUNET_YES == is_tcp) ? "tcp" : "udp");
555 nh->nat = GNUNET_NAT_register (cfg, 515 nh->nat = GNUNET_NAT_register (cfg,
556 is_tcp, 516 is_tcp,
557 adv_port, 517 adv_port,
@@ -565,7 +525,7 @@ GNUNET_NAT_test_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
565 if (NULL == nh->nat) 525 if (NULL == nh->nat)
566 { 526 {
567 LOG (GNUNET_ERROR_TYPE_INFO, 527 LOG (GNUNET_ERROR_TYPE_INFO,
568 _("NAT test failed to start NAT library\n")); 528 _ ("NAT test failed to start NAT library\n"));
569 if (NULL != nh->ltask) 529 if (NULL != nh->ltask)
570 { 530 {
571 GNUNET_SCHEDULER_cancel (nh->ltask); 531 GNUNET_SCHEDULER_cancel (nh->ltask);
@@ -577,14 +537,11 @@ GNUNET_NAT_test_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
577 nh->lsock = NULL; 537 nh->lsock = NULL;
578 } 538 }
579 nh->status = GNUNET_NAT_ERROR_NAT_REGISTER_FAILED; 539 nh->status = GNUNET_NAT_ERROR_NAT_REGISTER_FAILED;
580 nh->ttask = GNUNET_SCHEDULER_add_now (&do_timeout, 540 nh->ttask = GNUNET_SCHEDULER_add_now (&do_timeout, nh);
581 nh);
582 return nh; 541 return nh;
583 } 542 }
584 } 543 }
585 nh->ttask = GNUNET_SCHEDULER_add_delayed (timeout, 544 nh->ttask = GNUNET_SCHEDULER_add_delayed (timeout, &do_timeout, nh);
586 &do_timeout,
587 nh);
588 return nh; 545 return nh;
589} 546}
590 547
@@ -600,21 +557,16 @@ GNUNET_NAT_test_stop (struct GNUNET_NAT_Test *tst)
600 struct NatActivity *pos; 557 struct NatActivity *pos;
601 struct ClientActivity *cpos; 558 struct ClientActivity *cpos;
602 559
603 LOG (GNUNET_ERROR_TYPE_DEBUG, 560 LOG (GNUNET_ERROR_TYPE_DEBUG, "Stopping NAT test\n");
604 "Stopping NAT test\n");
605 while (NULL != (cpos = tst->ca_head)) 561 while (NULL != (cpos = tst->ca_head))
606 { 562 {
607 GNUNET_CONTAINER_DLL_remove (tst->ca_head, 563 GNUNET_CONTAINER_DLL_remove (tst->ca_head, tst->ca_tail, cpos);
608 tst->ca_tail,
609 cpos);
610 GNUNET_MQ_destroy (cpos->mq); 564 GNUNET_MQ_destroy (cpos->mq);
611 GNUNET_free (cpos); 565 GNUNET_free (cpos);
612 } 566 }
613 while (NULL != (pos = tst->na_head)) 567 while (NULL != (pos = tst->na_head))
614 { 568 {
615 GNUNET_CONTAINER_DLL_remove (tst->na_head, 569 GNUNET_CONTAINER_DLL_remove (tst->na_head, tst->na_tail, pos);
616 tst->na_tail,
617 pos);
618 GNUNET_SCHEDULER_cancel (pos->rtask); 570 GNUNET_SCHEDULER_cancel (pos->rtask);
619 GNUNET_NETWORK_socket_close (pos->sock); 571 GNUNET_NETWORK_socket_close (pos->sock);
620 GNUNET_free (pos); 572 GNUNET_free (pos);