diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2013-05-14 15:50:59 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2013-05-14 15:50:59 +0000 |
commit | dd5ab5c9a766b8ee9bb7ddb42afe16a09c2428e0 (patch) | |
tree | 8f6369b14d22ecdad058cc517d05eba499e0010b | |
parent | b1ae539d58a10b6cb037cf0ddaf3fccb947e01e5 (diff) | |
download | gnunet-dd5ab5c9a766b8ee9bb7ddb42afe16a09c2428e0.tar.gz gnunet-dd5ab5c9a766b8ee9bb7ddb42afe16a09c2428e0.zip |
fixing udp bindto
-rw-r--r-- | src/transport/plugin_transport_udp.c | 67 | ||||
-rw-r--r-- | src/transport/test_transport_api_udp_peer1.conf | 2 | ||||
-rw-r--r-- | src/transport/test_transport_api_udp_peer2.conf | 2 |
3 files changed, 44 insertions, 27 deletions
diff --git a/src/transport/plugin_transport_udp.c b/src/transport/plugin_transport_udp.c index ea1b616a2..3605bfde0 100644 --- a/src/transport/plugin_transport_udp.c +++ b/src/transport/plugin_transport_udp.c | |||
@@ -2660,10 +2660,12 @@ udp_plugin_select_v6 (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
2660 | 2660 | ||
2661 | 2661 | ||
2662 | static int | 2662 | static int |
2663 | setup_sockets (struct Plugin *plugin, struct sockaddr_in6 *serverAddrv6, struct sockaddr_in *serverAddrv4) | 2663 | setup_sockets (struct Plugin *plugin, struct sockaddr_in6 *bind_v6, struct sockaddr_in *bind_v4) |
2664 | { | 2664 | { |
2665 | int tries; | 2665 | int tries; |
2666 | int sockets_created = 0; | 2666 | int sockets_created = 0; |
2667 | struct sockaddr_in6 serverAddrv6; | ||
2668 | struct sockaddr_in serverAddrv4; | ||
2667 | struct sockaddr *serverAddr; | 2669 | struct sockaddr *serverAddr; |
2668 | struct sockaddr *addrs[2]; | 2670 | struct sockaddr *addrs[2]; |
2669 | socklen_t addrlens[2]; | 2671 | socklen_t addrlens[2]; |
@@ -2681,24 +2683,27 @@ setup_sockets (struct Plugin *plugin, struct sockaddr_in6 *serverAddrv6, struct | |||
2681 | else | 2683 | else |
2682 | { | 2684 | { |
2683 | #if HAVE_SOCKADDR_IN_SIN_LEN | 2685 | #if HAVE_SOCKADDR_IN_SIN_LEN |
2684 | serverAddrv6->sin6_len = sizeof (struct sockaddr_in6); | 2686 | serverAddrv6.sin6_len = sizeof (struct sockaddr_in6); |
2685 | #endif | 2687 | #endif |
2686 | serverAddrv6->sin6_family = AF_INET6; | 2688 | serverAddrv6.sin6_family = AF_INET6; |
2687 | serverAddrv6->sin6_addr = in6addr_any; | 2689 | if (NULL != bind_v6) |
2688 | serverAddrv6->sin6_port = htons (plugin->port); | 2690 | serverAddrv6.sin6_addr = bind_v6->sin6_addr; |
2691 | else | ||
2692 | serverAddrv6.sin6_addr = in6addr_any; | ||
2693 | serverAddrv6.sin6_port = htons (plugin->port); | ||
2689 | addrlen = sizeof (struct sockaddr_in6); | 2694 | addrlen = sizeof (struct sockaddr_in6); |
2690 | serverAddr = (struct sockaddr *) serverAddrv6; | 2695 | serverAddr = (struct sockaddr *) &serverAddrv6; |
2691 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Binding to IPv6 port %d\n", | 2696 | LOG (GNUNET_ERROR_TYPE_INFO, "Binding to IPv6 `%s'\n", |
2692 | ntohs (serverAddrv6->sin6_port)); | 2697 | GNUNET_a2s (serverAddr, addrlen)); |
2693 | tries = 0; | 2698 | tries = 0; |
2694 | while (GNUNET_OK != GNUNET_NETWORK_socket_bind (plugin->sockv6, | 2699 | while (GNUNET_OK != GNUNET_NETWORK_socket_bind (plugin->sockv6, |
2695 | (struct sockaddr *) serverAddrv6, | 2700 | (struct sockaddr *) &serverAddrv6, |
2696 | addrlen)) | 2701 | addrlen)) |
2697 | { | 2702 | { |
2698 | serverAddrv6->sin6_port = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG, 33537) + 32000); /* Find a good, non-root port */ | 2703 | serverAddrv6.sin6_port = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG, 33537) + 32000); /* Find a good, non-root port */ |
2699 | LOG (GNUNET_ERROR_TYPE_DEBUG, | 2704 | LOG (GNUNET_ERROR_TYPE_DEBUG, |
2700 | "IPv6 Binding failed, trying new port %d\n", | 2705 | "IPv6 Binding failed, trying new port %d\n", |
2701 | ntohs (serverAddrv6->sin6_port)); | 2706 | ntohs (serverAddrv6.sin6_port)); |
2702 | tries++; | 2707 | tries++; |
2703 | if (tries > 10) | 2708 | if (tries > 10) |
2704 | { | 2709 | { |
@@ -2711,8 +2716,8 @@ setup_sockets (struct Plugin *plugin, struct sockaddr_in6 *serverAddrv6, struct | |||
2711 | { | 2716 | { |
2712 | LOG (GNUNET_ERROR_TYPE_DEBUG, | 2717 | LOG (GNUNET_ERROR_TYPE_DEBUG, |
2713 | "IPv6 socket created on port %d\n", | 2718 | "IPv6 socket created on port %d\n", |
2714 | ntohs (serverAddrv6->sin6_port)); | 2719 | ntohs (serverAddrv6.sin6_port)); |
2715 | addrs[sockets_created] = (struct sockaddr *) serverAddrv6; | 2720 | addrs[sockets_created] = (struct sockaddr *) &serverAddrv6; |
2716 | addrlens[sockets_created] = sizeof (struct sockaddr_in6); | 2721 | addrlens[sockets_created] = sizeof (struct sockaddr_in6); |
2717 | sockets_created++; | 2722 | sockets_created++; |
2718 | } | 2723 | } |
@@ -2728,23 +2733,26 @@ setup_sockets (struct Plugin *plugin, struct sockaddr_in6 *serverAddrv6, struct | |||
2728 | else | 2733 | else |
2729 | { | 2734 | { |
2730 | #if HAVE_SOCKADDR_IN_SIN_LEN | 2735 | #if HAVE_SOCKADDR_IN_SIN_LEN |
2731 | serverAddrv4->sin_len = sizeof (struct sockaddr_in); | 2736 | serverAddrv4.sin_len = sizeof (struct sockaddr_in); |
2732 | #endif | 2737 | #endif |
2733 | serverAddrv4->sin_family = AF_INET; | 2738 | serverAddrv4.sin_family = AF_INET; |
2734 | serverAddrv4->sin_addr.s_addr = INADDR_ANY; | 2739 | if (NULL != bind_v4) |
2735 | serverAddrv4->sin_port = htons (plugin->port); | 2740 | serverAddrv4.sin_addr = bind_v4->sin_addr; |
2741 | else | ||
2742 | serverAddrv4.sin_addr.s_addr = INADDR_ANY; | ||
2743 | serverAddrv4.sin_port = htons (plugin->port); | ||
2736 | addrlen = sizeof (struct sockaddr_in); | 2744 | addrlen = sizeof (struct sockaddr_in); |
2737 | serverAddr = (struct sockaddr *) serverAddrv4; | 2745 | serverAddr = (struct sockaddr *) &serverAddrv4; |
2738 | 2746 | ||
2739 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Binding to IPv4 port %d\n", | 2747 | LOG (GNUNET_ERROR_TYPE_INFO, "Binding to IPv4 %s\n", |
2740 | ntohs (serverAddrv4->sin_port)); | 2748 | GNUNET_a2s (serverAddr, addrlen)); |
2741 | tries = 0; | 2749 | tries = 0; |
2742 | while (GNUNET_NETWORK_socket_bind (plugin->sockv4, serverAddr, addrlen) != | 2750 | while (GNUNET_NETWORK_socket_bind (plugin->sockv4, serverAddr, addrlen) != |
2743 | GNUNET_OK) | 2751 | GNUNET_OK) |
2744 | { | 2752 | { |
2745 | serverAddrv4->sin_port = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG, 33537) + 32000); /* Find a good, non-root port */ | 2753 | serverAddrv4.sin_port = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG, 33537) + 32000); /* Find a good, non-root port */ |
2746 | LOG (GNUNET_ERROR_TYPE_DEBUG, "IPv4 Binding failed, trying new port %d\n", | 2754 | LOG (GNUNET_ERROR_TYPE_DEBUG, "IPv4 Binding failed, trying new port %d\n", |
2747 | ntohs (serverAddrv4->sin_port)); | 2755 | ntohs (serverAddrv4.sin_port)); |
2748 | tries++; | 2756 | tries++; |
2749 | if (tries > 10) | 2757 | if (tries > 10) |
2750 | { | 2758 | { |
@@ -2755,7 +2763,7 @@ setup_sockets (struct Plugin *plugin, struct sockaddr_in6 *serverAddrv6, struct | |||
2755 | } | 2763 | } |
2756 | if (plugin->sockv4 != NULL) | 2764 | if (plugin->sockv4 != NULL) |
2757 | { | 2765 | { |
2758 | addrs[sockets_created] = (struct sockaddr *) serverAddrv4; | 2766 | addrs[sockets_created] = (struct sockaddr *) &serverAddrv4; |
2759 | addrlens[sockets_created] = sizeof (struct sockaddr_in); | 2767 | addrlens[sockets_created] = sizeof (struct sockaddr_in); |
2760 | sockets_created++; | 2768 | sockets_created++; |
2761 | } | 2769 | } |
@@ -2822,6 +2830,8 @@ libgnunet_plugin_transport_udp_init (void *cls) | |||
2822 | struct sockaddr_in serverAddrv4; | 2830 | struct sockaddr_in serverAddrv4; |
2823 | struct sockaddr_in6 serverAddrv6; | 2831 | struct sockaddr_in6 serverAddrv6; |
2824 | int res; | 2832 | int res; |
2833 | int have_bind4; | ||
2834 | int have_bind6; | ||
2825 | 2835 | ||
2826 | if (NULL == env->receive) | 2836 | if (NULL == env->receive) |
2827 | { | 2837 | { |
@@ -2865,9 +2875,8 @@ libgnunet_plugin_transport_udp_init (void *cls) | |||
2865 | enable_v6 = GNUNET_YES; | 2875 | enable_v6 = GNUNET_YES; |
2866 | 2876 | ||
2867 | /* Addresses */ | 2877 | /* Addresses */ |
2868 | memset (&serverAddrv6, 0, sizeof (serverAddrv6)); | 2878 | have_bind4 = GNUNET_NO; |
2869 | memset (&serverAddrv4, 0, sizeof (serverAddrv4)); | 2879 | memset (&serverAddrv4, 0, sizeof (serverAddrv4)); |
2870 | |||
2871 | if (GNUNET_YES == | 2880 | if (GNUNET_YES == |
2872 | GNUNET_CONFIGURATION_get_value_string (env->cfg, "transport-udp", | 2881 | GNUNET_CONFIGURATION_get_value_string (env->cfg, "transport-udp", |
2873 | "BINDTO", &bind4_address)) | 2882 | "BINDTO", &bind4_address)) |
@@ -2880,8 +2889,10 @@ libgnunet_plugin_transport_udp_init (void *cls) | |||
2880 | MEMDEBUG_free (bind4_address, __LINE__); | 2889 | MEMDEBUG_free (bind4_address, __LINE__); |
2881 | return NULL; | 2890 | return NULL; |
2882 | } | 2891 | } |
2892 | have_bind4 = GNUNET_YES; | ||
2883 | } | 2893 | } |
2884 | 2894 | have_bind6 = GNUNET_NO; | |
2895 | memset (&serverAddrv6, 0, sizeof (serverAddrv6)); | ||
2885 | if (GNUNET_YES == | 2896 | if (GNUNET_YES == |
2886 | GNUNET_CONFIGURATION_get_value_string (env->cfg, "transport-udp", | 2897 | GNUNET_CONFIGURATION_get_value_string (env->cfg, "transport-udp", |
2887 | "BINDTO6", &bind6_address)) | 2898 | "BINDTO6", &bind6_address)) |
@@ -2898,6 +2909,7 @@ libgnunet_plugin_transport_udp_init (void *cls) | |||
2898 | MEMDEBUG_free (bind6_address, __LINE__); | 2909 | MEMDEBUG_free (bind6_address, __LINE__); |
2899 | return NULL; | 2910 | return NULL; |
2900 | } | 2911 | } |
2912 | have_bind6 = GNUNET_YES; | ||
2901 | } | 2913 | } |
2902 | 2914 | ||
2903 | /* Enable neighbour discovery */ | 2915 | /* Enable neighbour discovery */ |
@@ -2955,7 +2967,8 @@ libgnunet_plugin_transport_udp_init (void *cls) | |||
2955 | api->send = &udp_plugin_send; | 2967 | api->send = &udp_plugin_send; |
2956 | 2968 | ||
2957 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Setting up sockets\n"); | 2969 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Setting up sockets\n"); |
2958 | res = setup_sockets (p, &serverAddrv6, &serverAddrv4); | 2970 | res = setup_sockets (p, (GNUNET_YES == have_bind6) ? &serverAddrv6 : NULL, |
2971 | (GNUNET_YES == have_bind4) ? &serverAddrv4 : NULL); | ||
2959 | if ((res == 0) || ((p->sockv4 == NULL) && (p->sockv6 == NULL))) | 2972 | if ((res == 0) || ((p->sockv4 == NULL) && (p->sockv6 == NULL))) |
2960 | { | 2973 | { |
2961 | LOG (GNUNET_ERROR_TYPE_ERROR, "Failed to create network sockets, plugin failed\n"); | 2974 | LOG (GNUNET_ERROR_TYPE_ERROR, "Failed to create network sockets, plugin failed\n"); |
diff --git a/src/transport/test_transport_api_udp_peer1.conf b/src/transport/test_transport_api_udp_peer1.conf index 7c3e33ad0..0b548f2de 100644 --- a/src/transport/test_transport_api_udp_peer1.conf +++ b/src/transport/test_transport_api_udp_peer1.conf | |||
@@ -7,6 +7,8 @@ PORT = 12040 | |||
7 | BROADCAST = NO | 7 | BROADCAST = NO |
8 | BROADCAST_INTERVAL = 30000 | 8 | BROADCAST_INTERVAL = 30000 |
9 | MAX_BPS = 50000000 | 9 | MAX_BPS = 50000000 |
10 | BINDTO = 127.0.0.1 | ||
11 | BINDTO6 = ::1 | ||
10 | 12 | ||
11 | [arm] | 13 | [arm] |
12 | PORT = 12045 | 14 | PORT = 12045 |
diff --git a/src/transport/test_transport_api_udp_peer2.conf b/src/transport/test_transport_api_udp_peer2.conf index 9b79c3b54..a2d5fb515 100644 --- a/src/transport/test_transport_api_udp_peer2.conf +++ b/src/transport/test_transport_api_udp_peer2.conf | |||
@@ -6,6 +6,8 @@ SERVICEHOME = /tmp/test-transport/api-udp-p2/ | |||
6 | PORT = 12050 | 6 | PORT = 12050 |
7 | BROADCAST = NO | 7 | BROADCAST = NO |
8 | MAX_BPS = 50000000 | 8 | MAX_BPS = 50000000 |
9 | BINDTO = 127.0.0.1 | ||
10 | BINDTO6 = ::1 | ||
9 | 11 | ||
10 | [arm] | 12 | [arm] |
11 | PORT = 12055 | 13 | PORT = 12055 |