aboutsummaryrefslogtreecommitdiff
path: root/src/nat
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2011-11-02 17:05:00 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2011-11-02 17:05:00 +0000
commit0a82c8fd7bb83ab64797838aaeddce34b8d67fcf (patch)
tree8279914364589f7403c5aaf07cff1af4361205f0 /src/nat
parentcbbfa621ff1d2ea316ead01d4dcb1c1854db0cb4 (diff)
downloadgnunet-0a82c8fd7bb83ab64797838aaeddce34b8d67fcf.tar.gz
gnunet-0a82c8fd7bb83ab64797838aaeddce34b8d67fcf.zip
disable local addresses
Diffstat (limited to 'src/nat')
-rw-r--r--src/nat/nat.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/nat/nat.c b/src/nat/nat.c
index 6e2011347..2040451d5 100644
--- a/src/nat/nat.c
+++ b/src/nat/nat.c
@@ -335,6 +335,11 @@ struct GNUNET_NAT_Handle
335 int use_localaddresses; 335 int use_localaddresses;
336 336
337 /** 337 /**
338 * Should we return local addresses to clients
339 */
340 int return_localaddress;
341
342 /**
338 * Should we do a DNS lookup of our hostname to find out our own IP? 343 * Should we do a DNS lookup of our hostname to find out our own IP?
339 */ 344 */
340 int use_hostname; 345 int use_hostname;
@@ -642,9 +647,19 @@ process_interfaces (void *cls, const char *name, int isDefault,
642 case AF_INET: 647 case AF_INET:
643 s4 = (struct sockaddr_in *) addr; 648 s4 = (struct sockaddr_in *) addr;
644 ip = &s4->sin_addr; 649 ip = &s4->sin_addr;
650
651 /* Check if address is in 127.0.0.0/8 */
652 uint32_t address = ntohl((in_addr_t)(s4->sin_addr.s_addr));
653 uint32_t value = (address & 0xFF000000) ^ 0x7F000000;
654 if ((h->return_localaddress == GNUNET_NO) && (value == 0))
655 {
656 return GNUNET_OK;
657 }
645 if (GNUNET_YES == h->use_localaddresses) 658 if (GNUNET_YES == h->use_localaddresses)
659 {
646 add_ip_to_address_list (h, LAL_INTERFACE_ADDRESS, &s4->sin_addr, 660 add_ip_to_address_list (h, LAL_INTERFACE_ADDRESS, &s4->sin_addr,
647 sizeof (struct in_addr)); 661 sizeof (struct in_addr));
662 }
648 break; 663 break;
649 case AF_INET6: 664 case AF_INET6:
650 s6 = (struct sockaddr_in6 *) addr; 665 s6 = (struct sockaddr_in6 *) addr;
@@ -653,10 +668,17 @@ process_interfaces (void *cls, const char *name, int isDefault,
653 /* skip link local addresses */ 668 /* skip link local addresses */
654 return GNUNET_OK; 669 return GNUNET_OK;
655 } 670 }
671 if ((h->return_localaddress == GNUNET_NO) &&
672 (IN6_IS_ADDR_LOOPBACK (&((struct sockaddr_in6 *) addr)->sin6_addr)))
673 {
674 return GNUNET_OK;
675 }
656 ip = &s6->sin6_addr; 676 ip = &s6->sin6_addr;
657 if (GNUNET_YES == h->use_localaddresses) 677 if (GNUNET_YES == h->use_localaddresses)
678 {
658 add_ip_to_address_list (h, LAL_INTERFACE_ADDRESS, &s6->sin6_addr, 679 add_ip_to_address_list (h, LAL_INTERFACE_ADDRESS, &s6->sin6_addr,
659 sizeof (struct in6_addr)); 680 sizeof (struct in6_addr));
681 }
660 break; 682 break;
661 default: 683 default:
662 GNUNET_break (0); 684 GNUNET_break (0);
@@ -1116,6 +1138,9 @@ GNUNET_NAT_register (const struct GNUNET_CONFIGURATION_Handle *cfg, int is_tcp,
1116 GNUNET_CONFIGURATION_get_value_yesno (cfg, "nat", "ENABLE_UPNP"); 1138 GNUNET_CONFIGURATION_get_value_yesno (cfg, "nat", "ENABLE_UPNP");
1117 h->use_localaddresses = 1139 h->use_localaddresses =
1118 GNUNET_CONFIGURATION_get_value_yesno (cfg, "nat", "USE_LOCALADDR"); 1140 GNUNET_CONFIGURATION_get_value_yesno (cfg, "nat", "USE_LOCALADDR");
1141 h->return_localaddress =
1142 GNUNET_CONFIGURATION_get_value_yesno (cfg, "nat", "RETURN_LOCAL_ADDRESSES");
1143
1119 h->use_hostname = 1144 h->use_hostname =
1120 GNUNET_CONFIGURATION_get_value_yesno (cfg, "nat", "USE_HOSTNAME"); 1145 GNUNET_CONFIGURATION_get_value_yesno (cfg, "nat", "USE_HOSTNAME");
1121 h->disable_ipv6 = 1146 h->disable_ipv6 =