summaryrefslogtreecommitdiff
path: root/lib/util/util_net.c
diff options
context:
space:
mode:
authorKai Blin <kai@samba.org>2011-09-24 18:18:14 -0700
committerKai Blin <kai@samba.org>2011-09-24 21:46:06 -0700
commitb02bbf237cfd36cd736cefc78f1e3ba3278dc7bf (patch)
tree7c2763a28aa44a08a48c78e0fde6c82dc6797ea8 /lib/util/util_net.c
parent7466612392272e70c60114fc035b62b16f6194aa (diff)
downloadsamba-b02bbf237cfd36cd736cefc78f1e3ba3278dc7bf.tar.gz
samba-b02bbf237cfd36cd736cefc78f1e3ba3278dc7bf.tar.bz2
samba-b02bbf237cfd36cd736cefc78f1e3ba3278dc7bf.zip
net: Don't register link local addresses with DNS
Diffstat (limited to 'lib/util/util_net.c')
-rw-r--r--lib/util/util_net.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/util/util_net.c b/lib/util/util_net.c
index 23d25acab9..139c9d42bc 100644
--- a/lib/util/util_net.c
+++ b/lib/util/util_net.c
@@ -432,6 +432,29 @@ void zero_ip_v4(struct in_addr *ip)
ZERO_STRUCTP(ip);
}
+bool is_linklocal_addr(const struct sockaddr_storage *pss)
+{
+#ifdef HAVE_IPV6
+ if (pss->ss_family == AF_INET6) {
+ const struct in6_addr *pin6 =
+ &((const struct sockaddr_in6 *)pss)->sin6_addr;
+ return IN6_IS_ADDR_LINKLOCAL(pin6);
+ }
+#endif
+ if (pss->ss_family == AF_INET) {
+ const struct in_addr *pin =
+ &((const struct sockaddr_in *)pss)->sin_addr;
+ struct in_addr ll_addr;
+ struct in_addr mask_addr;
+
+ /* 169.254.0.0/16, is link local, see RFC 3927 */
+ ll_addr.s_addr = 0xa9fe0000;
+ mask_addr.s_addr = 0xffff0000;
+ return same_net_v4(*pin, ll_addr, mask_addr);
+ }
+ return false;
+}
+
/**
* Convert an IPv4 struct in_addr to a struct sockaddr_storage.
*/