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