chiark / gitweb /
networkd: link - print address lifetime for tracked addresses
[elogind.git] / src / network / networkd-link.c
index 398e8baac905d5cc5262a2990d6bf247e0b0ce88..d929a8012919ea69a6a854fcb1b89d8b5961bf98 100644 (file)
@@ -1336,6 +1336,8 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message,
         _cleanup_address_free_ Address *address = NULL;
         Address *ad;
         char buf[INET6_ADDRSTRLEN];
+        char valid_buf[FORMAT_TIMESPAN_MAX];
+        const char *valid_str = NULL;
         bool address_dropped = false;
         int r, ifindex;
 
@@ -1419,6 +1421,17 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message,
                 return 0;
         }
 
+        r = sd_rtnl_message_read_cache_info(message, IFA_CACHEINFO,
+                                            &address->cinfo);
+        if (r >= 0) {
+                if (address->cinfo.ifa_valid == CACHE_INFO_INFINITY_LIFE_TIME)
+                        valid_str = "ever";
+                else
+                        valid_str = format_timespan(valid_buf, FORMAT_TIMESPAN_MAX,
+                                                    address->cinfo.ifa_valid * USEC_PER_SEC,
+                                                    USEC_PER_SEC);
+        }
+
         LIST_FOREACH(addresses, ad, link->addresses) {
                 if (address_equal(ad, address)) {
                         LIST_REMOVE(addresses, link->addresses, ad);
@@ -1434,11 +1447,13 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message,
         switch (type) {
         case RTM_NEWADDR:
                 if (!address_dropped)
-                        log_debug_link(link, "added address: %s/%u", buf,
-                                       address->prefixlen);
+                        log_debug_link(link, "added address: %s/%u (valid for %s)",
+                                       buf, address->prefixlen,
+                                       strna(valid_str));
                 else
-                        log_debug_link(link, "updated address: %s/%u", buf,
-                                       address->prefixlen);
+                        log_debug_link(link, "updated address: %s/%u (valid for %s)",
+                                       buf, address->prefixlen,
+                                       strna(valid_str));
 
                 LIST_PREPEND(addresses, link->addresses, address);
                 address = NULL;
@@ -1448,14 +1463,16 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message,
                 break;
         case RTM_DELADDR:
                 if (address_dropped) {
-                        log_debug_link(link, "removed address: %s/%u", buf,
-                                       address->prefixlen);
+                        log_debug_link(link, "removed address: %s/%u (valid for %s)",
+                                       buf, address->prefixlen,
+                                       strna(valid_str));
 
                         link_save(link);
                 } else
                         log_warning_link(link,
-                                         "removing non-existent address: %s/%u",
-                                         buf, address->prefixlen);
+                                         "removing non-existent address: %s/%u (valid for %s)",
+                                         buf, address->prefixlen,
+                                         strna(valid_str));
 
                 break;
         default:
@@ -1657,9 +1674,9 @@ static void link_update_operstate(Link *link) {
                         /* no useful addresses found */
                         link->operstate = LINK_OPERSTATE_CARRIER;
         } else if (link->flags & IFF_UP)
-                link->operstate = LINK_OPERSTATE_UP;
+                link->operstate = LINK_OPERSTATE_NO_CARRIER;
         else
-                link->operstate = LINK_OPERSTATE_DOWN;
+                link->operstate = LINK_OPERSTATE_OFF;
 }
 
 int link_save(Link *link) {
@@ -1793,8 +1810,8 @@ static const char* const link_state_table[_LINK_STATE_MAX] = {
 DEFINE_STRING_TABLE_LOOKUP(link_state, LinkState);
 
 static const char* const link_operstate_table[_LINK_OPERSTATE_MAX] = {
-        [LINK_OPERSTATE_DOWN] = "down",
-        [LINK_OPERSTATE_UP] = "up",
+        [LINK_OPERSTATE_OFF] = "off",
+        [LINK_OPERSTATE_NO_CARRIER] = "no-carrier",
         [LINK_OPERSTATE_DORMANT] = "dormant",
         [LINK_OPERSTATE_CARRIER] = "carrier",
         [LINK_OPERSTATE_DEGRADED] = "degraded",