{
h->ext_dns = NULL;
/* Current iteration is over, remove 'old' IPs now */
- remove_from_address_list_by_source (h, LAL_EXTERNAL_IP);
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Purging old IPs for external address\n");
+ remove_from_address_list_by_source (h, LAL_EXTERNAL_IP_OLD);
if (1 == inet_pton (AF_INET,
h->external_address,
&dummy))
+ {
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Got numeric IP for external address, not repeating lookup\n");
return; /* repated lookup pointless: was numeric! */
+ }
h->dns_task =
GNUNET_SCHEDULER_add_delayed (h->dyndns_frequency,
&resolve_dns, h);
return;
}
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Got IP `%s' for external address `%s'\n",
+ GNUNET_a2s (addr, addrlen),
+ h->external_address);
add_to_address_list (h, LAL_EXTERNAL_IP, addr, addrlen);
}
{
return GNUNET_OK;
}
- if (GNUNET_YES == h->use_localaddresses)
+ if ((GNUNET_YES == h->use_localaddresses) || (value != 0))
{
add_ip_to_address_list (h, LAL_INTERFACE_ADDRESS, &s4->sin_addr,
sizeof (struct in_addr));
(h->server_stdout =
GNUNET_DISK_pipe (GNUNET_YES, GNUNET_YES, GNUNET_NO, GNUNET_YES))))
{
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Starting `%s' at `%s'\n",
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Starting `%s' at `%s'\n",
"gnunet-helper-nat-server", h->internal_address);
/* Start the server process */
binary = GNUNET_OS_get_libexec_binary_path ("gnunet-helper-nat-server");
h->server_proc =
- GNUNET_OS_start_process (GNUNET_NO, 0, NULL, h->server_stdout,
+ GNUNET_OS_start_process (GNUNET_NO, 0, NULL, h->server_stdout, NULL,
binary,
"gnunet-helper-nat-server",
h->internal_address, NULL);
for (pos = h->lal_head; NULL != pos; pos = pos->next)
if (pos->source == LAL_EXTERNAL_IP)
pos->source = LAL_EXTERNAL_IP_OLD;
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Resolving external address `%s'\n",
+ h->external_address);
h->ext_dns =
GNUNET_RESOLVER_ip_get (h->external_address, AF_INET,
GNUNET_TIME_UNIT_MINUTES,
* the previous (now invalid) one
* @param addr either the previous or the new public IP address
* @param addrlen actual lenght of @a addr
+ * @param ret GNUNET_NAT_ERROR_SUCCESS on success, otherwise an error code
*/
static void
upnp_add (void *cls,
int add_remove,
const struct sockaddr *addr,
- socklen_t addrlen)
+ socklen_t addrlen,
+ enum GNUNET_NAT_FailureCode ret)
{
struct GNUNET_NAT_Handle *h = cls;
struct LocalAddressList *pos;
struct LocalAddressList *next;
+
+ if (GNUNET_NAT_ERROR_SUCCESS != ret)
+ {
+ /* Error while running upnp client */
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ _("Error while running upnp client:\n"));
+
+ //FIXME: convert error code to string
+
+ return;
+ }
+
if (GNUNET_YES == add_remove)
{
add_to_address_list (h, LAL_UPNP, addr, addrlen);
return;
}
- /* remove address */
- next = h->lal_head;
- while (NULL != (pos = next))
+ else if (GNUNET_NO == add_remove)
{
- next = pos->next;
- if ((pos->source != LAL_UPNP) || (pos->addrlen != addrlen) ||
- (0 != memcmp (&pos[1], addr, addrlen)))
- continue;
- GNUNET_CONTAINER_DLL_remove (h->lal_head, h->lal_tail, pos);
- if (NULL != h->address_callback)
- h->address_callback (h->callback_cls, GNUNET_NO,
- (const struct sockaddr *) &pos[1], pos->addrlen);
- GNUNET_free (pos);
- return; /* only remove once */
+ /* remove address */
+ next = h->lal_head;
+ while (NULL != (pos = next))
+ {
+ next = pos->next;
+ if ((pos->source != LAL_UPNP) || (pos->addrlen != addrlen) ||
+ (0 != memcmp (&pos[1], addr, addrlen)))
+ continue;
+ GNUNET_CONTAINER_DLL_remove (h->lal_head, h->lal_tail, pos);
+ if (NULL != h->address_callback)
+ h->address_callback (h->callback_cls, GNUNET_NO,
+ (const struct sockaddr *) &pos[1], pos->addrlen);
+ GNUNET_free (pos);
+ return; /* only remove once */
+ }
+ /* asked to remove address that does not exist */
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "Asked to remove unkown address `%s'\n",
+ GNUNET_a2s(addr, addrlen));
+ GNUNET_break (0);
+ }
+ else
+ {
+
+ GNUNET_break (0);
}
- /* asked to remove address that does not exist */
- GNUNET_break (0);
}
return; /* already got this port */
ml = ml->next;
}
+
ml = GNUNET_new (struct MiniList);
ml->port = port;
ml->mini = GNUNET_NAT_mini_map_start (port, h->is_tcp, &upnp_add, h);
+
+ if (NULL == ml->mini)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ _("Failed to run upnp client for port %u\n"), ml->port);
+ GNUNET_free (ml);
+ return;
+ }
+
GNUNET_CONTAINER_DLL_insert (h->mini_head, h->mini_tail, ml);
}
add_to_address_list (h, LAL_BINDTO_ADDRESS, sa,
sizeof (struct sockaddr_in));
if (h->enable_upnp)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Running upnp client for address `%s'\n",
+ GNUNET_a2s (sa,sizeof (struct sockaddr_in)));
add_minis (h, ntohs (v4->sin_port));
+ }
break;
case AF_INET6:
if (sizeof (struct sockaddr_in6) != h->local_addrlens[i])
if (NULL == reversal_callback)
h->enable_nat_server = GNUNET_NO;
+ /* Check for UPnP client, disable immediately if not available */
+ if ( (GNUNET_YES == h->enable_upnp) &&
+ (GNUNET_SYSERR ==
+ GNUNET_OS_check_helper_binary ("upnpc", GNUNET_NO, NULL)) )
+ {
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ _("UPnP enabled in configuration, but UPnP client `upnpc` command not found, disabling UPnP \n"));
+ h->enable_upnp = GNUNET_NO;
+ }
+
/* Check if NAT was hole-punched */
- if ((NULL != h->address_callback) && (h->external_address != NULL) &&
- (h->nat_punched == GNUNET_YES))
+ if ((NULL != h->address_callback) &&
+ (NULL != h->external_address) &&
+ (GNUNET_YES == h->nat_punched))
{
h->dns_task = GNUNET_SCHEDULER_add_now (&resolve_dns, h);
h->enable_nat_server = GNUNET_NO;
h->enable_upnp = GNUNET_NO;
}
+ else
+ {
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "No external IP address given to add to our list of addresses\n");
+ }
/* Test for SUID binaries */
binary = GNUNET_OS_get_libexec_binary_path ("gnunet-helper-nat-server");
{
h->enable_nat_server = GNUNET_NO;
LOG (GNUNET_ERROR_TYPE_WARNING,
- _
- ("Configuration requires `%s', but binary is not installed properly (SUID bit not set). Option disabled.\n"),
+ _("Configuration requires `%s', but binary is not installed properly (SUID bit not set). Option disabled.\n"),
"gnunet-helper-nat-server");
}
GNUNET_free (binary);
struct LocalAddressList *lal;
struct MiniList *ml;
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "NAT unregister called\n");
while (NULL != (ml = h->mini_head))
{
GNUNET_CONTAINER_DLL_remove (h->mini_head, h->mini_tail, ml);
(unsigned int) h->adv_port);
binary = GNUNET_OS_get_libexec_binary_path ("gnunet-helper-nat-client");
proc =
- GNUNET_OS_start_process (GNUNET_NO, 0, NULL, NULL,
+ GNUNET_OS_start_process (GNUNET_NO, 0, NULL, NULL, NULL,
binary,
"gnunet-helper-nat-client",
h->internal_address,