diff --git a/man/networkd.conf.xml b/man/networkd.conf.xml
index abf47d17b6..bf597cac2e 100644
--- a/man/networkd.conf.xml
+++ b/man/networkd.conf.xml
@@ -89,9 +89,10 @@
colon, i.e., name:number.
The route table name must not be default, main, or
local, as these route table names are predefined with route table number 253,
- 254, and 255, respectively. The route table number must be an integer in the range 1…4294967295.
- This setting can be specified multiple times. If an empty string is specified, then the list
- specified earlier are cleared. Defaults to unset.
+ 254, and 255, respectively. The route table number must be an integer in the range 1…4294967295,
+ except for predefined numbers 253, 254, and 255. This setting can be specified multiple times.
+ If an empty string is specified, then the list specified earlier are cleared. Defaults to unset.
+
diff --git a/src/network/networkd-route-util.c b/src/network/networkd-route-util.c
index aa7a4f93b3..9831a84991 100644
--- a/src/network/networkd-route-util.c
+++ b/src/network/networkd-route-util.c
@@ -501,9 +501,10 @@ int config_parse_route_table_names(
"Route table name cannot be numeric. Ignoring assignment: %s:%s", name, num);
continue;
}
- if (STR_IN_SET(name, "default", "main", "local")) {
+ if (route_table_from_string(name) >= 0) {
log_syntax(unit, LOG_WARNING, filename, line, 0,
- "Route table name %s is already predefined. Ignoring assignment: %s:%s", name, name, num);
+ "Route table name %s is predefined for %i. Ignoring assignment: %s:%s",
+ name, route_table_from_string(name), name, num);
continue;
}
@@ -518,6 +519,12 @@ int config_parse_route_table_names(
"Invalid route table number, ignoring assignment: %s:%s", name, num);
continue;
}
+ if (route_table_to_string(table)) {
+ log_syntax(unit, LOG_WARNING, filename, line, 0,
+ "Route table name for %s is predefined (%s). Ignoring assignment: %s:%s",
+ num, route_table_to_string(table), name, num);
+ continue;
+ }
r = hashmap_ensure_put(&m->route_table_numbers_by_name, &string_hash_ops_free, name, UINT32_TO_PTR(table));
if (r == -ENOMEM)
diff --git a/src/network/test-network.c b/src/network/test-network.c
index a8db202941..35592e0733 100644
--- a/src/network/test-network.c
+++ b/src/network/test-network.c
@@ -153,6 +153,7 @@ static void test_route_tables(Manager *manager) {
/* Invalid pairs */
assert_se(config_parse_route_table_names("manager", "filename", 1, "section", 1, "RouteTable", 0, "main:123 default:333 local:999", manager, manager) >= 0);
+ assert_se(config_parse_route_table_names("manager", "filename", 1, "section", 1, "RouteTable", 0, "xxx:253 yyy:254 local:255", manager, manager) >= 0);
assert_se(config_parse_route_table_names("manager", "filename", 1, "section", 1, "RouteTable", 0, "1234:321 :567 hoge:foo aaa:-888", manager, manager) >= 0);
assert_se(!manager->route_table_names_by_number);
assert_se(!manager->route_table_numbers_by_name);