aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nat/nat.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/nat/nat.c b/src/nat/nat.c
index 515fa1eb8..0aefc4312 100644
--- a/src/nat/nat.c
+++ b/src/nat/nat.c
@@ -638,15 +638,36 @@ process_interfaces (void *cls, const char *name, int isDefault,
638 const struct sockaddr *broadcast_addr, 638 const struct sockaddr *broadcast_addr,
639 const struct sockaddr *netmask, socklen_t addrlen) 639 const struct sockaddr *netmask, socklen_t addrlen)
640{ 640{
641 const static struct in6_addr any6 = IN6ADDR_ANY_INIT;
641 struct GNUNET_NAT_Handle *h = cls; 642 struct GNUNET_NAT_Handle *h = cls;
642 const struct sockaddr_in *s4; 643 const struct sockaddr_in *s4;
643 const struct sockaddr_in6 *s6; 644 const struct sockaddr_in6 *s6;
644 const void *ip; 645 const void *ip;
645 char buf[INET6_ADDRSTRLEN]; 646 char buf[INET6_ADDRSTRLEN];
647 unsigned int i;
648 int have_any;
646 649
647 switch (addr->sa_family) 650 switch (addr->sa_family)
648 { 651 {
649 case AF_INET: 652 case AF_INET:
653 /* check if we're bound to the "ANY" IP address */
654 have_any = GNUNET_NO;
655 for (i=0;i<h->num_local_addrs;i++)
656 {
657 if (h->local_addrs[i]->sa_family != AF_INET)
658 continue;
659#ifndef INADDR_ANY
660#define INADDR_ANY 0
661#endif
662 if (INADDR_ANY == ((struct sockaddr_in*) h->local_addrs[i])->sin_addr.s_addr)
663 {
664 have_any = GNUNET_YES;
665 break;
666 }
667 }
668 if (GNUNET_NO == have_any)
669 return GNUNET_OK; /* not bound to IP 0.0.0.0 but to specific IP addresses,
670 do not use those from interfaces */
650 s4 = (struct sockaddr_in *) addr; 671 s4 = (struct sockaddr_in *) addr;
651 ip = &s4->sin_addr; 672 ip = &s4->sin_addr;
652 673
@@ -665,6 +686,24 @@ process_interfaces (void *cls, const char *name, int isDefault,
665 } 686 }
666 break; 687 break;
667 case AF_INET6: 688 case AF_INET6:
689 /* check if we're bound to the "ANY" IP address */
690 have_any = GNUNET_NO;
691 for (i=0;i<h->num_local_addrs;i++)
692 {
693 if (h->local_addrs[i]->sa_family != AF_INET6)
694 continue;
695 if (0 == memcmp (&any6,
696 &((struct sockaddr_in6*) h->local_addrs[i])->sin6_addr,
697 sizeof (struct in6_addr)))
698 {
699 have_any = GNUNET_YES;
700 break;
701 }
702 }
703 if (GNUNET_NO == have_any)
704 return GNUNET_OK; /* not bound to "ANY" IP (::0) but to specific IP addresses,
705 do not use those from interfaces */
706
668 s6 = (struct sockaddr_in6 *) addr; 707 s6 = (struct sockaddr_in6 *) addr;
669 if (IN6_IS_ADDR_LINKLOCAL (&((struct sockaddr_in6 *) addr)->sin6_addr)) 708 if (IN6_IS_ADDR_LINKLOCAL (&((struct sockaddr_in6 *) addr)->sin6_addr))
670 { 709 {