summaryrefslogtreecommitdiff
path: root/lib/socket
diff options
context:
space:
mode:
authorTimur Bakeyev <timur@FreeBSD.org>2013-02-27 16:25:07 -0800
committerJeremy Allison <jra@samba.org>2013-02-28 20:56:57 +0100
commit8ac431a22e45611d4bbded67c4c8bd864c343a8f (patch)
tree289a7e89728efcc621623937a1e23ee4b1ea6b40 /lib/socket
parent61f34e2d25058452ab16f9d7ec5fc2776ab135eb (diff)
downloadsamba-8ac431a22e45611d4bbded67c4c8bd864c343a8f.tar.gz
Fix bug # 9666 - Broken filtering of link-local addresses.
This patch should address the problem with Link Local addresses on FreeBSD and Linux. Reviewed-by: Jeremy Allison <jra@samba.org> Reviewed-by: Richard Sharpe <rsharpe@samba.org> Autobuild-User(master): Jeremy Allison <jra@samba.org> Autobuild-Date(master): Thu Feb 28 20:56:57 CET 2013 on sn-devel-104
Diffstat (limited to 'lib/socket')
-rw-r--r--lib/socket/interfaces.c28
1 files changed, 15 insertions, 13 deletions
diff --git a/lib/socket/interfaces.c b/lib/socket/interfaces.c
index 74c642372a2..e62da3c3a1f 100644
--- a/lib/socket/interfaces.c
+++ b/lib/socket/interfaces.c
@@ -186,6 +186,21 @@ static int _get_interfaces(TALLOC_CTX *mem_ctx, struct iface_struct **pifaces)
memcpy(&ifaces[total].ip, ifptr->ifa_addr, copy_size);
memcpy(&ifaces[total].netmask, ifptr->ifa_netmask, copy_size);
+ /* calculate broadcast address */
+#if defined(HAVE_IPV6)
+ if (ifptr->ifa_addr->sa_family == AF_INET6) {
+ struct sockaddr_in6 *sin6 =
+ (struct sockaddr_in6 *)ifptr->ifa_addr;
+ struct in6_addr *in6 =
+ (struct in6_addr *)&sin6->sin6_addr;
+
+ if (IN6_IS_ADDR_LINKLOCAL(in6) || IN6_IS_ADDR_V4COMPAT(in6)) {
+ continue;
+ }
+ /* IPv6 does not have broadcast it uses multicast. */
+ memset(&ifaces[total].bcast, '\0', copy_size);
+ } else
+#endif
if (ifaces[total].flags & (IFF_BROADCAST|IFF_LOOPBACK)) {
make_bcast(&ifaces[total].bcast,
&ifaces[total].ip,
@@ -195,19 +210,6 @@ static int _get_interfaces(TALLOC_CTX *mem_ctx, struct iface_struct **pifaces)
memcpy(&ifaces[total].bcast,
ifptr->ifa_dstaddr,
copy_size);
-#if defined(HAVE_IPV6)
- } else if (ifptr->ifa_addr->sa_family == AF_INET6) {
- const struct sockaddr_in6 *sin6 =
- (const struct sockaddr_in6 *)ifptr->ifa_addr;
- const struct in6_addr *in6 =
- (const struct in6_addr *)&sin6->sin6_addr;
-
- if (IN6_IS_ADDR_LINKLOCAL(in6) || IN6_IS_ADDR_V4COMPAT(in6)) {
- continue;
- }
- /* IPv6 does not have broadcast it uses multicast. */
- memset(&ifaces[total].bcast, '\0', copy_size);
-#endif
} else {
continue;
}