| commit d94dfe7053d49fa62c4bfc07b7f3fc2227c10aff |
| Author: Yu Watanabe <watanabe.yu+github@gmail.com> |
| Date: Sun Apr 11 21:33:51 2021 +0900 |
| |
| 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. |
| |
| 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 <varname>SpeedMeter=no</varname>, the value is ignored. Defaults to 10sec.</para></listitem> |
| </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 |
| 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= |
| |