summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2024-07-30 20:04:04 +0200
committerYu Watanabe <watanabe.yu+github@gmail.com>2024-07-30 22:27:19 +0200
commite8eaed0240d642e70c567b08f3593e4cf45a255a (patch)
tree156dcd9d161124ab5bfd0b7120464644b0d9c54f
parentdocument how TimeoutStartSec= affects notify-reload (#33653) (diff)
downloadsystemd-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.c30
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;