From d94dfe7053d49fa62c4bfc07b7f3fc2227c10aff Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 11 Apr 2021 21:33:51 +0900 Subject: [PATCH] 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 dcce2095ed..23422c6c94 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 b2a2f55790..74d509896a 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 a8db2cc44b..20957ecd89 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 7f630fccc7..0fae7a5c2e 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 a7fddfd58f..03bdd4e640 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 0eac327314..4e4e8b8d07 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= -- 2.25.1