diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2013-06-27 10:01:08 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2013-06-27 10:01:08 +0000 |
commit | 4ff166c7c0910db7efcffb5023218dac0038b31d (patch) | |
tree | fdb4652bed297c8b0858eb8ff7a904e8d7c8ddec /src/transport/plugin_transport_udp.c | |
parent | b5f7f58e273a0e270586a378cb81ede568ff71b1 (diff) | |
download | gnunet-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.c | 109 |
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 | */ | ||
401 | static 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 | */ |
389 | struct Plugin * plugin; | 407 | struct 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"); |