aboutsummaryrefslogtreecommitdiff
path: root/src/transport/plugin_transport_udp.c
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2013-06-27 10:01:08 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2013-06-27 10:01:08 +0000
commit4ff166c7c0910db7efcffb5023218dac0038b31d (patch)
treefdb4652bed297c8b0858eb8ff7a904e8d7c8ddec /src/transport/plugin_transport_udp.c
parentb5f7f58e273a0e270586a378cb81ede568ff71b1 (diff)
downloadgnunet-4ff166c7c0910db7efcffb5023218dac0038b31d.tar.gz
gnunet-4ff166c7c0910db7efcffb5023218dac0038b31d.zip
added options field to addresses
fixed stack allocation problem when converting string to address
Diffstat (limited to 'src/transport/plugin_transport_udp.c')
-rw-r--r--src/transport/plugin_transport_udp.c109
1 files changed, 97 insertions, 12 deletions
diff --git a/src/transport/plugin_transport_udp.c b/src/transport/plugin_transport_udp.c
index c0077b26c..078946f0a 100644
--- a/src/transport/plugin_transport_udp.c
+++ b/src/transport/plugin_transport_udp.c
@@ -42,6 +42,7 @@
42 42
43#define LOG(kind,...) GNUNET_log_from (kind, "transport-udp", __VA_ARGS__) 43#define LOG(kind,...) GNUNET_log_from (kind, "transport-udp", __VA_ARGS__)
44 44
45#define PLUGIN_NAME "udp"
45 46
46/** 47/**
47 * Number of messages we can defragment in parallel. We only really 48 * Number of messages we can defragment in parallel. We only really
@@ -81,6 +82,17 @@ struct PrettyPrinterContext
81 * Port to add after the IP address. 82 * Port to add after the IP address.
82 */ 83 */
83 uint16_t port; 84 uint16_t port;
85
86 /**
87 * IPv6 address
88 */
89
90 int ipv6;
91
92 /**
93 * Options
94 */
95 uint32_t options;
84}; 96};
85 97
86 98
@@ -384,6 +396,12 @@ struct UDP_ACK_Message
384}; 396};
385 397
386/** 398/**
399 * Address options
400 */
401static uint32_t myoptions;
402
403
404/**
387 * Encapsulation of all of the state of the plugin. 405 * Encapsulation of all of the state of the plugin.
388 */ 406 */
389struct Plugin * plugin; 407struct Plugin * plugin;
@@ -506,11 +524,14 @@ udp_address_to_string (void *cls, const void *addr, size_t addrlen)
506 const struct IPv6UdpAddress *t6; 524 const struct IPv6UdpAddress *t6;
507 int af; 525 int af;
508 uint16_t port; 526 uint16_t port;
527 uint32_t options;
509 528
529 options = 0;
510 if (addrlen == sizeof (struct IPv6UdpAddress)) 530 if (addrlen == sizeof (struct IPv6UdpAddress))
511 { 531 {
512 t6 = addr; 532 t6 = addr;
513 af = AF_INET6; 533 af = AF_INET6;
534 options = ntohl (t6->options);
514 port = ntohs (t6->u6_port); 535 port = ntohs (t6->u6_port);
515 memcpy (&a6, &t6->ipv6_addr, sizeof (a6)); 536 memcpy (&a6, &t6->ipv6_addr, sizeof (a6));
516 sb = &a6; 537 sb = &a6;
@@ -519,6 +540,7 @@ udp_address_to_string (void *cls, const void *addr, size_t addrlen)
519 { 540 {
520 t4 = addr; 541 t4 = addr;
521 af = AF_INET; 542 af = AF_INET;
543 options = ntohl (t4->options);
522 port = ntohs (t4->u4_port); 544 port = ntohs (t4->u4_port);
523 memcpy (&a4, &t4->ipv4_addr, sizeof (a4)); 545 memcpy (&a4, &t4->ipv4_addr, sizeof (a4));
524 sb = &a4; 546 sb = &a4;
@@ -529,8 +551,9 @@ udp_address_to_string (void *cls, const void *addr, size_t addrlen)
529 return NULL; 551 return NULL;
530 } 552 }
531 inet_ntop (af, sb, buf, INET6_ADDRSTRLEN); 553 inet_ntop (af, sb, buf, INET6_ADDRSTRLEN);
532 GNUNET_snprintf (rbuf, sizeof (rbuf), (af == AF_INET6) ? "[%s]:%u" : "%s:%u", 554
533 buf, port); 555 GNUNET_snprintf (rbuf, sizeof (rbuf), (af == AF_INET6) ? "%s.%u.[%s]:%u" : "%s.%u.%s:%u",
556 PLUGIN_NAME, options, buf, port);
534 return rbuf; 557 return rbuf;
535} 558}
536 559
@@ -552,29 +575,62 @@ udp_string_to_address (void *cls, const char *addr, uint16_t addrlen,
552 void **buf, size_t *added) 575 void **buf, size_t *added)
553{ 576{
554 struct sockaddr_storage socket_address; 577 struct sockaddr_storage socket_address;
555 578 char *address;
556 if ((NULL == addr) || (0 == addrlen)) 579 char *plugin;
580 char *optionstr;
581 uint32_t options;
582
583 /* Format tcp.options.address:port */
584 address = NULL;
585 plugin = NULL;
586 optionstr = NULL;
587 options = 0;
588 if ((NULL == addr) || (addrlen == 0))
557 { 589 {
558 GNUNET_break (0); 590 GNUNET_break (0);
559 return GNUNET_SYSERR; 591 return GNUNET_SYSERR;
560 } 592 }
561
562 if ('\0' != addr[addrlen - 1]) 593 if ('\0' != addr[addrlen - 1])
563 { 594 {
595 GNUNET_break (0);
564 return GNUNET_SYSERR; 596 return GNUNET_SYSERR;
565 } 597 }
566
567 if (strlen (addr) != addrlen - 1) 598 if (strlen (addr) != addrlen - 1)
568 { 599 {
600 GNUNET_break (0);
569 return GNUNET_SYSERR; 601 return GNUNET_SYSERR;
570 } 602 }
603 plugin = GNUNET_strdup (addr);
604 optionstr = strchr (plugin, '.');
605 if (NULL == optionstr)
606 {
607 GNUNET_break (0);
608 GNUNET_free (plugin);
609 return GNUNET_SYSERR;
610 }
611 optionstr[0] = '\0';
612 optionstr ++;
613 options = atol (optionstr);
614 address = strchr (optionstr, '.');
615 if (NULL == address)
616 {
617 GNUNET_break (0);
618 GNUNET_free (plugin);
619 return GNUNET_SYSERR;
620 }
621 address[0] = '\0';
622 address ++;
571 623
572 if (GNUNET_OK != GNUNET_STRINGS_to_address_ip (addr, strlen (addr), 624 if (GNUNET_OK !=
573 &socket_address)) 625 GNUNET_STRINGS_to_address_ip (address, strlen (address),
626 &socket_address))
574 { 627 {
628 GNUNET_break (0);
575 return GNUNET_SYSERR; 629 return GNUNET_SYSERR;
576 } 630 }
577 631
632 GNUNET_free (plugin);
633
578 switch (socket_address.ss_family) 634 switch (socket_address.ss_family)
579 { 635 {
580 case AF_INET: 636 case AF_INET:
@@ -582,6 +638,7 @@ udp_string_to_address (void *cls, const char *addr, uint16_t addrlen,
582 struct IPv4UdpAddress *u4; 638 struct IPv4UdpAddress *u4;
583 struct sockaddr_in *in4 = (struct sockaddr_in *) &socket_address; 639 struct sockaddr_in *in4 = (struct sockaddr_in *) &socket_address;
584 u4 = GNUNET_malloc (sizeof (struct IPv4UdpAddress)); 640 u4 = GNUNET_malloc (sizeof (struct IPv4UdpAddress));
641 u4->options = htonl (options);
585 u4->ipv4_addr = in4->sin_addr.s_addr; 642 u4->ipv4_addr = in4->sin_addr.s_addr;
586 u4->u4_port = in4->sin_port; 643 u4->u4_port = in4->sin_port;
587 *buf = u4; 644 *buf = u4;
@@ -593,6 +650,7 @@ udp_string_to_address (void *cls, const char *addr, uint16_t addrlen,
593 struct IPv6UdpAddress *u6; 650 struct IPv6UdpAddress *u6;
594 struct sockaddr_in6 *in6 = (struct sockaddr_in6 *) &socket_address; 651 struct sockaddr_in6 *in6 = (struct sockaddr_in6 *) &socket_address;
595 u6 = GNUNET_malloc (sizeof (struct IPv6UdpAddress)); 652 u6 = GNUNET_malloc (sizeof (struct IPv6UdpAddress));
653 u6->options = htonl (options);
596 u6->ipv6_addr = in6->sin6_addr; 654 u6->ipv6_addr = in6->sin6_addr;
597 u6->u6_port = in6->sin6_port; 655 u6->u6_port = in6->sin6_port;
598 *buf = u6; 656 *buf = u6;
@@ -624,7 +682,10 @@ append_port (void *cls, const char *hostname)
624 GNUNET_free (ppc); 682 GNUNET_free (ppc);
625 return; 683 return;
626 } 684 }
627 GNUNET_asprintf (&ret, "%s:%d", hostname, ppc->port); 685 if (GNUNET_YES == ppc->ipv6)
686 GNUNET_asprintf (&ret, "%s.%u.[%s]:%d", PLUGIN_NAME, ppc->options, hostname, ppc->port);
687 else
688 GNUNET_asprintf (&ret, "%s.%u.%s:%d", PLUGIN_NAME, ppc->options, hostname, ppc->port);
628 ppc->asc (ppc->asc_cls, ret); 689 ppc->asc (ppc->asc_cls, ret);
629 GNUNET_free (ret); 690 GNUNET_free (ret);
630} 691}
@@ -660,7 +721,9 @@ udp_plugin_address_pretty_printer (void *cls, const char *type,
660 const struct IPv4UdpAddress *u4; 721 const struct IPv4UdpAddress *u4;
661 const struct IPv6UdpAddress *u6; 722 const struct IPv6UdpAddress *u6;
662 uint16_t port; 723 uint16_t port;
724 uint32_t options;
663 725
726 options = 0;
664 if (addrlen == sizeof (struct IPv6UdpAddress)) 727 if (addrlen == sizeof (struct IPv6UdpAddress))
665 { 728 {
666 u6 = addr; 729 u6 = addr;
@@ -672,6 +735,7 @@ udp_plugin_address_pretty_printer (void *cls, const char *type,
672 a6.sin6_port = u6->u6_port; 735 a6.sin6_port = u6->u6_port;
673 memcpy (&a6.sin6_addr, &u6->ipv6_addr, sizeof (struct in6_addr)); 736 memcpy (&a6.sin6_addr, &u6->ipv6_addr, sizeof (struct in6_addr));
674 port = ntohs (u6->u6_port); 737 port = ntohs (u6->u6_port);
738 options = ntohl (u6->options);
675 sb = &a6; 739 sb = &a6;
676 sbs = sizeof (a6); 740 sbs = sizeof (a6);
677 } 741 }
@@ -686,6 +750,7 @@ udp_plugin_address_pretty_printer (void *cls, const char *type,
686 a4.sin_port = u4->u4_port; 750 a4.sin_port = u4->u4_port;
687 a4.sin_addr.s_addr = u4->ipv4_addr; 751 a4.sin_addr.s_addr = u4->ipv4_addr;
688 port = ntohs (u4->u4_port); 752 port = ntohs (u4->u4_port);
753 options = ntohl (u4->options);
689 sb = &a4; 754 sb = &a4;
690 sbs = sizeof (a4); 755 sbs = sizeof (a4);
691 } 756 }
@@ -706,6 +771,11 @@ udp_plugin_address_pretty_printer (void *cls, const char *type,
706 ppc->asc = asc; 771 ppc->asc = asc;
707 ppc->asc_cls = asc_cls; 772 ppc->asc_cls = asc_cls;
708 ppc->port = port; 773 ppc->port = port;
774 ppc->options = options;
775 if (addrlen == sizeof (struct IPv6UdpAddress))
776 ppc->ipv6 = GNUNET_YES;
777 else
778 ppc->ipv6 = GNUNET_NO;
709 GNUNET_RESOLVER_hostname_get (sb, sbs, !numeric, timeout, &append_port, ppc); 779 GNUNET_RESOLVER_hostname_get (sb, sbs, !numeric, timeout, &append_port, ppc);
710} 780}
711 781
@@ -1382,7 +1452,11 @@ udp_plugin_get_session (void *cls,
1382 ((address->address_length != sizeof (struct IPv4UdpAddress)) && 1452 ((address->address_length != sizeof (struct IPv4UdpAddress)) &&
1383 (address->address_length != sizeof (struct IPv6UdpAddress)))) 1453 (address->address_length != sizeof (struct IPv6UdpAddress))))
1384 { 1454 {
1385 GNUNET_break (0); 1455 LOG (GNUNET_ERROR_TYPE_WARNING,
1456 _("Trying to create session for address of unexpected length %u (should be %u or %u)\n"),
1457 address->address_length,
1458 sizeof (struct IPv4UdpAddress),
1459 sizeof (struct IPv6UdpAddress));
1386 return NULL; 1460 return NULL;
1387 } 1461 }
1388 1462
@@ -1687,18 +1761,22 @@ udp_nat_port_map_callback (void *cls, int add_remove,
1687 { 1761 {
1688 case AF_INET: 1762 case AF_INET:
1689 GNUNET_assert (addrlen == sizeof (struct sockaddr_in)); 1763 GNUNET_assert (addrlen == sizeof (struct sockaddr_in));
1764 memset (&u4, 0, sizeof (u4));
1765 u4.options = htonl(myoptions);
1690 u4.ipv4_addr = ((struct sockaddr_in *) addr)->sin_addr.s_addr; 1766 u4.ipv4_addr = ((struct sockaddr_in *) addr)->sin_addr.s_addr;
1691 u4.u4_port = ((struct sockaddr_in *) addr)->sin_port; 1767 u4.u4_port = ((struct sockaddr_in *) addr)->sin_port;
1692 arg = &u4; 1768 arg = &u4;
1693 args = sizeof (u4); 1769 args = sizeof (struct IPv4UdpAddress);
1694 break; 1770 break;
1695 case AF_INET6: 1771 case AF_INET6:
1696 GNUNET_assert (addrlen == sizeof (struct sockaddr_in6)); 1772 GNUNET_assert (addrlen == sizeof (struct sockaddr_in6));
1773 memset (&u4, 0, sizeof (u4));
1774 u6.options = htonl(myoptions);
1697 memcpy (&u6.ipv6_addr, &((struct sockaddr_in6 *) addr)->sin6_addr, 1775 memcpy (&u6.ipv6_addr, &((struct sockaddr_in6 *) addr)->sin6_addr,
1698 sizeof (struct in6_addr)); 1776 sizeof (struct in6_addr));
1699 u6.u6_port = ((struct sockaddr_in6 *) addr)->sin6_port; 1777 u6.u6_port = ((struct sockaddr_in6 *) addr)->sin6_port;
1700 arg = &u6; 1778 arg = &u6;
1701 args = sizeof (u6); 1779 args = sizeof (struct IPv6UdpAddress);
1702 break; 1780 break;
1703 default: 1781 default:
1704 GNUNET_break (0); 1782 GNUNET_break (0);
@@ -1788,6 +1866,8 @@ process_udp_message (struct Plugin *plugin, const struct UDPMessage *msg,
1788 { 1866 {
1789 case AF_INET: 1867 case AF_INET:
1790 GNUNET_assert (sender_addr_len == sizeof (struct sockaddr_in)); 1868 GNUNET_assert (sender_addr_len == sizeof (struct sockaddr_in));
1869 memset (&u4, 0, sizeof (u4));
1870 u6.options = htonl (0);
1791 u4.ipv4_addr = ((struct sockaddr_in *) sender_addr)->sin_addr.s_addr; 1871 u4.ipv4_addr = ((struct sockaddr_in *) sender_addr)->sin_addr.s_addr;
1792 u4.u4_port = ((struct sockaddr_in *) sender_addr)->sin_port; 1872 u4.u4_port = ((struct sockaddr_in *) sender_addr)->sin_port;
1793 arg = &u4; 1873 arg = &u4;
@@ -1795,6 +1875,8 @@ process_udp_message (struct Plugin *plugin, const struct UDPMessage *msg,
1795 break; 1875 break;
1796 case AF_INET6: 1876 case AF_INET6:
1797 GNUNET_assert (sender_addr_len == sizeof (struct sockaddr_in6)); 1877 GNUNET_assert (sender_addr_len == sizeof (struct sockaddr_in6));
1878 memset (&u6, 0, sizeof (u6));
1879 u6.options = htonl (0);
1798 u6.ipv6_addr = ((struct sockaddr_in6 *) sender_addr)->sin6_addr; 1880 u6.ipv6_addr = ((struct sockaddr_in6 *) sender_addr)->sin6_addr;
1799 u6.u6_port = ((struct sockaddr_in6 *) sender_addr)->sin6_port; 1881 u6.u6_port = ((struct sockaddr_in6 *) sender_addr)->sin6_port;
1800 arg = &u6; 1882 arg = &u6;
@@ -2811,6 +2893,9 @@ libgnunet_plugin_transport_udp_init (void *cls)
2811 } 2893 }
2812 GNUNET_free_non_null (bind6_address); 2894 GNUNET_free_non_null (bind6_address);
2813 2895
2896 /* Initialize my flags */
2897 myoptions = 0;
2898
2814 /* Enable neighbour discovery */ 2899 /* Enable neighbour discovery */
2815 broadcast = GNUNET_CONFIGURATION_get_value_yesno (env->cfg, "transport-udp", 2900 broadcast = GNUNET_CONFIGURATION_get_value_yesno (env->cfg, "transport-udp",
2816 "BROADCAST"); 2901 "BROADCAST");