git: dc12e3e0e72a - main - dpaa2: Apply if_flags and MAC filters in dpaa2_ni_init()
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 19 Jul 2026 03:09:49 UTC
The branch main has been updated by adrian:
URL: https://cgit.FreeBSD.org/src/commit/?id=dc12e3e0e72a73f1ad1a14d8d0fa4e2147151720
commit dc12e3e0e72a73f1ad1a14d8d0fa4e2147151720
Author: Nick Price <nick@spun.io>
AuthorDate: 2026-07-19 02:27:36 +0000
Commit: Adrian Chadd <adrian@FreeBSD.org>
CommitDate: 2026-07-19 03:09:30 +0000
dpaa2: Apply if_flags and MAC filters in dpaa2_ni_init()
dpaa2_ni_init() only enabled the DPNI object; it never pushed the
promiscuous/allmulti state or the multicast filter table to the MC
firmware. The SIOCSIFFLAGS handler ignores flag changes that arrive
while the interface is down, yet still latches them into sc->if_flags,
so a promiscuous mode request made before the first up was silently
lost and could never be applied afterwards: the up path runs
dpaa2_ni_init(), which did not read the flags, and every later
SIOCSIFFLAGS compares against the already-latched value and sees no
change.
This is exactly what happens when if_bridge adds a dpni member while
the dpni is still down, e.g. rc.conf's
create_args_bridge0="... addm dpni0"
running at bridge clone time, before ifconfig_dpni0="up" is processed.
bridge_ioctl_add() puts the member into promiscuous mode at addm time;
the request never reaches the firmware, so the DPNI continues to
hardware-filter unicast destined to other MACs. ifconfig still
reports PROMISC (a stack-level flag), which makes the failure
invisible: the host stays reachable only via the DPNI's own MAC
address (e.g. with net.link.bridge.inherit_mac=1), while bridged
epair/vnet jail traffic is silently dropped on RX.
Reapply both pieces of administrative state after enabling the DPNI,
as other NIC drivers do in their init path. This also restores
multicast memberships joined while the interface was down.
PR: 292006
Reported by: jhibbits
Signed-off-by: Nick Price <nick@spun.io>
Reviewed by: jhibbits
Differential Revision: https://reviews.freebsd.org/D58330
---
sys/dev/dpaa2/dpaa2_ni.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/sys/dev/dpaa2/dpaa2_ni.c b/sys/dev/dpaa2/dpaa2_ni.c
index f85dc41a748c..435b0fdf4085 100644
--- a/sys/dev/dpaa2/dpaa2_ni.c
+++ b/sys/dev/dpaa2/dpaa2_ni.c
@@ -2491,6 +2491,17 @@ dpaa2_ni_init(void *arg)
__func__, error);
}
+ error = dpaa2_ni_setup_if_flags(sc);
+ if (error) {
+ device_printf(dev, "%s: failed to update interface flags: "
+ "error=%d\n", __func__, error);
+ }
+ error = dpaa2_ni_update_mac_filters(ifp);
+ if (error) {
+ device_printf(dev, "%s: failed to update MAC filters: "
+ "error=%d\n", __func__, error);
+ }
+
DPNI_LOCK(sc);
/* Announce we are up and running and can queue packets. */
if_setdrvflagbits(ifp, IFF_DRV_RUNNING, IFF_DRV_OACTIVE);