1
0
mirror of https://github.com/systemd/systemd synced 2025-10-06 00:13:24 +02:00

network/dhcp6: refactoring for verify_dhcp6_address()

No functional change. Preparation for later changes.
This commit is contained in:
Yu Watanabe
2025-06-21 03:48:51 +09:00
parent 3dcb56f5e0
commit 03f0658460

View File

@@ -155,46 +155,37 @@ static int dhcp6_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Reques
}
static int verify_dhcp6_address(Link *link, const Address *address) {
bool by_ndisc = false;
Address *existing;
int log_level;
assert(link);
assert(address);
assert(address->family == AF_INET6);
const char *pretty = IN6_ADDR_TO_STRING(&address->in_addr.in6);
Address *existing = NULL;
(void) address_get_harder(link, address, &existing);
if (address_get_harder(link, address, &existing) < 0) {
/* New address. */
log_level = LOG_INFO;
goto simple_log;
} else
log_level = LOG_DEBUG;
if (!existing || address_can_update(existing, address)) {
log_link_full(link,
/* Downgrade the log level if the address already exists or has been requested. */
existing ? LOG_DEBUG : LOG_INFO,
"DHCPv6 address %s (valid %s, preferred %s)",
IN6_ADDR_PREFIX_TO_STRING(&address->in_addr.in6, address->prefixlen),
FORMAT_LIFETIME(address->lifetime_valid_usec),
FORMAT_LIFETIME(address->lifetime_preferred_usec));
return 0;
}
if (address_can_update(existing, address))
goto simple_log;
bool by_ndisc = existing->source == NETWORK_CONFIG_SOURCE_NDISC;
if (existing->source == NETWORK_CONFIG_SOURCE_NDISC)
by_ndisc = true;
log_link_warning(link, "Ignoring DHCPv6 address %s/%u (valid %s, preferred %s) which conflicts with %s/%u%s.",
pretty, address->prefixlen,
FORMAT_LIFETIME(address->lifetime_valid_usec),
FORMAT_LIFETIME(address->lifetime_preferred_usec),
pretty, existing->prefixlen,
by_ndisc ? " assigned by NDisc" : "");
if (by_ndisc)
log_link_warning(link, "Hint: use IPv6Token= setting to change the address generated by NDisc or set UseAutonomousPrefix=no.");
log_link_full(link,
LOG_WARNING,
"Ignoring DHCPv6 address %s (valid %s, preferred %s) which conflicts with %s%s.%s",
IN6_ADDR_PREFIX_TO_STRING(&address->in_addr.in6, address->prefixlen),
FORMAT_LIFETIME(address->lifetime_valid_usec),
FORMAT_LIFETIME(address->lifetime_preferred_usec),
IN6_ADDR_PREFIX_TO_STRING(&existing->in_addr.in6, existing->prefixlen),
by_ndisc ? " assigned by NDisc" : "",
by_ndisc ? "\nHint: use IPv6Token= setting to change the address generated by NDisc or set UseAutonomousPrefix=no." : "");
return -EEXIST;
simple_log:
log_link_full(link, log_level, "DHCPv6 address %s/%u (valid %s, preferred %s)",
pretty, address->prefixlen,
FORMAT_LIFETIME(address->lifetime_valid_usec),
FORMAT_LIFETIME(address->lifetime_preferred_usec));
return 0;
}
static int dhcp6_request_address(