diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2022-01-31 19:08:27 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2022-02-01 11:30:37 +0900 |
commit | a0e99a377a2f22c0ba460d3e7228214008714c14 (patch) | |
tree | 017e39c04e5a574dde21998b2285f896e2aa2be0 /src/network/networkd-nexthop.c | |
parent | 9d67fb0e33145cde08759c85f6631f75bdef559c (diff) | |
download | systemd-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.c | 16 |
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; |