diff options
-rw-r--r-- | src/nat/nat.c | 39 |
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 | { |