summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-04-11 21:33:51 +0900
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2021-09-02 11:51:27 +0200
commit38a6b3a36edf27bf087986997740d245434ee6d0 (patch)
tree089a382be92348695c312874697551bad729f27f
parentacbd04c5fd2005e2f63bb2d1fe78ce9f212dccfe (diff)
downloadsystemd-38a6b3a36edf27bf087986997740d245434ee6d0.tar.gz
network: introduce ManageForeignRoutingPolicyRules= boolean setting in networkd.conf
The commit 0b81225e5791f660506f7db0ab88078cf296b771 makes that networkd remove all foreign rules except those with "proto kernel". But, in some situation, people may want to manage routing policy rules with other tools, e.g. 'ip' command. To support such the situation, this introduce ManageForeignRoutingPolicyRules= boolean setting. Closes #19106. (cherry picked from commit d94dfe7053d49fa62c4bfc07b7f3fc2227c10aff)
-rw-r--r--man/networkd.conf.xml9
-rw-r--r--src/network/networkd-gperf.gperf11
-rw-r--r--src/network/networkd-manager.c4
-rw-r--r--src/network/networkd-manager.h1
-rw-r--r--src/network/networkd-routing-policy-rule.c2
-rw-r--r--src/network/networkd.conf1
6 files changed, 23 insertions, 5 deletions
diff --git a/man/networkd.conf.xml b/man/networkd.conf.xml
index 65aecb6256..f5b5d92fa1 100644
--- a/man/networkd.conf.xml
+++ b/man/networkd.conf.xml
@@ -63,6 +63,15 @@
</varlistentry>
<varlistentry>
+ <term><varname>ManageForeignRoutingPolicyRules=</varname></term>
+ <listitem><para>A boolean. When true, <command>systemd-networkd</command> will remove rules
+ that are not configured in .network files (except for rules with protocol
+ <literal>kernel</literal>). When false, it will not remove any foreign rules, keeping them even
+ if they are not configured in a .network file. Defaults to yes.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><varname>ManageForeignRoutes=</varname></term>
<listitem><para>A boolean. When true, <command>systemd-networkd</command> will store any routes
configured by other tools in its memory. When false, <command>systemd-networkd</command> will
diff --git a/src/network/networkd-gperf.gperf b/src/network/networkd-gperf.gperf
index aaabb3d1b3..d0feebe140 100644
--- a/src/network/networkd-gperf.gperf
+++ b/src/network/networkd-gperf.gperf
@@ -18,8 +18,9 @@ struct ConfigPerfItem;
%struct-type
%includes
%%
-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)
+Network.SpeedMeter, config_parse_bool, 0, offsetof(Manager, use_speed_meter)
+Network.SpeedMeterIntervalSec, config_parse_sec, 0, offsetof(Manager, speed_meter_interval_usec)
+Network.ManageForeignRoutingPolicyRules, config_parse_bool, 0, offsetof(Manager, manage_foreign_rules)
+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 1aa086d0a1..df5b6bc31c 100644
--- a/src/network/networkd-manager.c
+++ b/src/network/networkd-manager.c
@@ -797,6 +797,7 @@ int manager_new(Manager **ret) {
*m = (Manager) {
.speed_meter_interval_usec = SPEED_METER_DEFAULT_TIME_INTERVAL,
.manage_foreign_routes = true,
+ .manage_foreign_rules = true,
.ethtool_fd = -1,
};
@@ -1058,6 +1059,9 @@ static int manager_enumerate_rules(Manager *m) {
assert(m);
assert(m->rtnl);
+ if (!m->manage_foreign_rules)
+ return 0;
+
r = sd_rtnl_message_new_routing_policy_rule(m->rtnl, &req, RTM_GETRULE, 0);
if (r < 0)
return r;
diff --git a/src/network/networkd-manager.h b/src/network/networkd-manager.h
index f6a5394b6e..fd9ca3cc01 100644
--- a/src/network/networkd-manager.h
+++ b/src/network/networkd-manager.h
@@ -31,6 +31,7 @@ struct Manager {
bool dirty:1;
bool restarting:1;
bool manage_foreign_routes;
+ bool manage_foreign_rules;
Set *dirty_links;
diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c
index d4fa23c4d9..7b42f416cd 100644
--- a/src/network/networkd-routing-policy-rule.c
+++ b/src/network/networkd-routing-policy-rule.c
@@ -944,6 +944,8 @@ int manager_rtnl_process_rule(sd_netlink *rtnl, sd_netlink_message *message, Man
case RTM_NEWRULE:
if (rule)
log_routing_policy_rule_debug(tmp, tmp->family, "Received remembered", NULL);
+ else if (!m->manage_foreign_routes)
+ log_routing_policy_rule_debug(tmp, tmp->family, "Ignoring received foreign", NULL);
else {
log_routing_policy_rule_debug(tmp, tmp->family, "Remembering foreign", NULL);
r = routing_policy_rule_consume_foreign(m, TAKE_PTR(tmp));
diff --git a/src/network/networkd.conf b/src/network/networkd.conf
index 1e8ccc3642..eb605f3ade 100644
--- a/src/network/networkd.conf
+++ b/src/network/networkd.conf
@@ -15,6 +15,7 @@
[Network]
#SpeedMeter=no
#SpeedMeterIntervalSec=10sec
+#ManageForeignRoutingPolicyRules=yes
#ManageForeignRoutes=yes
#RouteTable=