From de697db05b08464180af4a257f6df88b00d60b9e Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 8 Dec 2019 00:32:36 +0900 Subject: [PATCH] network: introduce AddPrefixRoute= and deprecate PrefixRoute= PrefixRoute= was added by e63be0847c39bfdca45c25c505922814374581a7, but unfortunately, the meaning of PrefixRoute= is inverted; when true IFA_F_NOPREFIXROUTE flag is added. This introduces AddPrefixRoute= setting. --- man/systemd.network.xml | 8 +++----- src/network/networkd-address.c | 5 ++++- src/network/networkd-dhcp4.c | 14 +++++++------- src/network/networkd-network-gperf.gperf | 3 ++- test/fuzz/fuzz-network-parser/directives.network | 1 + 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/man/systemd.network.xml b/man/systemd.network.xml index 9585111761..24471adaa9 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -1007,12 +1007,10 @@ - PrefixRoute= + AddPrefixRoute= - Takes a boolean. When adding or modifying an IPv6 address, the userspace - application needs a way to suppress adding a prefix route. This is for example relevant - together with IFA_F_MANAGERTEMPADDR, where userspace creates autoconf generated addresses, - but depending on on-link, no route for the prefix should be added. Defaults to false. + Takes a boolean. When true, the prefix route for the address is automatically added. + Defaults to true. diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 886a8c0665..169d0e4829 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -33,6 +33,7 @@ int address_new(Address **ret) { .cinfo.ifa_prefered = CACHE_INFO_INFINITY_LIFE_TIME, .cinfo.ifa_valid = CACHE_INFO_INFINITY_LIFE_TIME, .duplicate_address_detection = ADDRESS_FAMILY_IPV6, + .prefix_route = true, }; *ret = TAKE_PTR(address); @@ -596,7 +597,7 @@ int address_configure( if (address->manage_temporary_address) address->flags |= IFA_F_MANAGETEMPADDR; - if (address->prefix_route) + if (!address->prefix_route) address->flags |= IFA_F_NOPREFIXROUTE; if (address->autojoin) @@ -1001,6 +1002,8 @@ int config_parse_address_flags(const char *unit, else if (streq(lvalue, "ManageTemporaryAddress")) n->manage_temporary_address = r; else if (streq(lvalue, "PrefixRoute")) + n->prefix_route = !r; + else if (streq(lvalue, "AddPrefixRoute")) n->prefix_route = r; else if (streq(lvalue, "AutoJoin")) n->autojoin = r; diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index d430115f56..0694ffc939 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -111,10 +111,10 @@ static int route_scope_from_address(const Route *route, const struct in_addr *se return RT_SCOPE_UNIVERSE; } -static bool link_noprefixroute(Link *link) { - return link->network->dhcp_route_table_set && - link->network->dhcp_route_table != RT_TABLE_MAIN && - !link->manager->dhcp4_prefix_root_cannot_set_table; +static bool link_prefixroute(Link *link) { + return !link->network->dhcp_route_table_set || + link->network->dhcp_route_table == RT_TABLE_MAIN || + link->manager->dhcp4_prefix_root_cannot_set_table; } static int dhcp_route_configure(Route **route, Link *link) { @@ -254,7 +254,7 @@ static int link_set_dhcp_routes(Link *link) { if (r < 0) return log_link_warning_errno(link, r, "DHCP error: could not get address: %m"); - if (link_noprefixroute(link)) { + if (!link_prefixroute(link)) { _cleanup_(route_freep) Route *prefix_route = NULL; r = dhcp_prefix_route_from_lease(link->dhcp_lease, table, &address, &prefix_route); @@ -516,7 +516,7 @@ static int dhcp_remove_dns_routes(Link *link, sd_dhcp_lease *lease, const struct (void) route_remove(route, link, NULL); } - if (link_noprefixroute(link)) { + if (!link_prefixroute(link)) { _cleanup_(route_freep) Route *prefix_route = NULL; r = dhcp_prefix_route_from_lease(lease, table, address, &prefix_route); @@ -719,7 +719,7 @@ static int dhcp4_update_address(Link *link, addr->cinfo.ifa_valid = lifetime; addr->prefixlen = prefixlen; addr->broadcast.s_addr = address->s_addr | ~netmask->s_addr; - addr->prefix_route = link_noprefixroute(link); + addr->prefix_route = link_prefixroute(link); /* allow reusing an existing address and simply update its lifetime * in case it already exists */ diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index b06d32ec6d..29a05b2f30 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -106,7 +106,8 @@ Address.Label, config_parse_label, Address.PreferredLifetime, config_parse_lifetime, 0, 0 Address.HomeAddress, config_parse_address_flags, 0, 0 Address.ManageTemporaryAddress, config_parse_address_flags, 0, 0 -Address.PrefixRoute, config_parse_address_flags, 0, 0 +Address.PrefixRoute, config_parse_address_flags, 0, 0 /* deprecated */ +Address.AddPrefixRoute, config_parse_address_flags, 0, 0 Address.AutoJoin, config_parse_address_flags, 0, 0 Address.DuplicateAddressDetection, config_parse_duplicate_address_detection, 0, 0 Address.Scope, config_parse_address_scope, 0, 0 diff --git a/test/fuzz/fuzz-network-parser/directives.network b/test/fuzz/fuzz-network-parser/directives.network index 4513bbb529..0c76bd5f91 100644 --- a/test/fuzz/fuzz-network-parser/directives.network +++ b/test/fuzz/fuzz-network-parser/directives.network @@ -202,6 +202,7 @@ Address= Scope= HomeAddress= PrefixRoute= +AddPrefixRoute= ManageTemporaryAddress= Broadcast= Peer=