[Bug 295176] if_rge: IPv6 and multicast filtering issues
[email protected] Sat, 11 Jul 2026 15:40:12 +0000
| Newsgroups | gmane.os.freebsd.devel.net |
|---|---|
| Message-ID | <[email protected]/bugzilla/> |
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=295176 Oleg <[email protected]> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |[email protected] --- Comment #1 from Oleg <[email protected]> --- I can reproduce what appears to be the same multicast-filter problem on an RTL8125 using rge(4) on FreeBSD 16-CURRENT. My rge0 machine is directly connected to another FreeBSD machine. If I reboot only the rge0 machine, IPv6 Neighbor Discovery may work normally. If I reboot both machines, they often cannot discover each other. Sending pings does not help, but this immediately restores NDP: ifconfig rge0 allmulti That boot-order dependence suggested that IPv6 multicast memberships are being added after rge0 is already running, without the hardware multicast filter being refreshed. I believe there is a one-line bug in rge_ioctl(). The SIOCADDMULTI/SIOCDELMULTI handler checks IFF_DRV_RUNNING using if_getflags(), but IFF_DRV_RUNNING belongs to the interface driver flags, not the ordinary interface flags. As a result, rge_iff_locked() is not called when IPv6 adds or removes multicast memberships. Proposed fix: diff --git a/sys/dev/rge/if_rge.c b/sys/dev/rge/if_rge.c --- a/sys/dev/rge/if_rge.c +++ b/sys/dev/rge/if_rge.c @@ case SIOCADDMULTI: case SIOCDELMULTI: RGE_LOCK(sc); - if ((if_getflags(ifp) & IFF_DRV_RUNNING) != 0) + if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0) rge_iff_locked(sc); RGE_UNLOCK(sc); break; This matches the form used by other FreeBSD Ethernet drivers. It also explains why promisc/allmulti masks the problem: both modes force the rge hardware to accept all multicast frames, including Router Advertisements and Neighbor Discovery traffic. -- You are receiving this mail because: You are the assignee for the bug.