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