summaryrefslogtreecommitdiff
path: root/src/network/networkd-nexthop.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2022-01-31 19:08:27 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2022-02-01 11:30:37 +0900
commita0e99a377a2f22c0ba460d3e7228214008714c14 (patch)
tree017e39c04e5a574dde21998b2285f896e2aa2be0 /src/network/networkd-nexthop.c
parent9d67fb0e33145cde08759c85f6631f75bdef559c (diff)
downloadsystemd-a0e99a377a2f22c0ba460d3e7228214008714c14.tar.gz
network: remove only managed configs on reconfigure or carrier lost
Otherwise, if the carrir of the non-managed interface is lost, the configs such as addresses or routes on the interface will be removed by networkd.
Diffstat (limited to 'src/network/networkd-nexthop.c')
-rw-r--r--src/network/networkd-nexthop.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/network/networkd-nexthop.c b/src/network/networkd-nexthop.c
index e9e5d08557..b2bc0dc570 100644
--- a/src/network/networkd-nexthop.c
+++ b/src/network/networkd-nexthop.c
@@ -613,8 +613,8 @@ static void manager_mark_nexthops(Manager *manager, bool foreign, const Link *ex
if (nexthop->protocol == RTPROT_KERNEL)
continue;
- /* When 'foreign' is true, do not remove nexthops we configured. */
- if (foreign && nexthop->source != NETWORK_CONFIG_SOURCE_FOREIGN)
+ /* When 'foreign' is true, mark only foreign nexthops, and vice versa. */
+ if (foreign != (nexthop->source == NETWORK_CONFIG_SOURCE_FOREIGN))
continue;
/* Ignore nexthops not assigned yet or already removed. */
@@ -641,7 +641,7 @@ static void manager_mark_nexthops(Manager *manager, bool foreign, const Link *ex
}
}
-static int manager_drop_nexthops(Manager *manager) {
+static int manager_drop_marked_nexthops(Manager *manager) {
NextHop *nexthop;
int k, r = 0;
@@ -704,14 +704,14 @@ int link_drop_foreign_nexthops(Link *link) {
manager_mark_nexthops(link->manager, /* foreign = */ true, NULL);
- k = manager_drop_nexthops(link->manager);
+ k = manager_drop_marked_nexthops(link->manager);
if (k < 0 && r >= 0)
r = k;
return r;
}
-int link_drop_nexthops(Link *link) {
+int link_drop_managed_nexthops(Link *link) {
NextHop *nexthop;
int k, r = 0;
@@ -723,6 +723,10 @@ int link_drop_nexthops(Link *link) {
if (nexthop->protocol == RTPROT_KERNEL)
continue;
+ /* Do not touch addresses managed by kernel or other tools. */
+ if (nexthop->source == NETWORK_CONFIG_SOURCE_FOREIGN)
+ continue;
+
/* Ignore nexthops not assigned yet or already removing. */
if (!nexthop_exists(nexthop))
continue;
@@ -734,7 +738,7 @@ int link_drop_nexthops(Link *link) {
manager_mark_nexthops(link->manager, /* foreign = */ false, link);
- k = manager_drop_nexthops(link->manager);
+ k = manager_drop_marked_nexthops(link->manager);
if (k < 0 && r >= 0)
r = k;