link->n_ref = 1;
link->manager = manager;
- link->state = LINK_STATE_INITIALIZING;
+ link->state = LINK_STATE_PENDING;
link->ifindex = ifindex;
link->ifname = strdup(ifname);
if (!link->ifname)
assert(link);
assert(link->network);
- assert(link->state == LINK_STATE_INITIALIZING);
+ assert(link->state == LINK_STATE_PENDING);
link->state = LINK_STATE_ENSLAVING;
assert(link);
assert(link->network);
- assert(link->state == LINK_STATE_INITIALIZING);
+ assert(link->state == LINK_STATE_PENDING);
if (link->network->ipv4ll) {
r = ipv4ll_configure(link);
assert(link->ifname);
assert(link->manager);
- if (link->state != LINK_STATE_INITIALIZING)
+ if (link->state != LINK_STATE_PENDING)
return 1;
log_debug_link(link, "link state is up-to-date");
assert(link->manager->rtnl);
assert(device);
- if (link->state != LINK_STATE_INITIALIZING)
+ if (link->state != LINK_STATE_PENDING)
return 0;
if (link->udev_device)
_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;
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);
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;
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:
if (udev_device_get_is_initialized(device) <= 0) {
/* not yet ready */
- log_debug_link(link, "udev initializing link...");
+ log_debug_link(link, "link pending udev initialization...");
return 0;
}
/* 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) {
}
static const char* const link_state_table[_LINK_STATE_MAX] = {
- [LINK_STATE_INITIALIZING] = "initializing",
+ [LINK_STATE_PENDING] = "pending",
[LINK_STATE_ENSLAVING] = "configuring",
[LINK_STATE_SETTING_ADDRESSES] = "configuring",
[LINK_STATE_SETTING_ROUTES] = "configuring",
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",