gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r11669 - gnunet/src/transport


From: gnunet
Subject: [GNUnet-SVN] r11669 - gnunet/src/transport
Date: Fri, 11 Jun 2010 13:39:20 +0200

Author: nevans
Date: 2010-06-11 13:39:20 +0200 (Fri, 11 Jun 2010)
New Revision: 11669

Modified:
   gnunet/src/transport/plugin_transport_tcp.c
   gnunet/src/transport/plugin_transport_udp.c
Log:
explicitly add user provided external address to known addresses when used with 
NAT

Modified: gnunet/src/transport/plugin_transport_tcp.c
===================================================================
--- gnunet/src/transport/plugin_transport_tcp.c 2010-06-11 11:04:45 UTC (rev 
11668)
+++ gnunet/src/transport/plugin_transport_tcp.c 2010-06-11 11:39:20 UTC (rev 
11669)
@@ -2154,6 +2154,8 @@
   int only_nat_addresses;
   char *internal_address;
   char *external_address;
+  struct sockaddr_in in_addr;
+  struct IPv4TcpAddress t4;
 
   service = GNUNET_SERVICE_start ("transport-tcp", env->sched, env->cfg);
   if (service == NULL)
@@ -2223,6 +2225,11 @@
       return NULL;
     }
 
+  if ((external_address != NULL) && (inet_pton(AF_INET, external_address, 
&in_addr.sin_addr) != 1))
+    {
+      GNUNET_log_from(GNUNET_ERROR_TYPE_WARNING, "udp", "Malformed 
EXTERNAL_ADDRESS %s given in configuration!\n", external_address);
+    }
+
   internal_address = NULL;
   if ((GNUNET_YES == behind_nat) && (GNUNET_OK !=
          GNUNET_CONFIGURATION_get_value_string (env->cfg,
@@ -2240,6 +2247,10 @@
       return NULL;
     }
 
+  if ((internal_address != NULL) && (inet_pton(AF_INET, internal_address, 
&in_addr.sin_addr) != 1))
+    {
+      GNUNET_log_from(GNUNET_ERROR_TYPE_WARNING, "udp", "Malformed 
INTERNAL_ADDRESS %s given in configuration!\n", internal_address);
+    }
 
   aport = 0;
   if ((GNUNET_OK !=
@@ -2328,15 +2339,26 @@
   GNUNET_SERVER_disconnect_notify (plugin->server, 
                                   &disconnect_notify,
                                    plugin);
-  /* FIXME: do the two calls below periodically again and
-     not just once (since the info we get might change...) */
-  GNUNET_OS_network_interfaces_list (&process_interfaces, plugin);
+  if (plugin->behind_nat == GNUNET_NO)
+    {
+      GNUNET_OS_network_interfaces_list (&process_interfaces, plugin);
+    }
+
   plugin->hostname_dns = GNUNET_RESOLVER_hostname_resolve (env->sched,
                                                            env->cfg,
                                                            AF_UNSPEC,
                                                            
HOSTNAME_RESOLVE_TIMEOUT,
                                                            
&process_hostname_ips,
                                                            plugin);
+
+  if ((plugin->behind_nat == GNUNET_YES) && (inet_pton(AF_INET, 
plugin->external_address, &t4.ipv4_addr) == 1))
+    {
+      t4.t_port = htons(0);
+      plugin->env->notify_address (plugin->env->cls,
+                                  "tcp",
+                                  &t4, sizeof(t4), 
GNUNET_TIME_UNIT_FOREVER_REL);
+    }
+
   return api;
 }
 

Modified: gnunet/src/transport/plugin_transport_udp.c
===================================================================
--- gnunet/src/transport/plugin_transport_udp.c 2010-06-11 11:04:45 UTC (rev 
11668)
+++ gnunet/src/transport/plugin_transport_udp.c 2010-06-11 11:39:20 UTC (rev 
11669)
@@ -1671,6 +1671,7 @@
   int only_nat_addresses;
   char *internal_address;
   char *external_address;
+  struct sockaddr_in in_addr;
 
   service = GNUNET_SERVICE_start ("transport-udp", env->sched, env->cfg);
   if (service == NULL)
@@ -1736,6 +1737,11 @@
       return NULL;
     }
 
+  if ((external_address != NULL) && (inet_pton(AF_INET, external_address, 
&in_addr.sin_addr) != 1))
+    {
+      GNUNET_log_from(GNUNET_ERROR_TYPE_WARNING, "udp", "Malformed 
EXTERNAL_ADDRESS %s given in configuration!\n", external_address);
+    }
+
   internal_address = NULL;
   if ((GNUNET_YES == behind_nat) && (GNUNET_OK !=
          GNUNET_CONFIGURATION_get_value_string (env->cfg,
@@ -1753,6 +1759,11 @@
       return NULL;
     }
 
+  if ((internal_address != NULL) && (inet_pton(AF_INET, internal_address, 
&in_addr.sin_addr) != 1))
+    {
+      GNUNET_log_from(GNUNET_ERROR_TYPE_WARNING, "udp", "Malformed 
INTERNAL_ADDRESS %s given in configuration!\n", internal_address);
+    }
+
   if (GNUNET_OK !=
       GNUNET_CONFIGURATION_get_value_number (env->cfg,
                                             "transport-udp",
@@ -1799,7 +1810,11 @@
 
   plugin->service = service;
 
-  GNUNET_OS_network_interfaces_list (&process_interfaces, plugin);
+  if (plugin->behind_nat == GNUNET_NO)
+    {
+      GNUNET_OS_network_interfaces_list (&process_interfaces, plugin);
+    }
+
   plugin->hostname_dns = GNUNET_RESOLVER_hostname_resolve (env->sched,
                                                            env->cfg,
                                                            AF_UNSPEC,
@@ -1807,6 +1822,15 @@
                                                            
&process_hostname_ips,
                                                            plugin);
 
+  if ((plugin->behind_nat == GNUNET_YES) && (inet_pton(AF_INET, 
plugin->external_address, &in_addr.sin_addr) == 1))
+    {
+      in_addr.sin_port = htons(0);
+      in_addr.sin_family = AF_INET;
+      plugin->env->notify_address (plugin->env->cls,
+                                  "udp",
+                                  &in_addr, sizeof(in_addr), 
GNUNET_TIME_UNIT_FOREVER_REL);
+    }
+
   sockets_created = udp_transport_server_start (plugin);
 
   GNUNET_assert (sockets_created == 1);
@@ -1814,7 +1838,6 @@
   return api;
 }
 
-
 void *
 libgnunet_plugin_transport_udp_done (void *cls)
 {




reply via email to

[Prev in Thread] Current Thread [Next in Thread]