aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/transport/plugin_transport_udp.c67
-rw-r--r--src/transport/test_transport_api_udp_peer1.conf2
-rw-r--r--src/transport/test_transport_api_udp_peer2.conf2
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
2662static int 2662static int
2663setup_sockets (struct Plugin *plugin, struct sockaddr_in6 *serverAddrv6, struct sockaddr_in *serverAddrv4) 2663setup_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
7BROADCAST = NO 7BROADCAST = NO
8BROADCAST_INTERVAL = 30000 8BROADCAST_INTERVAL = 30000
9MAX_BPS = 50000000 9MAX_BPS = 50000000
10BINDTO = 127.0.0.1
11BINDTO6 = ::1
10 12
11[arm] 13[arm]
12PORT = 12045 14PORT = 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/
6PORT = 12050 6PORT = 12050
7BROADCAST = NO 7BROADCAST = NO
8MAX_BPS = 50000000 8MAX_BPS = 50000000
9BINDTO = 127.0.0.1
10BINDTO6 = ::1
9 11
10[arm] 12[arm]
11PORT = 12055 13PORT = 12055