netdev-linux: ignore devices IPv6 link local addresses
authorThadeu Lima de Souza Cascardo <cascardo@redhat.com>
Thu, 18 Feb 2016 12:54:49 +0000 (10:54 -0200)
committerThadeu Lima de Souza Cascardo <cascardo@redhat.com>
Thu, 10 Mar 2016 17:03:57 +0000 (14:03 -0300)
When querying for the device IPv6 address, ignore link local addresses. Those
addresses should not be used for tunnel communications anyway.

include/sparse/netinet/in.h
lib/netdev-linux.c

index 78e5981..f324a81 100644 (file)
@@ -116,6 +116,10 @@ struct sockaddr_in6 {
      (X)->s6_addr[10] == 0xff &&                \
      (X)->s6_addr[11] == 0xff)
 
+#define IN6_IS_ADDR_LINKLOCAL(X)                 \
+    (((X)->s6_addr[0] == 0xfe) &&                \
+     (((X)->s6_addr[1] & 0xc0) == 0x80))
+
 #define INET_ADDRSTRLEN 16
 #define INET6_ADDRSTRLEN 46
 
index d58c1b1..161810b 100644 (file)
@@ -2566,7 +2566,8 @@ netdev_linux_get_in6(const struct netdev *netdev_, struct in6_addr *in6)
                 struct in6_addr in6_tmp;
                 char ifname[16 + 1];
                 if (parse_if_inet6_line(line, &in6_tmp, ifname)
-                    && !strcmp(name, ifname))
+                    && !strcmp(name, ifname)
+                    && !IN6_IS_ADDR_LINKLOCAL(&in6_tmp))
                 {
                     netdev->in6 = in6_tmp;
                     netdev->in6_error = 0;