From 6bfadad9bb6eaf614da92eba0a9b6243e8645018 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 11 Apr 2021 21:25:16 +0900 Subject: [PATCH 1/3] network: add missing default setting in networkd.conf --- src/network/networkd.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/src/network/networkd.conf b/src/network/networkd.conf index 4850ba61f2f..0eac3273146 100644 --- a/src/network/networkd.conf +++ b/src/network/networkd.conf @@ -16,6 +16,7 @@ #SpeedMeter=no #SpeedMeterIntervalSec=10sec #ManageForeignRoutes=yes +#RouteTable= [DHCP] #DUIDType=vendor From d94dfe7053d49fa62c4bfc07b7f3fc2227c10aff Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 11 Apr 2021 21:33:51 +0900 Subject: [PATCH 2/3] 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. --- man/networkd.conf.xml | 9 +++++++++ src/network/networkd-gperf.gperf | 13 +++++++------ src/network/networkd-manager.c | 4 ++++ src/network/networkd-manager.h | 1 + src/network/networkd-routing-policy-rule.c | 2 ++ src/network/networkd.conf | 1 + 6 files changed, 24 insertions(+), 6 deletions(-) diff --git a/man/networkd.conf.xml b/man/networkd.conf.xml index dcce2095edd..23422c6c945 100644 --- a/man/networkd.conf.xml +++ b/man/networkd.conf.xml @@ -62,6 +62,15 @@ If SpeedMeter=no, the value is ignored. Defaults to 10sec. + + ManageForeignRoutingPolicyRules= + A boolean. When true, systemd-networkd will remove rules + that are not configured in .network files (except for rules with protocol + kernel). When false, it will not remove any foreign rules, keeping them even + if they are not configured in a .network file. Defaults to yes. + + + ManageForeignRoutes= A boolean. When true, systemd-networkd will store any routes diff --git a/src/network/networkd-gperf.gperf b/src/network/networkd-gperf.gperf index b2a2f55790f..74d509896a3 100644 --- a/src/network/networkd-gperf.gperf +++ b/src/network/networkd-gperf.gperf @@ -20,9 +20,10 @@ 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) -Network.RouteTable, config_parse_route_table_names, 0, 0 -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) +Network.RouteTable, config_parse_route_table_names, 0, 0 +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 a8db2cc44bb..20957ecd894 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -380,6 +380,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, }; @@ -655,6 +656,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 7f630fccc7f..0fae7a5c2ef 100644 --- a/src/network/networkd-manager.h +++ b/src/network/networkd-manager.h @@ -32,6 +32,7 @@ struct Manager { bool dirty; bool restarting; 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 a7fddfd58fc..03bdd4e640f 100644 --- a/src/network/networkd-routing-policy-rule.c +++ b/src/network/networkd-routing-policy-rule.c @@ -977,6 +977,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, m); + else if (!m->manage_foreign_routes) + log_routing_policy_rule_debug(tmp, tmp->family, "Ignoring received foreign", NULL, m); else { log_routing_policy_rule_debug(tmp, tmp->family, "Remembering foreign", NULL, m); r = routing_policy_rule_consume_foreign(m, TAKE_PTR(tmp)); diff --git a/src/network/networkd.conf b/src/network/networkd.conf index 0eac3273146..4e4e8b8d070 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= From 3fe23a96d66e82ff8b08e6573093e391d62f5bd1 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 13 Apr 2021 12:23:31 +0900 Subject: [PATCH 3/3] man: update description for ManageForeignRoutes= --- man/networkd.conf.xml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/man/networkd.conf.xml b/man/networkd.conf.xml index 23422c6c945..bbf6826e319 100644 --- a/man/networkd.conf.xml +++ b/man/networkd.conf.xml @@ -73,10 +73,13 @@ 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. + A boolean. When true, systemd-networkd will remove routes + that are not configured in .network files (except for routes with protocol + kernel, dhcp when KeepConfiguration= + is true or dhcp, and static when + KeepConfiguration= is true or static). When false, it will + not remove any foreign routes, keeping them even if they are not configured in a .network file. + Defaults to yes.