diff --git a/man/networkd.conf.xml b/man/networkd.conf.xml index 2041ddd427..6c60f6cf6b 100644 --- a/man/networkd.conf.xml +++ b/man/networkd.conf.xml @@ -61,6 +61,15 @@ Specifies the time interval to calculate the traffic speed of each interface. If SpeedMeter=no, the value is ignored. Defaults to 10sec. + + + ManageForeignRoutes= + A boolean. When true, systemd-networkd will store any routes + configured by other tools in its memory. When false, systemd-networkd will + not manage the foreign routes, thus they are kept even if KeepConfiguration= + is false. Defaults to yes. + + diff --git a/src/network/networkd-gperf.gperf b/src/network/networkd-gperf.gperf index d74d375599..aaabb3d1b3 100644 --- a/src/network/networkd-gperf.gperf +++ b/src/network/networkd-gperf.gperf @@ -20,5 +20,6 @@ struct ConfigPerfItem; %% Network.SpeedMeter, config_parse_bool, 0, offsetof(Manager, use_speed_meter) Network.SpeedMeterIntervalSec, config_parse_sec, 0, offsetof(Manager, speed_meter_interval_usec) +Network.ManageForeignRoutes, config_parse_bool, 0, offsetof(Manager, manage_foreign_routes) DHCP.DUIDType, config_parse_duid_type, 0, offsetof(Manager, duid) DHCP.DUIDRawData, config_parse_duid_rawdata, 0, offsetof(Manager, duid) diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index 5a442038c4..804f33d6cb 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -494,7 +494,8 @@ int manager_rtnl_process_route(sd_netlink *rtnl, sd_netlink_message *message, vo log_link_debug(link, "%s route: dst: %s%s, src: %s, gw: %s, prefsrc: %s, scope: %s, table: %s, proto: %s, type: %s", - type == RTM_DELROUTE ? "Forgetting" : route ? "Received remembered" : "Remembering", + (!route && !link->manager->manage_foreign_routes) || type == RTM_DELROUTE ? "Forgetting" : + route ? "Received remembered" : "Remembering", strna(buf_dst), strempty(buf_dst_prefixlen), strna(buf_src), strna(buf_gw), strna(buf_prefsrc), format_route_scope(tmp->scope, buf_scope, sizeof buf_scope), @@ -505,7 +506,7 @@ int manager_rtnl_process_route(sd_netlink *rtnl, sd_netlink_message *message, vo switch (type) { case RTM_NEWROUTE: - if (!route) { + if (!route && link->manager->manage_foreign_routes) { /* A route appeared that we did not request */ r = route_add_foreign(link, tmp, &route); if (r < 0) { @@ -1747,6 +1748,7 @@ int manager_new(Manager **ret) { *m = (Manager) { .speed_meter_interval_usec = SPEED_METER_DEFAULT_TIME_INTERVAL, + .manage_foreign_routes = true, }; m->state_file = strdup("/run/systemd/netif/state"); diff --git a/src/network/networkd-manager.h b/src/network/networkd-manager.h index f2f309ffb0..6ee0233537 100644 --- a/src/network/networkd-manager.h +++ b/src/network/networkd-manager.h @@ -30,6 +30,7 @@ struct Manager { bool enumerating:1; bool dirty:1; bool restarting:1; + bool manage_foreign_routes; Set *dirty_links; diff --git a/src/network/networkd.conf b/src/network/networkd.conf index c5667da9fa..5339e5e5ed 100644 --- a/src/network/networkd.conf +++ b/src/network/networkd.conf @@ -14,6 +14,7 @@ [Network] #SpeedMeter=no #SpeedMeterIntervalSec=10sec +#ManageForeignRoutes=yes [DHCP] #DUIDType=vendor