[PATCH 2/3] lwip: clean up IPv6 address handling in init_ifs and inquire_device
Joan Lledó <[email protected]> Wed, 1 Jul 2026 19:00:29 +0200
| Newsgroups | gmane.os.hurd.bugs |
|---|---|
| Message-ID | <[email protected]> |
From: Joan Lledó <[email protected]> - init_ifs: drop redundant manual tentative-state setup; let netif_add_ip6_address() handle DAD state internally. - update_if: skip multicast addresses, remove unused prefix_len hardcoding and trailing dead code. - inquire_device: memset the addr6 output buffer, only copy addresses whose state is valid, and set prefix_len based on whether the address is static (64) or autoconf (128) instead of always 64. --- lwip/lwip-util.c | 40 +++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/lwip/lwip-util.c b/lwip/lwip-util.c index 35f38694..d6c3f41e 100644 --- a/lwip/lwip-util.c +++ b/lwip/lwip-util.c @@ -218,11 +218,7 @@ init_ifs (void *arg) { netif_add_ip6_address (netif, address6, &ipv6_addr_idx); - if (ipv6_addr_idx >= 0) - /* First use DAD to make sure nobody else has it */ - netif_ip6_addr_set_state (netif, ipv6_addr_idx, - IP6_ADDR_TENTATIVE); - else + if (ipv6_addr_idx < 0) error (0, 0, "No free slot for IPv6 address: %s\n", ip6addr_ntoa (address6)); } @@ -271,8 +267,8 @@ update_if (void *arg) if (args->addr6) for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - ip6_addr_t *laddr6 = ((ip6_addr_t *) args->addr6 + i); - if (!ip6_addr_isany (laddr6)) + ip6_addr_t *laddr6 = args->addr6 + i; + if (!ip6_addr_isany (laddr6) && !ip6_addr_ismulticast (laddr6)) { netif_ip6_addr_set (args->netif, i, laddr6); @@ -281,13 +277,7 @@ update_if (void *arg) } } - if (args->addr6_prefix_len) - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) - *(args->addr6_prefix_len + i) = 64; - free (args); - - return; } /* Get the IP configuration of an interface */ @@ -317,17 +307,21 @@ inquire_device (struct netif *netif, ip4_addr_t * addr, ip4_addr_t * netmask, gateway->addr = netif_ip4_gw (netif)->addr; if (addr6) - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) - { - *(addr6 + i * 4 + 0) = netif_ip6_addr (netif, i)->addr[0]; - *(addr6 + i * 4 + 1) = netif_ip6_addr (netif, i)->addr[1]; - *(addr6 + i * 4 + 2) = netif_ip6_addr (netif, i)->addr[2]; - *(addr6 + i * 4 + 3) = netif_ip6_addr (netif, i)->addr[3]; - } + { + for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) + { + if (!ip6_addr_isvalid (netif_ip6_addr_state (netif, i))) + { + memset (&addr6[i], 0, sizeof (ip6_addr_t)); + continue; + } + + addr6[i] = *netif_ip6_addr (netif, i); - if (addr6_prefix_len) - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) - *(addr6_prefix_len + i) = 64; + if (addr6_prefix_len) + *(addr6_prefix_len + i) = 64; + } + } } } -- 2.50.1