Skip to content

Commit d94dfe7

Browse files
committed
network: introduce ManageForeignRoutingPolicyRules= boolean setting in networkd.conf
The commit 0b81225 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 systemd#19106.
1 parent 6bfadad commit d94dfe7

File tree

6 files changed

+24
-6
lines changed

6 files changed

+24
-6
lines changed

man/networkd.conf.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,15 @@
6262
If <varname>SpeedMeter=no</varname>, the value is ignored. Defaults to 10sec.</para></listitem>
6363
</varlistentry>
6464

65+
<varlistentry>
66+
<term><varname>ManageForeignRoutingPolicyRules=</varname></term>
67+
<listitem><para>A boolean. When true, <command>systemd-networkd</command> will remove rules
68+
that are not configured in .network files (except for rules with protocol
69+
<literal>kernel</literal>). When false, it will not remove any foreign rules, keeping them even
70+
if they are not configured in a .network file. Defaults to yes.
71+
</para></listitem>
72+
</varlistentry>
73+
6574
<varlistentry>
6675
<term><varname>ManageForeignRoutes=</varname></term>
6776
<listitem><para>A boolean. When true, <command>systemd-networkd</command> will store any routes

src/network/networkd-gperf.gperf

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ struct ConfigPerfItem;
2020
%struct-type
2121
%includes
2222
%%
23-
Network.SpeedMeter, config_parse_bool, 0, offsetof(Manager, use_speed_meter)
24-
Network.SpeedMeterIntervalSec, config_parse_sec, 0, offsetof(Manager, speed_meter_interval_usec)
25-
Network.ManageForeignRoutes, config_parse_bool, 0, offsetof(Manager, manage_foreign_routes)
26-
Network.RouteTable, config_parse_route_table_names, 0, 0
27-
DHCP.DUIDType, config_parse_duid_type, 0, offsetof(Manager, duid)
28-
DHCP.DUIDRawData, config_parse_duid_rawdata, 0, offsetof(Manager, duid)
23+
Network.SpeedMeter, config_parse_bool, 0, offsetof(Manager, use_speed_meter)
24+
Network.SpeedMeterIntervalSec, config_parse_sec, 0, offsetof(Manager, speed_meter_interval_usec)
25+
Network.ManageForeignRoutingPolicyRules, config_parse_bool, 0, offsetof(Manager, manage_foreign_rules)
26+
Network.ManageForeignRoutes, config_parse_bool, 0, offsetof(Manager, manage_foreign_routes)
27+
Network.RouteTable, config_parse_route_table_names, 0, 0
28+
DHCP.DUIDType, config_parse_duid_type, 0, offsetof(Manager, duid)
29+
DHCP.DUIDRawData, config_parse_duid_rawdata, 0, offsetof(Manager, duid)

src/network/networkd-manager.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,7 @@ int manager_new(Manager **ret) {
380380
*m = (Manager) {
381381
.speed_meter_interval_usec = SPEED_METER_DEFAULT_TIME_INTERVAL,
382382
.manage_foreign_routes = true,
383+
.manage_foreign_rules = true,
383384
.ethtool_fd = -1,
384385
};
385386

@@ -655,6 +656,9 @@ static int manager_enumerate_rules(Manager *m) {
655656
assert(m);
656657
assert(m->rtnl);
657658

659+
if (!m->manage_foreign_rules)
660+
return 0;
661+
658662
r = sd_rtnl_message_new_routing_policy_rule(m->rtnl, &req, RTM_GETRULE, 0);
659663
if (r < 0)
660664
return r;

src/network/networkd-manager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ struct Manager {
3232
bool dirty;
3333
bool restarting;
3434
bool manage_foreign_routes;
35+
bool manage_foreign_rules;
3536

3637
Set *dirty_links;
3738

src/network/networkd-routing-policy-rule.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -977,6 +977,8 @@ int manager_rtnl_process_rule(sd_netlink *rtnl, sd_netlink_message *message, Man
977977
case RTM_NEWRULE:
978978
if (rule)
979979
log_routing_policy_rule_debug(tmp, tmp->family, "Received remembered", NULL, m);
980+
else if (!m->manage_foreign_routes)
981+
log_routing_policy_rule_debug(tmp, tmp->family, "Ignoring received foreign", NULL, m);
980982
else {
981983
log_routing_policy_rule_debug(tmp, tmp->family, "Remembering foreign", NULL, m);
982984
r = routing_policy_rule_consume_foreign(m, TAKE_PTR(tmp));

src/network/networkd.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
[Network]
1616
#SpeedMeter=no
1717
#SpeedMeterIntervalSec=10sec
18+
#ManageForeignRoutingPolicyRules=yes
1819
#ManageForeignRoutes=yes
1920
#RouteTable=
2021

0 commit comments

Comments
 (0)