diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-04-11 21:33:51 +0900 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2021-09-02 11:51:27 +0200 |
commit | 38a6b3a36edf27bf087986997740d245434ee6d0 (patch) | |
tree | 089a382be92348695c312874697551bad729f27f | |
parent | acbd04c5fd2005e2f63bb2d1fe78ce9f212dccfe (diff) | |
download | systemd-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.xml | 9 | ||||
-rw-r--r-- | src/network/networkd-gperf.gperf | 11 | ||||
-rw-r--r-- | src/network/networkd-manager.c | 4 | ||||
-rw-r--r-- | src/network/networkd-manager.h | 1 | ||||
-rw-r--r-- | src/network/networkd-routing-policy-rule.c | 2 | ||||
-rw-r--r-- | src/network/networkd.conf | 1 |
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= |