On Sun, Jan 18, 2026 at 05:16:06PM -0500, Jon Maloy wrote:
As a preparation for multiple address support, we refactor the conf_print() function to handle this properly.
Signed-off-by: Jon Maloy
--- conf.c | 78 +++++++++++++++++++++++++++++++++------------------------- 1 file changed, 45 insertions(+), 33 deletions(-) diff --git a/conf.c b/conf.c index 9fc5dca..3ecd1a0 100644 --- a/conf.c +++ b/conf.c @@ -1199,20 +1199,28 @@ static void conf_print(const struct ctx *c) buf4, sizeof(buf4)));
if (!c->no_dhcp) { - uint32_t mask; - - mask = htonl(0xffffffff << - (32 - c->ip4.addrs[0].prefix_len)); - - info("DHCP:"); - info(" assign: %s", - inet_ntop(AF_INET, inany_v4(&c->ip4.addrs[0].addr), - buf4, sizeof(buf4))); - info(" mask: %s", - inet_ntop(AF_INET, &mask, buf4, sizeof(buf4))); - info(" router: %s", - inet_ntop(AF_INET, &c->ip4.guest_gw, - buf4, sizeof(buf4))); + for (i = 0; i < c->ip4.addr_count; i++) { + const struct inany_addr_entry *e; + uint32_t mask; + + e = &c->ip4.addrs[i]; + if (!(e->flags & INANY_ADDR_CONFIGURED) && + c->ip4.addr_count > 1) + continue;
This doesn't seem right - addresses taken from the host will also be used for DHCP.
+ + mask = htonl(0xffffffff << (32 - e->prefix_len)); + + info("DHCP:"); + info(" assign: %s", + inet_ntop(AF_INET, inany_v4(&e->addr), + buf4, sizeof(buf4))); + info(" mask: %s", + inet_ntop(AF_INET, &mask, buf4, sizeof(buf4))); + info(" router: %s", + inet_ntop(AF_INET, &c->ip4.guest_gw, + buf4, sizeof(buf4))); + break; + } }
for (i = 0; !IN4_IS_ADDR_UNSPECIFIED(&c->ip4.dns[i]); i++) { @@ -1230,30 +1238,34 @@ static void conf_print(const struct ctx *c) }
if (c->ifi6) { + bool do_slaac = !c->no_ndp || !c->no_dhcpv6; + if (!IN6_IS_ADDR_UNSPECIFIED(&c->ip6.map_host_loopback)) info(" NAT to host ::1: %s", inet_ntop(AF_INET6, &c->ip6.map_host_loopback, buf6, sizeof(buf6)));
- if (!c->no_ndp && !c->no_dhcpv6) - info("NDP/DHCPv6:"); - else if (!c->no_dhcpv6) - info("DHCPv6:"); - else if (!c->no_ndp) - info("NDP:"); - else - goto dns6; - - info(" assign: %s", - inet_ntop(AF_INET6, &c->ip6.addrs[0].addr.a6, - buf6, sizeof(buf6))); - info(" router: %s", - inet_ntop(AF_INET6, &c->ip6.guest_gw, buf6, sizeof(buf6))); - info(" our link-local: %s", - inet_ntop(AF_INET6, &c->ip6.our_tap_ll, - buf6, sizeof(buf6))); - -dns6: + if (do_slaac) { + if (!c->no_ndp && !c->no_dhcpv6) + info("NDP/DHCPv6:"); + else if (!c->no_dhcpv6) + info("DHCPv6:"); + else + info("NDP:"); + + for (i = 0; i < c->ip6.addr_count; i++) { + info(" assign: %s", + inet_ntop(AF_INET6, &c->ip6.addrs[i].addr.a6, + buf6, sizeof(buf6)));
There's an inany_ntop()... if you're going to use inany_ntop() for IPv6 only addresses you might at least use the helper functions already implemented for it.
+ } + info(" router: %s", + inet_ntop(AF_INET6, &c->ip6.guest_gw, + buf6, sizeof(buf6))); + info(" our link-local: %s", + inet_ntop(AF_INET6, &c->ip6.our_tap_ll, + buf6, sizeof(buf6))); + } + for (i = 0; !IN6_IS_ADDR_UNSPECIFIED(&c->ip6.dns[i]); i++) { if (!i) info("DNS:"); -- 2.52.0
-- David Gibson (he or they) | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you, not the other way | around. http://www.ozlabs.org/~dgibson