diff options
author | Christian Grothoff <christian@grothoff.org> | 2016-07-25 21:34:47 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2016-07-25 21:34:47 +0000 |
commit | 6446293d028db5fe66c53f70ab8194f6c47f3fa1 (patch) | |
tree | a27ec7e92f6ac78ba90e582ea9d88dc702ab10c2 /src/nat/nat.c | |
parent | 59a1974b48463e363442bd4e8f81741ee86d4123 (diff) | |
download | gnunet-6446293d028db5fe66c53f70ab8194f6c47f3fa1.tar.gz gnunet-6446293d028db5fe66c53f70ab8194f6c47f3fa1.zip |
-ensure clean DNS shutdown, fix DNS-STUN termination issues
Diffstat (limited to 'src/nat/nat.c')
-rw-r--r-- | src/nat/nat.c | 92 |
1 files changed, 52 insertions, 40 deletions
diff --git a/src/nat/nat.c b/src/nat/nat.c index 6e9fcfd0e..9a9ae18ac 100644 --- a/src/nat/nat.c +++ b/src/nat/nat.c | |||
@@ -429,7 +429,7 @@ struct GNUNET_NAT_Handle | |||
429 | /** | 429 | /** |
430 | * STUN request task | 430 | * STUN request task |
431 | */ | 431 | */ |
432 | struct GNUNET_SCHEDULER_Task * stun_task; | 432 | struct GNUNET_SCHEDULER_Task *stun_task; |
433 | 433 | ||
434 | /** | 434 | /** |
435 | * Head of List of STUN servers | 435 | * Head of List of STUN servers |
@@ -460,15 +460,6 @@ start_gnunet_nat_server (struct GNUNET_NAT_Handle *h); | |||
460 | 460 | ||
461 | 461 | ||
462 | /** | 462 | /** |
463 | * Call task to process STUN | ||
464 | * | ||
465 | * @param cls handle to NAT | ||
466 | */ | ||
467 | static void | ||
468 | process_stun (void *cls); | ||
469 | |||
470 | |||
471 | /** | ||
472 | * Remove all addresses from the list of 'local' addresses | 463 | * Remove all addresses from the list of 'local' addresses |
473 | * that originated from the given source. | 464 | * that originated from the given source. |
474 | * | 465 | * |
@@ -688,7 +679,8 @@ process_external_ip (void *cls, | |||
688 | /* Current iteration is over, remove 'old' IPs now */ | 679 | /* Current iteration is over, remove 'old' IPs now */ |
689 | LOG (GNUNET_ERROR_TYPE_DEBUG, | 680 | LOG (GNUNET_ERROR_TYPE_DEBUG, |
690 | "Purging old IPs for external address\n"); | 681 | "Purging old IPs for external address\n"); |
691 | remove_from_address_list_by_source (h, LAL_EXTERNAL_IP_OLD); | 682 | remove_from_address_list_by_source (h, |
683 | LAL_EXTERNAL_IP_OLD); | ||
692 | if (1 == inet_pton (AF_INET, | 684 | if (1 == inet_pton (AF_INET, |
693 | h->external_address, | 685 | h->external_address, |
694 | &dummy)) | 686 | &dummy)) |
@@ -704,9 +696,13 @@ process_external_ip (void *cls, | |||
704 | } | 696 | } |
705 | LOG (GNUNET_ERROR_TYPE_DEBUG, | 697 | LOG (GNUNET_ERROR_TYPE_DEBUG, |
706 | "Got IP `%s' for external address `%s'\n", | 698 | "Got IP `%s' for external address `%s'\n", |
707 | GNUNET_a2s (addr, addrlen), | 699 | GNUNET_a2s (addr, |
700 | addrlen), | ||
708 | h->external_address); | 701 | h->external_address); |
709 | add_to_address_list (h, LAL_EXTERNAL_IP, addr, addrlen); | 702 | add_to_address_list (h, |
703 | LAL_EXTERNAL_IP, | ||
704 | addr, | ||
705 | addrlen); | ||
710 | } | 706 | } |
711 | 707 | ||
712 | 708 | ||
@@ -740,10 +736,14 @@ process_hostname_ip (void *cls, | |||
740 | h->hostname_dns = NULL; | 736 | h->hostname_dns = NULL; |
741 | h->hostname_task = | 737 | h->hostname_task = |
742 | GNUNET_SCHEDULER_add_delayed (h->hostname_dns_frequency, | 738 | GNUNET_SCHEDULER_add_delayed (h->hostname_dns_frequency, |
743 | &resolve_hostname, h); | 739 | &resolve_hostname, |
740 | h); | ||
744 | return; | 741 | return; |
745 | } | 742 | } |
746 | add_to_address_list (h, LAL_HOSTNAME_DNS, addr, addrlen); | 743 | add_to_address_list (h, |
744 | LAL_HOSTNAME_DNS, | ||
745 | addr, | ||
746 | addrlen); | ||
747 | } | 747 | } |
748 | 748 | ||
749 | 749 | ||
@@ -1204,7 +1204,7 @@ static void | |||
1204 | process_stun (void *cls) | 1204 | process_stun (void *cls) |
1205 | { | 1205 | { |
1206 | struct GNUNET_NAT_Handle *h = cls; | 1206 | struct GNUNET_NAT_Handle *h = cls; |
1207 | struct StunServerList* elem = h->actual_stun_server; | 1207 | struct StunServerList *elem = h->actual_stun_server; |
1208 | 1208 | ||
1209 | h->stun_task = NULL; | 1209 | h->stun_task = NULL; |
1210 | /* Make the request */ | 1210 | /* Make the request */ |
@@ -1260,9 +1260,12 @@ resolve_hostname (void *cls) | |||
1260 | 1260 | ||
1261 | h->hostname_task = NULL; | 1261 | h->hostname_task = NULL; |
1262 | remove_from_address_list_by_source (h, LAL_HOSTNAME_DNS); | 1262 | remove_from_address_list_by_source (h, LAL_HOSTNAME_DNS); |
1263 | GNUNET_assert (NULL == h->hostname_dns); | ||
1263 | h->hostname_dns = | 1264 | h->hostname_dns = |
1264 | GNUNET_RESOLVER_hostname_resolve (AF_UNSPEC, HOSTNAME_RESOLVE_TIMEOUT, | 1265 | GNUNET_RESOLVER_hostname_resolve (AF_UNSPEC, |
1265 | &process_hostname_ip, h); | 1266 | HOSTNAME_RESOLVE_TIMEOUT, |
1267 | &process_hostname_ip, | ||
1268 | h); | ||
1266 | } | 1269 | } |
1267 | 1270 | ||
1268 | 1271 | ||
@@ -1285,10 +1288,13 @@ resolve_dns (void *cls) | |||
1285 | LOG (GNUNET_ERROR_TYPE_DEBUG, | 1288 | LOG (GNUNET_ERROR_TYPE_DEBUG, |
1286 | "Resolving external address `%s'\n", | 1289 | "Resolving external address `%s'\n", |
1287 | h->external_address); | 1290 | h->external_address); |
1291 | GNUNET_assert (NULL == h->ext_dns); | ||
1288 | h->ext_dns = | 1292 | h->ext_dns = |
1289 | GNUNET_RESOLVER_ip_get (h->external_address, AF_INET, | 1293 | GNUNET_RESOLVER_ip_get (h->external_address, |
1294 | AF_INET, | ||
1290 | GNUNET_TIME_UNIT_MINUTES, | 1295 | GNUNET_TIME_UNIT_MINUTES, |
1291 | &process_external_ip, h); | 1296 | &process_external_ip, |
1297 | h); | ||
1292 | } | 1298 | } |
1293 | 1299 | ||
1294 | 1300 | ||
@@ -1636,7 +1642,6 @@ GNUNET_NAT_register (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
1636 | size_t pos_port; | 1642 | size_t pos_port; |
1637 | 1643 | ||
1638 | h->socket = sock; | 1644 | h->socket = sock; |
1639 | h->actual_stun_server = NULL; | ||
1640 | stun_servers = NULL; | 1645 | stun_servers = NULL; |
1641 | /* Lets process the servers*/ | 1646 | /* Lets process the servers*/ |
1642 | (void) GNUNET_CONFIGURATION_get_value_string (cfg, | 1647 | (void) GNUNET_CONFIGURATION_get_value_string (cfg, |
@@ -1644,9 +1649,6 @@ GNUNET_NAT_register (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
1644 | "STUN_SERVERS", | 1649 | "STUN_SERVERS", |
1645 | &stun_servers); | 1650 | &stun_servers); |
1646 | urls = 0; | 1651 | urls = 0; |
1647 | h->stun_servers_head = NULL; | ||
1648 | h->stun_servers_tail = NULL; | ||
1649 | h->actual_stun_server = NULL; | ||
1650 | if ( (NULL != stun_servers) && | 1652 | if ( (NULL != stun_servers) && |
1651 | (strlen (stun_servers) > 0) ) | 1653 | (strlen (stun_servers) > 0) ) |
1652 | { | 1654 | { |
@@ -1665,8 +1667,8 @@ GNUNET_NAT_register (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
1665 | { | 1667 | { |
1666 | struct StunServerList *ml; | 1668 | struct StunServerList *ml; |
1667 | 1669 | ||
1668 | /*Check if we do have a port*/ | 1670 | /* Check if we do have a port */ |
1669 | if((0 == pos_port) || (pos_port <= pos)) | 1671 | if ((0 == pos_port) || (pos_port <= pos)) |
1670 | { | 1672 | { |
1671 | LOG (GNUNET_ERROR_TYPE_WARNING, | 1673 | LOG (GNUNET_ERROR_TYPE_WARNING, |
1672 | "STUN server format mistake\n"); | 1674 | "STUN server format mistake\n"); |
@@ -1677,7 +1679,7 @@ GNUNET_NAT_register (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
1677 | ml->port = atoi (&stun_servers[pos_port]); | 1679 | ml->port = atoi (&stun_servers[pos_port]); |
1678 | 1680 | ||
1679 | /* Remove trailing space */ | 1681 | /* Remove trailing space */ |
1680 | if(stun_servers[pos] == ' ') | 1682 | if (stun_servers[pos] == ' ') |
1681 | ml->address = GNUNET_strdup (&stun_servers[pos + 1]); | 1683 | ml->address = GNUNET_strdup (&stun_servers[pos + 1]); |
1682 | else | 1684 | else |
1683 | ml->address = GNUNET_strdup (&stun_servers[pos]); | 1685 | ml->address = GNUNET_strdup (&stun_servers[pos]); |
@@ -1688,6 +1690,7 @@ GNUNET_NAT_register (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
1688 | GNUNET_CONTAINER_DLL_insert (h->stun_servers_head, | 1690 | GNUNET_CONTAINER_DLL_insert (h->stun_servers_head, |
1689 | h->stun_servers_tail, | 1691 | h->stun_servers_tail, |
1690 | ml); | 1692 | ml); |
1693 | stun_servers[pos] = '\0'; | ||
1691 | } | 1694 | } |
1692 | } | 1695 | } |
1693 | } | 1696 | } |
@@ -1767,9 +1770,30 @@ GNUNET_NAT_unregister (struct GNUNET_NAT_Handle *h) | |||
1767 | unsigned int i; | 1770 | unsigned int i; |
1768 | struct LocalAddressList *lal; | 1771 | struct LocalAddressList *lal; |
1769 | struct MiniList *ml; | 1772 | struct MiniList *ml; |
1770 | 1773 | struct StunServerList *ssl; | |
1774 | |||
1771 | LOG (GNUNET_ERROR_TYPE_DEBUG, | 1775 | LOG (GNUNET_ERROR_TYPE_DEBUG, |
1772 | "NAT unregister called\n"); | 1776 | "NAT unregister called\n"); |
1777 | while (NULL != (ssl = h->stun_servers_head)) | ||
1778 | { | ||
1779 | GNUNET_CONTAINER_DLL_remove (h->stun_servers_head, | ||
1780 | h->stun_servers_tail, | ||
1781 | ssl); | ||
1782 | GNUNET_free (ssl->address); | ||
1783 | GNUNET_free (ssl); | ||
1784 | } | ||
1785 | while (NULL != (lal = h->lal_head)) | ||
1786 | { | ||
1787 | GNUNET_CONTAINER_DLL_remove (h->lal_head, | ||
1788 | h->lal_tail, | ||
1789 | lal); | ||
1790 | if (NULL != h->address_callback) | ||
1791 | h->address_callback (h->callback_cls, | ||
1792 | GNUNET_NO, | ||
1793 | (const struct sockaddr *) &lal[1], | ||
1794 | lal->addrlen); | ||
1795 | GNUNET_free (lal); | ||
1796 | } | ||
1773 | while (NULL != (ml = h->mini_head)) | 1797 | while (NULL != (ml = h->mini_head)) |
1774 | { | 1798 | { |
1775 | GNUNET_CONTAINER_DLL_remove (h->mini_head, | 1799 | GNUNET_CONTAINER_DLL_remove (h->mini_head, |
@@ -1839,18 +1863,6 @@ GNUNET_NAT_unregister (struct GNUNET_NAT_Handle *h) | |||
1839 | h->server_stdout = NULL; | 1863 | h->server_stdout = NULL; |
1840 | h->server_stdout_handle = NULL; | 1864 | h->server_stdout_handle = NULL; |
1841 | } | 1865 | } |
1842 | while (NULL != (lal = h->lal_head)) | ||
1843 | { | ||
1844 | GNUNET_CONTAINER_DLL_remove (h->lal_head, | ||
1845 | h->lal_tail, | ||
1846 | lal); | ||
1847 | if (NULL != h->address_callback) | ||
1848 | h->address_callback (h->callback_cls, | ||
1849 | GNUNET_NO, | ||
1850 | (const struct sockaddr *) &lal[1], | ||
1851 | lal->addrlen); | ||
1852 | GNUNET_free (lal); | ||
1853 | } | ||
1854 | for (i = 0; i < h->num_local_addrs; i++) | 1866 | for (i = 0; i < h->num_local_addrs; i++) |
1855 | GNUNET_free (h->local_addrs[i]); | 1867 | GNUNET_free (h->local_addrs[i]); |
1856 | GNUNET_free_non_null (h->local_addrs); | 1868 | GNUNET_free_non_null (h->local_addrs); |