networkd: don't consider deprecated or tentative addresses when determining operstate
authorTom Gundersen <teg@jklm.no>
Tue, 19 Aug 2014 16:59:28 +0000 (18:59 +0200)
committerTom Gundersen <teg@jklm.no>
Tue, 19 Aug 2014 17:01:38 +0000 (19:01 +0200)
https://bugs.freedesktop.org/show_bug.cgi?id=81287

src/network/networkd-link.c
src/network/networkd.h

index b5f5863..dff3270 100644 (file)
@@ -1386,6 +1386,13 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message,
                 return 0;
         }
 
+        r = sd_rtnl_message_addr_get_flags(message, &address->flags);
+        if (r < 0) {
+                log_warning_link(link,
+                                 "rtnl: received address with invalid flags, ignoring");
+                return 0;
+        }
+
         switch (address->family) {
         case AF_INET:
                 r = sd_rtnl_message_read_in_addr(message, IFA_LOCAL,
@@ -1658,6 +1665,9 @@ static void link_update_operstate(Link *link) {
 
                 /* if we have carrier, check what addresses we have */
                 LIST_FOREACH(addresses, address, link->addresses) {
+                        if (address->flags & (IFA_F_TENTATIVE | IFA_F_DEPRECATED))
+                                continue;
+
                         if (address->scope < scope)
                                 scope = address->scope;
                 }
index c8d89d2..ab5df1a 100644 (file)
@@ -126,6 +126,7 @@ struct Address {
         int family;
         unsigned char prefixlen;
         unsigned char scope;
+        unsigned char flags;
         char *label;
 
         struct in_addr broadcast;