diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2024-07-30 20:04:04 +0200 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2024-07-30 22:27:19 +0200 |
commit | e8eaed0240d642e70c567b08f3593e4cf45a255a (patch) | |
tree | 156dcd9d161124ab5bfd0b7120464644b0d9c54f | |
parent | document how TimeoutStartSec= affects notify-reload (#33653) (diff) | |
download | systemd-e8eaed0240d642e70c567b08f3593e4cf45a255a.tar.xz systemd-e8eaed0240d642e70c567b08f3593e4cf45a255a.zip |
network: do not bring down bound interfaces immediately
Even if a timespan specified to IgnoreCarrierLoss= for an interface,
when the carrier of the interface lost, bound interfaces might be bring
down immediately.
Let's also postpone bringing down bound interfaces with the specified
timespan.
-rw-r--r-- | src/network/networkd-link.c | 30 |
1 files changed, 11 insertions, 19 deletions
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 6b0f09926a..e1947f0bc9 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -1769,25 +1769,22 @@ static int link_carrier_gained(Link *link) { } static int link_carrier_lost_impl(Link *link) { - int r, ret = 0; + int ret = 0; assert(link); link->previous_ssid = mfree(link->previous_ssid); + ret = link_handle_bound_by_list(link); + if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) - return 0; + return ret; if (!link->network) - return 0; - - r = link_stop_engines(link, false); - if (r < 0) - ret = r; + return ret; - r = link_drop_managed_config(link); - if (r < 0 && ret >= 0) - ret = r; + RET_GATHER(ret, link_stop_engines(link, false)); + RET_GATHER(ret, link_drop_managed_config(link)); return ret; } @@ -1808,22 +1805,17 @@ static int link_carrier_lost_handler(sd_event_source *s, uint64_t usec, void *us static int link_carrier_lost(Link *link) { uint16_t dhcp_mtu; usec_t usec; - int r; assert(link); - r = link_handle_bound_by_list(link); - if (r < 0) - return r; - if (link->iftype == ARPHRD_CAN) /* let's shortcut things for CAN which doesn't need most of what's done below. */ - return 0; + usec = 0; - if (!link->network) - return 0; + else if (!link->network) + usec = 0; - if (link->network->ignore_carrier_loss_set) + else if (link->network->ignore_carrier_loss_set) /* If IgnoreCarrierLoss= is explicitly specified, then use the specified value. */ usec = link->network->ignore_carrier_loss_usec; |