From 3ec8303fdc4d1fab87cdd83370c00b25b76374bc Mon Sep 17 00:00:00 2001 From: Patrik Flykt Date: Fri, 24 Aug 2018 09:49:14 -0600 Subject: [PATCH 1/4] networkd-dhcp6: Log warning with PD prefixes shorter than 48 Log a warning message in case the network prefix delegated is shorter than /48. --- src/network/networkd-dhcp6.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index fa6e18cd2c..a64545b937 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -236,6 +236,11 @@ static int dhcp6_lease_pd_prefix_acquired(sd_dhcp6_client *client, Link *link) { continue; } + if (pd_prefix_len < 48) { + log_link_warning(link, "PD Prefix length < 48, looks unusual %s/%u", + strnull(buf), pd_prefix_len); + } + r = dhcp6_pd_prefix_distribute(link, &i, &pd_prefix, pd_prefix_len, lifetime_preferred, From 37f52406d979cee10d93467552e5311aa7afe186 Mon Sep 17 00:00:00 2001 From: Patrik Flykt Date: Fri, 24 Aug 2018 09:49:18 -0600 Subject: [PATCH 2/4] networkd-dhcp6: Fix PD prefix length for subnet assignment When computing the next network prefix to assign, compute the next prefix to allocate based on the intended /64 assignment, not the given prefix length for the whole prefix, e.g. /48, given to systemd-networkd. Fixes #9626. --- src/network/networkd-dhcp6.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index a64545b937..5a23330732 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -174,7 +174,7 @@ static int dhcp6_pd_prefix_distribute(Link *dhcp6_link, Iterator *i, n_used++; - r = in_addr_prefix_next(AF_INET6, &prefix, pd_prefix_len); + r = in_addr_prefix_next(AF_INET6, &prefix, 64); if (r < 0 && n_used < n_prefixes) return r; } From ef5df4e5c57f0cced79dd3eac3509a2c5d9bcbe6 Mon Sep 17 00:00:00 2001 From: Patrik Flykt Date: Fri, 24 Aug 2018 09:49:20 -0600 Subject: [PATCH 3/4] networkd-dhcp6: Fix logging of DHCPv6 prefix Pretty-print log messages with DHCPv6 prefixes after the prefixes have been set instead of some random unassigned stack values. --- src/network/networkd-dhcp6.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index 5a23330732..c55fe62cda 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -221,8 +221,6 @@ static int dhcp6_lease_pd_prefix_acquired(sd_dhcp6_client *client, Link *link) { if (r < 0) return r; - (void) in_addr_to_string(AF_INET6, (union in_addr_union*) &pd_prefix, &buf); - dhcp6_reset_pd_prefix_network(link); sd_dhcp6_lease_reset_pd_prefix_iter(lease); @@ -231,12 +229,14 @@ static int dhcp6_lease_pd_prefix_acquired(sd_dhcp6_client *client, Link *link) { &lifetime_valid) >= 0) { if (pd_prefix_len > 64) { + (void) in_addr_to_string(AF_INET6, (union in_addr_union*) &pd_prefix, &buf); log_link_debug(link, "PD Prefix length > 64, ignoring prefix %s/%u", strnull(buf), pd_prefix_len); continue; } if (pd_prefix_len < 48) { + (void) in_addr_to_string(AF_INET6, (union in_addr_union*) &pd_prefix, &buf); log_link_warning(link, "PD Prefix length < 48, looks unusual %s/%u", strnull(buf), pd_prefix_len); } From eb75b919e8013de2031054349fe7f778e8935f29 Mon Sep 17 00:00:00 2001 From: Patrik Flykt Date: Fri, 24 Aug 2018 09:49:22 -0600 Subject: [PATCH 4/4] networkd-dhcp6: Improve logging on DHCPv6 PD assignment Print out prefixes assigned to links in addition to the DHCPv6 prefix it was delegated from. --- src/network/networkd-dhcp6.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index c55fe62cda..0aa7a190c4 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -121,6 +121,7 @@ static int dhcp6_pd_prefix_distribute(Link *dhcp6_link, Iterator *i, union in_addr_union prefix; uint64_t n_prefixes, n_used = 0; _cleanup_free_ char *buf = NULL; + _cleanup_free_ char *assigned_buf = NULL; int r; assert(manager); @@ -158,19 +159,23 @@ static int dhcp6_pd_prefix_distribute(Link *dhcp6_link, Iterator *i, if (assigned_link != NULL && assigned_link != link) continue; + (void) in_addr_to_string(AF_INET6, &prefix, &assigned_buf); r = dhcp6_pd_prefix_assign(link, &prefix.in6, 64, lifetime_preferred, lifetime_valid); if (r < 0) { - log_link_error_errno(link, r, "Unable to %s prefix %s/%u for link: %m", + log_link_error_errno(link, r, "Unable to %s prefix %s/64 from %s/%u for link: %m", assigned_link ? "update": "assign", + strnull(assigned_buf), strnull(buf), pd_prefix_len); if (assigned_link == NULL) continue; } else - log_link_debug(link, "Assigned prefix %" PRIu64 "/%" PRIu64 " %s/64 to link", - n_used + 1, n_prefixes, strnull(buf)); + log_link_debug(link, "Assigned prefix %" PRIu64 "/%" PRIu64 " %s/64 from %s/%u to link", + n_used + 1, n_prefixes, + strnull(assigned_buf), + strnull(buf), pd_prefix_len); n_used++;