Re: git: 8f6561e8adbd - stable/15 - ixv: fix multicast address enumeration
Date: Sat, 08 Aug 2026 08:08:04 UTC
Somewhat related: I'm concerned that ifmcstat(8) may not be reporting
AF_LINK memberships in all cases, only the ones which were plumbed there
by an upper layer (AF_INET, AF_INET6).
I noticed this when preparing "add that which was never ratified" for
IPv6 sockets.
It's a potential issue for LLDP, Carrier Ethernet and IS-IS bring-up.
Has anyone else observed this? Is anyone else actively using it, or
using FreeBSD for these control plane protocols?
It may be a "bms@ ends up having to fix it again" issue because I merged
ifmcstat(8) from NetBSD originally. #tragedyofthecommons
On 08/08/2026 01:38, Kevin Bowling wrote:
> The branch stable/15 has been updated by kbowling:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=8f6561e8adbd07f52278b5a404c72d5c9643b471
>
> commit 8f6561e8adbd07f52278b5a404c72d5c9643b471
> Author: Kevin Bowling <kbowling@FreeBSD.org>
> AuthorDate: 2026-07-28 11:06:23 +0000
> Commit: Kevin Bowling <kbowling@FreeBSD.org>
> CommitDate: 2026-08-08 00:34:24 +0000
>
> ixv: fix multicast address enumeration
>
> if_foreach_llmaddr() adds each callback return value to its running
> count. Returning the incremented count made the address indices grow
> as 0, 1, 3, 7, and so on, eventually writing beyond the multicast
> address array.
>
> Return one address per callback and stop copying when the array is
> full, matching the ixv-1.6.12 driver.
>
> Fixes: ff06a8dbb677 ("Mechanically convert ixgbe(4) to IfAPI")
>
> (cherry picked from commit 6020de5ad154d54c8b9a838f28612c2182330c67)
> ---
> sys/dev/ixgbe/if_ixv.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/sys/dev/ixgbe/if_ixv.c b/sys/dev/ixgbe/if_ixv.c
> index 8a1c1aae041d..24e6fa714a7b 100644
> --- a/sys/dev/ixgbe/if_ixv.c
> +++ b/sys/dev/ixgbe/if_ixv.c
> @@ -842,11 +842,14 @@ ixv_negotiate_api(struct ixgbe_softc *sc)
> static u_int
> ixv_if_multi_set_cb(void *cb_arg, struct sockaddr_dl *addr, u_int cnt)
> {
> + if (cnt >= MAX_NUM_MULTICAST_ADDRESSES)
> + return (0);
> +
> bcopy(LLADDR(addr),
> &((u8 *)cb_arg)[cnt * IXGBE_ETH_LENGTH_OF_ADDRESS],
> IXGBE_ETH_LENGTH_OF_ADDRESS);
>
> - return (++cnt);
> + return (1);
> }
>
> /************************************************************************
> @@ -1982,4 +1985,3 @@ ixv_init_device_features(struct ixgbe_softc *sc)
> if (sc->feat_cap & IXGBE_FEATURE_NEEDS_CTXD)
> sc->feat_en |= IXGBE_FEATURE_NEEDS_CTXD;
> } /* ixv_init_device_features */
> -
>