mirror of
https://github.com/systemd/systemd.git
synced 2025-08-31 09:49:54 +03:00
networkd: wait for IFF_RUNNING rather than IFF_LOWER_UP
The interface is not fully ready until it enterns RUNNING. This was causing problems with sending out DHCP messages before the interface was ready, so they would get lost. In particular this affected DHCP INIT-REBOOT, as it relies on the first package sent being successful (or it will fall back to a full reboot). Also improve the logging a lot, to make future debugging of link state a lot easier.
This commit is contained in:
@ -1031,6 +1031,7 @@ static int link_acquire_conf(Link *link) {
|
||||
}
|
||||
|
||||
static int link_update_flags(Link *link, unsigned flags) {
|
||||
unsigned flags_added, flags_removed, generic_flags;
|
||||
int r;
|
||||
|
||||
assert(link);
|
||||
@ -1042,16 +1043,31 @@ static int link_update_flags(Link *link, unsigned flags) {
|
||||
if (link->flags == flags)
|
||||
return 0;
|
||||
|
||||
log_debug_link(link, "link status updated: %#.8x -> %#.8x",
|
||||
link->flags, flags);
|
||||
flags_added = (link->flags ^ flags) & flags;
|
||||
flags_removed = (link->flags ^ flags) & link->flags;
|
||||
generic_flags = ~(IFF_UP | IFF_LOWER_UP | IFF_RUNNING);
|
||||
|
||||
if ((link->flags & IFF_UP) != (flags & IFF_UP))
|
||||
log_info_link(link,
|
||||
"link is %s", flags & IFF_UP ? "up": "down");
|
||||
if (flags_added & generic_flags)
|
||||
log_debug_link(link, "link flags gained: %#.8x",
|
||||
flags_added & generic_flags);
|
||||
|
||||
if ((link->flags & IFF_LOWER_UP) != (flags & IFF_LOWER_UP)) {
|
||||
if (flags & IFF_LOWER_UP) {
|
||||
if (flags_removed & generic_flags)
|
||||
log_debug_link(link, "link flags lost: %#.8x",
|
||||
flags_removed & generic_flags);
|
||||
|
||||
if (flags_added & IFF_UP)
|
||||
log_info_link(link, "link is up");
|
||||
else if (flags_removed & IFF_UP)
|
||||
log_info_link(link, "link is down");
|
||||
|
||||
if (flags_added & IFF_LOWER_UP)
|
||||
log_info_link(link, "carrier on");
|
||||
else if (flags_removed & IFF_LOWER_UP)
|
||||
log_info_link(link, "carrier off");
|
||||
|
||||
|
||||
if (flags_added & IFF_RUNNING) {
|
||||
log_info_link(link, "running");
|
||||
|
||||
if (link->network->dhcp || link->network->ipv4ll) {
|
||||
r = link_acquire_conf(link);
|
||||
@ -1061,8 +1077,8 @@ static int link_update_flags(Link *link, unsigned flags) {
|
||||
return r;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
log_info_link(link, "carrier off");
|
||||
} else if (flags_removed & IFF_RUNNING) {
|
||||
log_info_link(link, "not running");
|
||||
|
||||
if (link->network->dhcp) {
|
||||
r = sd_dhcp_client_stop(link->dhcp_client);
|
||||
@ -1082,7 +1098,6 @@ static int link_update_flags(Link *link, unsigned flags) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
link->flags = flags;
|
||||
|
||||
|
Reference in New Issue
Block a user